diff --git a/.config/CredScanSuppressions.json b/.config/CredScanSuppressions.json
index da14baee20e3..984a86f68e69 100644
--- a/.config/CredScanSuppressions.json
+++ b/.config/CredScanSuppressions.json
@@ -1,49 +1,70 @@
{
- "tool": "Credential Scanner",
- "suppressions": [
- {
- "file": [
- "/eng/common/internal-feed-operations.ps1",
- "/eng/common/internal-feed-operations.sh",
- "/src/libraries/Common/src/Interop/Windows/WinHttp/Interop.winhttp_types.cs",
- "/src/libraries/Common/src/System/Security/Cryptography/EccSecurityTransforms.cs",
- "/src/libraries/Common/tests/System/Net/Configuration.Certificates.cs",
- "/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.Authentication.cs",
- "/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs",
- "/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.DefaultProxyCredentials.cs",
- "/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.Proxy.cs",
- "/src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.ServerCertificates.cs",
- "/src/libraries/Common/tests/System/Net/Http/PostScenarioTest.cs",
- "/src/libraries/Common/tests/System/Net/Prerequisites/Deployment/setup_certificates.ps1",
- "/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/EC/ECKeyFileTests.cs",
- "/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/EC/ECKeyFileTests.LimitedPrivate.cs",
- "/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/RSAKeyFileTests.cs",
- "/src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/RSAKeyPemTests.cs",
- "/src/libraries/System.Data.Common/tests/System/Data/Common/DbConnectionStringBuilderTest.cs",
- "/src/libraries/System.Diagnostics.Process/tests/ProcessStartInfoTests.cs",
- "/src/libraries/System.DirectoryServices.AccountManagement/src/System/DirectoryServices/AccountManagement/constants.cs",
- "/src/libraries/System.DirectoryServices.AccountManagement/tests/PrincipalTest.cs",
- "/src/libraries/System.DirectoryServices.AccountManagement/tests/UserPrincipalTest.cs",
- "/src/libraries/System.Net.Http/tests/FunctionalTests/SocketsHttpHandlerTest.cs",
- "/src/libraries/System.Net.Http/tests/UnitTests/DigestAuthenticationTests.cs",
- "/src/libraries/System.Net.Http/tests/UnitTests/HttpEnvironmentProxyTest.cs",
- "/src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs",
- "/src/libraries/System.Net.Requests/src/System/Net/FtpControlStream.cs",
- "/src/libraries/System.Net.Requests/src/System/Net/FtpWebRequest.cs",
- "/src/libraries/System.Net.WebSockets.Client/tests/ConnectTest.cs",
- "/src/libraries/System.Private.Uri/tests/ExtendedFunctionalTests/UriRelativeResolutionTest.cs",
- "/src/libraries/System.Private.Uri/tests/FunctionalTests/UriBuilderRefreshTest.cs",
- "/src/libraries/System.Private.Uri/tests/FunctionalTests/UriBuilderTests.cs",
- "/src/libraries/System.Private.Uri/tests/FunctionalTests/UriRelativeResolutionTest.cs",
- "/src/libraries/System.Runtime/tests/System/Uri.CreateStringTests.cs",
- "/src/libraries/System.Security.Cryptography.Algorithms/tests/Rfc2898Tests.cs",
- "/src/libraries/System.Security.Cryptography.Pkcs/tests/Pkcs12/Pkcs12Documents.cs",
- "/src/libraries/System.Security.Cryptography.X509Certificates/tests/ExportTests.cs",
- "/src/libraries/System.Security.Cryptography.Xml/tests/EncryptedXmlTest.cs",
- "/src/libraries/System.Security.Cryptography.Xml/tests/SignedXmlTest.cs",
- "/src/libraries/System.Security.Cryptography.Xml/tests/TestHelpers.cs"
- ],
- "_justification": "Mostly test files. Other files contain harmless examples or constants."
- },
- ]
+ "tool": "Credential Scanner",
+ "suppressions": [
+ {
+ "_justification": "Unit test containing connection strings under the test.",
+ "file": [
+ "src/libraries/System.Data.Common/tests/System/Data/Common/DbConnectionStringBuilderTest.cs"
+ ]
+ },
+ {
+ "_justification": "Private key for testing purpose.",
+ "file": [
+ "src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/DSA/DSAKeyPemTests.cs",
+ "src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/EC/ECKeyPemTests.cs",
+ "src/libraries/Common/tests/System/Security/Cryptography/AlgorithmImplementations/RSA/RSAKeyPemTests.cs",
+ "src/libraries/System.Security.Cryptography.X509Certificates/tests/TestData.cs"
+ ],
+ "placeholder": [
+ "-----BEGIN PRIVATE KEY-----",
+ "-----BEGIN * PRIVATE KEY-----"
+ ]
+ },
+ {
+ "_justification": "Test credential for Uri testing",
+ "file": [
+ "src/libraries/System.Net.Http/tests/UnitTests/HttpEnvironmentProxyTest.cs",
+ "src/libraries/System.Private.Uri/tests/ExtendedFunctionalTests/UriRelativeResolutionTest.cs",
+ "src/libraries/System.Private.Uri/tests/FunctionalTests/UriBuilderRefreshTest.cs",
+ "src/libraries/System.Private.Uri/tests/FunctionalTests/UriBuilderTests.cs",
+ "src/libraries/System.Private.Uri/tests/FunctionalTests/UriRelativeResolutionTest.cs",
+ "src/libraries/System.Runtime/tests/System/Uri.CreateStringTests.cs"
+ ],
+ "placeholder": [
+ "//*:;&$=123USERINFO@",
+ "//*:bar@",
+ "//*:bar1@",
+ "//*:password1@",
+ "//*:psw@",
+ "//*:userinfo2@"
+ ]
+ },
+ {
+ "_justification": "Generic test password.",
+ "file": [
+ "src/libraries/Common/tests/System/Net/Configuration.Certificates.cs",
+ "src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.Authentication.cs",
+ "src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.cs",
+ "src/libraries/Common/tests/System/Net/Http/HttpClientHandlerTest.DefaultProxyCredentials.cs",
+ "src/libraries/Common/tests/System/Net/Http/PostScenarioTest.cs",
+ "src/libraries/Common/tests/System/Net/Prerequisites/Deployment/setup_certificates.ps1",
+ "src/libraries/System.Net.Http/tests/FunctionalTests/SocketsHttpHandlerTest.cs",
+ "src/libraries/System.Net.Http/tests/UnitTests/DigestAuthenticationTests.cs",
+ "src/libraries/System.Net.Http/tests/UnitTests/HttpEnvironmentProxyTest.cs",
+ "src/libraries/System.Net.Mail/tests/Functional/SmtpClientTest.cs",
+ "src/libraries/System.Security.Cryptography.Xml/tests/SignedXmlTest.cs",
+ "src/libraries/System.Security.Cryptography.Xml/tests/TestHelpers.cs"
+ ],
+ "placeholder": [
+ "\"anotherpassword\"",
+ "\"bar\"",
+ "\"mono\"",
+ "\"password1\"",
+ "\"rightpassword\"",
+ "\"testcertificate\"",
+ "\"unused\"",
+ "\"wrongpassword\""
+ ]
+ }
+ ]
}
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 519943094947..d706d96a00e0 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -15,7 +15,7 @@
]
},
"microsoft.dotnet.xharness.cli": {
- "version": "1.0.0-prerelease.20352.2",
+ "version": "1.0.0-prerelease.20530.4",
"commands": [
"xharness"
]
diff --git a/.editorconfig b/.editorconfig
index 9d03bd30636c..4986cd7d1964 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -15,6 +15,10 @@ trim_trailing_whitespace = true
[project.json]
indent_size = 2
+# Generated code
+[*{_AssemblyInfo.cs,.notsupported.cs}]
+generated_code = true
+
# C# files
[*.cs]
# New line preferences
@@ -155,10 +159,11 @@ csharp_space_between_square_brackets = false
# Analyzers
dotnet_code_quality.ca1802.api_surface = private, internal
+dotnet_code_quality.ca1822.api_surface = private, internal
dotnet_code_quality.ca2208.api_surface = public
# License header
-file_header_template = Licensed to the .NET Foundation under one or more agreements.\nThe .NET Foundation licenses this file to you under the MIT license.\n
+file_header_template = Licensed to the .NET Foundation under one or more agreements.\nThe .NET Foundation licenses this file to you under the MIT license.
# C++ Files
[*.{cpp,h,in}]
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 000000000000..769b0081686d
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,62 @@
+# Users referenced in this file will automatically be requested as reviewers for PRs that modify the given paths.
+# See https://help.github.com/articles/about-code-owners/
+
+/src/libraries/Common/src/System/Net/Http/aspnetcore/ @dotnet/http
+/src/libraries/Common/tests/Tests/System/Net/aspnetcore/ @dotnet/http
+/src/libraries/System.Text.Json/ @ahsonkhan @steveharter @layomia @Jozkee
+/src/libraries/System.Buffers/ @ahsonkhan
+/src/libraries/System.Memory/ @ahsonkhan
+
+# CoreCLR Code Owners
+
+/src/coreclr/src/inc/corinfo.h @dotnet/jit-contrib
+/src/coreclr/src/inc/corjit.h @dotnet/jit-contrib
+/src/coreclr/src/jit/ @dotnet/jit-contrib
+
+# Mono Code Owners
+
+/src/mono @marek-safar
+
+/src/mono/llvm @vargaz @SamMonoRT @imhameed @EgorBo
+
+/src/mono/mono/arch @vargaz
+/src/mono/mono/benchmark @SamMonoRT @naricc
+/src/mono/mono/dis @lambdageek @vargaz
+/src/mono/mono/eglib @vargaz @lambdageek @CoffeeFlux
+
+/src/mono/mono/metadata @vargaz @lambdageek @thaystg @CoffeeFlux
+/src/mono/mono/metadata/*-win* @lateralusX @lambdageek @CoffeeFlux
+/src/mono/mono/metadata/handle* @lambdageek @vargaz
+/src/mono/mono/metadata/monitor* @brzvlad @vargaz
+/src/mono/mono/metadata/sgen* @brzvlad @vargaz @naricc
+/src/mono/mono/metadata/thread* @lateralusX @lambdageek
+/src/mono/mono/metadata/w32* @lateralusX @lambdageek @CoffeeFlux
+
+/src/mono/mono/mini @vargaz @lambdageek @SamMonoRT @CoffeeFlux
+/src/mono/mono/mini/*cfgdump* @vargaz
+/src/mono/mono/mini/*exceptions* @vargaz @BrzVlad
+/src/mono/mono/mini/*llvm* @vargaz @imhameed @EgorBo
+/src/mono/mono/mini/*ppc* @vargaz
+/src/mono/mono/mini/*profiler* @BrzVlad @lambdageek
+/src/mono/mono/mini/*riscv* @alexrp
+/src/mono/mono/mini/*type-check* @lambdageek
+/src/mono/mono/mini/debugger-agent.c @vargaz @thaystg @DavidKarlas @lambdageek
+/src/mono/mono/mini/interp/* @BrzVlad @vargaz
+
+/src/mono/mono/native @egorbo @marek-safar
+/src/mono/mono/profiler @BrzVlad @lambdageek
+/src/mono/mono/sgen @BrzVlad @lambdageek @naricc
+
+/src/mono/mono/utils @vargaz @lambdageek @CoffeeFlux
+/src/mono/mono/utils/*-win* @lateralusX @lambdageek @CoffeeFlux
+/src/mono/mono/utils/atomic* @vargaz
+/src/mono/mono/utils/mono-hwcap* @vargaz
+/src/mono/mono/utils/mono-mem* @vargaz
+/src/mono/mono/utils/mono-merp* @lambdageek @naricc @imhameed
+/src/mono/mono/utils/mono-state* @lambdageek
+/src/mono/mono/utils/mono-threads* @lambdageek @vargaz
+
+/src/mono/msvc @lateralusX @kg @akoeplinger
+/src/mono/msvc/scripts @akoeplinger @kg
+
+/src/mono/netcore @marek-safar @akoeplinger @egorbo @vargaz @steveisok
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/01_bug_report.md b/.github/ISSUE_TEMPLATE/01_bug_report.md
index ddca1a08888f..b6b9a0a295ef 100644
--- a/.github/ISSUE_TEMPLATE/01_bug_report.md
+++ b/.github/ISSUE_TEMPLATE/01_bug_report.md
@@ -24,6 +24,7 @@ assignees: ''
* What OS and version, and what distro if applicable?
* What is the architecture (x64, x86, ARM, ARM64)?
* Do you know whether it is specific to that configuration?
+* If you're using Blazor, which web browser(s) do you see this issue in?
-->
### Regression?
diff --git a/.github/PULL_REQUEST_TEMPLATE/servicing_pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/servicing_pull_request_template.md
new file mode 100644
index 000000000000..ae585706a99b
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE/servicing_pull_request_template.md
@@ -0,0 +1,23 @@
+Fixes Issue
+
+Master PR
+
+# Description
+
+
+
+# Customer Impact
+
+
+
+# Regression
+
+
+
+# Testing
+
+
+
+# Risk
+
+
diff --git a/.github/move.yml b/.github/move.yml
new file mode 100644
index 000000000000..013f705a0883
--- /dev/null
+++ b/.github/move.yml
@@ -0,0 +1,27 @@
+# Configuration for Move Issues - https://github.com/dessant/move-issues
+
+# Delete the command comment when it contains no other content
+deleteCommand: true
+
+# Close the source issue after moving
+closeSourceIssue: true
+
+# Lock the source issue after moving
+lockSourceIssue: false
+
+# Mention issue and comment authors
+mentionAuthors: true
+
+# Preserve mentions in the issue content
+keepContentMentions: false
+
+# Move labels that also exist on the target repository
+moveLabels: false
+
+# Set custom aliases for targets
+# aliases:
+# r: repo
+# or: owner/repo
+
+# Repository to extend settings from
+# _extends: repo
diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml
new file mode 100644
index 000000000000..79cde1d3ce29
--- /dev/null
+++ b/.github/workflows/backport.yml
@@ -0,0 +1,26 @@
+name: Backport PR to branch
+on:
+ issue_comment:
+ types: [created]
+
+jobs:
+ backport:
+ if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/backport to')
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout repo
+ uses: actions/checkout@v2
+ - name: Run backport
+ uses: ./eng/actions/backport
+ with:
+ auth_token: ${{ secrets.GITHUB_TOKEN }}
+ pr_description_template: |
+ Backport of #%source_pr_number% to %target_branch%
+
+ /cc %cc_users%
+
+ ## Customer Impact
+
+ ## Testing
+
+ ## Risk
diff --git a/.gitignore b/.gitignore
index bfe14adb6c04..7596f954d951 100644
--- a/.gitignore
+++ b/.gitignore
@@ -319,7 +319,6 @@ Vagrantfile
CMakeFiles/
cmake_install.cmake
CMakeCache.txt
-Makefile
# Cross compilation
cross/rootfs/*
@@ -353,3 +352,7 @@ src/coreclr/src/System.Private.CoreLib/common
# The debug directory should not be ignored
!src/coreclr/src/debug
+
+# Mono Wasm-specific excludes
+src/mono/wasm/emsdk/
+src/mono/wasm/.stamp-wasm-install-and-select*
diff --git a/Build.proj b/Build.proj
index dc4a15ab5f41..2d96f02056fe 100644
--- a/Build.proj
+++ b/Build.proj
@@ -1,5 +1,9 @@
+
+ BuildTargetFramework=$([MSBuild]::ValueOrDefault('$(BuildTargetFramework)', '$(NetCoreAppCurrent)'))
+
+
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'installer.tasks'))$([MSBuild]::NormalizePath('$(InstallerTasksOutputPath)', 'Debug', 'netstandard2.0', 'installer.tasks.dll'))
- $([MSBuild]::NormalizePath('$(InstallerTasksOutputPath)', 'Debug', 'net46', 'installer.tasks.dll'))
+ $([MSBuild]::NormalizePath('$(InstallerTasksOutputPath)', 'Debug', 'net461', 'installer.tasks.dll'))$([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'docs'))$([MSBuild]::NormalizeDirectory('$(DocsDir)', 'manpages'))
+
+
$([MSBuild]::NormalizeDirectory('$(LibrariesProjectRoot)', 'System.Private.CoreLib', 'src'))
+ $([MSBuild]::NormalizePath('$(CoreClrProjectRoot)', 'src', 'System.Private.CoreLib', 'System.Private.CoreLib.csproj'))
+ $([MSBuild]::NormalizePath('$(MonoProjectRoot)', 'netcore', 'System.Private.CoreLib', 'System.Private.CoreLib.csproj'))$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AppleAppBuilder', 'Debug', '$(NetCoreAppCurrent)'))
- $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AndroidAppBuilder', 'Debug', '$(NetCoreAppCurrent)'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'AndroidAppBuilder', 'Debug', '$(NetCoreAppCurrent)', 'publish'))$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'WasmAppBuilder', 'Debug', '$(NetCoreAppCurrent)', 'publish'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'WasmBuildTasks', 'Debug', '$(NetCoreAppCurrent)', 'publish'))$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'MonoAOTCompiler', 'Debug', '$(NetCoreAppCurrent)'))$([MSBuild]::NormalizePath('$(AppleAppBuilderDir)', 'AppleAppBuilder.dll'))$([MSBuild]::NormalizePath('$(AndroidAppBuilderDir)', 'AndroidAppBuilder.dll'))$([MSBuild]::NormalizePath('$(WasmAppBuilderDir)', 'WasmAppBuilder.dll'))
+ $([MSBuild]::NormalizePath('$(WasmBuildTasksDir)', 'WasmBuildTasks.dll'))$([MSBuild]::NormalizePath('$(MonoAOTCompilerDir)', 'MonoAOTCompiler.dll'))
@@ -84,6 +90,9 @@
false
+
+
+ false
@@ -92,15 +101,18 @@
previewlatesttrue
+ truetrue
+
+ falseProperties
- $([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture.ToString().ToLowerInvariant())
+ $([System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture.ToString().ToLowerInvariant())
diff --git a/Directory.Build.targets b/Directory.Build.targets
index f16e04d9b4e2..9d18986a3f87 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -6,6 +6,8 @@
tell Microsoft.Common.targets not to import Directory.Build.targets again
-->
false
+
+ false
@@ -20,4 +22,27 @@
$(MajorVersion).$(MinorVersion)
+
+
+
+
+
+
diff --git a/NuGet.config b/NuGet.config
index 13929bbcd87a..5f2930685412 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -16,6 +16,8 @@
+
+
diff --git a/README.md b/README.md
index b1d2839ea39e..71c5ae530856 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,7 @@
[![Build Status](https://dnceng.visualstudio.com/public/_apis/build/status/dotnet/runtime/runtime?branchName=master)](https://dnceng.visualstudio.com/public/_build/latest?definitionId=686&branchName=master)
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/dotnet/runtime)
+[![Discord](https://img.shields.io/discord/732297728826277939?style=flat-square&label=Discord&logo=discord&logoColor=white&color=7289DA)](https://aka.ms/dotnet-discord)
This repo contains the code to build the .NET runtime, libraries and shared host (`dotnet`) installers for
all supported platforms, as well as the sources to .NET runtime and libraries.
@@ -12,7 +13,7 @@ Official Starting Page: https://dotnet.microsoft.com/
* [How to use .NET](https://docs.microsoft.com/dotnet/core/get-started) (with VS, VS Code, command-line CLI)
* [Install official releases](https://dotnet.microsoft.com/download)
- * [Install daily builds](https://github.com/dotnet/installer#installers-and-binaries)
+ * [Install daily builds](docs/project/dogfooding.md)
* [Documentation](https://docs.microsoft.com/dotnet/core) (Get Started, Tutorials, Porting from .NET Framework, API reference, ...)
* [Deploying apps](https://docs.microsoft.com/dotnet/core/deploying)
* [Supported OS versions](https://github.com/dotnet/core/blob/master/os-lifecycle-policy.md)
@@ -48,6 +49,7 @@ For other issues, please use the following repos:
* [API Reference docs](https://docs.microsoft.com/dotnet/api/?view=netcore-3.1)
* [.NET API Catalog](http://apisof.net) (incl. APIs from daily builds and API usage info)
* [API docs writing guidelines](https://github.com/dotnet/dotnet-api-docs/wiki) - useful when writing /// comments
+* [.NET Discord Server](https://aka.ms/dotnet-discord) - a place to talk and hang out with .NET community
## .NET Foundation
diff --git a/SECURITY.md b/SECURITY.md
index 29863ccaa542..8312d20e4537 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -6,8 +6,8 @@ The .NET Core and ASP.NET Core support policy, including supported versions can
## Reporting a Vulnerability
-Security issues and bugs should be reported privately to the Microsoft Security Response Center (MSRC), either by emailing secure@microsoft.com or via the portal at https://msrc.microsoft.com.
-You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your
+Security issues and bugs should be reported privately to the Microsoft Security Response Center (MSRC), either by emailing secure@microsoft.com or via the portal at https://msrc.microsoft.com.
+You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your
original message. Further information, including the MSRC PGP key, can be found in the [MSRC Report an Issue FAQ](https://www.microsoft.com/en-us/msrc/faqs-report-an-issue).
Reports via MSRC may qualify for the .NET Core Bug Bounty. Details of the .NET Core Bug Bounty including terms and conditions are at [https://aka.ms/corebounty](https://aka.ms/corebounty).
diff --git a/THIRD-PARTY-NOTICES.TXT b/THIRD-PARTY-NOTICES.TXT
index 32e23122d71a..111dcf586ab5 100644
--- a/THIRD-PARTY-NOTICES.TXT
+++ b/THIRD-PARTY-NOTICES.TXT
@@ -520,12 +520,9 @@ Greg Parker gparker@cs.stanford.edu December 2000
This code is in the public domain and may be copied or modified without
permission.
-License notice for libunwind8 based code
+License notice for libunwind based code
----------------------------------------
-Copyright (c) 2003-2005 Hewlett-Packard Development Company, L.P.
- Contributed by David Mosberger-Tang
-
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
diff --git a/build.cmd b/build.cmd
index 76f4d8418947..fd4aba34c4c9 100644
--- a/build.cmd
+++ b/build.cmd
@@ -3,6 +3,7 @@ setlocal
set _args=%*
if "%~1"=="-?" set _args=-help
+if "%~1"=="/?" set _args=-help
powershell -ExecutionPolicy ByPass -NoProfile -Command "& '%~dp0eng\build.ps1'" %_args%
exit /b %ERRORLEVEL%
diff --git a/docs/README.md b/docs/README.md
index 130c5fa144fc..bbbc1515913f 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -14,7 +14,7 @@ Getting Started
- [Installing the .NET SDK](https://dotnet.microsoft.com/download)
- [Official .NET Docs](https://docs.microsoft.com/dotnet/core/)
-Workflow (Building, testing, etc.)
+Workflow (Building, testing, benchmarking, profiling, etc.)
===============
If you want to contribute a code change to this repo, start here.
diff --git a/docs/area-owners.md b/docs/area-owners.md
index 17b260a9c9ea..c84e0f573d3e 100644
--- a/docs/area-owners.md
+++ b/docs/area-owners.md
@@ -1,6 +1,10 @@
-If you need to tag folks on an issue or PR, you will generally want to tag the owners (not the lead).
+# Pull Requests Tagging
-Note: Editing this file doesn't update the mapping used by the `@msftbot` issue notification bot to tag owners. Some area owners prefer not to get those notifications. To update those notifications, contact any one of `@danmosemsft`, `@jeffschw`, `@ericstj`, or `@karelz`. If you're a community member interested in these notifications, you won't appear in this table but we can add you to notifications - just let us know.
+If you need to tag folks on an issue or PR, you will generally want to tag the owners (not the lead) for [area](#areas) to which the change or issue is closest to. For areas which are large and can be operating system or architecture specific it's better to tag owners of [OS](#operating-systems) or [Architecture](#architectures).
+
+## Areas
+
+Note: Editing this file doesn't update the mapping used by the `@msftbot` issue notification bot to tag owners. Some area owners prefer not to get those notifications. To update those notifications, contact any one of `@danmosemsft`, `@jeffschw`, `@marek-safar`, `@ericstj`, `@karelz`, or `@jeffhandley`; they have permissions to update [`msftbot` configuration](https://fabric-cp.azurewebsites.net/bot/?repo=dotnet/runtime). If you're a community member interested in these notifications, you won't appear in this table but we can add you to notifications - just let us know.
| Area | Lead | Owners (area experts to tag in PR's and issues) | Description |
|------------------------------------------------|---------------|-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -16,7 +20,7 @@ Note: Editing this file doesn't update the mapping used by the `@msftbot` issue
| area-CoreLib-mono | @marek-safar | @vargaz | |
| area-CrossGen/NGEN-coreclr | @mangod9 | @nattress | |
| area-crossgen2-coreclr | @mangod9 | @nattress @trylek @dotnet/crossgen-contrib | |
-| area-Debugger-mono | @lewing | @thaystg | |
+| area-Debugger-mono | @lewing | @thaystg @radical | |
| area-DependencyModel | @eerhardt | @eerhardt | Microsoft.Extensions.DependencyModel |
| area-Diagnostics-coreclr | @tommcdon | @tommcdon | |
| area-ExceptionHandling-coreclr | @mangod9 | @janvorli | |
@@ -25,14 +29,14 @@ Note: Editing this file doesn't update the mapping used by the `@msftbot` issue
| area-Extensions-DependencyInjection | @ericstj | @maryamariyan @eerhardt | |
| area-Extensions-FileSystem | @ericstj | @maryamariyan @carlossanlop | |
| area-Extensions-Hosting | @ericstj | @maryamariyan @eerhardt | |
-| area-Extensions-HttpClientFactory | @ericstj | @dotnet/ncl @maryamariyan | |
+| area-Extensions-HttpClientFactory | @ericstj | @dotnet/ncl | |
| area-Extensions-Logging | @ericstj | @maryamariyan @tarekgh | |
| area-Extensions-Options | @ericstj | @maryamariyan @ViktorHofer | |
| area-Extensions-Primitives | @ericstj | @maryamariyan @eerhardt | |
| area-GC-coreclr | @jeffschwMSFT | @Maoni0 | |
| area-GC-mono | @SamMonoRT | @BrzVlad | |
-| area-Host | @agocke | @jeffschwMSFT @vitek-karas @swaroop-sridhar | Issues with dotnet.exe including bootstrapping, framework detection, hostfxr.dll and hostpolicy.dll |
-| area-HostModel | @agocke | @vitek-karas @swaroop-sridhar | |
+| area-Host | @agocke | @jeffschwMSFT @vitek-karas | Issues with dotnet.exe including bootstrapping, framework detection, hostfxr.dll and hostpolicy.dll |
+| area-HostModel | @agocke | @vitek-karas | |
| area-ILTools-coreclr | @JulieLeeMSFT | @BruceForstall @dotnet/jit-contrib | |
| area-ILVerification | @JulieLeeMSFT | @BruceForstall @dotnet/jit-contrib | |
| area-Infrastructure | @ericstj | @ViktorHofer @jeffschwMSFT @dleeapho | |
@@ -43,17 +47,17 @@ Note: Editing this file doesn't update the mapping used by the `@msftbot` issue
| area-Interop-coreclr | @jeffschwMSFT | @jeffschwMSFT @AaronRobinsonMSFT | |
| area-Interop-mono | @marek-safar | @lambdageek | |
| area-Meta | @ericstj | @joperezr | Issues without clear association to any specific API/contract, e.g.
|
| area-System.Net.Http | @karelz | @dotnet/ncl | |
+| area-System.Net.Quic | @karelz | @dotnet/ncl | |
| area-System.Net.Security | @karelz | @dotnet/ncl | |
| area-System.Net.Sockets | @karelz | @dotnet/ncl | |
| area-System.Numerics | @jeffhandley | @tannergooding @pgovind | |
| area-System.Numerics.Tensors | @jeffhandley | @pgovind @eiriktsarpalis | |
| area-System.Reflection | @ericstj | @steveharter @GrabYourPitchforks | |
+| area-System.Reflection-mono | @SamMonoRT | @lambdageek @CoffeeFlux | MonoVM-specific reflection and reflection-emit issues |
| area-System.Reflection.Emit | @ericstj | @steveharter @GrabYourPitchforks | |
| area-System.Reflection.Metadata | @ericstj | @tmat @steveharter | |
| area-System.Resources | @jeffhandley | @buyaa-n @tarekgh @krwq | |
@@ -114,10 +122,26 @@ Note: Editing this file doesn't update the mapping used by the `@msftbot` issue
| area-System.Xml | @jeffhandley | @buyaa-n @krwq | |
| area-Threading-mono | @SamMonoRT | @lambdageek | |
| area-TieredCompilation-coreclr | @mangod9 | @kouvel | |
-| area-Tizen | | @alpencolt @gbalykov | |
| area-Tracing-coreclr | @tommcdon | @sywhang @josalem | |
| area-Tracing-mono | @steveisok | @lateralusX | |
| area-TypeSystem-coreclr | @mangod9 | @davidwrighton @MichalStrehovsky @janvorli @mangod9 | |
| area-UWP | @tommcdon | @jashook | UWP-specific issues including Microsoft.NETCore.UniversalWindowsPlatform and Microsoft.Net.UWPCoreRuntimeSdk |
| area-VM-coreclr | @mangod9 | @mangod9 | |
| area-VM-meta-mono | @SamMonoRT | @lambdageek @CoffeeFlux | |
+## Operating Systems
+
+| Operating System | Lead | Owners (area experts to tag in PR's and issues) | Description |
+|------------------|---------------|-----------------------------------------------------|--------------|
+| os-alpine | | | |
+| os-android | @steveisok | @akoeplinger | |
+| os-freebsd | | | |
+| os-mac-os-x | @steveisok | | |
+| os-ios | @steveisok | @vargaz | |
+| os-tvos | @steveisok | @vargaz | |
+
+## Architectures
+
+| Architecture | Lead | Owners (area experts to tag in PR's and issues) | Description |
+|-----------------|---------------|-----------------------------------------------------|--------------|
+| arch-wasm | @lewing | @lewing @BrzVlad | |
+
diff --git a/docs/coding-guidelines/api-guidelines/System.Memory.md b/docs/coding-guidelines/api-guidelines/System.Memory.md
index 894b8ca77d9e..6df28c18ca5d 100644
--- a/docs/coding-guidelines/api-guidelines/System.Memory.md
+++ b/docs/coding-guidelines/api-guidelines/System.Memory.md
@@ -51,4 +51,4 @@ specs can be found here:
can be implicitly converted to `ReadOnlySpan`.
* **AVOID** providing overloads for both `ReadOnlySpan`/`Span` as well as
pointers and arrays as those can be implicitly converted to
- `ReadOnlySpan`/`Span`.
\ No newline at end of file
+ `ReadOnlySpan`/`Span`.
diff --git a/docs/coding-guidelines/api-guidelines/nullability.md b/docs/coding-guidelines/api-guidelines/nullability.md
index 8c029d01fcce..9cb1b96525c2 100644
--- a/docs/coding-guidelines/api-guidelines/nullability.md
+++ b/docs/coding-guidelines/api-guidelines/nullability.md
@@ -99,6 +99,7 @@ The C# compiler respects a set of attributes that impact its flow analysis. We
- **DO** add `[NotNullIfNotNull(string)]` if nullable ref argument will be non-`null` upon exit, when an other argument passed evaluated to non-`null`, pass that argument name as string. Example: `public void Exchange([NotNullIfNotNull("value")] ref object? location, object? value);`.
- **DO** add `[return: NotNullIfNotNull(string)]` if a method would not return `null` in case an argument passed evaluated to non-`null`, pass that argument name as string. Example: `[return: NotNullIfNotNull("name")] public string? FormatName(string? name);`
- **DO** add `[MemberNotNull(string fieldName)]` to a helper method which initializes member field(s), passing in the field name. Example: `[MemberNotNull("_buffer")] private void InitializeBuffer()`. This will help to avoid spurious warnings at call sites that call the initialization method and then proceed to use the specified field. Note that there are two constructors to `MemberNotNull`; one that takes a single `string`, and one that takes a `params string[]`. When the number of fields initialized is small (e.g. <= 3), it's preferable to use multiple `[MemberNotNull(string)]` attributes on the method rather than one `[MemberNotNull(string, string, string, ...)]` attribute, as the latter is not CLS compliant and will likely require `#pragma warning disable` and `#pragma warning restore` around the line to suppress warnings.
+- **AVOID** using `[MaybeNull]`, not because it's problematic, but because there's almost always a better option, such as `T?` (as of this writing, in all of the dotnet/runtime there are only 7 occurrences of `[MaybeNull]`). One example of where it's applicable is `AsyncLocal.Value`; `[DisallowNull]` can't be used here, because `null` is valid if `T` is nullable, and `T?` shouldn't be used because `Value` shouldn't be set to `null` if `T` isn't nullable. Another is in the relatively rare case where a public or protected field is exposed, may begin life as null, but shouldn't be explicitly set to null.
## Code Review Guidance
@@ -113,7 +114,7 @@ A code review for enabling nullability generally involves three passes:
- Adding `!` to reference type usage. These essentially suppress the null warning, telling the compiler to treat the expression as if it's non-null. These evaporate at compile-time.
- Adding `Debug.Assert(reference != null);` statements. These inform the compiler that the mentioned reference is non-`null`, which will cause the compiler to factor that in and have the effect of suppressing subsequent warnings on that reference (until the flow analysis suggests that could change). As with any `Debug.Assert`, these evaporate at compile-time in release builds (where `DEBUG` isn't defined).
-
+
- Most any other changes have the potential to change the IL, which should not be necessary for the feature. In particular, it's common for `?`s on dereferences to sneak in, e.g. changing `someVar.SomeMethod()` to `someVar?.SomeMethod()`; that is a change to the IL, and should only be employed when there's an actual known bug that's important to fix, as otherwise we're incurring unnecessary cost. Similarly, it's easy to accidentally add `?` to value types, which has a significant impact, changing the `T` to a `Nullable` and should be avoided.
- Any `!`s added that should have been unnecessary and are required due to either a compiler issue or due to lack of expressibility about annotations should have a `// TODO-NULLABLE: http://link/to/relevant/issue` comment added on the same line.
diff --git a/docs/coding-guidelines/breaking-change-definitions.md b/docs/coding-guidelines/breaking-change-definitions.md
index 6eb6f958fc7e..dbcbfd6c6cde 100644
--- a/docs/coding-guidelines/breaking-change-definitions.md
+++ b/docs/coding-guidelines/breaking-change-definitions.md
@@ -6,7 +6,7 @@ Behavioral Change
A behavioral change represents changes to the behavior of a member. A behavioral change may including throwing a new exception, adding or removing internal method calls, or alternating the way in which a return value is calculated. Behavioral changes can be the hardest type of change to categorize as acceptable or not - they can be severe in impact, or relatively innocuous.
-Binary Compatibility
+Binary Compatibility
--------------------
Refers to the ability of existing consumers of an API to be able to use a newer version without recompilation. By definition, if an assembly's public signatures have been removed, or altered so that consumers can no longer access the same interface exposed by the assembly, the change is said to be a _binary incompatible change_.
@@ -16,19 +16,19 @@ Source Compatibility
Refers to the ability of existing consumers of an API to recompile against a newer version without any source changes. By definition, if a consumer needs to make changes to its code in order for it to build successfully against a newer version of an API, the change is said to be a _source incompatible change_.
-Design-Time Compatibility
+Design-Time Compatibility
-------------------------
_Design-time compatibility_ refers to preserving the design-time experience across versions of Visual Studio and other design-time environments. This can involve details around the UI of the designer, but by far the most interesting design-time compatibility is project compatibility. A potential project (or solution), must be able to be opened, and used on a newer version of a designer.
-Backwards Compatibility
+Backwards Compatibility
-----------------------
-_Backwards compatibility_ refers to the ability of an existing consumer of an API to run against, and behave in the same way against a newer version. By definition, if a consumer is not able to run, or behaves differently against the newer version of the API, then the API is said to be _backwards incompatible_.
+_Backwards compatibility_ refers to the ability of an existing consumer of an API to run against, and behave in the same way against a newer version. By definition, if a consumer is not able to run, or behaves differently against the newer version of the API, then the API is said to be _backwards incompatible_.
Changes that affect backwards compatibility are strongly discouraged. All alternates should be actively considered, since developers will, by default, expect backwards compatibility in newer versions of an API.
-Forwards Compatibility
+Forwards Compatibility
----------------------
_Forwards compatibility_ is the exact reverse of backwards compatibility; it refers to the ability of an existing consumer of an API to run against, and behave in the way against a _older_ version. By definition, if a consumer is not able to run, or behaves differently against an older version of the API, then the API is said to be _forwards incompatible_.
diff --git a/docs/coding-guidelines/breaking-change-rules.md b/docs/coding-guidelines/breaking-change-rules.md
index 6fff08837e16..ab230f9d279a 100644
--- a/docs/coding-guidelines/breaking-change-rules.md
+++ b/docs/coding-guidelines/breaking-change-rules.md
@@ -19,14 +19,14 @@ Breaking Change Rules
### Property, Field, Parameter and Return Values
✓ **Allowed**
* Increasing the range of accepted values for a property or parameter if the member _is not_ `virtual`
-
+
Note that the range can only increase to the extent that it does not impact the static type. e.g. it is OK to remove `if (x > 10) throw new ArgumentOutOfRangeException("x")`, but it is not OK to change the type of `x` from `int` to `long` or `int?`.
* Returning a value of a more derived type for a property, field, return or `out` value
Note, again, that the static type cannot change. e.g. it is OK to return a `string` instance where an `object` was returned previously, but it is not OK to change the return type from `object` to `string`.
-✗ **Disallowed**
+✗ **Disallowed**
* Increasing the range of accepted values for a property or parameter if the member _is_ `virtual`
This is breaking because any existing overridden members will now not function correctly for the extended range of values.
@@ -135,7 +135,7 @@ Breaking Change Rules
So long as it does not introduce any new abstract members or change the semantics or behavior of existing members, a type can be introduced into a hierarchy between two existing types. For example, between .NET Framework 1.1 and .NET Framework 2.0, we introduced `DbConnection` as a new base class for `SqlConnection` which previously derived from `Component`.
* Adding an interface implementation to a type
-
+
This is acceptable because it will not adversely affect existing clients. Any changes which could be made to the type being changed in this situation, will have to work within the boundaries of acceptable changes defined here, in order for the new implementation to remain acceptable.
Extreme caution is urged when adding interfaces that directly affect the ability of the designer or serializer to generate code or data, that cannot be consumed down-level. An example is the `ISerializable` interface.
Care should be taken when the interface (or one of the interfaces that this interface requires) has default interface implementations for other interface methods. The default implementation could conflict with other default implementations in a derived class.
@@ -205,7 +205,7 @@ Breaking Change Rules
* Adding an overload that precludes an existing overload, and defines different behavior
- This will break existing clients that were bound to the previous overload. For example, if you have a class that has a single version of a method that accepts a `uint`, an existing consumer will
+ This will break existing clients that were bound to the previous overload. For example, if you have a class that has a single version of a method that accepts a `uint`, an existing consumer will
successfully bind to that overload, if simply passing an `int` value. However, if you add an overload that accepts an `int`, recompiling or via late-binding the application will now bind to the new overload. If different behavior results, then this is a breaking change.
* Moving an exposed field onto a class higher in the hierarchy tree of the type from which it was removed
diff --git a/docs/coding-guidelines/breaking-changes.md b/docs/coding-guidelines/breaking-changes.md
index 5e4798cf7d1b..78b787cb70b8 100644
--- a/docs/coding-guidelines/breaking-changes.md
+++ b/docs/coding-guidelines/breaking-changes.md
@@ -97,7 +97,7 @@ more latitude here in .NET Core.
For buckets #2 and #3 we apply a risk-benefit analysis. It doesn't matter if the
old behavior is "wrong", we still need to think through the implications. This
-can result in one of the following outcomes:
+can result in one of the following outcomes:
* **Accepted with compat switch**. Depending on the estimated customer impact,
we may decide to add a compat switch that allows consumers to bring back the
diff --git a/docs/coding-guidelines/coding-style.md b/docs/coding-guidelines/coding-style.md
index 6686ac7702df..6181ee3dbe99 100644
--- a/docs/coding-guidelines/coding-style.md
+++ b/docs/coding-guidelines/coding-style.md
@@ -24,13 +24,14 @@ The general rule we follow is "use Visual Studio defaults".
9. If a file happens to differ in style from these guidelines (e.g. private members are named `m_member`
rather than `_member`), the existing style in that file takes precedence.
10. We only use `var` when it's obvious what the variable type is (e.g. `var stream = new FileStream(...)` not `var stream = OpenStandardInput()`).
-11. We use language keywords instead of BCL types (e.g. `int, string, float` instead of `Int32, String, Single`, etc) for both type references as well as method calls (e.g. `int.Parse` instead of `Int32.Parse`). See issue [391](https://github.com/dotnet/corefx/issues/391) for examples.
+11. We use language keywords instead of BCL types (e.g. `int, string, float` instead of `Int32, String, Single`, etc) for both type references as well as method calls (e.g. `int.Parse` instead of `Int32.Parse`). See issue [#13976](https://github.com/dotnet/runtime/issues/13976) for examples.
12. We use PascalCasing to name all our constant local variables and fields. The only exception is for interop code where the constant value should exactly match the name and value of the code you are calling via interop.
-13. We use ```nameof(...)``` instead of ```"..."``` whenever possible and relevant.
-14. Fields should be specified at the top within type declarations.
-15. When including non-ASCII characters in the source code use Unicode escape sequences (\uXXXX) instead of literal characters. Literal non-ASCII characters occasionally get garbled by a tool or editor.
-16. When using labels (for goto), indent the label one less than the current indentation.
-17. When using a single-statement if, we follow these conventions:
+13. We use PascalCasing for all method names, including local functions.
+14. We use ```nameof(...)``` instead of ```"..."``` whenever possible and relevant.
+15. Fields should be specified at the top within type declarations.
+16. When including non-ASCII characters in the source code use Unicode escape sequences (\uXXXX) instead of literal characters. Literal non-ASCII characters occasionally get garbled by a tool or editor.
+17. When using labels (for goto), indent the label one less than the current indentation.
+18. When using a single-statement if, we follow these conventions:
- Never use single-line form (for example: `if (source == null) throw new ArgumentNullException("source");`)
- Using braces is always accepted, and required if any block of an `if`/`else if`/.../`else` compound statement uses braces or if a single statement body spans multiple lines.
- Braces may be omitted only if the body of *every* block associated with an `if`/`else if`/.../`else` compound statement is placed on a single line.
diff --git a/docs/coding-guidelines/interop-guidelines.md b/docs/coding-guidelines/interop-guidelines.md
index e6e3a1d32060..7dff0711a8d3 100644
--- a/docs/coding-guidelines/interop-guidelines.md
+++ b/docs/coding-guidelines/interop-guidelines.md
@@ -58,7 +58,7 @@ internal static partial class Interop
```
As shown above, platforms may be additive, in that an assembly may use functionality from multiple folders, e.g. System.IO.FileSystem's Linux build will use functionality both from Unix (common across all Unix systems) and from Linux (specific to Linux and not available across non-Linux Unix systems).
-
+
- Interop.*.cs files are created in a way such that every assembly consuming the file will need every DllImport it contains.
- If multiple related DllImports will all be needed by every consumer, they may be declared in the same file, named for the functionality grouping, e.g. Interop.IOErrors.cs.
- Otherwise, in the limit (and the expected case for most situations) each Interop.*.cs file will contain a single DllImport and associated interop types (e.g. the structs used with that signature) and helper wrappers, e.g. Interop.strerror.cs.
@@ -104,7 +104,7 @@ internal static partial class Interop // contents of Common\src\Interop\Windows\
```
(Note that this will likely result in some extra constants defined in each assembly that uses interop, which minimally violates one of the goals, but it's very minimal.)
-
+
- .csproj project files then include the interop code they need, e.g.
```XML
@@ -170,10 +170,10 @@ To address this, we're moving to a model where all UNIX interop from dotnet/runt
Guidelines for shim C++ API:
-- Keep them as "thin"/1:1 as possible.
- - We want to write the majority of code in C#.
+- Keep them as "thin"/1:1 as possible.
+ - We want to write the majority of code in C#.
- Never skip the shim and P/Invoke directly to the underlying platform API. It's easy to assume something is safe/guaranteed when it isn't.
-- Don't cheat and take advantage of coincidental agreement between one flavor's ABI and the shim's ABI.
+- Don't cheat and take advantage of coincidental agreement between one flavor's ABI and the shim's ABI.
- Use PascalCase in a style closer to Win32 than libc.
- If an export point has a 1:1 correspondence to the platform API, then name it after the platform API in PascalCase (e.g. stat -> Stat, fstat -> FStat).
- If an export is not 1:1, then spell things out as we typically would in dotnet/runtime code (i.e. don't use abbreviations unless they come from the underlying API.
diff --git a/docs/coding-guidelines/project-guidelines.md b/docs/coding-guidelines/project-guidelines.md
index 36a43555afff..afc05f4037b2 100644
--- a/docs/coding-guidelines/project-guidelines.md
+++ b/docs/coding-guidelines/project-guidelines.md
@@ -1,41 +1,33 @@
# Build Project Guidelines
-In order to work in dotnet/runtime repo you must first run build.cmd/sh from the root of the repo at least
-once before you can iterate and work on a given library project.
+In order to work in the dotnet/runtime repo you must first run build.cmd/sh from the root of the repo at least once before you can iterate and work on a given library project.
## Behind the scenes with build.cmd/sh
-- Setup tools (currently done in restore in build.cmd/sh)
+- Restore tools
- Restore external dependencies
- CoreCLR - Copy to `bin\runtime\$(BuildTargetFramework)-$(TargetOS)-$(Configuration)-$(TargetArchitecture)`
- - Netstandard Library - Copy to `bin\ref\netstandard2.0`
- - NetFx targeting pack - Copy to `bin\ref\net472`
- Build targeting pack
- Build src\libraries\ref.proj which builds all references assembly projects. For reference assembly project information see [ref](#ref)
- Build product
- Build src\libraries\src.proj which builds all the source library projects. For source library project information see [src](#src).
-- Sign product
- - Build src\sign.proj
# Build Pivots
Below is a list of all the various options we pivot the project builds on:
-- **Target Frameworks:** NetFx (aka Desktop), netstandard (aka dotnet/Portable), NETCoreApp (aka .NET Core)
-- **Platform Runtimes:** NetFx (aka CLR/Desktop), CoreCLR, Mono
+- **Target Frameworks:** .NETFramework, .NETStandard, .NETCoreApp
+- **Platform Runtimes:** .NETFramework (aka CLR/Desktop), CoreCLR, Mono
- **OS:** Windows_NT, Linux, OSX, FreeBSD, AnyOS
- **Flavor:** Debug, Release
-- **Architecture:** x86, x64, arm, arm64, AnyCPU
## Individual build properties
The following are the properties associated with each build pivot
-- `$(BuildTargetFramework) -> netstandard2.1 | net5.0 | net472`
+- `$(BuildTargetFramework) -> Any .NETCoreApp or .NETFramework TFM, e.g. net5.0`
- `$(TargetOS) -> Windows | Linux | OSX | FreeBSD | [defaults to running OS when empty]`
- `$(Configuration) -> Release | [defaults to Debug when empty]`
- `$(TargetArchitecture) - x86 | x64 | arm | arm64 | [defaults to x64 when empty]`
- `$(RuntimeOS) - win7 | osx10.10 | ubuntu.14.04 | [any other RID OS+version] | [defaults to running OS when empty]` See [RIDs](https://github.com/dotnet/runtime/tree/master/src/libraries/pkg/Microsoft.NETCore.Platforms) for more info.
-For more information on various targets see also [.NET Standard](https://github.com/dotnet/standard/blob/master/docs/versions.md)
-
## Aggregate build properties
Each project will define a set of supported TargetFrameworks
@@ -60,21 +52,8 @@ Pure netstandard configuration:
All supported targets with unique windows/unix build for netcoreapp:
```
- $(NetCoreAppCurrent)-Windows_NT;$(NetCoreAppCurrent)-Unix;$(NetFrameworkCurrent)-Windows_NT
-
-```
-
-### Placeholder Target Frameworks
-Placeholder Target Framework can be added to the `` property to indicate the build system that the specific project is inbox in that framework and that Build Setting needs to be ignored.
-
-Placeholder target frameworks start with _ prefix.
-
-Example:
-When we have a project that has a `netstandard2.0` target framework that means that this project is compatible with any build setting. So if we do a vertical build for `net472` this project will be built as part of the vertical because `net472` is compatible with `netstandard2.0`. This means that in the runtime and testhost binaries the netstandard2.0 implementation will be included, and we will test against those assets instead of testing against the framework inbox asset. In order to tell the build system to not include this project as part of the `net472` vertical we need to add a placeholder target framework:
-```
+ $(NetCoreAppCurrent)-Windows_NT;$(NetCoreAppCurrent)-Unix;net461-Windows_NT
- netstandard2.0;_net472
-
```
## Options for building
@@ -94,7 +73,7 @@ When building an individual project the `BuildTargetFramework` and `TargetOS` wi
## Supported full build settings
- .NET Core latest on current OS (default) -> `$(NetCoreAppCurrent)-[RunningOS]`
-- .NET Framework latest -> `$(NetFrameworkCurrent)-Windows_NT`
+- .NET Framework latest -> `net48-Windows_NT`
# Library project guidelines
@@ -152,44 +131,34 @@ Reference assemblies are required for any library that has more than one impleme
In the ref directory for the library there should be at most **one** `.csproj` that contains the latest API for the reference assembly for the library. That project can contain multiple entries in its `TargetFrameworks` property. Ref projects should use `` for its dependencies.
### ref output
-The output for the ref project build will be a flat targeting pack folder in the following directory:
+All ref outputs should be under
-`bin\ref\$(TargetFramework)`
-
- //**CONSIDER**: Do we need a specific BuildTargetFramework version of TargetFramework for this output path to ensure all projects output to same targeting path?
+`bin\$(MSBuildProjectName)\ref\$(TargetFramework)`
## src
In the src directory for a library there should be only **one** `.csproj` file that contains any information necessary to build the library in various target frameworks. All supported target frameworks should be listed in the `TargetFrameworks` property.
-All libraries should use `` for all their project references. That will cause them to be resolved against a targeting pack (i.e. `bin\ref\net5.0` or `\bin\ref\netstandard2.0`) based on the project target framework. There should not be any direct project references to other libraries. The only exception to that rule right now is for partial facades which directly reference System.Private.CoreLib and thus need to directly reference other partial facades to avoid type conflicts.
- //**CONSIDER**: just using Reference and use a reference to System.Private.CoreLib as a trigger to turn the other References into a ProjectReference automatically. That will allow us to have consistency where all projects just use Reference.
+All libraries should use `` for all their references to libraries that compose the shared framework of the current .NETCoreApp. That will cause them to be resolved against the locally built targeting pack which is located at `artifacts\bin\microsoft.netcore.app.ref`. The only exception to that rule right now is for partial facades which directly reference System.Private.CoreLib and thus need to directly reference other partial facades to avoid type conflicts.
-### src output
-The output for the src product build will be a flat runtime folder into the following directory:
+Other target frameworks than .NETCoreApp latest (i.e. `netstandard2.0`, `net461`, `netcoreapp3.0`) should use ProjectReference items to reference dependencies.
-`bin\runtime\$(BuildSettings)`
+### src output
+All src outputs are under
-Note: The `BuildSettings` is a global property and not the project setting because we need all projects to output to the same runtime directory no matter which compatible target framework we select and build the project with.
-```$(BuildTargetFramework)-$(TargetOS)-(Configuration)-(TargetArchitecture)```
+`bin\$(MSBuildProjectName)\$(TargetFramework)`
## pkg
In the pkg directory for the library there should be only **one** `.pkgproj` for the primary package for the library. If the library has platform-specific implementations those should be split into platform specific projects in a subfolder for each platform. (see [Package projects](./package-projects.md))
-TODO: Outline changes needed for pkgprojs
-
## tests
Similar to the src projects tests projects will define a `TargetFrameworks` property so they can list out the set of target frameworks they support.
-Tests should not have any `` or `` items in their project because they will automatically reference everything in the targeting pack based on the TargetFramework they are building in. The only exception to this is a `` can be used to reference other test helper libraries or assets.
-
-In order to build and run a test project in a given build target framework a root level build.cmd/sh must have been completed for that build target framework first. Tests will run on the live built runtime at `bin\runtime\$(BuildSettings)`.
-TODO: We need update our test host so that it can run from the shared runtime directory as well as resolve assemblies from the test output directory.
+Tests don't need to reference default references which are part of the targeting packs (i.e. `mscorlib` on .NETFramework or `System.Runtime` on .NETCoreApp). Everything on top of targeting packs should be referenced via ProjectReference items for live built assets.
### tests output
All test outputs should be under
-`bin\tests\$(MSBuildProjectName)\$(TargetFramework)` or
-`bin\tests\$(MSBuildProjectName)\netstandard2.0`
+`bin\$(MSBuildProjectName)\$(TargetFramework)`
## Facades
Facade are unique in that they don't have any code and instead are generated by finding a contract reference assembly with the matching identity and generating type forwards for all the types to where they live in the implementation assemblies (aka facade seeds). There are also partial facades which contain some type forwards as well as some code definitions. All the various build configurations should be contained in the one csproj file per library.
diff --git a/docs/coding-guidelines/updating-ref-source.md b/docs/coding-guidelines/updating-ref-source.md
index a906f97eb040..a0599fae4dec 100644
--- a/docs/coding-guidelines/updating-ref-source.md
+++ b/docs/coding-guidelines/updating-ref-source.md
@@ -3,7 +3,7 @@ This document provides the steps you need to take to update the reference assemb
## For most assemblies within libraries
1. Implement the API in the source assembly and [build it](../workflow/building/libraries/README.md#building-individual-libraries). Note that when adding new public types, this might fail with a `TypeMustExist` error. The deadlock can be worked around by disabling the `RunApiCompat` property: `dotnet build /p:RunApiCompat=false`.
-2. Run the following command (from the src directory) `msbuild /t:GenerateReferenceAssemblySource` to update the reference assembly**.
+2. Run the following command (from the src directory) `dotnet msbuild /t:GenerateReferenceAssemblySource` to update the reference assembly**.
3. Navigate to the ref directory and build the reference assembly.
4. Add, build, and run tests.
@@ -15,3 +15,11 @@ These steps can also be applied to some unique assemblies which depend on change
1) Run `dotnet build --no-incremental /t:GenerateReferenceSource` from the System.Runtime/src directory.
2) Filter out all unrelated changes and extract the changes you care about (ignore certain attributes being removed). Generally, this step is not required for other reference assemblies.
+
+## For Full Facade Assemblies
+
+For assemblies that are "full facades" over another assembly (ex. System.Runtime.Serialization.Json or System.Xml.XDocument), use the following command to generate the reference source code instead:
+
+```
+dotnet msbuild /t:GenerateReferenceAssemblySource /p:GenAPIAdditionalParameters=--follow-type-forwards
+```
diff --git a/docs/design/coreclr/botr/corelib.md b/docs/design/coreclr/botr/corelib.md
index b23ddba8143a..288e4be0353b 100644
--- a/docs/design/coreclr/botr/corelib.md
+++ b/docs/design/coreclr/botr/corelib.md
@@ -201,7 +201,7 @@ Here's a real-world example from the `String` class:
```CSharp
public partial sealed class String
-{
+{
[MethodImpl(MethodImplOptions.InternalCall)]
private extern string? IsInterned();
diff --git a/docs/design/coreclr/botr/method-descriptor.md b/docs/design/coreclr/botr/method-descriptor.md
index 7d3f24ccf40f..453e850f1d7e 100644
--- a/docs/design/coreclr/botr/method-descriptor.md
+++ b/docs/design/coreclr/botr/method-descriptor.md
@@ -1,4 +1,4 @@
-Method Descriptor
+Method Descriptor
=================
Author: Jan Kotas ([@jkotas](https://github.com/jkotas)) - 2006
diff --git a/docs/design/coreclr/botr/readytorun-format.md b/docs/design/coreclr/botr/readytorun-format.md
index 8db3423dbadf..ff48f53c16c3 100644
--- a/docs/design/coreclr/botr/readytorun-format.md
+++ b/docs/design/coreclr/botr/readytorun-format.md
@@ -9,7 +9,7 @@ Revisions:
# Introduction
This document describes ReadyToRun format 3.1 implemented in CoreCLR as of June 2019 and not yet
-implemented proposed extensions 4.1 for the support of composite R2R file format.
+implemented proposed extensions 4.1 for the support of composite R2R file format.
**Composite R2R file format** has basically the same structure as the traditional R2R file format
defined in earlier revisions except that the output file represents a larger number of input MSIL
assemblies compiled together as a logical unit.
@@ -320,8 +320,8 @@ basic encoding, with extended encoding for large values).
## ReadyToRunSectionType.RuntimeFunctions
-This section contains sorted array of `RUNTIME_FUNCTION` entries that describe all code blocks in the image with pointers to their unwind info.
-Despite the name, these code block might represent a method body, or it could be just a part of it (e.g. a funclet) that requires its own unwind data.
+This section contains sorted array of `RUNTIME_FUNCTION` entries that describe all code blocks in the image with pointers to their unwind info.
+Despite the name, these code block might represent a method body, or it could be just a part of it (e.g. a funclet) that requires its own unwind data.
The standard Windows xdata/pdata format is used.
ARM format is used for x86 to compensate for the lack of x86 unwind info standard.
The unwind info blob is immediately followed by the GC info blob. The encoding slightly differs for amd64
diff --git a/docs/design/coreclr/botr/shared-generics.md b/docs/design/coreclr/botr/shared-generics.md
index 6b23563ebf22..367d2caa6d8b 100644
--- a/docs/design/coreclr/botr/shared-generics.md
+++ b/docs/design/coreclr/botr/shared-generics.md
@@ -47,7 +47,7 @@ This feature is currently only supported for instantiations over reference types
The dictionary used by any given generic method is pointed at by the `m_pPerInstInfo` field on the `InstantiatedMethodDesc` structure of that method. It's a direct pointer to the contents of the generic dictionary data.
-On generic types, there's an extra level of indirection: the `m_pPerInstInfo` field on the `MethodTable` structure is a pointer to a table of dictionaries, and each entry in that table is a pointer to the actual generic dictionary data. This is because types have inheritance, and derived generic types inherit the dictionaries of their base types.
+On generic types, there's an extra level of indirection: the `m_pPerInstInfo` field on the `MethodTable` structure is a pointer to a table of dictionaries, and each entry in that table is a pointer to the actual generic dictionary data. This is because types have inheritance, and derived generic types inherit the dictionaries of their base types.
Here's an example:
```c#
diff --git a/docs/design/coreclr/botr/type-system.md b/docs/design/coreclr/botr/type-system.md
index dba3a0e22fa7..d111fd79f03f 100644
--- a/docs/design/coreclr/botr/type-system.md
+++ b/docs/design/coreclr/botr/type-system.md
@@ -1,4 +1,4 @@
-Type System Overview
+Type System Overview
====================
Author: David Wrighton ([@davidwrighton](https://github.com/davidwrighton)) - 2010
diff --git a/docs/design/coreclr/botr/vectors-and-intrinsics.md b/docs/design/coreclr/botr/vectors-and-intrinsics.md
index 0e0848950c2c..2688db9ca376 100644
--- a/docs/design/coreclr/botr/vectors-and-intrinsics.md
+++ b/docs/design/coreclr/botr/vectors-and-intrinsics.md
@@ -3,7 +3,7 @@ Vectors and Hardware Intrinsics Support
---
# Introduction
-The CoreCLR runtime has support for several varieties of hardware intrinsics, and various ways to compile code which uses them. This support varies by target processor, and the code produced depends on how the jit compiler is invoked. This document describes the various behaviors of intrinsics in the runtime, and concludes with implications for developers working on the runtime and libraries portions of the runtime.
+The CoreCLR runtime has support for several varieties of hardware intrinsics, and various ways to compile code which uses them. This support varies by target processor, and the code produced depends on how the jit compiler is invoked. This document describes the various behaviors of intrinsics in the runtime, and concludes with implications for developers working on the runtime and libraries portions of the runtime.
# Acronyms and definitions
| Acronym | Definition
@@ -44,8 +44,8 @@ There are 2 different implementations of AOT compilation under development at th
###Code written in System.Private.CoreLib.dll
#### Crossgen implementation rules
-- Any code which uses `Vector` will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_SIMD_NGEN_DISALLOWED`)
-- Code which uses Sse and Sse2 platform hardware intrinsics is always generated as it would be at jit time.
+- Any code which uses `Vector` will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_SIMD_NGEN_DISALLOWED`)
+- Code which uses Sse and Sse2 platform hardware intrinsics is always generated as it would be at jit time.
- Code which uses Sse3, Ssse3, Sse41, Sse42, Popcnt, Pclmulqdq, and Lzcnt instruction sets will be generated, but the associated IsSupported check will be a runtime check. See `FilterNamedIntrinsicMethodAttribs` for details on how this is done.
- Code which uses other instruction sets will be generated as if the processor does not support that instruction set. (For instance, a usage of Avx2.IsSupported in CoreLib will generate native code where it unconditionally returns false, and then if and when tiered compilation occurs, the function may be rejitted and have code where the property returns true.)
- Non-platform intrinsics which require more hardware support than the minimum supported hardware capability will not take advantage of that capability. In particular the code generated for `Vector2/3/4.Dot`, and `Math.Round`, and `MathF.Round`. See `FilterNamedIntrinsicMethodAttribs` for details. MethodImplOptions.AggressiveOptimization may be used to disable precompilation compilation of this sub-par code.
@@ -58,8 +58,8 @@ The rules here provide the following characteristics.
- AOT generated code which could take advantage of more advanced hardware support experiences a performance penalty until rejitted. (If a customer chooses to disable tiered compilation, then customer code may always run slowly).
#### Code review rules for code written in System.Private.CoreLib.dll
-- Any use of a platform intrinsic in the codebase MUST be wrapped with a call to the associated IsSupported property. This wrapping MUST be done within the same function that uses the hardware intrinsic, and MUST NOT be in a wrapper function unless it is one of the intrinsics that are enabled by default for crossgen compilation of System.Private.CoreLib (See list above in the implementation rules section).
-- Within a single function that uses platform intrinsics, it must behave identically regardless of whether IsSupported returns true or not. This rule is required as code inside of an IsSupported check that calls a helper function cannot assume that the helper function will itself see its use of the same IsSupported check return true. This is due to the impact of tiered compilation on code execution within the process.
+- Any use of a platform intrinsic in the codebase MUST be wrapped with a call to the associated IsSupported property. This wrapping MUST be done within the same function that uses the hardware intrinsic, and MUST NOT be in a wrapper function unless it is one of the intrinsics that are enabled by default for crossgen compilation of System.Private.CoreLib (See list above in the implementation rules section).
+- Within a single function that uses platform intrinsics, it must behave identically regardless of whether IsSupported returns true or not. This rule is required as code inside of an IsSupported check that calls a helper function cannot assume that the helper function will itself see its use of the same IsSupported check return true. This is due to the impact of tiered compilation on code execution within the process.
- Excessive use of intrinsics may cause startup performance problems due to additional jitting, or may not achieve desired performance characteristics due to suboptimal codegen.
ACCEPTABLE Code
@@ -130,7 +130,7 @@ public class BitOperations
of this method may be compiled as if the Avx2 feature is not available, and is not reliably rejitted
at the same time as the PopCount function.
- As a special note, on the x86 and x64 platforms, this generally unsafe pattern may be used
+ As a special note, on the x86 and x64 platforms, this generally unsafe pattern may be used
with the Sse, Sse2, Sse3, Sssse3, Ssse41 and Sse42 instruction sets as those instruction sets
are treated specially by both crossgen1 and crossgen2 when compiling System.Private.CoreLib.dll.
}
@@ -140,16 +140,16 @@ public class BitOperations
### Code written in other assemblies (both first and third party)
#### Crossgen implementation rules
-- Any code which uses an intrinsic from the `System.Runtime.Intrinsics.Arm` or `System.Runtime.Intrinsics.X86` namespace will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_HWINTRINSIC_NGEN_DISALLOWED`)
-- Any code which uses `Vector` will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_SIMD_NGEN_DISALLOWED`)
-- Any code which uses `Vector64`, `Vector128` or `Vector256` will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_HWINTRINSIC_NGEN_DISALLOWED`)
+- Any code which uses an intrinsic from the `System.Runtime.Intrinsics.Arm` or `System.Runtime.Intrinsics.X86` namespace will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_HWINTRINSIC_NGEN_DISALLOWED`)
+- Any code which uses `Vector` will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_SIMD_NGEN_DISALLOWED`)
+- Any code which uses `Vector64`, `Vector128` or `Vector256` will not be compiled AOT. (See code which throws a TypeLoadException using `IDS_EE_HWINTRINSIC_NGEN_DISALLOWED`)
- Non-platform intrinsics which require more hardware support than the minimum supported hardware capability will not take advantage of that capability. In particular the code generated for Vector2/3/4 is sub-optimal. MethodImplOptions.AggressiveOptimization may be used to disable compilation of this sub-par code.
#### Characteristics which result from rules
The rules here provide the following characteristics.
- Use of platform specific hardware intrinsics causes runtime jit and startup time concerns.
- Use of `Vector` causes runtime jit and startup time concerns
-- AOT generated code which could take advantage of more advanced hardware support experiences a performance penalty until rejitted. (If a customer chooses to disable tiered compilation, then customer code may always run slowly).
+- AOT generated code which could take advantage of more advanced hardware support experiences a performance penalty until rejitted. (If a customer chooses to disable tiered compilation, then customer code may always run slowly).
#### Code review rules for use of platform intrinsics
- Any use of a platform intrinsic in the codebase SHOULD be wrapped with a call to the associated IsSupported property. This wrapping may be done within the same function that uses the hardware intrinsic, but this is not required as long as the programmer can control all entrypoints to a function that uses the hardware intrinsic.
@@ -183,7 +183,7 @@ Since System.Private.CoreLib.dll is known to be code reviewed with the code revi
# Mechanisms in the JIT to generate correct code to handle varied instruction set support
-The JIT receives flags which instruct it on what instruction sets are valid to use, and has access to a new jit interface api `notifyInstructionSetUsage(isa, bool supportBehaviorRequired)`.
+The JIT receives flags which instruct it on what instruction sets are valid to use, and has access to a new jit interface api `notifyInstructionSetUsage(isa, bool supportBehaviorRequired)`.
The notifyInstructionSetUsage api is used to notify the AOT compiler infrastructure that the code may only execute if the runtime environment of the code is exactly the same as the boolean parameter indicates it should be. For instance, if `notifyInstructionSetUsage(Avx, false)` is used, then the code generated must not be used if the `Avx` instruction set is useable. Similarly `notifyInstructionSetUsage(Avx, true)` will indicate that the code may only be used if the `Avx` instruction set is available.
diff --git a/docs/design/coreclr/botr/virtual-stub-dispatch.md b/docs/design/coreclr/botr/virtual-stub-dispatch.md
index af80f0a84c96..bf67c5895bcb 100644
--- a/docs/design/coreclr/botr/virtual-stub-dispatch.md
+++ b/docs/design/coreclr/botr/virtual-stub-dispatch.md
@@ -91,7 +91,7 @@ The following is a small class structure (modeled in C#), and what the resulting
![Figure 1](images/virtualstubdispatch-fig1.png)
-Thus, looking at this map, we see that the first column of the sub-maps of the slot maps correspond to the slot number in the classic virtual table view (remember that System.Object contributes four virtual methods of its own, which are omitted for clarity). Searches for method implementations are always bottom-up. Thus, if I had an object of type _B_ and I wished to invoke _I.Foo_, I would look for a mapping of _I.Foo_ starting at _B_'s slot map. Not finding it there, I would look in _A_'s slot map and find it there. It states that virtual slot 0 of _I_ (corresponding to _I.Foo_) is implemented by virtual slot 0. Then I return to _B_'s slot map and search for an implementation for slot 0, and find that it is implemented by slot 1 in its own implementation table.
+Thus, looking at this map, we see that the first column of the sub-maps of the slot maps correspond to the slot number in the classic virtual table view (remember that System.Object contributes four virtual methods of its own, which are omitted for clarity). Searches for method implementations are always bottom-up. Thus, if I had an object of type _B_ and I wished to invoke _I.Foo_, I would look for a mapping of _I.Foo_ starting at _B_'s slot map. Not finding it there, I would look in _A_'s slot map and find it there. It states that virtual slot 0 of _I_ (corresponding to _I.Foo_) is implemented by virtual slot 4. Then I return to _B_'s slot map and search for an implementation for virtual slot 4, and find that it is implemented by slot 1 in its own implementation table.
### Additional Uses
diff --git a/docs/design/coreclr/botr/xplat-minidump-generation.md b/docs/design/coreclr/botr/xplat-minidump-generation.md
index f0836ae5c214..46fd6bdf3727 100644
--- a/docs/design/coreclr/botr/xplat-minidump-generation.md
+++ b/docs/design/coreclr/botr/xplat-minidump-generation.md
@@ -1,6 +1,6 @@
# Introduction #
-Core dump generation on Linux and other non-Windows platforms has several challenges. Dumps can be very large and the default name/location of a dump is not consistent across all our supported platforms. The size of a full core dumps can be controlled somewhat with the "coredump_filter" file/flags but even with the smallest settings may be still too large and may not contain all the managed state needed for debugging. By default, some platforms use _core_ as the name and place the core dump in the current directory from where the program is launched; others add the _pid_ to the name. Configuring the core name and location requires superuser permission. Requiring superuser to make this consistent is not a satisfactory option.
+Dump generation on Windows, Linux and other non-Windows platforms has several challenges. Dumps can be very large and the default name/location of a dump is not consistent across all our supported platforms. The size of a full core dumps can be controlled somewhat with the "coredump_filter" file/flags but even with the smallest settings may be still too large and may not contain all the managed state needed for debugging. By default, some platforms use _core_ as the name and place the core dump in the current directory from where the program is launched; others add the _pid_ to the name. Configuring the core name and location requires superuser permission. Requiring superuser to make this consistent is not a satisfactory option.
Our goal is to generate core dumps that are on par with WER (Windows Error Reporting) crash dumps on any supported Linux platform. To the very least we want to enable the following:
- automatic generation of minimal size minidumps. The quality and quantity of the information contained in the dump should be on par with the information contained in a traditional Windows mini-dump.
@@ -12,7 +12,7 @@ Our solution at this time is to intercept any unhandled exception in the PAL lay
We looked at the existing technologies like Breakpad and its derivatives (e.g.: an internal MS version called _msbreakpad_ from the SQL team....). Breakpad generates Windows minidumps but they are not compatible with existing tools like Windbg, etc. Msbreakpad even more so. There is a minidump to Linux core conversion utility but it seems like a wasted extra step. _Breakpad_ does allow the minidump to be generated in-process inside the signal handlers. It restricts the APIs to what was allowed in a "async" signal handler (like SIGSEGV) and has a small subset of the C++ runtime that was also similarly constrained. We also need to add the set of memory regions for the "managed" state which requires loading and using the _DAC_'s (*) enumerate memory interfaces. Loading modules is not allowed in an async signal handler but forking/execve is allowed so launching an utility that loads the _DAC_, enumerates the list of memory regions and writes the dump is the only reasonable option. It would also allow uploading the dump to a server too.
-\* The _DAC_ is a special build of parts of the coreclr runtime that allows inspection of the runtime's managed state (stacks, variables, GC state heaps) out of context. One of the many interfaces it provides is [ICLRDataEnumMemoryRegions](https://github.com/dotnet/runtime/blob/master/src/coreclr/src/debug/daccess/dacimpl.h) which enumerates all the managed state a minidump would require to enable a fuitful debugging experience.
+\* The _DAC_ is a special build of parts of the coreclr runtime that allows inspection of the runtime's managed state (stacks, variables, GC state heaps) out of context. One of the many interfaces it provides is [ICLRDataEnumMemoryRegions](https://github.com/dotnet/runtime/blob/master/src/coreclr/src/debug/daccess/dacimpl.h) which enumerates all the managed state a minidump would require to enable a fruitful debugging experience.
_Breakpad_ could have still been used out of context in the generation utility but there seemed no value to their Windows-like minidump format when it would have to be converted to the native Linux core format away because in most scenarios using the platform tools like _lldb_ is necessary. It also adds a coreclr build dependency on Google's _Breakpad_ or SQL's _msbreakpad_ source repo. The only advantage is that the breakpad minidumps may be a little smaller because minidumps memory regions are byte granule and Linux core memory regions need to be page granule.
@@ -42,7 +42,11 @@ There will be some differences gathering the crash information but these platfor
### OS X ###
-Gathering the crash information on OS X will be quite a bit different than Linux and the core dump will be written in the Mach-O format instead of ELF. The OS X support currently has not been implemented.
+As of .NET 5.0, createdump is supported on MacOS but instead of the MachO dump format, it generates the ELF coredumps. This is because of time constraints developing a MachO dump writer on the generation side and a MachO reader for the diagnostics tooling side (dotnet-dump and CLRMD). This means the native debuggers like gdb and lldb will not work with these dumps but the dotnet-dump tool will allow the managed state to be analyzed. Because of this behavior an additional environment variable will need to be set (COMPlus_DbgEnableElfDumpOnMacOS=1) along with the ones below in the Configuration/Policy section.
+
+### Windows ###
+
+As of .NET 5.0, createdump and the below configuration environment variables are supported on Windows. It is implemented using the Windows MiniDumpWriteDump API. This allows consistent crash/unhandled exception dumps across all of our platforms.
# Configuration/Policy #
@@ -75,14 +79,25 @@ The createdump utility can also be run from the command line on arbitrary .NET C
`sudo createdump `
- createdump [options] pid
- -f, --name - dump path and file name. The pid can be placed in the name with %d. The default is "/tmp/coredump.%d"
- -n, --normal - create minidump (default).
- -h, --withheap - create minidump with heap.
+ -f, --name - dump path and file name. The %p, %e, %h %t format characters are supported. The default is '/tmp/coredump.%p'
+ -n, --normal - create minidump.
+ -h, --withheap - create minidump with heap (default).
-t, --triage - create triage minidump.
-u, --full - create full core dump.
-d, --diag - enable diagnostic messages.
+
+**Dump name formatting**
+
+As of .NET 5.0, the following subset of the core pattern (see [core](https://man7.org/linux/man-pages/man5/core.5.html)) dump name formatting is supported:
+
+ %% A single % character.
+ %d PID of dumped process (for backwards createdump compatibility).
+ %p PID of dumped process.
+ %e The process executable filename.
+ %h Hostname return by gethostname().
+ %t Time of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).
+
# Testing #
The test plan is to modify the SOS tests in the (still) private debuggertests repo to trigger and use the core minidumps generated. Debugging managed core dumps on Linux is not supported by _mdbg_ at this time until we have a ELF core dump reader so only the SOS tests (which use _lldb_ on Linux) will be modified.
diff --git a/docs/design/coreclr/jit/GuardedDevirtualization.md b/docs/design/coreclr/jit/GuardedDevirtualization.md
index 95b3caa65364..84eeaa085f72 100644
--- a/docs/design/coreclr/jit/GuardedDevirtualization.md
+++ b/docs/design/coreclr/jit/GuardedDevirtualization.md
@@ -28,7 +28,7 @@ happens quite early (during importation) and there is only minimal ability to do
data flow analysis at this stage. So for current devirtualization the source of
the type information and the consumption must be fairly close in the code. A
more detailed accounting of some of the shortcomings can be found in
-[CoreCLR#9908](https://github.com/dotnet/coreclr/issues/9908).
+[#7541](https://github.com/dotnet/runtime/issues/7541).
Resolution of these issues will improve the ability of the JIT to devirtualize,
but even the best analysis possible will still miss out on many cases. Some call
@@ -277,7 +277,7 @@ setup, may be able to optimize away the null check, and opens the door for
inlining. So it should be slightly cheaper on average and significantly cheaper
in some cases.
-(Note [CoreCLR#1422](https://github.com/dotnet/coreclr/issues/14222) indicates
+(Note [#9027](https://github.com/dotnet/runtime/issues/9027) indicates
we should be able to optimize away the null check in any case).
If the guarded tests fails we've filtered out one method table the dispatch cell
diff --git a/docs/design/coreclr/jit/JitOptimizerTodoAssessment.md b/docs/design/coreclr/jit/JitOptimizerTodoAssessment.md
index 7799abdabf6c..1c1eec65a4b6 100644
--- a/docs/design/coreclr/jit/JitOptimizerTodoAssessment.md
+++ b/docs/design/coreclr/jit/JitOptimizerTodoAssessment.md
@@ -72,8 +72,8 @@ high priority.
We haven't been targeting benchmarks that spend a lot of time doing computations
in an inner loop. Pursuing loop optimizations for the peanut butter effect
would seem odd. So this simply hasn't bubbled up in priority yet, though it's
-bound to eventually. Obvious candidates include [IV widening](https://github.com/dotnet/coreclr/issues/9179),
-[unrolling](https://github.com/dotnet/coreclr/issues/11606), load/store motion,
+bound to eventually. Obvious candidates include [IV widening](https://github.com/dotnet/runtime/issues/7312),
+[unrolling](https://github.com/dotnet/runtime/issues/8107), load/store motion,
and strength reduction.
@@ -112,7 +112,7 @@ handle SSA renames.
We've made note of the prevalence of async/await in modern code (and particularly
in web server code such as TechEmpower), and have some opportunities listed in
-[#7914](https://github.com/dotnet/coreclr/issues/7914). Some sort of study of
+[#6916](https://github.com/dotnet/runtime/issues/6916). Some sort of study of
async peanut butter to find more opportunities is probably in order, but what
would that look like?
@@ -120,7 +120,7 @@ would that look like?
### If-Conversion (cmov formation)
This hits big in microbenchmarks where it hits. There's some work in flight
-on this (see [#7447](https://github.com/dotnet/coreclr/issues/7447) and
+on this (see [#6749](https://github.com/dotnet/runtime/issues/6749) and
[#10861](https://github.com/dotnet/coreclr/pull/10861)).
@@ -149,7 +149,7 @@ helpers that are known not to trash them, but the information about which
helpers trash which registers is spread across a few places in the codebase,
and has some puzzling quirks like separate "GC" and "NoGC" kill sets for the
same helper. Unifying the information sources and then refining the recorded
-kill sets would help avoid more stack traffic. See [#12940](https://github.com/dotnet/coreclr/issues/12940).
+kill sets would help avoid more stack traffic. See [#8605](https://github.com/dotnet/runtime/issues/8605).
Low-Hanging Fruit
-----------------
@@ -160,8 +160,8 @@ The MSIL `switch` instruction is actually encoded as a jump table, so (for
better or worse) intelligent optimization of source-level switch statements
largely falls to the MSIL generator (e.g. Roslyn), since encoding sparse
switches as jump tables in MSIL would be impractical. That said, when the MSIL
-has a switch of just a few cases (as in [#12868](https://github.com/dotnet/coreclr/issues/12868)),
-or just a few distinct cases that can be efficiently checked (as in [#12477](https://github.com/dotnet/coreclr/issues/12477)),
+has a switch of just a few cases (as in [#8573](https://github.com/dotnet/runtime/issues/8573)),
+or just a few distinct cases that can be efficiently checked (as in [#8418](https://github.com/dotnet/runtime/issues/8418)),
the JIT needn't blindly emit these as jump tables in the native code. Work is
underway to address the latter case in [#12552](https://github.com/dotnet/coreclr/pull/12552).
@@ -170,7 +170,7 @@ underway to address the latter case in [#12552](https://github.com/dotnet/corecl
A number of suggestions have been made for having the JIT recognize certain
patterns and emit specialized write barriers that avoid various overheads --
-see [#13006](https://github.com/dotnet/coreclr/issues/13006) and [#12812](https://github.com/dotnet/coreclr/issues/12812).
+see [#8627](https://github.com/dotnet/runtime/issues/8627) and [#8547](https://github.com/dotnet/runtime/issues/8547).
### Byref-Exposed Store/Load Value Propagation
@@ -178,8 +178,8 @@ see [#13006](https://github.com/dotnet/coreclr/issues/13006) and [#12812](https:
There are a few tweaks to our value-numbering for byref-exposed loads and stores
to share some of the machinery we use for heap loads and stores that would
allow better propagation through byref-exposed locals and out parameters --
-see [#13457](https://github.com/dotnet/coreclr/issues/13457) and
-[#13458](https://github.com/dotnet/coreclr/issues/13458).
+see [#8767](https://github.com/dotnet/runtime/issues/8767) and
+[#8768](https://github.com/dotnet/runtime/issues/8768).
Miscellaneous
-------------
@@ -199,4 +199,4 @@ Maybe it's worth reconsidering the priority based on throughput?
RyuJIT has an implementation that handles the valuable cases (see [analysis](https://gist.github.com/JosephTremoulet/c1246b17ea2803e93e203b9969ee5a25#file-mulshift-md)
and [follow-up](https://github.com/dotnet/coreclr/pull/13128) for details).
The current implementation is split across Morph and CodeGen; ideally it would
-be moved to Lower, which is tracked by [#13150](https://github.com/dotnet/coreclr/issues/13150).
+be moved to Lower, which is tracked by [#8668](https://github.com/dotnet/runtime/issues/8668).
diff --git a/docs/design/coreclr/jit/first-class-structs.md b/docs/design/coreclr/jit/first-class-structs.md
index 2153b8cb96aa..91e889831561 100644
--- a/docs/design/coreclr/jit/first-class-structs.md
+++ b/docs/design/coreclr/jit/first-class-structs.md
@@ -213,7 +213,7 @@ This would be done in multiple phases:
for a general idea of the kinds of VM changes that may be required.
* Defer retyping of struct return types (`Compiler::impFixupStructReturnType()` and
`Compiler::impFixupCallStructReturn()`)
- * This is probably the "right" way to fix [#26491](https://github.com/dotnet/coreclr/issues/26491).
+ * This is probably the "right" way to fix [#13355](https://github.com/dotnet/runtime/issues/13355).
* Next, eliminate the "pessimizations".
* For cases where `GT_LCL_FLD` is currently used to "retype" the struct, change it to use *either*
`GT_LCL_FLD`, if it is already address-taken, or to use a `GT_BITCAST` otherwise.
@@ -230,7 +230,7 @@ This would be done in multiple phases:
* The removal of each of these pessimizations should result in improved code generation
in cases where previously disabled optimizations are now enabled.
* Other ABI-related issues:
- * [#8289](https://github.com/dotnet/coreclr/issues/8289) - code generation for x86 promoted struct args.
+ * [#7048](https://github.com/dotnet/runtime/issues/7048) - code generation for x86 promoted struct args.
Related issues: #1133 (maybe), #4766, #23675, #23129
@@ -262,14 +262,14 @@ This would be enabled first by [Defer ABI-specific transformations to Lowering](
(#10019, #9594, #7313)
* Support partial struct promotion when some fields are more frequently accessed.
* Aggressively promote lclVar struct incoming or outgoing args or returns whose fields match the ABI requirements.
- * This should address [\#26710](https://github.com/dotnet/coreclr/issues/26710).
+ * This should address [\#13417](https://github.com/dotnet/runtime/issues/13417).
* Aggressively promote pointer-sized fields of structs used as args or returns
* Allow struct promotion of locals that are passed or returned in a way that doesn't match
the field types.
* Investigate whether it would be useful to re-type single-field structs, rather than creating new lclVars.
This would complicate type analysis when copied, passed or returned, but would avoid unnecessarily expanding
the lclVar data structures.
- * Allow promotion of 32-byte SIMD on 16-byte alignment [\#24368](https://github.com/dotnet/coreclr/issues/24368)
+ * Allow promotion of 32-byte SIMD on 16-byte alignment [\#12623](https://github.com/dotnet/runtime/issues/12623)
* Related: #6839, #9477, #16887
* Also, #11888, which suggests adding a struct promotion stress mode.
@@ -294,7 +294,7 @@ Struct-Related Issues in RyuJIT
The following issues illustrate some of the motivation for improving the handling of value types
(structs) in RyuJIT:
-* [\#11407 [RyuJIT] Fully enregister structs that fit into a single register when profitable](https://github.com/dotnet/coreclr/issues/11407), also VSO Bug 98404: .NET JIT x86 - poor code generated for value type initialization
+* [\#8016 [RyuJIT] Fully enregister structs that fit into a single register when profitable](https://github.com/dotnet/runtime/issues/8016), also VSO Bug 98404: .NET JIT x86 - poor code generated for value type initialization
* This is a simple test case that should generate simply `xor eax; ret` on x86 and x64, but
instead generates many unnecessary copies. It is addressed by full enregistration of
structs that fit into a register. See [Support Full Enregistration of Struct Types](#support-full-enregistration-of-struct-types):
@@ -304,7 +304,7 @@ struct foo { public byte b1, b2, b3, b4; }
static foo getfoo() { return new foo(); }
```
-* [\#1133 JIT: Excessive copies when inlining](https://github.com/dotnet/coreclr/issues/1133)
+* [\#4308 JIT: Excessive copies when inlining](https://github.com/dotnet/runtime/issues/4308)
* The scenario given in this issue involves a struct that is larger than 8 bytes, so
it is not impacted by the fixed-size types. However, by enabling value numbering and assertion propagation
for struct types (which, in turn is made easier by using normal assignments), the
@@ -314,54 +314,54 @@ static foo getfoo() { return new foo(); }
in the first place.
* This case may now be handled; needs verification
-* [\#1161 RyuJIT properly optimizes structs with a single field if the field type is int but not if it is double](https://github.com/dotnet/coreclr/issues/1161)
+* [\#4323 RyuJIT properly optimizes structs with a single field if the field type is int but not if it is double](https://github.com/dotnet/runtime/issues/4323)
* This issue arises because we never promote a struct with a single double field, due to
the fact that such a struct may be passed or returned in a general purpose register.
This issue could be addressed independently, but should "fall out" of improved heuristics
for when to promote and enregister structs.
- * Related: [\#8828](https://github.com/dotnet/coreclr/issues/8828)
+ * Related: [\#7200](https://github.com/dotnet/runtime/issues/7200)
* [\#1636 Add optimization to avoid copying a struct if passed by reference and there are no
- writes to and no reads after passed to a callee](https://github.com/dotnet/coreclr/issues/1636).
+ writes to and no reads after passed to a callee](https://github.com/dotnet/runtime/issues/4524).
* This issue is related to #1133, except that in this case the desire is to
eliminate unneeded copies locally (i.e. not just due to inlining), in the case where
the struct may or may not be passed or returned directly.
* Unfortunately, there is not currently a scenario or test case for this issue.
-* [\#19425 Unix: Unnecessary struct copy while passsing struct of size <=16](https://github.com/dotnet/coreclr/issues/19425)
-* [\#16619 [RyuJIT] Eliminate unecessary copies when passing structs](https://github.com/dotnet/coreclr/issues/16619)
+* [\#10879 Unix: Unnecessary struct copy while passing struct of size <=16](https://github.com/dotnet/runtime/issues/10879)
+* [\#9839 [RyuJIT] Eliminate unecessary copies when passing structs](https://github.com/dotnet/runtime/issues/9839)
* These require changing both the callsite and the callee to avoid copying the parameter onto the stack.
-* [\#3144 Avoid marking tmp as DoNotEnregister in tmp=GT_CALL() where call returns a
- enregisterable struct in two return registers](https://github.com/dotnet/coreclr/issues/3144)
+* [\#5112 Avoid marking tmp as DoNotEnregister in tmp=GT_CALL() where call returns a
+ enregisterable struct in two return registers](https://github.com/dotnet/runtime/issues/5112)
* This issue could be addressed without First Class Structs. However, it
should be done along with the streamlining of the handling of ABI-specific struct passing
and return values.
-* [\#4766 Pi-Digits: Extra Struct copies of BigInteger](https://github.com/dotnet/coreclr/issues/4766)
+* [\#5785 Pi-Digits: Extra Struct copies of BigInteger](https://github.com/dotnet/runtime/issues/5785)
* In addition to suffering from the same issue as #1133, this has a struct that is promoted even though it is
passed (by reference) to its non-inlined constructor. This means that any copy to/from this struct will be field-by-field.
-* [\#11816 Extra zeroing with structs and inlining](https://github.com/dotnet/coreclr/issues/11816)
+* [\#8186 Extra zeroing with structs and inlining](https://github.com/dotnet/runtime/issues/8186)
* This issue illustrates the failure of the JIT to eliminate zero-initialization of structs that are subsequently fully
defined. It is a related but somewhat different manifestation of the issue in #1133, i.e. that structs are not
fully supported in value numbering and optimization.
-* [\#12865 JIT: inefficient codegen for calls returning 16-byte structs on Linux x64](https://github.com/dotnet/coreclr/issues/12865)
+* [\#8571 JIT: inefficient codegen for calls returning 16-byte structs on Linux x64](https://github.com/dotnet/runtime/issues/8571)
* This is related to #3144, and requires supporting the assignment of a multi-reg call return into a promoted local variable,
and enabling subsequent elimination of any redundant copies.
-* [\#22445](https://github.com/dotnet/coreclr/issues/22445) and [\#22319](https://github.com/dotnet/coreclr/issues/22319)
+* [\#11992](https://github.com/dotnet/runtime/issues/11992) and [\#11940](https://github.com/dotnet/runtime/issues/11940)
* These are both cases where we introduce a `GT_LCL_FLD` to retype a value that needs
to be passed in a register.
## Other Struct-related Issues
-* [\#17207](https://github.com/dotnet/coreclr/issues/17207)
+* [\#10029](https://github.com/dotnet/runtime/issues/10029)
* This suffers from pessimization due to poor handling of conversion (`Unsafe.As`) from `Quaternion` to `Vector4`.
It's not immediately clear what's the best way to improve this.
-* [#7740](https://github.com/dotnet/coreclr/issues/7740)
+* [#6858](https://github.com/dotnet/runtime/issues/6858)
* Addressing mode expression optimization for struct fields
Sample IR
diff --git a/docs/design/coreclr/jit/jit-call-morphing.md b/docs/design/coreclr/jit/jit-call-morphing.md
index cf46fa674b14..5c99ac293912 100644
--- a/docs/design/coreclr/jit/jit-call-morphing.md
+++ b/docs/design/coreclr/jit/jit-call-morphing.md
@@ -17,7 +17,6 @@ post/pre increment, perhaps like this: `Foo(j, a[j++])`. Here `j` is updated vi
when the second arg is evaluated, so the earlier uses of `j` would need to be evaluated and
saved in a new LclVar.
-
One simple approach would be to create new single definition, single use LclVars for every argument
that is passed. This would preserve the evaluation order. However, it would potentially create
hundreds of LclVar for moderately sized methods and that would overflow the limited number of
@@ -25,7 +24,6 @@ tracked local variables in the JIT. One observation is that many arguments to m
either constants or LclVars and can be set up anytime we want. They usually will not need a
new LclVar to preserve the order of evaluation rule.
-
Each argument is an arbitrary expression tree. The JIT tracks a summary of observable side-effects
using a set of five bit flags in every GenTree node: `GTF_ASG`, `GTF_CALL`, `GTF_EXCEPT`, `GTF_GLOB_REF`,
and `GTF_ORDER_SIDEEFF`. These flags are propagated up the tree so that the top node has a particular
diff --git a/docs/design/coreclr/jit/lsra-detail.md b/docs/design/coreclr/jit/lsra-detail.md
index 7a35d1947adf..a637b8ac6982 100644
--- a/docs/design/coreclr/jit/lsra-detail.md
+++ b/docs/design/coreclr/jit/lsra-detail.md
@@ -3,25 +3,54 @@ Linear Scan Register Allocation: Design and Implementation Notes
Table of Contents
-----------------
-[Overview](#overview)
-
-[Preconditions](#preconditions)
-
-[Post-Conditions](#post-conditions)
-
-[LSRA Phases](#lsra-phases)
-
-[Key Data Structures](#key-data-structures)
-
-[Dumps and Debugging Support](#dumps-and-debugging-support)
-
-[LSRA Stress Modes](#lsra-stress-modes)
-
-[Assertions & Validation](#assertions-validation)
-
-[Future Extensions and Enhancements](#future-extensions-and-enhancements)
-
-[References](#references)
+ * [Overview](#overview)
+ * [Preconditions](#preconditions)
+ + [Lowered IR Form (LIR)](#lowered-ir-form-lir)
+ + [Register Requirements](#register-requirements)
+ * [Post-Conditions](#post-conditions)
+ * [LSRA Phases](#lsra-phases)
+ + [Liveness and Candidate Identification](#liveness-and-candidate-identification)
+ + [Block Ordering](#block-ordering)
+ + [Building Intervals and RefPositions](#building-intervals-and-refpositions)
+ + [Register allocation (doLinearScan)](#register-allocation-dolinearscan)
+ * [Key Data Structures](#key-data-structures)
+ + [Live In](#live-in)
+ + [currentLiveVars](#currentlivevars)
+ + [Referenceable](#referenceable)
+ + [Interval](#interval)
+ + [RegRecord](#regrecord)
+ + [RefPosition](#refposition)
+ + [GenTree Nodes](#gentree-nodes)
+ + [VarToRegMap](#vartoregmap)
+ * [Dumps and Debugging Support](#dumps-and-debugging-support)
+ * [LSRA Stress Modes](#lsra-stress-modes)
+ * [Assertions & Validation](#assertions--validation)
+ * [Future Extensions and Enhancements](#future-extensions-and-enhancements)
+ * [Feature Enhancements](#feature-enhancements)
+ + [Support for Allocating Consecutive Registers](#support-for-allocating-consecutive-registers)
+ * [Code Quality Enhancements](#code-quality-enhancements)
+ + [Merge Allocation of Free and Busy Registers](#merge-allocation-of-free-and-busy-registers)
+ + [Auto-tuning of register selection](#auto-tuning-of-register-selection)
+ + [Pre-allocating high frequency lclVars](#pre-allocating-high-frequency-lclvars)
+ + [Avoid Splitting Loop Backedges](#avoid-splitting-loop-backedges)
+ + [Enable EHWriteThru by default](#enable-ehwritethru-by-default)
+ + [Avoid Spill When Stack Copy is Valid](#avoid-spill-when-stack-copy-is-valid)
+ + [Rematerialization](#rematerialization)
+ + [Improving Reg-Optional Support](#improving-reg-optional-support)
+ - [Reg-Optional Defs](#reg-optional-defs)
+ - [Don't Pre-determine Reg-Optional Operand](#dont-pre-determine-reg-optional-operand)
+ - [Don't Mark DelayFree for Duplicate Operands](#dont-mark-delayfree-for-duplicate-operands)
+ + [Improving Preferencing](#improving-preferencing)
+ + [Leveraging SSA form](#leveraging-ssa-form)
+ + [Spanning trees for physical registers](#spanning-trees-for-physical-registers)
+ + [Improve the handling of def/use conflicts](#improve-the-handling-of-defuse-conflicts)
+ * [Throughput Enhancements](#throughput-enhancements)
+ + [Allocation Window for Min-Opts and Tier 0](#allocation-window-for-min-opts-and-tier-0)
+ + [Distinguish Intra-Block versus Inter-Block Variables](#distinguish-intra-block-versus-inter-block-variables)
+ + [Improve the VarToRegMap](#improve-the-vartoregmap)
+ + [Other Throughput Investigations](#other-throughput-investigations)
+ * [Test and Cleanup Issues](#test-and-cleanup-issues)
+ * [References](#references)
Overview
--------
@@ -63,7 +92,7 @@ There are four main phases to LSRA:
- Note that the order doesn't affect correctness, as the
location of `lclVar`s across block boundaries is fixed up
- as necessary by the resolution phase. When not optimizing
+ as necessary by the resolution phase. When not optimizing,
`lclVar`s are not enregistered, so there is no benefit to
using a different order.
@@ -98,6 +127,12 @@ There are four main phases to LSRA:
as both a source and target (where the source is not
marked `delayRegFree`.
+ - An exception is multi-reg local stores of multi-reg sources.
+ For these, the code generator will read each source register,
+ and then move it, if needed, to the destination register.
+ These nodes have 2*N locations where N is the number of registers,
+ so that the liveness can be reflected accordingly.
+
- For each node, `RefPosition`s are built to reflect the uses,
definitions and kills of any registers involved in the
evaluation of the node.
@@ -119,7 +154,8 @@ There are four main phases to LSRA:
- Splitting or spilling an `Interval` doesn't involve creating a new
one. Instead, the `RefPosition` simply gets a new assignment, and
is either marked for reload/copy or its location is simply
- updated in the incoming map.
+ updated in the incoming map. This differs from other linear-scan
+ allocators, where separate intervals are constructed for this case.
- The resolution phase has two parts:
@@ -246,11 +282,11 @@ Post-Conditions
After LSRA, the graph has the following properties:
-- The `gtRegNum` of each tree node contains the allocated register,
+- The `_gtRegNum` of each tree node (`GetRegNum()`) contains the allocated register,
if any. Nodes that produce multiple registers are similarly
assigned, via extended register number fields. If the node does not
produce a value directly (i.e. it is either of void type, or it is
- evaluated as part of its parent) its gtRegNum is set to REG_NA.
+ evaluated as part of its parent) its `_gtRegNum` is set to `REG_NA`.
- In most cases, this register must satisfy the constraints
specified for each `RefPosition` by the `BuildNode` methods.
@@ -273,20 +309,24 @@ After LSRA, the graph has the following properties:
- However, if such a node is constrained to a set of registers,
and its current location does not satisfy that requirement, LSRA
- must insert a `GT_COPY` node between the node and its parent.
- The gtRegNum on the `GT_COPY` node must satisfy the register
+ must insert a `GT_COPY` node between the node and its parent.
+ The `_gtRegNum` on the `GT_COPY` node must satisfy the register
requirement of the parent.
-- GenTree::gtRsvdRegs has a set of registers used for internal temps.
+- `GenTree::gtRsvdRegs` has a set of registers used for internal temps.
These must satisfy the constraints specified by the associated `RefPosition`s.
- A tree node is marked `GTF_SPILL` if the tree node must be spilled by
the code generator after it has been evaluated.
+ - Note that a write-thru variable def is always written to the stack, and the `GTF_SPILLED`
+ flag (not otherwise used for pure defs) to indicate that it also remains live
+ in the assigned register.
+
- A tree node is marked `GTF_SPILLED` if it is a lclVar that must be
reloaded prior to use.
- - The register (gtRegNum) on the node indicates the register to
+ - The register (`_gtRegNum`) on the node indicates the register to
which it must be reloaded.
- For lclVar nodes, since the uses and defs are distinct tree
@@ -299,18 +339,23 @@ After LSRA, the graph has the following properties:
insert a `GT_RELOAD` node to specify the register to which it
should be reloaded.
+- Note that `GT_COPY` and `GT_RELOAD` nodes are inserted immediately after the
+ instruction that must be copied or reloaded. However, the reload or copy
+ isn't actually generated until the code generator is generating code for
+ the consuming node.
+
- Local variable table (`LclVarDsc`):
- `LclVarDsc::lvRegister` is set to true if a local variable has the
same register assignment for its entire lifetime.
- - `LclVarDsc::lvRegNum` is initialized to its initial register
+ - `LclVarDsc::_lvRegNum` is initialized to its initial register
assignment.
- For incoming parameters, this is the register to which
`genFnPrologCalleeRegArgs()` will move it.
- - Codegen will set `lvRegNum` to its current value as it processes
+ - Codegen will set `_lvRegNum` to its current value as it processes
the trees, since a variable can be assigned different registers
over its lifetimes.
@@ -347,7 +392,7 @@ well as supporting components) in more depth.
should probably handle them in `Compiler::lvaMarkLocalVars()`
when it is called after `Lowering`.
- - It sets the ` lvLRACandidate` flag on lclVars that are going
+ - It sets the `lvLRACandidate` flag on lclVars that are going
to be register candidates.
### Block Ordering
@@ -364,6 +409,8 @@ that satisfies the following properties:
- We use block weight, since edge weight is not tracked in the
JIT.
+- Blocks that enter EH regions have no predecessor. All live-in vars are on the stack.
+
The order of the `BasicBlock`s is captured in the `blockSequence` member of `LinearScan`.
Other implementations of linear scan register allocation aim to ensure
@@ -389,7 +436,8 @@ critical edges. This also captured in the `LsraBlockInfo` and is used by the res
`Interval`s are built for lclVars up-front. These are maintained in an array,
`localVarIntervals` which is indexed by the `lvVarIndex` (not the `varNum`, since
we never allocate registers for non-tracked lclVars). Other intervals (for tree temps and
-internal registers) are constructed as the relevant node is encountered.
+internal registers) are constructed as the relevant node is encountered. Intervals for
+`lclVar`s that are live into an exception region are marked `isWriteThru`.
The building of `RefPosition`s is done via a traversal of the nodes, using the `blockSequence`
constructed as described above. This traversal invokes `LinearScan::BuildNode()` for each
@@ -412,6 +460,7 @@ node, which builds `RefPositions` according to the liveness model described abov
- A contained memory operand or addressing mode will cause `RefPosition`s to be
created for any (non-contained) base or index registers.
+
- A single `RefPosition` is created for non-contained nodes.
In order to build these uses, we need to find the `Interval` associated with the
@@ -420,7 +469,8 @@ node, which builds `RefPositions` according to the liveness model described abov
have not yet seen the use. This is a simple list on the assumption that the distance
between defs and uses of tree temps is rarely very great.
- For x86 and x64, when we have an instruction that will overwrite one of its sources,
+ When we have an instruction that will overwrite one of its sources, such as RMW
+ operands common on x86 and x64,
we need to ensure that the other source isn't given the same register as the
target. For this, we annotate the use `RefPosition` with `delayRegFree`.
@@ -428,12 +478,15 @@ node, which builds `RefPositions` according to the liveness model described abov
This is cleared before the next instruction is handled.
- Next, any registers in the kill set for the instruction are killed. This is performed
- by `buildKillPositionsForNode()`, which takes a kill mask that is generally provided
- by a `getKillSetForXXX()` method.
+ by `buildKillPositionsForNode()`, which takes a kill mask that is node-specific and
+ either provided directly by the `buildXXX()` method for the node, or by a `getKillSetForXXX()`
+ method. There is a debug-only method, `getKillSetForNode()` which is only used for validation.
- Finally, we create `RefTypeDef` `RefPositions` for any registers that are defined by
the node.
+ - For a `STORE_LCL_VAR` of a write-thru `lclVar`, the `RefPosition` is marked `writeThru`.
+
- A `RefTypeBB` `RefPosition` marks the beginning of a block, at which the incoming live
variables are set to their locations at the end of the selected predecessor.
@@ -462,13 +515,7 @@ During this phase, preferences are set:
(at a previous definition) been assigned a register, and we want to try to use that
register again, as well as the case where it has yet to be assigned a register.
- This area has room for improvement:
-
- - A specific case that could be improved is [Issue #25312](https://github.com/dotnet/coreclr/issues/25312)
- which involves preferencing for HW intrinsics.
-
- - Issue [#22374](https://github.com/dotnet/coreclr/issues/22374) also has a pointer
- to some methods that could benefit from improved preferencing.
+ This area has room for improvement, (see [Improving Preferencing](#improving-preferencing)).
- Register preferences are set:
@@ -528,7 +575,7 @@ LinearScanAllocation(List refPositions)
- Currently, parameters may not be allocated a register if their
weighted reference count is less than `BB_UNITY_WEIGHT`, however
plenty of room remains for improving the allocation of
- parameters [Issue \#11356](https://github.com/dotnet/coreclr/issues/11356)
+ parameters [Issue \#7999](https://github.com/dotnet/runtime/issues/7999)
- `TryAllocateFreeReg()` iterates over the registers, attempting to find
the best free register (if any) to allocate:
@@ -547,17 +594,21 @@ LinearScanAllocation(List refPositions)
which is not currently live, but which previously occupied
that register).
+ - Currently it doesn't take encoding size into account.
+ [Issue \#7996](https://github.com/dotnet/runtime/issues/7996)
+ tracks this.
+
- It always uses the same order for iterating over the registers.
The jit32 register allocator used a different ordering for tree
temps than for lclVars. It's unclear if this matters for LSRA,
- but [Issue \#11357](https://github.com/dotnet/coreclr/issues/11357)
+ but [Issue \#8000](https://github.com/dotnet/runtime/issues/8000)
tracks this question.
- `AllocateBusyReg()` iterates over all the registers trying to find the
best register to spill (it must only be called if `tryAllocateFreeReg()`
was unable to find one):
- - It takes into account the following:
+ - It takes into account a number of heuristics including:
- The distance to the next use of the `Interval` being
spilled
@@ -567,16 +618,15 @@ LinearScanAllocation(List refPositions)
- Whether the `RefPosition` being allocated, or the one
potentially being spilled, is reg-optional
+ - Both `tryAllocateFreeReg()` and `allocateBusyReg()` currently fully evaluate the "goodness"
+ of each register.
+
- It will always spill an `Interval` either at its most recent
use, or at the entry to the current block.
- - Issues [\#7609](https://github.com/dotnet/coreclr/issues/7609) and
- [\#7665](https://github.com/dotnet/coreclr/issues/7665) track improvement of spill
- placement.
-
- - It is quite possible that combining `TryAllocateFreeReg()` and
+ - It is quite likely that combining `TryAllocateFreeReg()` and
`AllocateBusyReg()` would be more effective, see
- [Merge Allocation of Free and Busy Registers](#combine)
+ [Merge Allocation of Free and Busy Registers](#merge-allocation-of-free-and-busy-registers)
- Resolution
@@ -599,18 +649,10 @@ LinearScanAllocation(List refPositions)
- Resolution of exception edges
- - This is currently done by ensuring that any variable that's
- live in to an exception region is maintained on stack.
-
- - Issue \#6001 raises the performance issue due to this
- implementation.
-
- - Work is in-progress to support the notion
- of "write-thru" variables; for these, all definitions
- would write to memory, but uses could use a register
- value, if available.
+ - When `COMPlus_EnableEHWriteThru == 0`, any variable that's
+ live in to an exception region is always referenced on the stack.
- - The value is reloaded at exception boundaries.
+ - See [Enable EHWriteThru by default](#enable-EHWriteThru-by-default).
- Code generation (genGenerateCode)
@@ -699,7 +741,7 @@ fixed registers.
The representation of `TYP_DOUBLE` registers on 32-bit `Arm` is complicated by the
fact that they overlap two `TYP_FLOAT` registers. The handling of this
-case could be improved.
+case could be improved. See [Support for Allocating Consecutive Registers](#Support-for-Allocating-Consecutive-Registers).
### RefPosition
@@ -727,14 +769,11 @@ enregisterable variable or temporary or physical register. It contains
- `RefTypeUse` is a pure use of an `Interval` .
- `RefTypeKill` is a location at which a physical register is
- killed. These only exist on `RegRecord`s, not on `Interval`s
-
- - Note that this type is probably not needed -- see especially
- notes about physical registers in "future" section.
+ killed. These only exist on `RegRecord`s, not on `Interval`s
- `RefTypeBB` is really just a marker in the list of `RefPosition`s,
- where the register allocator needs to record the register
- locations at block boundaries. It is not associated with an
+ where the register allocator needs to record the register
+ locations at block boundaries. It is not associated with an
`Interval` or `RegRecord`.
- `RefTypeFixedReg` is a `RefPosition` on a `RegRecord` that marks a
@@ -807,7 +846,7 @@ The following dumps and debugging modes are provided:
- For each incoming arg: its type and incoming location
- For each instruction:
- - The current contents of the `OperandToLocationInfoMap`.
+ - The current contents of the `defList`.
This corresponds to all the nodes that have defined values
that have not yet been consumed.
- An abbreviated dump of the GenTree node.
@@ -822,8 +861,8 @@ The following dumps and debugging modes are provided:
progresses.
- After allocation
- - A dump of `RefPosition`s, sequentially, and grouped for Var
- `Interval` s
+ - A dump of `RefPosition`s, sequentially, and grouped for `lclVar`
+ `Interval`s
- During resolution
- A list of the candidates for resolution at each split, join or
@@ -895,18 +934,15 @@ exclusive:
- Never allocate a register for a `RefPosition` marked `regOptional` (0x1000).
-It may be useful to also have a stress mode that deliberately trashes registers that
-are not currently occupied (e.g. at block boundaries). Issue [#18944](https://github.com/dotnet/coreclr/issues/18944).
-
Assertions & Validation
-----------------------
There are many assertions in `LinearScan`. The following are the most
effective at identifying issues (i.e. they frequently show up in bugs):
-- The node information isn't showing the number of consumed registers
- that are expected:
- - `assert((consume == 0) || (ComputeAvailableSrcCount(tree) == consume));`
+- The def and use counts don't match what's expected:
+ - See the asserts at the end of the `LinearScan::BuildNode()` method (these are
+ architecture-specific, and can be found in lsraxarch.cpp, lsraarm64.cpp and lsraarm.cpp).
- This usually means that the `BuildXXX` method for this
node is not building `RefPosition`s for all of its uses (which is what `consume` has been set to).
- The liveness information is incorrect. This assert comes from `LinearScan::checkLastUses()` which
@@ -918,19 +954,26 @@ effective at identifying issues (i.e. they frequently show up in bugs):
possibly because it is a stress mode, and the instruction hasn't correctly specified its
minimum number of registers.
-At the end of write-back (`resolveRegisters()`), `verifyFinalAllocation()` runs. It doesn't do a lot of validation, but it
- prints the final allocation (including final spill placement), so is useful for tracking down correctness issues.
+At the end of write-back (`resolveRegisters()`), `verifyFinalAllocation()` runs. It doesn't do a
+lot of validation, but it prints the final allocation (including final spill placement), so is
+useful for tracking down correctness issues.
Future Extensions and Enhancements
----------------------------------
-The potential enhancements to the JIT, some of which are referenced in this document, can generally be found by [searching for LSRA in open issues](https://github.com/dotnet/coreclr/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+LSRA+in%3Atitle). The ones that are focused on JIT throughput are labeled `JITThroughput`.
+The potential enhancements to the JIT, some of which are referenced in this document, can generally be found by [searching for LSRA in open issues](https://github.com/dotnet/runtime/issues?q=is%3Aissue+is%3Aopen+lsra+in%3Atitle). The ones that are focused on JIT throughput are labeled `JITThroughput`.
+
+## Feature Enhancements
+
+### Support for Allocating Consecutive Registers
+
+This is [\#39457](https://github.com/dotnet/runtime/issues/39457). As described there, the challenge is to do this without impacting the common path. This should also include cleaning up the allocating of consecutive registers for `TYP_DOUBLE` for Arm32 [\#8758](https://github.com/dotnet/runtime/issues/8758).
## Code Quality Enhancements
-### Merge Allocation of Free and Busy Registers
+### Merge Allocation of Free and Busy Registers
-This is captured as [\#15408](https://github.com/dotnet/coreclr/issues/15408)
+This is captured as [\#9399](https://github.com/dotnet/runtime/issues/9399)
Consider merging allocating free & busy regs.
Currently the register allocator will always allocate an available register, even if it only meets
@@ -943,31 +986,34 @@ The alternative approach under consideration is to combine free and busy registe
(`tryAllocateFreeReg()` and `allocateBusyReg()`) such that a busy register will be spilled if there
are no suitable free registers, and the current `Interval` has greater weight than the `Interval`
occupying the register. This must be accompanied by some improvements in the efficiency of the
-checks, so as not to degrade throughput. This is currently a work-in-progress (https://github.com/CarolEidt/coreclr/tree/CombineAlloc) but hasn't yet been ported to the runtime repo, and needs
+checks, so as not to degrade throughput. This is currently a work-in-progress (https://github.com/CarolEidt/runtime/tree/CombineAlloc), and needs
further work to eliminate diffs and improve throughput.
This would make it possible to spill a register for a higher weight `lclVar` rather than "settling"
for a register that's a poor fit for its requirements. This is probably the best approach to
-address Issues [\#7664](https://github.com/dotnet/coreclr/issues/7664)
+address Issues [\#6824](https://github.com/dotnet/runtime/issues/6824):
Heuristics for callee saved reg allocation and
-[\#13735](https://github.com/dotnet/coreclr/issues/13735)
+[\#8846](https://github.com/dotnet/runtime/issues/8846):
Let variables within a loop use register first.
The following issues are related:
-* Both `tryAllocateFreeReg()` and `allocateBusyReg()` currently fully evaluate the "goodness" of each register.
- Issue [\#7301](https://github.com/dotnet/coreclr/issues/7301) tracks the possibility of short-circuiting
- this evaluation.
- Making such an improvement should probably be done in conjunction with this work.
+- Issues [\#6806](https://github.com/dotnet/runtime/issues/6806) and
+ [\#6825](https://github.com/dotnet/runtime/issues/6825) track improvement of spill
+ placement.
+
+- Issue [\#6705](https://github.com/dotnet/runtime/issues/6705) tracks the possibility of
+ short-circuiting this evaluation.
+ Making such an improvement should probably be done in conjunction with this work.
-* Issue [\#26847](https://github.com/dotnet/coreclr/issues/26847)
- Heuristics for callee saved reg allocation.
+- Issue [\#13466](https://github.com/dotnet/runtime/issues/13466):
+ Inefficient register allocation in simple method which dereferences a span
### Auto-tuning of register selection
This is not yet captured as a GitHub issue.
-This would be best done after [Merge Allocation of Free and Busy Registers](#combine).
+This would be best done after [Merge Allocation of Free and Busy Registers](#merge-allocation-of-free-and-busy-registers).
The idea would be to add support to change the weight given to the various selection heuristics
according to a configuration specification, allowing them to be auto-tuned.
@@ -980,7 +1026,7 @@ would be added as an alternate path in the register allocator, leaving the defau
### Pre-allocating high frequency lclVars
-This is captured as Issue [\#11424](https://github.com/dotnet/coreclr/issues/11424)
+This is captured as Issue [\#8019](https://github.com/dotnet/runtime/issues/8019)
Consider pre-allocating high-frequency lclVars.
The idea here is to ensure that high frequency lclVars aren't forced to use less-than-optimal
@@ -1015,7 +1061,7 @@ One strategy would be to do something along the lines of (appropriate hand-wavin
### Avoid Splitting Loop Backedges
-This is captured as Issue [\#16857](https://github.com/dotnet/coreclr/issues/16857).
+This is captured as Issue [\#9909](https://github.com/dotnet/runtime/issues/9909).
When the register allocator performs resolution across block boundaries, it may split critical
edges (edges from a block with multiple successors to a block with multiple predecessors).
@@ -1029,16 +1075,43 @@ set would ensure that the variable locations match. This would eliminate not jus
but all the extra branches currently inserted for resolution. It remains to be seen whether this would
outweigh the impact of cases where more resolution moves would be required.
+I have an old experimental branch where I started working on this: https://github.com/CarolEidt/coreclr/tree/NoEdgeSplitting (not yet ported to the runtime repo).
+
+### Enable EHWriteThru by default
+
+When `COMPlus_EnableEHWriteThru` is set, some performance regressions are observed. When an EH write-thru variable (i.e. one that is live into an exception region) is defined, its value is
+always stored, in addition to potentially remaining live in a register. This increases register
+pressure which may result in worse code.
+
+Further investigation is needed, but the following mitigations may be effective (here the
+term "EH Var" means a `lclVar` marked `lvLiveInOutOfHndlr`):
+
+- Adjust the heuristics:
+
+ 1. For determining whether an EH var should be a candidate for register allocation,
+ e.g. if the defs outweight the uses.
+
+ 2. For determining when a definition of an EH var should be only stored to the stack,
+ rather than also remaining live in the register.
+
+- If the weight of the defs exceeds the weight of the blocks with successors in exception
+ regions, consider spilling the `lclVar` to the stack only at those boundaries.
+
+The original issue to enable EH WriteThru is [#6212](https://github.com/dotnet/runtime/issues/6212).
+It remains open pending the resolution of the performance regressions.
+
### Avoid Spill When Stack Copy is Valid
The idea here is to avoid spilling at a use if the value on the stack is already the correct value.
-Issues that this might address include [\#11344] Spill single-def vars at def, [\#7665] Improve spill placement,
-and [\#7465] Avoiding reg spill to memory when reg-value is consistent with memory.
+Issues that this might address include:
+- [\#7994](https://github.com/dotnet/runtime/issues/7994) Spill single-def vars at def,
+- [\#6825](https://github.com/dotnet/runtime/issues/6825) Improve spill placement, and
+- [\#6761](https://github.com/dotnet/runtime/issues/6761) Avoiding reg spill to memory when reg-value is consistent with memory.
Currently the register allocator doesn't track whether a local variable has the same value on the stack
-as in a register. The work-in-progress to support "write-thru" EH variables (variables live across exception
-boundaries) adds capability to liveness analysis and code generation (in addition to the register allocator)
+as in a register. The support for "write-thru" EH variables (variables live across exception
+boundaries) has added the capability to liveness analysis and code generation (in addition to the register allocator)
to handle variables that are live in both registers and on the stack. This support could be further leveraged
to avoid spilling single-def variables to memory if they have already been spilled at their
definition.
@@ -1047,19 +1120,29 @@ Extending such support to more generally track whether there is already a valid
work. Fully general support would require such information at block boundaries, but it might be worth
investigating whether it would be worthwhile and cheaper to simply track this information within a block.
-### Support Reg-Optional Defs
+### Rematerialization
+
+This would involve identifying `Interval`s whose values are cheaper to recompute than to spill
+and reload. Without SSA form, this would probably be easiest to do when there's a single def.
+Issue [\#6264](https://github.com/dotnet/runtime/issues/6264).
+
+### Improving Reg-Optional Support
+
+#### Reg-Optional Defs
-Issues [\#7752](https://github.com/dotnet/coreclr/issues/7752) and
-[\#7753](https://github.com/dotnet/coreclr/issues/7753) track the
+Issues [\#6862](https://github.com/dotnet/runtime/issues/6862) and
+[\#6863](https://github.com/dotnet/runtime/issues/6863) track the
proposal to support "folding" of operations using a tree temp when
the defining operation supports read-modify-write (RMW) to memory.
This involves supporting the possibility
of a def being reg-optional, as well as its use, so that it need
never occupy a register.
-### Don't Pre-determine Reg-Optional Operand
+I have an old experimental branch: https://github.com/CarolEidt/coreclr/tree/RegOptDef where I started working on this.
-Issue [\#6361](https://github.com/dotnet/coreclr/issues/6361)
+#### Don't Pre-determine Reg-Optional Operand
+
+Issue [\#6358](https://github.com/dotnet/runtime/issues/6358)
tracks the problem that `Lowering` currently has
to select a single operand to be reg-optional, even if either
operand could be. This requires some additional state because
@@ -1067,6 +1150,18 @@ LSRA can't easily navigate from one use to the other to
communicate whether the first operand has been assigned a
register.
+#### Don't Mark DelayFree for Duplicate Operands
+
+Issue [\#9896](https://github.com/dotnet/runtime/issues/9896).
+
+### Improving Preferencing
+
+- Issue [#12945](https://github.com/dotnet/runtime/issues/12945)
+ involves preferencing for HW intrinsics.
+
+- Issue [#11959](https://github.com/dotnet/runtime/issues/11959) also has a pointer
+ to some methods that could benefit from improved preferencing.
+
### Leveraging SSA form
This has not yet been opened as a github issue.
@@ -1083,7 +1178,7 @@ Making SSA form available to LSRA would:
This has not yet been opened as a github issue.
LLVM has extended their linear scan register allocator with something it
-calls "Greedy Register Allocation". This uses a priority queue for the
+calls "Greedy Register Allocation"[[6](#6),[7](#7)]. This uses a priority queue for the
order of allocation (sorted by decreasing spill cost), and a B+ tree to
represent each physical register. I think that using the B+ trees for
physical registers would be an improvement over the current PhysRegs,
@@ -1091,6 +1186,13 @@ and we may want to experiment with changing the allocation order as
well. It would not be necessary to significantly modify the process of
creating `Interval`s, nor the resolution phase.
+### Improve the handling of def/use conflicts
+
+Def/use conflicts arise when the producing and conusming nodes each have register requirements,
+and they conflict. The current mechanism, in which the register assignment of one of the
+`RefPosition`s is changed, can lead to problems because there's then
+no associated `RefTypeFixedReg` for that reference. This is Issue [\#10196](https://github.com/dotnet/runtime/issues/10196).
+
## Throughput Enhancements
### Allocation Window for Min-Opts and Tier 0
@@ -1111,48 +1213,75 @@ form of a `defList` that holds all of the tree temp values that have been define
Once this is empty, the register allocator could process the current list of `RefPosition`s and then
start over.
+[Issue \#6690](https://github.com/dotnet/runtime/issues/6690) proposes to build `RefPositions` incrementally, which is part of this item.
+
### Distinguish Intra-Block versus Inter-Block Variables
It is unclear whether it would be beneficial, but if we could keep track of the variables that are
only used within a block (presumably true of many introduced temps), we may find that we could
continue to limit the number of variables whose liveness is tracked across blocks, keeping an expanded
-set only for transient liveness. Issue [\#11339](https://github.com/dotnet/coreclr/issues/11339).
+set only for transient liveness. Issue [\#7992](https://github.com/dotnet/runtime/issues/7992).
Note that this would only improve JIT throughput for optimized code.
### Improve the VarToRegMap
-The `VarToRegMap` incurs non-trivial JIT-time overhead. Issue \#11396 addresses
+The `VarToRegMap` incurs non-trivial JIT-time overhead.
+Issue [\#8013](https://github.com/dotnet/runtime/issues/8013) addresses
the question of whether there is an alternative that would have better
performance. This would also improve JIT throughput only for optimized code.
+### Other Throughput Investigations
+
+Issue [\#7998](https://github.com/dotnet/runtime/issues/7998) suggests evluating the throughput cost of updating the preferences at each
+kill site.
+
+## Test and Cleanup Issues
+
+Issue [\#9767](https://github.com/dotnet/runtime/issues/9767) captures the issue that the
+"spill always" stress mode, `LSRA_SPILL_ALWAYS`, `COMPlus_JitStressRegs=0x800` doesn't work properly.
+
+Issue [\#6261](https://github.com/dotnet/runtime/issues/6261) has to do with `RegOptional`
+`RefPositions` that are marked as `copyReg` or `moveReg`. See the notes on this issue;
+I don't think such cases should arise, but there may be some cleanup needed here.
+
+Issue [\#5793](https://github.com/dotnet/runtime/issues/5793) suggests adding a stress mode that
+allocates registers forr mullti-reg nodes in the reverse of the ABI requirements.
+
+Issue [#10691](https://github.com/dotnet/runtime/issues/10691) suggests adding a stress mode that
+deliberately trashes registers that are not currently occupied (e.g. at block boundaries).
+
References
----------
-1. Boissinot, B. et
+1. Boissinot, B. et
al "Fast liveness checking for ssa-form programs," CGO 2008, pp.
35-44.
http://portal.acm.org/citation.cfm?id=1356058.1356064&coll=ACM&dl=ACM&CFID=105967773&CFTOKEN=80545349
-2. Boissinot, B. et al, "Revisiting
+2. Boissinot, B. et al, "Revisiting
Out-of-SSA Translation for Correctness, Code Quality and
Efficiency," CGO 2009, pp. 114-125.
-3. Wimmer, C. and Mössenböck, D. "Optimized
+3. Wimmer, C. and Mössenböck, D. "Optimized
Interval Splitting in a Linear Scan Register Allocator," ACM VEE
2005, pp. 132-141.
-4. Wimmer, C. and Franz, M. "Linear Scan
+4. Wimmer, C. and Franz, M. "Linear Scan
Register Allocation on SSA Form," ACM CGO 2010, pp. 170-179.
-5. Traub, O. et al "Quality and Speed in Linear-scan Register
+5. Traub, O. et al "Quality and Speed in Linear-scan Register
Allocation," SIGPLAN '98, pp. 142-151.
-6. Olesen, J. "Greedy Register Allocation in LLVM 3.0," LLVM Project Blog, Sept. 2011.
+6. Olesen, J. "Greedy Register Allocation in LLVM 3.0," LLVM Project Blog, Sept. 2011.
- (Last retrieved Feb. 2012)
+ (Last retrieved July 2020)
+
+7. Yatsina, M. "LLVM Greedy Register Allocator," LLVM Dev Meeting, April 2018.
+
+ (Last retrieved July 2020)
diff --git a/docs/design/coreclr/jit/object-stack-allocation.md b/docs/design/coreclr/jit/object-stack-allocation.md
index ec6fe14b3d64..914013878000 100644
--- a/docs/design/coreclr/jit/object-stack-allocation.md
+++ b/docs/design/coreclr/jit/object-stack-allocation.md
@@ -21,7 +21,7 @@ various Java runtimes. This optimization is more important for Java since it do
[roslyn #2104](https://github.com/dotnet/roslyn/issues/2104) Compiler should optimize "alloc temporary small object" to "alloc on stack"
-[coreclr #1784](https://github.com/dotnet/coreclr/issues/1784) CLR/JIT should optimize "alloc temporary small object" to "alloc on stack" automatically
+[runtime #4584](https://github.com/dotnet/runtime/issues/4584) CLR/JIT should optimize "alloc temporary small object" to "alloc on stack" automatically
## Escape Analysis
@@ -157,7 +157,7 @@ So the upper bound from this experiment is 22.2%.
@AndyAyersMS recently resurrected @echesakovMSFT work and used it to [prototype stack allocation of a simple delegate that's
directly invoked](https://github.com/dotnet/coreclr/compare/master...AndyAyersMS:NonNullPlusStackAlloc). It exposed a number of things that need to be
done in the jit to generate better code for stack-allocated objects. The details are in comments of
-[coreclr #1784](https://github.com/dotnet/coreclr/issues/1784).
+[runtime #4584](https://github.com/dotnet/runtime/issues/4584).
We did some analysis of Roslyn csc self-build to see where this optimization may be beneficial. One hot place was found in [GreenNode.WriteTo](https://github.com/dotnet/roslyn/blob/fab7134296816fc80019c60b0f5bef7400cf23ea/src/Compilers/Core/Portable/Syntax/GreenNode.cs#L647).
This object allocation accounts for 8.17% of all object allocations in this scenario. The number is not as impressive as a percentage
diff --git a/docs/design/coreclr/jit/ryujit-tutorial.md b/docs/design/coreclr/jit/ryujit-tutorial.md
index 050c11495b6a..69e90580fbfa 100644
--- a/docs/design/coreclr/jit/ryujit-tutorial.md
+++ b/docs/design/coreclr/jit/ryujit-tutorial.md
@@ -606,7 +606,7 @@ public static int PopCount(ulong bitVectorArg)
#### Notes
The sample I'm going to walk through implements support for pop count (counting the number of '1' bits in a 64-bit value).
-
+
We're going to start by assuming that we have a method with a known signature that implements PopCount.
Here's the implementation we're going to use. It simply takes the input value, and keeps anding with one, and then shifting right.
We're first going to simply recognize the name and signature, and replace the method call with a simple PopCnt IR node.
diff --git a/docs/design/coreclr/jit/variabletracking.md b/docs/design/coreclr/jit/variabletracking.md
index e37dd8b54f4a..c4f86a6cd56d 100644
--- a/docs/design/coreclr/jit/variabletracking.md
+++ b/docs/design/coreclr/jit/variabletracking.md
@@ -338,7 +338,7 @@ There are many things we can do to improve optimized debugging:
Currently we don't have the IL offset of them.
And this is broadly used to improve code performance.
-- [Promoted structs](https://github.com/dotnet/coreclr/issues/23542): There is no debug support for fields of promoted structs, we just report the struct itself.
+- [Promoted structs](https://github.com/dotnet/runtime/issues/12369): There is no debug support for fields of promoted structs, we just report the struct itself.
-- [Reduce space used for VariableLiveDescriptor](https://github.com/dotnet/coreclr/issues/23544): we are currently using a `jitstd::list`, which is a double linked list.
+- [Reduce space used for VariableLiveDescriptor](https://github.com/dotnet/runtime/issues/12371): we are currently using a `jitstd::list`, which is a double linked list.
We could use a simple single linked list with push_back(), head(), tail(), size() operations and an iterator and we would be saving memory.
diff --git a/docs/design/coreclr/profiling/Profiler Attach on CoreCLR.md b/docs/design/coreclr/profiling/Profiler Attach on CoreCLR.md
index 1e494a79f364..6a724e4fdc2f 100644
--- a/docs/design/coreclr/profiling/Profiler Attach on CoreCLR.md
+++ b/docs/design/coreclr/profiling/Profiler Attach on CoreCLR.md
@@ -13,7 +13,7 @@ Attaching a profiler to a running CoreCLR process involves sending a message fro
2) `uint attachTimeout` - (Required) A timeout that informs the runtime how long to wait while attempting to attach. This does not impact the timeout of trying to send the attach message.
3) `Guid profilerGuid` - (Required) The profiler's GUID to use when initializing.
4) `string profilerPath` - (Required) The path to the profiler on disk.
-5) `byte[] additionalData` - (Optional) A data blob that will be passed to `ICorProfilerCallback3::InitializeForAttach` as `pvClientData`.
+5) `byte[] additionalData` - (Optional) A data blob that will be passed to `ICorProfilerCallback3::InitializeForAttach` as `pvClientData`.
This method returns a status HR following the usual convention, 0 (S_OK) means a profiler was successfully attached and any other value is an error indicating what went wrong.
diff --git a/docs/design/coreclr/profiling/Profiler Breaking Changes.md b/docs/design/coreclr/profiling/Profiler Breaking Changes.md
index 07c54c7277ff..0e6d5e2444b9 100644
--- a/docs/design/coreclr/profiling/Profiler Breaking Changes.md
+++ b/docs/design/coreclr/profiling/Profiler Breaking Changes.md
@@ -4,4 +4,4 @@ Over time we will need to modify the Profiler APIs, this document will serve as
1. Code Versioning introduced changes documented [here](../../features/code-versioning-profiler-breaking-changes.md)
2. The work to allow adding new types and methods after module load means ICorProfilerInfo7::ApplyMetadata will now potentially trigger a GC, and will not be callable in situations where a GC can not happen (for example ICorProfilerCallback::RootReferences).
-3. As part of the work to allow ReJIT on attach ReJITted methods will no longer be inlined (ever). Since the inlining is blocked there won't be a `ICorProfilerCallback::JITInlining` callback.
\ No newline at end of file
+3. As part of the work to allow ReJIT on attach ReJITted methods will no longer be inlined (ever). Since the inlining is blocked there won't be a `ICorProfilerCallback::JITInlining` callback.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Attach.md b/docs/design/coreclr/profiling/davbr-blog-archive/Attach.md
index 93335dd51fec..f9f08680f24f 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Attach.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Attach.md
@@ -7,8 +7,6 @@ Profiler attach is a feature that allows you to attach a profiler to an already
Please note! You can't just take any profiler you bought and suddenly be able to attach it to a running application. The profiler must be built with "attachability" in mind. So if you're a profiler developer looking to pump some attachability into your product, read on--this article is for you. Everyone else, this article will probably be less useful--but just as riveting.
-#
-
# The Players
So how do you get your profiler attached to a running process? The process has already started, and the CLR code which interrogates the environment to determine whether to load a profiler has already run. So how do you kick the process into loading your profiler? The answer: Another process!
@@ -19,17 +17,17 @@ In order to force your profiler DLL to load into the target profilee process, yo
# Inside the Trigger Process
-Your trigger uses a simple API method, AttachProfiler, to request the target process to load your profiler. Where is this method defined? Well, it doesn't make much sense to put it on ICorProfilerInfo, since that interface is only available to a profiler after it's been loaded. You could imagine a C export from mscoree.dll. But because of in-process side-by-side CLR instances, we're moving away from mscoree.dll exports to a COM-based interface model called "metahost".
+Your trigger uses a simple API method, AttachProfiler, to request the target process to load your profiler. Where is this method defined? Well, it doesn't make much sense to put it on ICorProfilerInfo, since that interface is only available to a profiler after it's been loaded. You could imagine a C export from mscoree.dll. But because of in-process side-by-side CLR instances, we're moving away from mscoree.dll exports to a COM-based interface model called "metahost".
## Meta-whos-its?
Whereas the "hosting" interfaces enable one to host and manage a CLR in a process, the "metahost" interfaces allow one to manage multiple CLRs that may be installed onto a machine or loaded into a single process. Here's a high-level view of how you navigate your way through metahost to find AttachProfiler() (there’s a pointer to actual sample code below).
-- Get ICLRMetaHost
-- Enumerate the CLRs loaded into the target process
-- Get ICLRRuntimeInfo for the particular CLR in the target process you want to profile
-- Get the corresponding ICLRProfiling
-- Call ICLRProfiling::AttachProfiler
+- Get ICLRMetaHost
+- Enumerate the CLRs loaded into the target process
+- Get ICLRRuntimeInfo for the particular CLR in the target process you want to profile
+- Get the corresponding ICLRProfiling
+- Call ICLRProfiling::AttachProfiler
## Users and Integrity
@@ -57,8 +55,6 @@ From your InitializeForAttach implementation, your profiler will call SetEventMa
It was impossible to enable all profiling scenarios for attach in the time we had for the V4 release. So only profilers that do **sampling** and **memory** analysis will function properly after attaching to a live process. Attempts to use other profiling APIs after attach will be met with CORPROF\_E\_UNSUPPORTED\_FOR\_ATTACHING\_PROFILER.
-###
-
## Specific Callback Limitations
When your attaching profiler calls SetEventMask, you will be limited to only those event mask flags present in the COR\_PRF\_ALLOWABLE\_AFTER\_ATTACH bitmask (you'll find it in corprof.idl). Any other flags, and SetEventMask will return CORPROF\_E\_UNSUPPORTED\_FOR\_ATTACHING\_PROFILER.
@@ -67,14 +63,14 @@ When your attaching profiler calls SetEventMask, you will be limited to only tho
Most of the ICorProfilerInfo\* methods are available to your attaching profiler, however some are not--particularly those involved in **IL rewriting**. Here's a list of all ICorProfilerInfo\* methods NOT supported for attaching profilers:
-- GetILFunctionBody
-- GetILFunctionBodyAllocator
-- SetILFunctionBody
-- SetILInstrumentedCodeMap
-- SetEnterLeaveFunctionHooks\*
-- SetFunctionIDMapper\*
-- GetNotifiedExceptionClauseInfo
-- All methods related to Enter/Leave/Tailcall
+- GetILFunctionBody
+- GetILFunctionBodyAllocator
+- SetILFunctionBody
+- SetILInstrumentedCodeMap
+- SetEnterLeaveFunctionHooks\*
+- SetFunctionIDMapper\*
+- GetNotifiedExceptionClauseInfo
+- All methods related to Enter/Leave/Tailcall
It's expected that future releases of the CLR will enable more API methods for use by attaching profilers.
@@ -84,9 +80,9 @@ It's expected that future releases of the CLR will enable more API methods for u
To understand limitations around the GC modes, here's a quick review of the GC modes an app can run under:
-- **Workstation Blocking mode**. The thread that triggered the GC performs the GC while all other threads executing managed code must wait.
-- **Workstation Concurrent / Background mode (the default)**. Concurrent GC (V1 & V2) allows portions of a full GC to execute while other threads are allowed to run. Background GC (its replacement in V4) takes it one step further, and also allows an ephemeral GC (i.e., gen 0 or gen 1) to execute while a gen 2 GC is executing.
-- **Server mode**. Hosts like ASP.NET may choose to enable server mode which creates a heap + dedicated GC thread per CPU. This allows GCs to be fanned out to multiple threads.
+- **Workstation Blocking mode**. The thread that triggered the GC performs the GC while all other threads executing managed code must wait.
+- **Workstation Concurrent / Background mode (the default)**. Concurrent GC (V1 & V2) allows portions of a full GC to execute while other threads are allowed to run. Background GC (its replacement in V4) takes it one step further, and also allows an ephemeral GC (i.e., gen 0 or gen 1) to execute while a gen 2 GC is executing.
+- **Server mode**. Hosts like ASP.NET may choose to enable server mode which creates a heap + dedicated GC thread per CPU. This allows GCs to be fanned out to multiple threads.
Of course, [Maoni's blog](https://devblogs.microsoft.com/dotnet/author/maoni/) is required reading for anyone who wants to understand how the GC works.
@@ -96,15 +92,13 @@ So here's the catch. What if a V4 app starts up in background GC mode _without_
Of course, you could forcibly turn off concurrent / background mode every time the app starts up via a config file:
-|
-
-\
- \
- \
- \
-\
-
- |
+```xml
+
+
+
+
+
+```
But you don't really want to be running your apps with a sub-optimal GC mode all the time, just on the off-chance you might need to attach a memory profiler to it. If you suspect you might need to do some memory profiling of a client app, you should just start up your app with the memory profiler to begin with.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Attach2.md b/docs/design/coreclr/profiling/davbr-blog-archive/Attach2.md
index d2db6ca61301..6ff0409ebebd 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Attach2.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Attach2.md
@@ -11,12 +11,12 @@ A profiler that loads on startup of an application has the option to know the en
[NoBirthAnnouncement](media/NoBirthAnnouncement.JPG)
Drawing by Magdalena Hermawan
-
+
There are two fundamental ways your profiler can catch up on the current state of an application:
-- Lazy catch-up—as the profiler encounters new IDs, the profiler queries information about those IDs as it needs them, rather than assuming it has a full cache that’s always built up as the IDs are first created. This is analogous to Dorothy meeting a new grown-up, and gracefully accepting the fact that that person exists.
-- Enumeration—for certain kinds of IDs, the profiler can (at attach time) request a complete list of the currently active IDs and query information about them at that time. Sort of like Dorothy first going to the Oz City Hall and looking up the birth records for everyone.
+- Lazy catch-up—as the profiler encounters new IDs, the profiler queries information about those IDs as it needs them, rather than assuming it has a full cache that’s always built up as the IDs are first created. This is analogous to Dorothy meeting a new grown-up, and gracefully accepting the fact that that person exists.
+- Enumeration—for certain kinds of IDs, the profiler can (at attach time) request a complete list of the currently active IDs and query information about them at that time. Sort of like Dorothy first going to the Oz City Hall and looking up the birth records for everyone.
Lazy catch-up is fairly self-explanatory. For example, if your sampling profiler encounters an IP in a FunctionID you’ve never seen before, just look up whatever info you need about that FunctionID the first time you encounter it, rather than assuming you’d already built up a cache when the function was first JITted. And if you discover that FunctionID resides in a module you’ve never seen before, then just look up whatever info you need about that ModuleID at that point, rather than assuming you already have a complete cache of all modules. Many of you are already doing something like this today if you support sampling against regular NGENd images (since you don’t get JIT notifications of those functions anyway).
@@ -26,8 +26,8 @@ Enumeration, on the other hand, has some caveats and is worthwhile to describe i
Some kinds of IDs have new enumerator methods as part of the profiling API. In particular:
-- ICorProfilerInfo3::EnumModules
-- ICorProfilerInfo3::EnumJITedFunctions
+- ICorProfilerInfo3::EnumModules
+- ICorProfilerInfo3::EnumJITedFunctions
Your profiler calls these methods, and they return a standard enumerator you use to iterate through all of the currently-loaded IDs of that type. It’s worth noting that EnumJITedFunctions only enumerates FunctionIDs for which you would receive JITCompilationStarted/Finished events, and will not include FunctionIDs from NGENd modules.
@@ -39,24 +39,24 @@ As you may recall, once your profiler is attached to the process, the CLR calls
Bad timeline (loading; enumerating too soon):
-1. Profiler attaches
-2. Profiler calls EnumModules
-3. Module starts to load
-4. ModuleID is now enumerable
-5. ModuleLoadFinished event would fire here if events were enabled (but they’re not yet!)
-6. CLR enables events
+1. Profiler attaches
+2. Profiler calls EnumModules
+3. Module starts to load
+4. ModuleID is now enumerable
+5. ModuleLoadFinished event would fire here if events were enabled (but they’re not yet!)
+6. CLR enables events
The problem is that the profiler calls EnumModules too early. If your profiler only calls EnumModules after CLR enables events, then you’re assured of either seeing a ModuleID via EnumModules or via a ModuleLoad event. In the above scenario, your profiler might as well have never done enumeration at all, since it will still not be notified of the ModuleID before it comes across that ModuleID in action later on. It gets even worse for modules that unload:
Bad timeline (unloading; enumerating too soon):
-1. Module loads
-2. ModuleID is now enumerable
-3. Profiler attaches
-4. Profiler calls EnumModules (includes the ModuleID)
-5. Module starts to unload
-6. ModuleUnloadStarted event would fire here if events were enabled (but they’re not yet!)
-7. CLR enables events
+1. Module loads
+2. ModuleID is now enumerable
+3. Profiler attaches
+4. Profiler calls EnumModules (includes the ModuleID)
+5. Module starts to unload
+6. ModuleUnloadStarted event would fire here if events were enabled (but they’re not yet!)
+7. CLR enables events
In the above case, the profiler discovers a ModuleID via EnumModules, but has no idea that the module is now in the process of unloading. So the profiler might query information about the stale ModuleID, potentially causing an AV. Again, this is caused because the profiler called the enumeration API too soon (i.e., before the CLR enabled event callbacks).
@@ -68,24 +68,24 @@ When your profiler calls the Enum\* methods, the CLR creates a snapshot of all
Bad timeline (loading):
-1. Module starts to load
-2. ModuleLoadFinished event would fire here if events were enabled (but they’re not yet—no profiler is attached!)
-3. Profiler attaches
-4. CLR enables events, calls ProfilerAttachComplete()
-5. Profiler calls EnumModules
-6. ModuleID is now enumerable
+1. Module starts to load
+2. ModuleLoadFinished event would fire here if events were enabled (but they’re not yet—no profiler is attached!)
+3. Profiler attaches
+4. CLR enables events, calls ProfilerAttachComplete()
+5. Profiler calls EnumModules
+6. ModuleID is now enumerable
Because 2 comes before 6, it’s possible for a profiler to attach and grab an enumeration in the middle, and thus never hear about a ModuleID (even though the profiler avoided Race #1 from the previous section). Again, an even worse problem occurs for module unloading. Suppose the CLR were to change an ID’s enumerable status to false after sending the unload event. That would also lead to holes:
Bad timeline (unloading):
-1. Module loads, event would fire if profiler were attached (but it’s not), then ModuleID becomes enumerable
-2. Module starts to unload
-3. ModuleUnloadStarted event would fire here if events were enabled (but they’re not yet—no profiler is attached!)
-4. Profiler attaches
-5. CLR enables events, calls ProfilerAttachComplete()
-6. Profiler calls EnumModules (ModuleID is still enumerable, so profiler discovers ModuleID at this point)
-7. ModuleID is no longer enumerable
+1. Module loads, event would fire if profiler were attached (but it’s not), then ModuleID becomes enumerable
+2. Module starts to unload
+3. ModuleUnloadStarted event would fire here if events were enabled (but they’re not yet—no profiler is attached!)
+4. Profiler attaches
+5. CLR enables events, calls ProfilerAttachComplete()
+6. Profiler calls EnumModules (ModuleID is still enumerable, so profiler discovers ModuleID at this point)
+7. ModuleID is no longer enumerable
Because 3 comes before 7, a profiler could attach in the middle, grab an enumeration, discover the ModuleID via the enumeration, and have no idea that module was in the process of unloading. If the profiler were to use that ModuleID later on, an AV could result. The above led to the following golden rule:
@@ -93,10 +93,10 @@ Because 3 comes before 7, a profiler could attach in the middle, grab an enumera
In other words, an ID becomes enumerable _before_ the LoadFinished (or JITCompilationFinished) event. And an ID ceases to be enumerable _before_ the UnloadStarted event. Or you can think of it as, “The event is always last”. This eliminates any potential holes. So to be even more explicit, here’s the enumerability vs. event ordering:
-1. ID available in enumerations snapped now
-2. LoadFinished
-3. ID no longer in enumerations snapped now
-4. UnloadStarted
+1. ID available in enumerations snapped now
+2. LoadFinished
+3. ID no longer in enumerations snapped now
+4. UnloadStarted
If an ID is present, the profiler will discover the ID via the enumerator or a LoadFinished event (or both). If an ID is not present, the profiler will either not see the ID via the enumerator or will see an UnloadStarted event (or both). In all cases, the event is more recent, and so the profiler should always trust an event over an enumeration that was generated prior. (More on that last point later.)
@@ -104,36 +104,36 @@ The astute reader will notice that what we’ve done here is trade one race for
Good timeline (loading with duplicate):
-1. Module starts to load
-2. ModuleID is now enumerable
-3. Profiler attaches
-4. CLR enables events, calls ProfilerAttachComplete()
-5. Profiler calls EnumModules
-6. Profiler receives ModuleLoadFinished
+1. Module starts to load
+2. ModuleID is now enumerable
+3. Profiler attaches
+4. CLR enables events, calls ProfilerAttachComplete()
+5. Profiler calls EnumModules
+6. Profiler receives ModuleLoadFinished
At first it might seem a little strange. The enumerator contains the ModuleID, so the profiler sees that the module is loaded. But then the profiler receives a ModuleLoadFinished event, which might seem odd, since the enumerator implied the module was already loaded. This is what I mean by “duplicate”—the profiler is notified of a ModuleID twice (once via the enumeration, and once via the event). The profiler will need to be resilient to this. Although it’s a bit awkward, it’s better than the alternative of a hole, since the profiler would have no way to know the hole occurred. Unloading has a similar situation:
Good timeline (unloading with duplicate):
-1. Module loads, event would have fired if profiler were attached (but it’s not), ModuleID becomes enumerable
-2. Module starts to unload
-3. ModuleID is no longer enumerable
-4. Profiler attaches
-5. CLR enables events, calls ProfilerAttachComplete()
-6. Profiler calls EnumModules
-7. Profiler receives ModuleUnloadStarted event
+1. Module loads, event would have fired if profiler were attached (but it’s not), ModuleID becomes enumerable
+2. Module starts to unload
+3. ModuleID is no longer enumerable
+4. Profiler attaches
+5. CLR enables events, calls ProfilerAttachComplete()
+6. Profiler calls EnumModules
+7. Profiler receives ModuleUnloadStarted event
In step 6, the profiler does not see the unloading ModuleID (since it’s no longer enumerable). But in step 7 the profiler is notified that the ModuleID is unloading. Perhaps it’s a bit awkward that the profiler would be told that a seemingly nonexistent ModuleID is unloading. But again, this is better than the alternative, where a profiler finds an unloading ID in the enumeration, and is never told that the ModuleID got unloaded. One more case that’s worthwhile to bring out occurs when we move the profiler attach a bit earlier in the sequence.
Good timeline (unloading without duplicate):
-1. Module loads, event would fire if profiler were attached, ModuleID becomes enumerable
-2. Module starts to unload
-3. Profiler attaches
-4. CLR enables events, calls ProfilerAttachComplete()
-5. Profiler calls EnumModules (ModuleID is still present in the enumeration)
-6. ModuleID is no longer enumerable
-7. Profiler receives ModuleUnloadStarted event
+1. Module loads, event would fire if profiler were attached, ModuleID becomes enumerable
+2. Module starts to unload
+3. Profiler attaches
+4. CLR enables events, calls ProfilerAttachComplete()
+5. Profiler calls EnumModules (ModuleID is still present in the enumeration)
+6. ModuleID is no longer enumerable
+7. Profiler receives ModuleUnloadStarted event
Here the profiler discovers the ModuleID exists in step 5 (as the ModuleID is still enumerable at that point), but the profiler almost immediately after discovers that the module is unloading in step 7. As stated above, events are more recent, and should always take precedence over enumerations that were generated prior. This could get a bit tricky, though, as the profiler generates an enumeration before it iterates over the enumeration. In the above sequence, the enumeration is generated in step 5. However, the profiler could be iterating though the generated enumeration for quite some time, and might not come across the unloading ModuleID until after step 7 (multiple threads means fun for everyone!). For this reason, it’s important for the profiler to give precedence to events that occur after the enumeration was _generated_, even though iteration over that enumeration might occur later.
@@ -151,7 +151,5 @@ It may be beneficial to program your profiler such that, upon attaching to the p
It’s worth reiterating a limitation I stated in the first attach post (linked above): the ObjectAllocated() callback is unavailable to profilers that attach to running processes. Therefore, any logic your profiler has that assumes it gets all the ObjectAllocated() callbacks will need to be addressed. Any objects newly allocated since the last GC may still be unknown to your profiler until it comes across their references via GC callbacks during the next GC (unless your profiler comes across those objects in other ways—example: as parameters to methods you hook with the Enter/Leave/Tailcall probes).
-
-
OK, that about covers the first steps your profiler should take once it attaches to a running process. It will either need to use lazy catch-up or the catch-up enumerations (or, quite likely, a combination of both). When using the enumerations, be careful to avoid holes (by calling the enumeration methods from inside ProfilerAttachComplete()), and be resilient to receiving information duplicated across the enumeration and the load / unload events. For memory profilers, be wary of GCs already in progress at the time your profiler attaches, and consider inducing your own GC at attach-time to build your initial cache of GC objects.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.md b/docs/design/coreclr/profiling/davbr-blog-archive/CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.md
index c6feb97c779a..b2a900ca8757 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.md
@@ -11,24 +11,24 @@ On the other hand, if you're hijacking or otherwise calling ICorProfilerInfo fun
In 2.0 we've added some simple checks to help you avoid this problem. If you call an unsafe ICorProfilerInfo function asynchronously, instead of crossing its fingers and trying, it will fail with CORPROF\_E\_UNSUPPORTED\_CALL\_SEQUENCE. The general rule of thumb is, nothing is safe to call asynchronously. But here are the exceptions that are safe, and that we specifically allow to be called asynchronously:
-- GetEventMask/SetEventMask
-- GetCurrentThreadID
-- GetThreadContext
-- GetThreadAppDomain
-- GetFunctionFromIP
-- GetFunctionInfo/GetFunctionInfo2
-- GetCodeInfo/GetCodeInfo2
-- GetModuleInfo
-- GetClassIDInfo/GetClassIDInfo2
-- IsArrayClass
-- SetFunctionIDMapper
-- DoStackSnapshot
+- GetEventMask/SetEventMask
+- GetCurrentThreadID
+- GetThreadContext
+- GetThreadAppDomain
+- GetFunctionFromIP
+- GetFunctionInfo/GetFunctionInfo2
+- GetCodeInfo/GetCodeInfo2
+- GetModuleInfo
+- GetClassIDInfo/GetClassIDInfo2
+- IsArrayClass
+- SetFunctionIDMapper
+- DoStackSnapshot
There are also a few things to keep in mind:
-1. ICorProfilerInfo calls made from within the fast-path Enter/Leave callbacks are considered asynchronous. (Though ICorProfilerInfo calls made from within the _slow_-path Enter/Leave callbacks are considered synchronous.) See the blog entries [here](ELT - The Basics.md) and [here](http://blogs.msdn.com/jkeljo/archive/2005/08/11/450506.aspx) for more info on fast / slow path.
-2. ICorProfilerInfo calls made from within instrumented code (i.e., IL you've rewritten to call into your profiler and then into ICorProfilerInfo) are considered asynchronous.
-3. Calls made inside your FunctionIDMapper hook are considered to be synchronous.
-4. Calls made on threads created by your profiler, are always considered to be synchronous. (This is because there's no danger of conflicts resulting from interrupting and then re-entering the CLR on that thread, since a profiler-created thread was not in the CLR to begin with.)
-5. Calls made inside a StackSnapshotCallback are considered to be synchronous iff the call to DoStackSnapshot was synchronous.
+1. ICorProfilerInfo calls made from within the fast-path Enter/Leave callbacks are considered asynchronous. (Though ICorProfilerInfo calls made from within the _slow_-path Enter/Leave callbacks are considered synchronous.) See the blog entries [here](ELT - The Basics.md) and [here](http://blogs.msdn.com/jkeljo/archive/2005/08/11/450506.aspx) for more info on fast / slow path.
+2. ICorProfilerInfo calls made from within instrumented code (i.e., IL you've rewritten to call into your profiler and then into ICorProfilerInfo) are considered asynchronous.
+3. Calls made inside your FunctionIDMapper hook are considered to be synchronous.
+4. Calls made on threads created by your profiler, are always considered to be synchronous. (This is because there's no danger of conflicts resulting from interrupting and then re-entering the CLR on that thread, since a profiler-created thread was not in the CLR to begin with.)
+5. Calls made inside a StackSnapshotCallback are considered to be synchronous iff the call to DoStackSnapshot was synchronous.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Debugging - Activation.md b/docs/design/coreclr/profiling/davbr-blog-archive/Debugging - Activation.md
index 79ee3e1d291a..4afd8111db88 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Debugging - Activation.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Debugging - Activation.md
@@ -15,9 +15,8 @@ Environment variables --\> Registry --\> Profiler DLL on File system.
The first link in this chain is to check the environment variables inside the process that should be profiled. If you're running the process from a command-prompt, you can just try a "set co" from the command prompt:
-|
```
-**C:\>** set co
+C:\> set co
(blah blah, other vars beginning with "co")
```
@@ -25,7 +24,6 @@ The first link in this chain is to check the environment variables inside the pr
Cor_Enable_Profiling=0x1
COR_PROFILER={C5F90153-B93E-4138-9DB7-EB7156B07C4C}
```
- |
If your scenario doesn't allow you to just run the process from a command prompt, like say an asp.net scenario, you may want to attach a debugger to the process that's supposed to be profiled, or use IFEO (HKEY\_LOCAL\_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options) to force a debugger to start when the worker process starts. In the debugger, you can then use "!peb" to view the environment block, which will include the environment variables.
@@ -62,4 +60,3 @@ or even set a breakpoint inside your Profiler DLL's **DllMain.** Now go, and s
If you're still going strong, set a breakpoint in your profiler's **Initialize** () callback. Failures here are actually a popular cause for activation problems. Inside your Initialize() callback, your profiler is likely calling QueryInterface for the ICorProfilerInfoX interface of your choice, and then calling SetEventMask, and doing other initialization-related tasks, like calling SetEnterLeaveFunctionHooks(2). Do any of these fail? Is your Initialize() callback returning a failure HRESULT?
Hopefully by now you've isolated the failure point. If not, and your Initialize() is happily returning S\_OK, then your profiler is apparently loading just fine. At least it is when you're debugging it. :-)
-
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Debugging - SOS and IDs.md b/docs/design/coreclr/profiling/davbr-blog-archive/Debugging - SOS and IDs.md
index 8f032244926c..7616327f8773 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Debugging - SOS and IDs.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Debugging - SOS and IDs.md
@@ -9,9 +9,8 @@ SOS.DLL is a debugger extension DLL that ships with the CLR. You'll find it sit
In windbg, you'll need mscorwks.dll to load first, and then you can load SOS. Often, I don't need SOS until well into my debugging session, at which point mscorwks.dll has already been loaded anyway. However, there are some cases where you'd like SOS loaded at the first possible moment, so you can use some of its commands early (like !bpmd to set a breakpoint on a managed method). So a surefire way to get SOS loaded ASAP is to have the debugger break when mscorwks gets loaded (e.g., "sxe ld mscorwks"). Once mscorwks is loaded, you can load SOS using the .loadby command:
-|
```
-0:000\> **sxe ld mscorwks**
+0:000\> sxe ld mscorwks
0:000\> g
ModLoad: 79e70000 7a3ff000 C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=7efdd000 edi=20000000
@@ -19,9 +18,8 @@ In windbg, you'll need mscorwks.dll to load first, and then you can load SOS. O
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000202
ntdll!NtMapViewOfSection+0x12:
77a1a9fa c22800 ret 28h
- 0:000\> **.loadby sos mscorwks**
+ 0:000\> .loadby sos mscorwks
```
- |
With SOS loaded, you can now use its commands to inspect the various IDs that the profiling API passes to your profiler.
@@ -35,7 +33,6 @@ As far as your profiler is concerned, a FunctionID is just an opaque number. It
Ok, so FunctionID = (MethodDesc \*). How does that help you? SOS just so happens to have a command to inspect MethodDescs: !dumpmd. So if you're in a debugger looking at your profiler code that's operating on a FunctionID, it can beneficial to you to find out which function that FunctionID actually refers to. In the example below, the debugger will break in my proifler's JITCompilationStarted callback and look at the FunctionID. It's assumed that you've already loaded SOS as per above.
-|
```
0:000\> bu UnitTestSampleProfiler!SampleCallbackImpl::JITCompilationStarted
0:000\> g
@@ -50,36 +47,30 @@ Breakpoint 0 hit
UnitTestSampleProfiler!SampleCallbackImpl::JITCompilationStarted:
10003fc0 55 push ebp
```
- |
The debugger is now sitting at the beginning of my profiler's JITCompilationStarted callback. Let's take a look at the parameters.
-|
```
0:000\> dv
this = 0x00c133f8
- **functionID = 0x1e3170**
+ functionID = 0x1e3170
fIsSafeToBlock = 1
```
- |
Aha, that's the FunctionID about to get JITted. Now use SOS to see what that function really is.
-|
```
0:000\> !dumpmd 0x1e3170
Method Name: test.Class1.Main(System.String[])
Class: 001e1288
-**MethodTable: 001e3180** mdToken: 06000001
+MethodTable: 001e3180 mdToken: 06000001
Module: 001e2d8c
IsJitted: no
m\_CodeOrIL: ffffffff
```
- |
Lots of juicy info here, though the Method Name typically is what helps me the most in my debugging sessions. mdToken tells us the metadata token for this method. MethodTable tells us where another internal CLR data structure is stored that contains information about the class containing the function. In fact, the profiing API's ClassID is simply a MethodTable \*. [Note: the "Class: 001e1288" in the output above is very different from the MethodTable, and thus different from the profiling API's ClassID. Don't let the name fool you!] So we could go and inspect a bit further by dumping information about the MethodTable:
-|
```
0:000\> !dumpmt 0x001e3180
EEClass: 001e1288
@@ -91,7 +82,6 @@ Lots of juicy info here, though the Method Name typically is what helps me the m
Number of IFaces in IFaceMap: 0
Slots in VTable: 6
```
- |
And of course, !dumpmt can be used anytime you come across a ClassID and want more info on it.
@@ -126,17 +116,15 @@ It would probably be quicker to list what _isn't_ useful! I encourage you to do
!bpmd lets you place a breakpoint on a managed method. Just specify the module name and the fully-qualified method name. For example:
-|
```
!bpmd MyModule.exe MyNamespace.MyClass.Foo
```
- |
If the method hasn't jitted yet, no worries. A "pending" breakpoint is placed. If your profiler performs IL rewriting, then using !bpmd on startup to set a managed breakpoint can be a handy way to break into the debugger just before your instrumented code will run (which, in turn, is typically just after your instrumented code has been jitted). This can help you in reproducing and diagnosing issues your profiler may run into when instrumenting particular functions (due to something interesting about the signature, generics, etc.).
!PrintException: If you use this without arguments you get to see a pretty-printing of the last outstanding managed exception on the thread; or specify a particular Exception object's address.
-
+
Ok, that about does it for SOS. Hopefully this info can help you track down problems a little faster, or better yet, perhaps this can help you step through and verify your code before problems arise.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - Callback CONTEXT Registers.md b/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - Callback CONTEXT Registers.md
index 2f6576708260..784e65b09103 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - Callback CONTEXT Registers.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - Callback CONTEXT Registers.md
@@ -5,9 +5,6 @@ In my initial [post](DoStackSnapshot - Exception Filters.md) about DoStackSnapsh
The quick answer is that **nonvolatile (i.e., preserved), integer registers** should be valid. You don't really need many registers to walk the stack anyway. Obviously, you want a good stack pointer and instruction pointer. And hey, a frame pointer is handy when you come across an EBP-based frame in x86 (RBP on x64). These are all included in the set, of course. Specifically by architecture, you can trust these fields in your context:
-x86: Edi, Esi, Ebx, Ebp, Esp, Eip
-x64: Rdi, Rsi, Rbx, Rbp, Rsp, Rip, R12:R15
-ia64: IntS0:IntS3, RsBSP, StIFS, RsPFS, IntSp, StIIP, StIPSR
-
-
-
+- x86: Edi, Esi, Ebx, Ebp, Esp, Eip
+- x64: Rdi, Rsi, Rbx, Rbp, Rsp, Rip, R12:R15
+- ia64: IntS0:IntS3, RsBSP, StIFS, RsPFS, IntSp, StIIP, StIPSR
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - Exception Filters.md b/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - Exception Filters.md
index 60ce221b4600..7e9a9484f3fd 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - Exception Filters.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - Exception Filters.md
@@ -7,38 +7,38 @@ For those of you diehard C# fans, you might be unaware of the existence of excep
First, a little background. For the full deal, check out the MSDN Library topic on VB.NET's [try/catch/finally statements](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vblr7/html/vastmTryCatchFinally.asp). But here's an appetizer. In VB.NET you can do this:
-```
-Function Negative() As Boolean
- Return False
-End Function
-
-Function Positive() As Boolean
- Return True
-End Function
-
-Sub Thrower
- Throw New Exception
-End Sub
-
-Sub Main()
- Try
- Thrower()
- Catch ex As Exception When Negative()
- MsgBox("Negative")
- Catch ex As Exception When Positive()
- MsgBox("Positive")
- End Try
-End Sub
```
+Function Negative() As Boolean
+ Return False
+End Function
-The filters are the things that come after "When". We all know that, when an exception is thrown, its type must match the type specified in a Catch clause in order for that Catch clause to be executed. "When" is a way to further restrict whether a Catch clause will be executed. Now, not only must the exception's type match, but also the When clause must evaluate to True for that Catch clause to be chosen. In the example above, when we run, we'll skip the first Catch clause (because its filter returned False), and execute the second, thus showing a message box with "Positive" in it.
-
-The thing you need to realize about DoStackSnapshot's behavior (indeed, CLR in general) is that the execution of a When clause is really a separate function call. In the above example, imagine we take a stack snapshot while inside Positive(). Our managed-only stack trace, as reported by DoStackSnapshot, would then look like this (stack grows up):
-
-Positive
-Main
-Thrower
-Main
-
-It's that highlighted Main that seems odd at first. While the exception is thrown inside Thrower(), the CLR needs to execute the filter clauses to figure out which Catch wins. These filter executions are actually _function calls_. Since filter clauses don't have their own names, we just use the name of the function containing the filter clause for stack reporting purposes. Thus, the highlighted Main above is the execution of a filter clause located inside Main (in this case, "When Positive()"). When each filter clause completes, we "return" back to Thrower() to continue our search for the filter that returns True. Since this is how the call stack is built up, that's what DoStackSnapshot will report.
+Function Positive() As Boolean
+ Return True
+End Function
+
+Sub Thrower
+ Throw New Exception
+End Sub
+
+Sub Main()
+ Try
+ Thrower()
+ Catch ex As Exception When Negative()
+ MsgBox("Negative")
+ Catch ex As Exception When Positive()
+ MsgBox("Positive")
+ End Try
+End Sub
+```
+
+The filters are the things that come after "When". We all know that, when an exception is thrown, its type must match the type specified in a Catch clause in order for that Catch clause to be executed. "When" is a way to further restrict whether a Catch clause will be executed. Now, not only must the exception's type match, but also the When clause must evaluate to True for that Catch clause to be chosen. In the example above, when we run, we'll skip the first Catch clause (because its filter returned False), and execute the second, thus showing a message box with "Positive" in it.
+
+The thing you need to realize about DoStackSnapshot's behavior (indeed, CLR in general) is that the execution of a When clause is really a separate function call. In the above example, imagine we take a stack snapshot while inside Positive(). Our managed-only stack trace, as reported by DoStackSnapshot, would then look like this (stack grows up):
+
+Positive\
+Main\
+Thrower\
+Main
+
+It's that highlighted Main that seems odd at first. While the exception is thrown inside Thrower(), the CLR needs to execute the filter clauses to figure out which Catch wins. These filter executions are actually _function calls_. Since filter clauses don't have their own names, we just use the name of the function containing the filter clause for stack reporting purposes. Thus, the highlighted Main above is the execution of a filter clause located inside Main (in this case, "When Positive()"). When each filter clause completes, we "return" back to Thrower() to continue our search for the filter that returns True. Since this is how the call stack is built up, that's what DoStackSnapshot will report.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - HRESULTs.md b/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - HRESULTs.md
index 7d9952ff7545..59d46109f365 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - HRESULTs.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/DoStackSnapshot - HRESULTs.md
@@ -5,14 +5,14 @@ Generally, corerror.h tells you all you need to know about what kinds of HRESULT
### E\_FAIL
-I don't much like E\_FAIL. If DoStackSnapshot fails, you will typically see a more descriptive, custom HRESULT. However, there are regrettably a few ways DoStackSnapshot can fail where you'll see the dreaded E\_FAIL instead. From your code's point of view, you shouldn't assume E\_FAIL will always imply one of the cases below (or conversely that each of these cases will always result in E\_FAIL). But this is just good stuff to know as you develop and debug your profiler, so you don't get blindsided.
-
-1) No managed frames on stack
-
+I don't much like E\_FAIL. If DoStackSnapshot fails, you will typically see a more descriptive, custom HRESULT. However, there are regrettably a few ways DoStackSnapshot can fail where you'll see the dreaded E\_FAIL instead. From your code's point of view, you shouldn't assume E\_FAIL will always imply one of the cases below (or conversely that each of these cases will always result in E\_FAIL). But this is just good stuff to know as you develop and debug your profiler, so you don't get blindsided.
+
+1) No managed frames on stack
+
If you call DoStackSnapshot when there are no managed functions on your target thread's stack, you can get E\_FAIL. For example, if you try to walk the stack of a target thread very early on in its execution, there simply might not be any managed frames there yet. Or, if you try to walk the stack of the finalizer thread while it's waiting to do work, there will certainly be no managed frames on its stack. It's also possible that walking a stack with no managed frames on it will yield S\_OK instead of E\_FAIL (e.g., if the target thread is jit-compiling the first managed function to be called on that thread). Again, your code probably doesn't need to worry about all these cases. If we call your StackSnapshotCallback for a managed frame, you can trust that frame is there. If we don't call your StackSnapshotCallback, you can assume there are no managed frames on the stack.
-2) OS kernel handling a hardware exception
-
+2) OS kernel handling a hardware exception
+
This one is less likely to happen, but it certainly can. When an app throws a hardware exception (e.g., divide by 0), the offending thread enters the Windows kernel. The kernel spends some time recording the thread's current user-mode register context, modifying some registers, and moving the instruction pointer to the user-mode exception dispatch routine. At this point the thread is ready to reenter user-mode. But if you are unlucky enough to call DoStackSnapshot while the target thread is still in the kernel doing this stuff, you will get E\_FAIL.
3) Detectably bad seed
@@ -25,11 +25,11 @@ Generally, this HRESULT means that your profiler requested to abort the stack wa
One of the beautiful things about running 64-bit Windows is that you can get the Windows OS to perform (native) stack walks for you. Read up on [RtlVirtualUnwind](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/rtlvirtualunwind.asp) if you're unfamiliar with this. The Windows OS has a critical section to protect a block of memory used to help perform this stack walk. So what would happen if:
-- The OS's exception handling code causes a thread to walk its own stack
-- The thread therefore enters this critical section
-- Your profiler (via DoStackSnapshot) suspends this thread while the thread is still inside the critical section
-- DoStackSnapshot uses RtlVirtualUnwind to help walk this suspended thread
-- RtlVirtualUnwind (executing on the current thread) tries to enter the critical section (already owned by suspended target thread)
+- The OS's exception handling code causes a thread to walk its own stack
+- The thread therefore enters this critical section
+- Your profiler (via DoStackSnapshot) suspends this thread while the thread is still inside the critical section
+- DoStackSnapshot uses RtlVirtualUnwind to help walk this suspended thread
+- RtlVirtualUnwind (executing on the current thread) tries to enter the critical section (already owned by suspended target thread)
If your answer was "deadlock", congratulations! DoStackSnapshot has some code that tries to avoid this scenario, by aborting the stack walk before the deadlock can occur. When this happens, DoStackSnapshot will return CORPROF\_E\_STACKSNAPSHOT\_ABORTED. Note that this whole scenario is pretty rare, and only happens on WIN64.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/ELT Hooks - The Basics.md b/docs/design/coreclr/profiling/davbr-blog-archive/ELT Hooks - The Basics.md
index af5d867ee4a4..7acb138cbd1e 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/ELT Hooks - The Basics.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/ELT Hooks - The Basics.md
@@ -5,79 +5,84 @@ The CLR Profiling API allows you to hook managed functions so that your profiler
### Setting up the hooks
-1. On initialization, your profiler must call SetEnterLeaveFunctionHooks(2) to specify which functions inside your profiler should be called whenever a managed function is entered, returns, or exits via tail call, respectively.
- _(Profiler calls this…)_
+1. On initialization, your profiler must call SetEnterLeaveFunctionHooks(2) to specify which functions inside your profiler should be called whenever a managed function is entered, returns, or exits via tail call, respectively.
+
+ _(Profiler calls this…)_
+
```
HRESULT SetEnterLeaveFunctionHooks(
- [in] FunctionEnter \*pFuncEnter,
- [in] FunctionLeave \*pFuncLeave,
- [in] FunctionTailcall \*pFuncTailcall);
- ```
-
- _(Profiler implements these…)_
- ```
- typedef void FunctionEnter(FunctionID funcID);
- typedef void FunctionLeave(FunctionID funcID);
- typedef void FunctionTailcall(FunctionID funcID);
+ [in] FunctionEnter *pFuncEnter,
+ [in] FunctionLeave *pFuncLeave,
+ [in] FunctionTailcall *pFuncTailcall);
```
- **OR**
+ _(Profiler implements these…)_
- _(Profiler calls this…)_
- ```
- HRESULT SetEnterLeaveFunctionHooks2(
- [in] FunctionEnter2 *pFuncEnter,
- [in] FunctionLeave2 *pFuncLeave,
- [in] FunctionTailcall2 *pFuncTailcall);
- ```
-
+ ```
+ typedef void FunctionEnter(FunctionID funcID);
+ typedef void FunctionLeave(FunctionID funcID);
+ typedef void FunctionTailcall(FunctionID funcID);
+ ```
- _(Profiler implements these…)_
- ```
- typedef void FunctionEnter2(
- FunctionID funcId,
- UINT_PTR clientData,
- COR_PRF_FRAME_INFO func,
- COR_PRF_FUNCTION_ARGUMENT_INFO *argumentInfo);
-
- typedef void FunctionLeave2(
- FunctionID funcId,
- UINT_PTR clientData,
- COR_PRF_FRAME_INFO func,
- COR_PRF_FUNCTION_ARGUMENT_RANGE *retvalRange);
-
- typedef void FunctionTailcall2(
- FunctionID funcId,
- UINT_PTR clientData,
- COR_PRF_FRAME_INFO func);
- ```
+ **OR**
+
+ _(Profiler calls this…)_
+
+ ```
+ HRESULT SetEnterLeaveFunctionHooks2(
+ [in] FunctionEnter2 *pFuncEnter,
+ [in] FunctionLeave2 *pFuncLeave,
+ [in] FunctionTailcall2 *pFuncTailcall);
+ ```
- This step alone does not cause the enter/leave/tailcall (ELT) hooks to be called. But you must do this on startup to get things rolling.
+ _(Profiler implements these…)_
-2. At any time during the run, your profiler calls SetEventMask specifying COR\_PRF\_MONITOR\_ENTERLEAVE in the bitmask. Your profiler may set or reset this flag at any time to cause ELT hooks to be called or ignored, respectively.
+ ```
+ typedef void FunctionEnter2(
+ FunctionID funcId,
+ UINT_PTR clientData,
+ COR_PRF_FRAME_INFO func,
+ COR_PRF_FUNCTION_ARGUMENT_INFO *argumentInfo);
+
+ typedef void FunctionLeave2(
+ FunctionID funcId,
+ UINT_PTR clientData,
+ COR_PRF_FRAME_INFO func,
+ COR_PRF_FUNCTION_ARGUMENT_RANGE *retvalRange);
+
+ typedef void FunctionTailcall2(
+ FunctionID funcId,
+ UINT_PTR clientData,
+ COR_PRF_FRAME_INFO func);
+ ```
+
+ This step alone does not cause the enter/leave/tailcall (ELT) hooks to be called. But you must do this on startup to get things rolling.
+
+2. At any time during the run, your profiler calls SetEventMask specifying COR\_PRF\_MONITOR\_ENTERLEAVE in the bitmask. Your profiler may set or reset this flag at any time to cause ELT hooks to be called or ignored, respectively.
### FunctionIDMapper
In addition to the above two steps, your profiler may specify more granularly which managed functions should have ELT hooks compiled into them:
-1. At any time, your profiler may call ICorProfilerInfo2::SetFunctionIDMapper to specify a special hook to be called when a function is JITted.
+1. At any time, your profiler may call ICorProfilerInfo2::SetFunctionIDMapper to specify a special hook to be called when a function is JITted.
+
+ _(Profiler calls this…)_
-_(Profiler calls this…)_
-```
- HRESULT SetFunctionIDMapper([in] FunctionIDMapper \*pFunc);
-```
-
+ ```
+ HRESULT SetFunctionIDMapper([in] FunctionIDMapper \*pFunc);
+ ```
+
+ _(Profiler implements this…)_
+
+ ```
+ typedef UINT_PTR __stdcall FunctionIDMapper(
+ FunctionID funcId,
+ BOOL *pbHookFunction);
+ ```
- _(Profiler implements this…)_
-```
-typedef UINT_PTR __stdcall FunctionIDMapper(
- FunctionID funcId,
- BOOL *pbHookFunction);
-```
-
2. When FunctionIDMapper is called:
- a. Your profiler sets the pbHookFunction [out] parameter appropriately to determine whether the function identified by funcId should have ELT hooks compiled into it.
+ a. Your profiler sets the pbHookFunction \[out] parameter appropriately to determine whether the function identified by funcId should have ELT hooks compiled into it.
b. Of course, the primary purpose of FunctionIDMapper is to allow your profiler to specify an alternate ID for that function. Your profiler does this by returning that ID from FunctionIDMapper . The CLR will pass this alternate ID to your ELT hooks (as funcID if you're using the 1.x ELT, and as clientData if you're using the 2.x ELT).
### Writing your ELT hooks
@@ -92,8 +97,6 @@ The solution is “NGEN /Profile”. For example, if you run this command agains
`ngen install MyAssembly.dll /Profile`
-
-
it will NGEN MyAssembly.dll with the “Profile” flavor (also called “profiler-enhanced”). This flavor causes extra hooks to be baked in to enable features like ELT hooks, loader callbacks, managed/unmanaged code transition callbacks, and the JITCachedFunctionSearchStarted/Finished callbacks.
The original NGENd versions of all your assemblies still stay around in your NGEN cache. NGEN /Profile simply causes a new set of NGENd assemblies to be generated as well, marked as the “profiler-enhanced” set of NGENd assemblies. At run-time, the CLR determines which flavor should be loaded. If a profiler is attached and enables certain features that only work with profiler-enhanced (not regular) NGENd assemblies (such as ELT via a call to SetEnterLeaveFunctionHooks(2), or any of several other features that are requested by setting particular event flags via SetEventMask), then the CLR will only load profiler-enhanced NGENd images--and if none exist then the CLR degrades to JIT in order to support the features requested by the profiler. In contrast, if the profiler does not specify such event flags, or there is no profiler to begin with, then the CLR loads the regular-flavored NGENd assemblies.
@@ -128,4 +131,3 @@ Why do you care? Well, it's always good to know what price you're paying. If you
### Next time...
That about covers it for the ELT basics. Next installment of this riveting series will talk about that enigma known as tailcall.
-
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/ELT Hooks - tail calls.md b/docs/design/coreclr/profiling/davbr-blog-archive/ELT Hooks - tail calls.md
index 3cca8c9a9c5c..d00ceba195e7 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/ELT Hooks - tail calls.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/ELT Hooks - tail calls.md
@@ -79,7 +79,7 @@ typedef void FunctionTailcall2(
COR_PRF_FRAME_INFO func);
```
-**Tip** : More than once I've seen profiler writers make the following mistake. They will take their naked assembly-language wrapper for their Enter2 and Leave2 hooks, and paste it again to use as the Tailcall2 assembly-language wrapper. The problem is they forget that the Tailcall2 hook takes a different number of parameters than the Enter2 / Leave2 hooks (or, more to the point, a different number of _bytes_ is passed on the stack to invoke the Tailcall2 hook). So, they'll take the "ret 16" at the end of their Enter2/Leave2 hook wrappers and stick that into their Tailcall2 hook wrapper, forgetting to change it to a "ret 12". Don't make the same mistake!
+**Tip** : More than once I've seen profiler writers make the following mistake. They will take their naked assembly-language wrapper for their Enter2 and Leave2 hooks, and paste it again to use as the Tailcall2 assembly-language wrapper. The problem is they forget that the Tailcall2 hook takes a different number of parameters than the Enter2 / Leave2 hooks (or, more to the point, a different number of _bytes_ is passed on the stack to invoke the Tailcall2 hook). So, they'll take the "ret 16" at the end of their Enter2/Leave2 hook wrappers and stick that into their Tailcall2 hook wrapper, forgetting to change it to a "ret 12". Don't make the same mistake!
It's worth noting what these parameters mean. With the Enter and Leave hooks it's pretty obvious that the parameters your hook is given (e.g., funcId) apply to the function being Entered or Left. But what about the Tailcall hook? Do the Tailcall hook's parameters describe the caller (function making the tail call) or the callee (function being tail called into)?
@@ -95,7 +95,7 @@ Ok, enough dilly-dallying. What should your profiler do in its Tailcall hook? Tw
The [CLRProfiler](http://www.microsoft.com/downloads/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0&DisplayLang=en) is a great example of using Enter/Leave/Tailcall hooks to maintain shadow stacks. A shadow stack is your profiler's own copy of the current stack of function calls on a given thread at any given time. Upon Enter of a function, you push that FunctionID (and whatever other info interests you, such as arguments) onto your data structure that represents that thread's stack. Upon Leave of a function, you pop that FunctionID. This gives you a live list of managed calls in play on the thread. The CLRProfiler uses shadow stacks so that whenever the managed app being profiled chooses to allocate a new object, the CLRProfiler can know the managed call stack that led to the allocation. (Note that an alternate way of accomplishing this would be to call DoStackSnapshot at every allocation point instead of maintaining a shadow stack. Since objects are allocated so frequently, however, you'd end up calling DoStackSnapshot extremely frequently and will often see worse performance than if you had been maintaining shadow stacks in the first place.)
-
+
OK, so when your profiler maintains a shadow stack, it's clear what your profiler should do on Enter or Leave, but what should it do on Tailcall? There are a couple ways one could imagine answering that question, but only one of them will work! Taking the example from the top of this post, imagine the stack looks like this:
@@ -121,9 +121,11 @@ Method 2: On tailcall, "mark" the FunctionID at the top of your stack as needing
With this strategy, for the duration of the call to Three(), the shadow stack will look like this:
-Three
-Helper (marked for deferred pop)
-Main
+```
+Three
+Helper (marked for deferred pop)
+Main
+```
which some might consider more user-friendly. And as soon as Three() returns, your profiler will sneakily do a double-pop leaving just this:
@@ -163,9 +165,11 @@ Method 2: Shadow stack fails
At stage (4), the shadow stack looks like this:
-Helper
-Thread.Sleep (marked for "deferred pop")
+```
+Helper
+Thread.Sleep (marked for "deferred pop")
Main
+```
If you think it might be complicated to explain tail calls to your users so they can understand the Method 1 form of shadow stack presentation, just try explaining why it makes sense to present to them that Thread.Sleep() is calling Helper()!
@@ -184,11 +188,11 @@ static public void Main()
would yield:
```
-Helper
-Thread.Sleep (marked for "deferred pop")
-Thread.Sleep (marked for "deferred pop")
-Thread.Sleep (marked for "deferred pop")
-Thread.Sleep (marked for "deferred pop")
+Helper
+Thread.Sleep (marked for "deferred pop")
+Thread.Sleep (marked for "deferred pop")
+Thread.Sleep (marked for "deferred pop")
+Thread.Sleep (marked for "deferred pop")
Main
```
@@ -211,11 +215,11 @@ static public void Helper()
would yield:
```
-Thread.Sleep (marked for "deferred pop")
-Thread.Sleep (marked for "deferred pop")
-Thread.Sleep (marked for "deferred pop")
-Thread.Sleep (marked for "deferred pop")
-Helper
+Thread.Sleep (marked for "deferred pop")
+Thread.Sleep (marked for "deferred pop")
+Thread.Sleep (marked for "deferred pop")
+Thread.Sleep (marked for "deferred pop")
+Helper
Main
```
@@ -337,7 +341,7 @@ ildasm Class1.exe
Inside ildasm, use File.Dump to generate a text file that contains a textual representation of the IL from Class1.exe. Call it Class1WithTail.il. Open up that file and add the tail. prefix just before the call you want optimized into a tail call (see highlighted yellow for changes):
```
-.method private hidebysig static int32
+.method private hidebysig static int32
Helper(int32 i) cil managed
{
~~// Code size 45 (0x2d)
@@ -386,5 +390,5 @@ If you didn't learn anything, I hope you at least got some refreshing sleep than
- Since some managed functions may tail call into native helper functions inside the CLR (for which you won't get an Enter hook notification), your Tailcall hook should treat the tail call as if it were a Leave, and not depend on the next Enter hook correlating to the target of the last tail call. With shadow stacks, for example, this means you should simply pop the calling function off your shadow stack in your Tailcall hook.
- Since tail calls can be elusive to find in practice, it's well worth your while to use ildasm/ilasm to manufacture explicit tail calls so you can step through your Tailcall hook and test its logic.
-_David has been a developer at Microsoft for over 70 years (allowing for his upcoming time-displacement correction). He joined Microsoft in 2079, first starting in the experimental time-travel group. His current assignment is to apply his knowledge of the future to eliminate the "Wait for V3" effect customers commonly experience in his source universe. By using Retroactive Hindsight-ellisenseTM his goal is to "get it right the first time, this time" in a variety of product groups._
+_David has been a developer at Microsoft for over 70 years (allowing for his upcoming time-displacement correction). He joined Microsoft in 2079, first starting in the experimental time-travel group. His current assignment is to apply his knowledge of the future to eliminate the "Wait for V3" effect customers commonly experience in his source universe. By using Retroactive Hindsight-ellisenseTM his goal is to "get it right the first time, this time" in a variety of product groups._
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Generics and Your Profiler.md b/docs/design/coreclr/profiling/davbr-blog-archive/Generics and Your Profiler.md
index 149a0c0a7888..856290fd9931 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Generics and Your Profiler.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Generics and Your Profiler.md
@@ -7,7 +7,7 @@ If you’re writing a profiler that you expect to run against CLR 2.0 or greater
Let's say a C# developer writes code like this:
-
+
```
class MyClass
{
@@ -57,8 +57,6 @@ HRESULT GetFunctionInfo2([in] FunctionID funcId,
typeArgs[]: This is the array of **type arguments** to MyClass\.Foo\. So this will be an array of only one element: the ClassID for float. (The int in MyClass\ is a type argument to MyClass, not to Foo, and you would only see that when you call GetClassIDInfo2 with MyClass\.)
-##
-
## GetClassIDInfo2
OK, someone in parentheses said something about calling GetClassIDInfo2, so let’s do that. Since we got the ClassID for MyClass\ above, let’s pass it to GetClassIDInfo2 to see what we get:
@@ -89,21 +87,19 @@ To understand why, it’s necessary to understand an internal optimization the C
For now, the important point is that, once we’re inside JITted code that is shared across different generic instantiations, how can one know which instantiation is the actual one that caused the current invocation? Well, in many cases, the CLR may not have that data readily lying around. However, as a profiler, you can capture this information and pass it back to the CLR when it needs it. This is done through a COR\_PRF\_FRAME\_INFO. There are two ways your profiler can get a COR\_PRF\_FRAME\_INFO:
-1. Via slow-path Enter/Leave/Tailcall probes
-2. Via your DoStackSnapshot callback
+1. Via slow-path Enter/Leave/Tailcall probes
+2. Via your DoStackSnapshot callback
I lied. #1 is really the only way for your profiler to get a COR\_PRF\_FRAME\_INFO. #2 may seem like a way—at least the profiling API suggests that the CLR gives your profiler a COR\_PRF\_FRAME\_INFO in the DSS callback—but unfortunately the COR\_PRF\_FRAME\_INFO you get there is pretty useless. I suspect the COR\_PRF\_FRAME\_INFO parameter was added to the signature of the profiler’s DSS callback function so that it could “light up” at some point in the future when we could work on finding out how to create a sufficiently helpful COR\_PRF\_FRAME\_INFO during stack walks. However, that day has not yet arrived. So if you want a COR\_PRF\_FRAME\_INFO, you’ll need to grab it—and use it from—your slow-path Enter/Leave/Tailcall probe.
With a valid COR\_PRF\_FRAME\_INFO, GetFunctionInfo2 will give you helpful, specific ClassIDs in the typeArgs [out] array and pClassId [out] parameter. If the profiler passes NULL for COR\_PRF\_FRAME\_INFO, here’s what you can expect:
-- If you’re using CLR V2, pClassId will point to NULL if the function sits on _any_ generic class (shared or not). In CLR V4 this got a little better, and you’ll generally only see pClassId point to NULL if the function sits on a “shared” generic class (instantiated with reference types).
- - Note: If it’s impossible for the profiler to have a COR\_PRF\_FRAME\_INFO handy to pass to GetFunctionInfo2, and that results in a NULL \*pClassID, the profiler can always use the metadata interfaces to find the mdTypeDef token of the class on which the function resides for the purposes of pretty-printing the class name to the user. Of course, the profiler will not know the specific instantiating type arguments that were used on the class in that case.
-- the typeArgs [out] array will contain the ClassID for **System.\_\_Canon** , rather than the actual instantiating type(s), if the function itself is generic and is instantiated with reference type argument(s).
+- If you’re using CLR V2, pClassId will point to NULL if the function sits on _any_ generic class (shared or not). In CLR V4 this got a little better, and you’ll generally only see pClassId point to NULL if the function sits on a “shared” generic class (instantiated with reference types).
+ - Note: If it’s impossible for the profiler to have a COR\_PRF\_FRAME\_INFO handy to pass to GetFunctionInfo2, and that results in a NULL \*pClassID, the profiler can always use the metadata interfaces to find the mdTypeDef token of the class on which the function resides for the purposes of pretty-printing the class name to the user. Of course, the profiler will not know the specific instantiating type arguments that were used on the class in that case.
+- the typeArgs [out] array will contain the ClassID for **System.\_\_Canon** , rather than the actual instantiating type(s), if the function itself is generic and is instantiated with reference type argument(s).
It’s worth noting here that there is a bug in GetFunctionInfo2, in that the [out] pClassId you get for the class containing the function can be wrong with generic virtual functions. Take a look at [this forum post](http://social.msdn.microsoft.com/Forums/en-US/netfxtoolsdev/thread/ed6f972f-712a-48df-8cce-74f8951503fa/) for more information and a workaround.
-##
-
## ClassIDs & FunctionIDs vs. Metadata Tokens
Although you can infer this from the above, let’s take a breather and review. When you have multiple generic instantiations of a generic type, that type is defined with one mdTypeDef (metadata token), but you’ll see multiple ClassIDs (one per instantiation). When you have multiple generic instantiations of a generic method, it’s defined with one mdMethodDef (metadata token), but you’ll see multiple FunctionIDs (one per instantiation).
@@ -120,14 +116,14 @@ If you got curious, and ran such a profiler under the debugger, you could use th
If your profiler performs IL rewriting, it’s important to understand that it must NOT do instantiation-specific IL rewriting. Huh? Let’s take an example. Suppose you’re profiling code that uses MyClass\.Foo\ and MyClass\.Foo\. Your profiler will see two JITCompilationStarted callbacks, and will have two opportunities to rewrite the IL. Your profiler may call GetFunctionInfo2 on those two FunctionIDs and determine that they’re two different instantiations of the same generic function. You may then be tempted to make use of the fact that one is instantiated with float, and the other with long, and provide different IL for the two different JIT compilations. The problem with this is that the IL stored in metadata, as well as the IL provided to SetILFunctionBody, is always specified relative to the mdMethodDef. (Remember, SetILFunctionBody doesn’t take a FunctionID as input; it takes an mdMethodDef.) And it’s the profiler’s responsibility always to specify the same rewritten IL for any given mdMethodDef no matter how many times it’s JITted. And a given mdMethodDef can be JITted multiple times due to a number of reasons:
-- Two threads simultaneously trying to call the same function for the first time (and thus both trying to JIT that function)
-- Strange dependency chains involving class constructors (more on this in the MSDN [reference topic](http://msdn.microsoft.com/en-us/library/ms230586.aspx))
-- Multiple AppDomains using the same (non-domain-neutral) function
-- And of course multiple generic instantiations!
+- Two threads simultaneously trying to call the same function for the first time (and thus both trying to JIT that function)
+- Strange dependency chains involving class constructors (more on this in the MSDN [reference topic](http://msdn.microsoft.com/en-us/library/ms230586.aspx))
+- Multiple AppDomains using the same (non-domain-neutral) function
+- And of course multiple generic instantiations!
Regardless of the reason, the profiler must always rewrite with exactly the same IL. Otherwise, an invariant in the CLR will have been broken by the profiler, and you will get strange, undefined behavior as a result. And no one wants that.
-
+
That’s it! Hopefully this gives you a good idea of how the CLR Profiling API will behave in the face of generic classes and functions, and what is expected of your profiler.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Metadata Tokens, Run-Time IDs, and Type Loading.md b/docs/design/coreclr/profiling/davbr-blog-archive/Metadata Tokens, Run-Time IDs, and Type Loading.md
index 1b1e2f74d7a3..283194e860dd 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Metadata Tokens, Run-Time IDs, and Type Loading.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Metadata Tokens, Run-Time IDs, and Type Loading.md
@@ -31,16 +31,12 @@ Yes, that is a good example. You are an astute reader. Memory profilers that w
# Going from metadata token to run-time ID
-#
-
-#
-
As I mentioned above, the safest way to do this is to build up your own map and do reverse-lookups as necessary. If that scheme meets your needs, then by all means do that, and stop reading! But in the cases where this is insufficient, you may need to resort to using GetFunctionFromToken(AndTypeArgs) and GetClassFromToken(AndTypeArgs). There is no simple, foolproof way to use these APIs safely, but here is your guideline:
**Never call GetFunctionFromToken(AndTypeArgs) and GetClassFromToken(AndTypeArgs) unless you’re certain the relevant types have been loaded.** (“Relevant types” include the ClassID containing the FunctionID whose mdMethodDef you pass to GetFunctionFromToken(AndTypeArgs), and the ClassID whose mdTypeDef you pass to GetClassFromToken(AndTypeArgs).) If these types have not been loaded, _you may cause them to be loaded now_! This is bad because:
-- This is an easy way to crash the app. Trying to load a type at the wrong time could cause cycles, causing infinite loops (depending on what your profiler does in response to class load notifications) or outright crashes. For example, trying to load a type while its containing assembly is still in an early phase of loading is a great and fun way to crash the CLR.
-- You will impact the behavior of the app. If you’re lucky enough not to crash the app, you’ve still impacted its behavior, by causing types to get loaded in a different order than they normally would. Any impact to app behavior like this makes it difficult for your users to reproduce problems that they are trying to use your tool to diagnose, or may hide problems that they don’t discover until they run their application outside of your tool.
+- This is an easy way to crash the app. Trying to load a type at the wrong time could cause cycles, causing infinite loops (depending on what your profiler does in response to class load notifications) or outright crashes. For example, trying to load a type while its containing assembly is still in an early phase of loading is a great and fun way to crash the CLR.
+- You will impact the behavior of the app. If you’re lucky enough not to crash the app, you’ve still impacted its behavior, by causing types to get loaded in a different order than they normally would. Any impact to app behavior like this makes it difficult for your users to reproduce problems that they are trying to use your tool to diagnose, or may hide problems that they don’t discover until they run their application outside of your tool.
## Determining whether a class was loaded
@@ -54,14 +50,14 @@ MyRetType MyClass::MyFunction(MyArgumentType myArgumentType)
then you can be reasonably assured that the following are loaded:
-- MyClass
-- MyArgumentType (if it’s a value-type)
-- MyRetType (if it’s a value-type)
-- For any class you know is loaded, so should be:
- - its base class
- - its value-type fields (not necessarily reference-type fields!)
- - implemented interfaces
- - value-type generic type arguments (and even reference-type generic type arguments in the case of MyClass)
+- MyClass
+- MyArgumentType (if it’s a value-type)
+- MyRetType (if it’s a value-type)
+- For any class you know is loaded, so should be:
+ - its base class
+ - its value-type fields (not necessarily reference-type fields!)
+ - implemented interfaces
+ - value-type generic type arguments (and even reference-type generic type arguments in the case of MyClass)
So much for stacks. What if you encounter an instance of a class on the heap? Surely the class is loaded then, right? Well, probably. If you encounter an object on heap just after GC (inside **GarbageCollectionFinished** , before you return), it should be safe to inspect the class’s layout, and then peek through ObjectIDs to see the values of their fields.
@@ -73,7 +69,7 @@ In general, a lot of the uncertainty above comes from types stored in NGENd modu
Now is a good time remind you that, not only is it dangerous to inspect run-time IDs too early (i.e., before they load); it’s also dangerous to inspect run-time IDs too late (i.e., after they **unload** ). For example, if you store ClassIDs and FunctionIDs for later use, and use them “too late”, you can easily crash the CLR. The profiling API does pretty much no validation of anything (in many cases, it’s incapable of doing so without using up significant amounts of memory to maintain lookup tables for everything). So we generally take any run-time ID that you pass to ICorProfilerInfo\* methods, cast it to an internal CLR structure ptr, and go boom if the ID is bad.
-There is no way to just ask the CLR if a FunctionID or ClassID is valid. Indeed, classes could get unloaded, and new classes loaded, and your ClassID may now refer to a totally different (valid) class.
+There is no way to just ask the CLR if a FunctionID or ClassID is valid. Indeed, classes could get unloaded, and new classes loaded, and your ClassID may now refer to a totally different (valid) class.
You need to keep track of the unloads yourself. You are notified when run-time IDs go out of scope (today, this happens at the level of an AppDomain unloading or a collectible assembly unloading—in both cases all IDs “contained” in the unloading thing are now invalid). Once a run-time ID is out of scope, you are not allowed to pass that run-time ID back to the CLR. In fact, you should consider whether thread synchronization will be necessary in your profiler to maintain this invariant. For example, if a run-time ID gets unloaded on thread A, you’re still not allowed to pass that run-time ID back to the CLR on thread B. So you may need to block on a critical section in thread A during the \*UnloadStarted / AppDomainShutdown\* callbacks, to prevent them from returning to the CLR until any uses of the contained IDs in thread B are finished.
@@ -91,16 +87,16 @@ ResolveTypeRef doesn’t know about any of this—it was never designed to be us
If you absolutely need to resolve refs to defs, your best bet may be to use your own algorithm which will be as accurate as you can make it, under the circumstances, and which will never try to locate a module that hasn’t been loaded yet. That means that you shouldn’t try to resolve a ref to a def if that def hasn’t actually been loaded into a type by the CLR. Consider using an algorithm similar to the following:
-1. Get the AssemblyRef from the TypeRef to get to the name, public key token and version of the assembly where the type should reside.
-2. Enumerate all loaded modules that the Profiling API has notified you of (or via [EnumModules](http://msdn.microsoft.com/en-us/library/dd490890)) (you can filter out a specific AppDomain at this point if you want).
-3. In each enumerated module, search for a TypeDef with the same name and namespace as the TypeRef (IMetaDataImport::FindTypeDefByName)
-4. Pay attention to **type forwarding**! Once you find the TypeDef, it may actually be an “exported” type, in which case you will need to follow the trail to the next module. Read toward the bottom of [this post](Type Forwarding.md) for more info.
+1. Get the AssemblyRef from the TypeRef to get to the name, public key token and version of the assembly where the type should reside.
+2. Enumerate all loaded modules that the Profiling API has notified you of (or via [EnumModules](http://msdn.microsoft.com/en-us/library/dd490890)) (you can filter out a specific AppDomain at this point if you want).
+3. In each enumerated module, search for a TypeDef with the same name and namespace as the TypeRef (IMetaDataImport::FindTypeDefByName)
+4. Pay attention to **type forwarding**! Once you find the TypeDef, it may actually be an “exported” type, in which case you will need to follow the trail to the next module. Read toward the bottom of [this post](Type Forwarding.md) for more info.
The above can be a little bit smarter by paying attention to what order you choose to search through the modules:
-- First search for the TypeDef in assemblies which exactly match the name, public key token and version for the AssemblyRef.
-- If that fails, then search through assemblies matching name and public key token (where the version is higher than the one supplied – this can happen for Framework assemblies).
-- If that fails, then search through all the other assemblies
+- First search for the TypeDef in assemblies which exactly match the name, public key token and version for the AssemblyRef.
+- If that fails, then search through assemblies matching name and public key token (where the version is higher than the one supplied – this can happen for Framework assemblies).
+- If that fails, then search through all the other assemblies
I must warn you that the above scheme is **not tested and not supported. Use at your own risk!**
@@ -108,7 +104,7 @@ I must warn you that the above scheme is **not tested and not supported. Use at
Although I cannot comment on what will or will not be in any particular future version of the CLR, I can tell you that it is clear to us on the CLR team that we have work to do, to make dealing with metadata tokens and their corresponding run-time type information easier from the profiling API. After all, it doesn’t take a rocket scientist to read the above and conclude that it does take a rocket scientist to actually follow all this advice. So for now, enjoy the fact that what you do is really hard, making you difficult to replace, and thus your job all the more secure. You’re welcome.
-
+
Special thanks to David Wrighton and Karel Zikmund, who have helped considerably with all content in this entry around the type system and metadata.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Profiler Detach.md b/docs/design/coreclr/profiling/davbr-blog-archive/Profiler Detach.md
index 987ee24507b4..4b87a0018c44 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Profiler Detach.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Profiler Detach.md
@@ -9,9 +9,9 @@ The Detach feature allows a profiler that the user is finished with to be unload
Not every V4 profiler is allowed to detach from a running process. The general rule is that a profiler which has caused an irreversible impact in the process it’s profiling should _not_ attempt to detach. The CLR catches the following cases:
-- Profiler set immutable flags (COR\_PRF\_MONITOR\_IMMUTABLE) via SetEventMask.
-- Profiler performed IL rewriting via SetILFunctionBody
-- Profiler used the Enter/Leave/Tailcall methods to add callouts to its probes
+- Profiler set immutable flags (COR\_PRF\_MONITOR\_IMMUTABLE) via SetEventMask.
+- Profiler performed IL rewriting via SetILFunctionBody
+- Profiler used the Enter/Leave/Tailcall methods to add callouts to its probes
If the profiler attempts to detach after doing any of the above, the CLR will disallow the attempt (see below for details).
@@ -25,20 +25,20 @@ There’s one, deceptively simple-looking method the profiler calls to detach it
So, the sequence works like this:
-1. The profiler **deactivates all the ways control could enter the profiler** (aside from the CLR Profiling API itself). This means removing any Windows callbacks, timer interrupts, hijacking, disabling any other components that may try to call into the profiler DLL, etc. The profiler must also wait for all threads that it has created (e.g., a sampling thread, inter-process communication threads, a ForceGC thread, etc.) to exit, except for the one thread the profiler will use to call RequestProfilerDetach(). Any threads created by the CLR, of course, should not be tampered with.
- - Your profiler must block here until all those ways control can enter your profiler DLL have truly been deactivated (e.g., just setting a flag to disable sampling may not be enough if your sampling thread is currently performing a sample already in progress). You must coordinate with all components of your profiler so that your profiler DLL knows that everything is verifiably deactivated, and all profiler-created threads have exited (except for the one thread the profiler will use to call RequestProfilerDetach()).
-2. If the profiler will use a thread of its own creation to call RequestProfilerDetach() (which is the typical way this API will be called), that thread must own a reference onto the profiler’s DLL, via its own **LoadLibrary()** call that it makes on the profiler DLL. This can either be done when the thread starts up, or now, or sometime in between. But that reference must be added at some point before calling RequestProfilerDetach().
-3. Profiler calls ICorProfilerInfo3:: **RequestProfilerDetach** ().
- - (A) This causes the CLR to (synchronously) set internal state to avoid making any further calls into the profiler via the ICorProfilerCallback\* interfaces, and to refuse any calls from the profiler into ICorProfilerInfo\* interfaces (such calls will now fail early with CORPROF\_E\_PROFILER\_DETACHING).
- - (B) The CLR also (asynchronously) begins a period safety check on another thread to determine when all pre-existing calls into the profiler via the ICorProfilerCallback\* interfaces have returned.
- - Note: It is expected that your profiler will not make any more “unsolicited” calls back into the CLR via any interfaces (ICorProfilerInfo\*, hosting, metahost, metadata, etc.). By “unsolicited”, I’m referring to calls that didn’t originate from the CLR via ICorProfilerCallback\*. In other words, it’s ok for the profiler to continue to do its usual stuff in its implementation of ICorProfilerCallback methods (which may include calling into the CLR via ICorProfilerInfo\*), as the CLR will wait for those outer ICorProfilerCallback methods to return as per 3B. But the profiler must not make any other calls into the CLR (i.e., that are not sandwiched inside an ICorProfilerCallback call). You should already have deactivated any component of your profiler that would make such unsolicited calls in step 1.
-4. Assuming the above RequestProfilerDetach call was made on a profiler-created thread, that thread must now call [**FreeLibraryAndExitThread**](http://msdn.microsoft.com/en-us/library/ms683153(VS.85).aspx)**()**. (Note: that’s a specialized Windows API that combines FreeLibrary() and ExitThread() in such a way that races can be avoided—do not call FreeLibrary() and ExitThread() separately.)
-5. On another thread, the CLR continues its **period safety checks** from 3B above. Eventually the CLR determines that there are no more ICorProfilerCallback\* interface calls currently executing, and it is therefore safe to unload the profiler.
-6. The CLR calls ICorProfilerCallback3:: **ProfilerDetachSucceeded**. The profiler can use this signal to know that it’s about to be unloaded. It’s expected that the profiler will do very little in this callback—probably just notifying the user that the profiler is about to be unloaded. Any cleanup the profiler needs to do should already have been done during step 1.
-7. CLR makes the necessary number of **Release** () calls on ICorProfilerCallback3. The reference count should go down to 0 at this point, and the profiler may deallocate any memory it had previously allocated to support its callback implementation.
-8. CLR calls **FreeLibrary** () on the profiler DLL. This should be the last reference to the profiler’s DLL, and your DLL will now be unloaded.
- - Note: in some cases, it’s theoretically possible that step 4 doesn’t happen until _after_ this step, in which case the last reference to the profiler’s DLL will actually be released by your profiler’s thread that called RequestProfilerDetach and then FreeLibraryAndExitThread. That’s because steps 1-4 happen on your profiler’s thread, and steps 5-8 happen on a dedicated CLR thread (for detaching profilers) sometime after step 3 is completed. So there’s a race between step 4 and all of steps 5-8. There’s no harm in this, so long as you’re playing nice by doing your own LoadLibrary and FreeLibraryAndExitThread as described above.
-9. The CLR adds an Informational entry to the Application Event Log noting that the profiler has been unloaded. The CLR is now ready to service any profiler attach requests.
+1. The profiler **deactivates all the ways control could enter the profiler** (aside from the CLR Profiling API itself). This means removing any Windows callbacks, timer interrupts, hijacking, disabling any other components that may try to call into the profiler DLL, etc. The profiler must also wait for all threads that it has created (e.g., a sampling thread, inter-process communication threads, a ForceGC thread, etc.) to exit, except for the one thread the profiler will use to call RequestProfilerDetach(). Any threads created by the CLR, of course, should not be tampered with.
+ - Your profiler must block here until all those ways control can enter your profiler DLL have truly been deactivated (e.g., just setting a flag to disable sampling may not be enough if your sampling thread is currently performing a sample already in progress). You must coordinate with all components of your profiler so that your profiler DLL knows that everything is verifiably deactivated, and all profiler-created threads have exited (except for the one thread the profiler will use to call RequestProfilerDetach()).
+2. If the profiler will use a thread of its own creation to call RequestProfilerDetach() (which is the typical way this API will be called), that thread must own a reference onto the profiler’s DLL, via its own **LoadLibrary()** call that it makes on the profiler DLL. This can either be done when the thread starts up, or now, or sometime in between. But that reference must be added at some point before calling RequestProfilerDetach().
+3. Profiler calls ICorProfilerInfo3:: **RequestProfilerDetach** ().
+ - (A) This causes the CLR to (synchronously) set internal state to avoid making any further calls into the profiler via the ICorProfilerCallback\* interfaces, and to refuse any calls from the profiler into ICorProfilerInfo\* interfaces (such calls will now fail early with CORPROF\_E\_PROFILER\_DETACHING).
+ - (B) The CLR also (asynchronously) begins a period safety check on another thread to determine when all pre-existing calls into the profiler via the ICorProfilerCallback\* interfaces have returned.
+ - Note: It is expected that your profiler will not make any more “unsolicited” calls back into the CLR via any interfaces (ICorProfilerInfo\*, hosting, metahost, metadata, etc.). By “unsolicited”, I’m referring to calls that didn’t originate from the CLR via ICorProfilerCallback\*. In other words, it’s ok for the profiler to continue to do its usual stuff in its implementation of ICorProfilerCallback methods (which may include calling into the CLR via ICorProfilerInfo\*), as the CLR will wait for those outer ICorProfilerCallback methods to return as per 3B. But the profiler must not make any other calls into the CLR (i.e., that are not sandwiched inside an ICorProfilerCallback call). You should already have deactivated any component of your profiler that would make such unsolicited calls in step 1.
+4. Assuming the above RequestProfilerDetach call was made on a profiler-created thread, that thread must now call [**FreeLibraryAndExitThread**](http://msdn.microsoft.com/en-us/library/ms683153(VS.85).aspx)**()**. (Note: that’s a specialized Windows API that combines FreeLibrary() and ExitThread() in such a way that races can be avoided—do not call FreeLibrary() and ExitThread() separately.)
+5. On another thread, the CLR continues its **period safety checks** from 3B above. Eventually the CLR determines that there are no more ICorProfilerCallback\* interface calls currently executing, and it is therefore safe to unload the profiler.
+6. The CLR calls ICorProfilerCallback3:: **ProfilerDetachSucceeded**. The profiler can use this signal to know that it’s about to be unloaded. It’s expected that the profiler will do very little in this callback—probably just notifying the user that the profiler is about to be unloaded. Any cleanup the profiler needs to do should already have been done during step 1.
+7. CLR makes the necessary number of **Release** () calls on ICorProfilerCallback3. The reference count should go down to 0 at this point, and the profiler may deallocate any memory it had previously allocated to support its callback implementation.
+8. CLR calls **FreeLibrary** () on the profiler DLL. This should be the last reference to the profiler’s DLL, and your DLL will now be unloaded.
+ - Note: in some cases, it’s theoretically possible that step 4 doesn’t happen until _after_ this step, in which case the last reference to the profiler’s DLL will actually be released by your profiler’s thread that called RequestProfilerDetach and then FreeLibraryAndExitThread. That’s because steps 1-4 happen on your profiler’s thread, and steps 5-8 happen on a dedicated CLR thread (for detaching profilers) sometime after step 3 is completed. So there’s a race between step 4 and all of steps 5-8. There’s no harm in this, so long as you’re playing nice by doing your own LoadLibrary and FreeLibraryAndExitThread as described above.
+9. The CLR adds an Informational entry to the Application Event Log noting that the profiler has been unloaded. The CLR is now ready to service any profiler attach requests.
## RequestProfilerDetach
@@ -46,17 +46,17 @@ Let’s dive a little deeper into the method you call to detach your profiler:
`HRESULT RequestProfilerDetach([in] DWORD dwExpectedCompletionMilliseconds);`
-
+
First off, you’ll notice this is on ICorProfilerInfo3, the interface your profiler DLL uses, in the same process as your profilee. Although the AttachProfiler API is called from outside the process, this detach method is called from in-process. Why? Well, the general rule with profilers is that _everything_ is done in-process. Attach is an exception because your profiler isn’t in the process yet. You need to somehow trigger your profiler to load, and you can’t do that from a process in which you have no code executing yet! So Attach is sort of a boot-strapping API that has to be called from a process of your own making.
Once your profiler DLL is up and running, it is in charge of everything, from within the same process as the profilee. And detach is no exception. Now with that said, it’s probably typical that your profiler will detach in response to an end user action—probably via some GUI that you ship that runs in its own process. So a case could be made that the CLR team could have made your life easier by providing an out-of-process way to do a detach, so that your GUI could easily trigger a detach, just as it triggered the attach. However, you could make that same argument about all the ways you might want to control a profiler via a GUI, such as these commands:
-- Do a GC now and show me the heap
-- Dial up or down the sampling frequency
-- Change which instrumented methods should log their invocations
-- Start / stop monitoring exceptions
-- etc.
+- Do a GC now and show me the heap
+- Dial up or down the sampling frequency
+- Change which instrumented methods should log their invocations
+- Start / stop monitoring exceptions
+- etc.
The point is, if you have a GUI to control your profiler, then you probably already have an inter-process mechanism for the GUI to communicate with your profiler DLL. So think of “detach” as yet one more command your GUI will send to your profiler DLL.
@@ -66,10 +66,10 @@ The CLR uses that value in its Sleep() statement that sits between each periodic
Until the profiler can be unloaded, it will be considered “loaded” (though deactivated in the sense that no new callback methods will be called). This prevents any new profiler from attaching.
-
+
Ok, that wraps up how detaching works. If you remember only one thing from this post, remember that it’s really easy to cause an application you profile to AV after your profiler unloads if you’re not careful. While the CLR tracks outgoing ICorProfilerCallback\* calls, it does not track any other way that control can enter your profiler DLL. _Before_ your profiler calls RequestProfilerDetach:
-- You must take care to deactivate all other ways control can enter your profiler DLL
-- Your profiler must block until all those other ways control can enter your profiler DLL have verifiably been deactivated
+- You must take care to deactivate all other ways control can enter your profiler DLL
+- Your profiler must block until all those other ways control can enter your profiler DLL have verifiably been deactivated
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Profiler stack walking Basics and beyond.md b/docs/design/coreclr/profiling/davbr-blog-archive/Profiler stack walking Basics and beyond.md
index 682ad7bf583e..935138b64f90 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Profiler stack walking Basics and beyond.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Profiler stack walking Basics and beyond.md
@@ -17,31 +17,31 @@ It’s nice to be able to get call stacks whenever you want them. But with powe
So let’s take a look at the beast. Here’s what your profiler calls (you can find this in ICorProfilerInfo2, in corprof.idl):
```
-HRESULT DoStackSnapshot(
- [in] ThreadID thread,
- [in] StackSnapshotCallback *callback,
- [in] ULONG32 infoFlags,
- [in] void *clientData,
- [in, size_is(contextSize), length_is(contextSize)] BYTE context[],
+HRESULT DoStackSnapshot(
+ [in] ThreadID thread,
+ [in] StackSnapshotCallback *callback,
+ [in] ULONG32 infoFlags,
+ [in] void *clientData,
+ [in, size_is(contextSize), length_is(contextSize)] BYTE context[],
[in] ULONG32 contextSize);
```
And here’s what the CLR calls on your profiler (you can also find this in corprof.idl). You’ll pass a pointer to your implementation of this function in the callback parameter above.
```
-typedef HRESULT \_\_stdcall StackSnapshotCallback(
- FunctionID funcId,
- UINT_PTR ip,
- COR_PRF_FRAME_INFO frameInfo,
- ULONG32 contextSize,
- BYTE context[],
+typedef HRESULT __stdcall StackSnapshotCallback(
+ FunctionID funcId,
+ UINT_PTR ip,
+ COR_PRF_FRAME_INFO frameInfo,
+ ULONG32 contextSize,
+ BYTE context[],
void *clientData);
```
It’s like a sandwich. When your profiler wants to walk the stack, you call DoStackSnapshot. Before the CLR returns from that call, it calls your StackSnapshotCallback several times, once for each managed frame (or run of unmanaged frames) on the stack:
```
-Profiler calls DoStackSnapshot. Whole wheat bread
- CLR calls StackSnapshotCallback. Lettuce frame (“leaf”-most frame, ha)
- CLR calls StackSnapshotCallback. Tomato frame
- CLR calls StackSnapshotCallback. Bacon frame (root or “main” frame)
+Profiler calls DoStackSnapshot. Whole wheat bread
+ CLR calls StackSnapshotCallback. Lettuce frame (“leaf”-most frame, ha)
+ CLR calls StackSnapshotCallback. Tomato frame
+ CLR calls StackSnapshotCallback. Bacon frame (root or “main” frame)
CLR returns back to profiler from DoStackSnapshot Whole wheat bread
```
@@ -77,50 +77,20 @@ Before I continue from this exciting cliffhanger, a brief interlude. Everyone k
Now that we’re speaking the same language. Let’s look at a mixed-mode stack:
-|
-
+```
Unmanaged
-
- |
-|
-
D (Managed)
-
- |
-|
-
Unmanaged
-
- |
-|
-
C (Managed)
-
- |
-|
-
B (Managed)
-
- |
-|
-
Unmanaged
-
- |
-|
-
A (Managed)
-
- |
-|
-
Main (Managed)
-
- |
+```
Stepping back a bit, it’s worthwhile to understand why DoStackSnapshot exists in the first place. It’s there to help you walk _managed_ frames on the stack. If you tried to walk managed frames yourself, you would get unreliable results, particularly on 32 bits, because of some wacky calling conventions used in managed code. The CLR understands these calling conventions, and DoStackSnapshot is therefore in a uniquely suitable position to help you decode them. However, DoStackSnapshot is not a complete solution if you want to be able to walk the entire stack, including unmanaged frames. Here’s where you have a choice:
-1. Do nothing and report stacks with “unmanaged holes” to your users, or
+1. Do nothing and report stacks with “unmanaged holes” to your users, or
2. Write your own unmanaged stack walker to fill in those holes.
When DoStackSnapshot comes across a block of unmanaged frames, it calls your StackSnapshotCallback with funcId=0. (I think I mentioned this before, but I’m not sure you were listening.) If you’re going with option #1 above, simply do nothing in your callback when funcId=0. We’ll call you again for the next managed frame and you can wake up at that point.
@@ -145,81 +115,67 @@ But before you get too deep, note that the issue of whether and how to seed a st
For the truly adventurous profiler that is doing an asynchronous, cross-thread, seeded stack walk while filling in the unmanaged holes, here’s what it would look like.
-|
-
-Block of
-Unmanaged
-Frames
+Block of Unmanaged Frames
- |
-1. You suspend the target thread (target thread’s suspend count is now 1)
-2. You get the target thread’s current register context
-3. You determine if the register context points to unmanaged code (e.g., call ICorProfilerInfo2::GetFunctionFromIP(), and see if you get back a 0 FunctionID)
+1. You suspend the target thread (target thread’s suspend count is now 1)
+2. You get the target thread’s current register context
+3. You determine if the register context points to unmanaged code (e.g., call ICorProfilerInfo2::GetFunctionFromIP(), and see if you get back a 0 FunctionID)
4. In this case the register context does point to unmanaged code, so you perform an unmanaged stack walk until you find the top-most managed frame (D)
- |
-|
-Function D
-(Managed)
+ ```
+ Function D
+ (Managed)
+ ```
- |
1. You call DoStackSnapshot with your seed context. CLR suspends target thread again: its suspend count is now 2. Our sandwich begins.
1. CLR calls your StackSnapshotCallback with FunctionID for D.
- |
-|
-Block of
-Unmanaged
-Frames
+ ```
+ Block of
+ Unmanaged
+ Frames
+ ```
- |
1. CLR calls your StackSnapshotCallback with FunctionID=0. You’ll need to walk this block yourself. You can stop when you hit the first managed frame, or you can cheat: delay your unmanaged walk until sometime after your next callback, as the next callback will tell you exactly where the next managed frame begins (and thus where your unmanaged walk should end).
- |
-|
-Function C
-(Managed)
-
- |
+ ```
+ Function C
+ (Managed)
+ ```
1. CLR calls your StackSnapshotCallback with FunctionID for C.
- |
-|
-Function B
-(Managed)
+ ```
+ Function B
+ (Managed)
+ ```
- |
1. CLR calls your StackSnapshotCallback with FunctionID for B.
- |
-|
-Block of
-Unmanaged
-Frames
+ ```
+ Block of
+ Unmanaged
+ Frames
+ ```
- |
1. CLR calls your StackSnapshotCallback with FunctionID=0. Again, you’ll need to walk this block yourself.
- |
-|
-Function A
-(Managed)
+ ```
+ Function A
+ (Managed)
+ ```
- |
1. CLR calls your StackSnapshotCallback with FunctionID for A.
- |
-|
-Main
-(Managed)
+ ```
+ Main
+ (Managed)
+ ```
- |
-1. CLR calls your StackSnapshotCallback with FunctionID for Main.
+1. CLR calls your StackSnapshotCallback with FunctionID for Main.
2. DoStackSnapshot “resumes” target thread (its suspend count is now 1) and returns. Our sandwich is complete.
1. You resume target thread (its suspend count is now 0, so it’s resumed for real).
- |
**Triumph over evil**
@@ -253,8 +209,8 @@ Problem 2: _While you suspend the target thread, the target thread tries to susp
“Come on! Like that could really happen.” Believe it or not, if:
-- Your app runs on a multiproc box, and
-- Thread A runs on one proc and thread B runs on another, and
+- Your app runs on a multiproc box, and
+- Thread A runs on one proc and thread B runs on another, and
- A tries to suspend B while B tries to suspend A
then it’s possible that both suspensions win, and both threads end up suspended. It’s like the line from that movie: “Multiproc means never having to say, ‘I lose.’”. Since each thread is waiting for the other to wake it up, they stay suspended forever. It is the most romantic of all deadlocks.
@@ -265,7 +221,7 @@ Ok, so, why is the target thread trying to suspend you anyway? Well, in a hypot
A less obvious reason that the target thread might try to suspend your walking thread is due to the inner workings of the CLR. The CLR suspends application threads to help with things like garbage collection. So if your walker tries to walk (and thus suspend) the thread doing the GC at the same time the thread doing the GC tries to suspend your walker, you are hosed.
-The way out, fortunately, is quite simple. The CLR is only going to suspend threads it needs to suspend in order to do its work. Let’s label the two threads involved in your stack walk: Thread A = the current thread (the thread performing the walk), and Thread B = the target thread (the thread whose stack is walked). As long as Thread A has _never executed managed code_ (and is therefore of no use to the CLR during a garbage collection), then the CLR will never try to suspend Thread A. This means it’s safe for your profiler to have Thread A suspend Thread B, as the CLR will have no reason for B to suspend A.
+The way out, fortunately, is quite simple. The CLR is only going to suspend threads it needs to suspend in order to do its work. Let’s label the two threads involved in your stack walk: Thread A = the current thread (the thread performing the walk), and Thread B = the target thread (the thread whose stack is walked). As long as Thread A has _never executed managed code_ (and is therefore of no use to the CLR during a garbage collection), then the CLR will never try to suspend Thread A. This means it’s safe for your profiler to have Thread A suspend Thread B, as the CLR will have no reason for B to suspend A.
If you’re writing a sampling profiler, it’s quite natural to ensure all of this. You will typically have a separate thread of your own creation that responds to timer interrupts and walks the stacks of other threads. Call this your sampler thread. Since you create this sampler thread yourself and have control over what it executes, the CLR will have no reason to suspend it. And this also fixes the “poorly-written profiler” example above, since this sampler thread is the only thread of your profiler trying to walk or suspend other threads. So your profiler will never try to directly suspend the sampler thread.
@@ -281,7 +237,7 @@ Lucky for you, the CLR notifies profilers when a thread is about to be destroyed
Rule 2: Block in ThreadDestroyed callback until that thread’s stack walk is complete
-
+
**_GC helps you make a cycle_**
@@ -293,25 +249,25 @@ A while back I mentioned that it is clearly a bad idea for your profiler to hold
Example #1:
-- Thread A successfully grabs and now owns one of your profiler locks
-- Thread B = thread doing the GC
-- Thread B calls profiler’s GarbageCollectionStarted callback
-- Thread B blocks on the same profiler lock
-- Thread A executes GetClassFromTokenAndTypeArgs()
-- GetClassFromTokenAndTypeArgs tries to trigger a GC, but notices a GC is already in progress.
-- Thread A blocks, waiting for GC currently in progress (Thread B) to complete
+- Thread A successfully grabs and now owns one of your profiler locks
+- Thread B = thread doing the GC
+- Thread B calls profiler’s GarbageCollectionStarted callback
+- Thread B blocks on the same profiler lock
+- Thread A executes GetClassFromTokenAndTypeArgs()
+- GetClassFromTokenAndTypeArgs tries to trigger a GC, but notices a GC is already in progress.
+- Thread A blocks, waiting for GC currently in progress (Thread B) to complete
- But B is waiting for A, because of your profiler lock.
![](media/gccycle.jpg)
Example #2:
-- Thread A successfully grabs and now owns one of your profiler locks
-- Thread B calls profiler’s ModuleLoadStarted callback
-- Thread B blocks on the same profiler lock
-- Thread A executes GetClassFromTokenAndTypeArgs()
-- GetClassFromTokenAndTypeArgs triggers a GC
-- Thread A (now doing the GC) waits for B to be ready to be collected
+- Thread A successfully grabs and now owns one of your profiler locks
+- Thread B calls profiler’s ModuleLoadStarted callback
+- Thread B blocks on the same profiler lock
+- Thread A executes GetClassFromTokenAndTypeArgs()
+- GetClassFromTokenAndTypeArgs triggers a GC
+- Thread A (now doing the GC) waits for B to be ready to be collected
- But B is waiting for A, because of your profiler lock.
![](media/deadlock.jpg)
@@ -332,10 +288,10 @@ Yeah, if you read carefully, you’ll see that this rule never even mentions DoS
I’m just about tuckered out, so I’m gonna close this out with a quick summary of the highlights. Here's what's important to remember.
-1. Synchronous stack walks involve walking the current thread in response to a profiler callback. These don’t require seeding, suspending, or any special rules. Enjoy!
-2. Asynchronous walks require a seed if the top of the stack is unmanaged code not part of a PInvoke or COM call. You supply a seed by directly suspending the target thread and walking it yourself, until you find the top-most managed frame. If you don’t supply a seed in this case, DoStackSnapshot will just return a failure code to you.
-3. If you directly suspend threads, remember that only a thread that has never run managed code can suspend another thread
-4. When doing asynchronous walks, always block in your ThreadDestroyed callback until that thread’s stack walk is complete
+1. Synchronous stack walks involve walking the current thread in response to a profiler callback. These don’t require seeding, suspending, or any special rules. Enjoy!
+2. Asynchronous walks require a seed if the top of the stack is unmanaged code not part of a PInvoke or COM call. You supply a seed by directly suspending the target thread and walking it yourself, until you find the top-most managed frame. If you don’t supply a seed in this case, DoStackSnapshot will just return a failure code to you.
+3. If you directly suspend threads, remember that only a thread that has never run managed code can suspend another thread
+4. When doing asynchronous walks, always block in your ThreadDestroyed callback until that thread’s stack walk is complete
5. Do not hold a lock while your profiler calls into a CLR function that can trigger a GC
Finally, a note of thanks to the rest of the CLR Profiling API team, as the writing of these rules is truly a team effort. And special thanks to Sean Selitrennikoff who provided an earlier incarnation of much of this content.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/ReJIT - The Basics.md b/docs/design/coreclr/profiling/davbr-blog-archive/ReJIT - The Basics.md
index 746a45d38c0c..544e0da32d0f 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/ReJIT - The Basics.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/ReJIT - The Basics.md
@@ -2,13 +2,13 @@
This post is organized in chronological order, telling what your profiler should be doing at the following times in the process:
-- Startup Time
-- ModuleLoadFinished Time
-- RequestReJIT Time
-- Actual ReJIT Time
-- RequestRevert Time
+- Startup Time
+- ModuleLoadFinished Time
+- RequestReJIT Time
+- Actual ReJIT Time
+- RequestRevert Time
+
-
## Startup Time
@@ -22,12 +22,6 @@ Typically, your profiler will also create a new thread at this point, call it yo
## ModuleLoadFinished Time
-###
-
-###
-
-###
-
### Metadata Changes
As each module loads, you will likely need to add metadata so that your future ReJITs will have the tokens they need. What you do here heavily depends on the kind of instrumentation you want to do. I’m assuming you’re doing instrumentation that adds some calls from the user code into brand new profiler helper methods you will add somewhere. If you plan to instrument mscorlib, you will likely want to add those profiler helper methods into mscorlib (remember, mscorlib is not allowed to contain an AssemblyRef that points to any other assembly!). Otherwise, perhaps you plan to ship a managed helper assembly that will sit on your user’s disk, and all your profiler helper methods will reside in this on-disk managed helper assembly.
@@ -46,19 +40,15 @@ This won’t make much sense until you’ve read the next section, but I’m pla
Now imagine your user has turned some dial on your out-of-process GUI, to request that some functions get instrumented (or re-instrumented (or re-re-instrumented (or …))). This results in a signal sent to your in-process profiler component. Your ReJIT Thread now knows it must call **RequestReJIT**. You can call this API once in bulk for a list of functions to ReJIT. Note that functions are expressed in terms of ModuleID + mdMethodDef metadata tokens. A few things to note about this:
-- You request that all instantiations of a generic function (or function on a generic class) get ReJITted with a single ModuleID + mdMethodDef pair. You cannot request a specific instantiation be ReJITted, or provide instantiation-specific IL. This is nothing new, as classic first-JIT-instrumentation should never be customized per instantiation either. But the ReJIT API is designed with this restriction in mind, as you’ll see later on.
-- ModuleID is specific to one AppDomain for unshared modules, or the SharedDomain for shared modules. Thus:
- - If ModuleID is shared, then your request will simultaneously apply to all domains using the shared copy of this module (and thus function)
- - If ModuleID is unshared, then your request will apply only to the single AppDomain using this module (and function)
- - Therefore, if you want this ReJIT request to apply to _all unshared copies_ of this function:
- - You’ll need to include all such ModuleIDs in this request.
- - And… any _future_ unshared loads of this module will result in new ModuleIDs. So as those loads happen, you’ll need to make further calls to RequestReJIT with the new ModuleIDs to ensure those copies get ReJITted as well.
- - This is optional, and only need be done if you truly want this ReJIT request to apply to all unshared copies of the function. You’re perfectly welcome to ReJIT only those unshared copies you want (and / or the shared copy).
- - Now you can re-read the “Re-Request Prior ReJITs” section above. :-)
-
-##
-
-###
+- You request that all instantiations of a generic function (or function on a generic class) get ReJITted with a single ModuleID + mdMethodDef pair. You cannot request a specific instantiation be ReJITted, or provide instantiation-specific IL. This is nothing new, as classic first-JIT-instrumentation should never be customized per instantiation either. But the ReJIT API is designed with this restriction in mind, as you’ll see later on.
+- ModuleID is specific to one AppDomain for unshared modules, or the SharedDomain for shared modules. Thus:
+ - If ModuleID is shared, then your request will simultaneously apply to all domains using the shared copy of this module (and thus function)
+ - If ModuleID is unshared, then your request will apply only to the single AppDomain using this module (and function)
+ - Therefore, if you want this ReJIT request to apply to _all unshared copies_ of this function:
+ - You’ll need to include all such ModuleIDs in this request.
+ - And… any _future_ unshared loads of this module will result in new ModuleIDs. So as those loads happen, you’ll need to make further calls to RequestReJIT with the new ModuleIDs to ensure those copies get ReJITted as well.
+ - This is optional, and only need be done if you truly want this ReJIT request to apply to all unshared copies of the function. You’re perfectly welcome to ReJIT only those unshared copies you want (and / or the shared copy).
+ - Now you can re-read the “Re-Request Prior ReJITs” section above. :-)
### More on AppDomains
@@ -81,18 +71,18 @@ You may have noticed that you have read a whole lot of words so far, but we have
IF this is the first generic instantiation to ReJIT, for a given RequestReJIT call (or this is not a generic at all), THEN:
- CLR calls **GetReJITParameters**
- - This callback passes an ICorProfilerFunctionControl to your profiler. Inside your implementation of GetReJITParameters (and no later!) you may call into ICorProfilerFunctionControl to provide the instrumented IL and codegen flags that the CLR should use during the ReJIT
- - Therefore it is here where you may:
- - Call GetILFunctionBody
- - Add any new LocalVarSigTokens to the function’s module’s metadata. (You may not do any other metadata modifications here, though!)
- - Rewrite the IL to your specifications, passing it to ICorProfilerFunctionControl::SetILFunctionBody.
- - You may NOT call ICorProfilerInfo::SetILFunctionBody for a ReJIT! This API still exists if you want to do classic first-JIT IL rewriting only.
- - Note that GetReJITParameters expresses the function getting compiled in terms of the ModuleID + mdMethodDef pair you previously specified to RequestReJIT, and _not_ in terms of a FunctionID. As mentioned before, you may not provide instantiation-specific IL!
+ - This callback passes an ICorProfilerFunctionControl to your profiler. Inside your implementation of GetReJITParameters (and no later!) you may call into ICorProfilerFunctionControl to provide the instrumented IL and codegen flags that the CLR should use during the ReJIT
+ - Therefore it is here where you may:
+ - Call GetILFunctionBody
+ - Add any new LocalVarSigTokens to the function’s module’s metadata. (You may not do any other metadata modifications here, though!)
+ - Rewrite the IL to your specifications, passing it to ICorProfilerFunctionControl::SetILFunctionBody.
+ - You may NOT call ICorProfilerInfo::SetILFunctionBody for a ReJIT! This API still exists if you want to do classic first-JIT IL rewriting only.
+ - Note that GetReJITParameters expresses the function getting compiled in terms of the ModuleID + mdMethodDef pair you previously specified to RequestReJIT, and _not_ in terms of a FunctionID. As mentioned before, you may not provide instantiation-specific IL!
And then, for all ReJITs (regardless of whether they are for the first generic instantiation or not):
-- CLR calls **ReJITCompilationStarted**
-- CLR calls **ReJITCompilationFinished**
+- CLR calls **ReJITCompilationStarted**
+- CLR calls **ReJITCompilationFinished**
These callbacks express the function getting compiled in terms of FunctionID + ReJITID. (ReJITID is simply a disambiguating value so that each ReJITted version of a function instantiation can be uniquely identified via FunctionID + ReJITID.) Your profiler doesn’t need to do anything in the above callbacks if it doesn’t want to. They just notify you that the ReJIT is occurring, and get called for each generic instantiation (or non-generic) that gets ReJITted.
@@ -114,12 +104,12 @@ Note that RequestRevert allows you to revert back to the original JITted IL, and
If there are any errors with performing the ReJIT, you will be notified by the dedicated callback ICorProfilerCallback4::ReJITError(). Errors can happen at a couple times:
-- RequestReJIT Time: These are fundamental errors with the request itself. This can include bad parameter values, requesting to ReJIT dynamic (Ref.Emit) code, out of memory, etc. If errors occur here, you’ll get a callback to your implementation of ReJITError(), sandwiched inside your call to RequestReJIT on your ReJIT Thread.
-- Actual ReJIT Time: These are errors we don’t encounter until actually trying to ReJIT the function itself. When these later errors occur, your implementation of ReJITError() is called on whatever CLR thread encountered the error.
+- RequestReJIT Time: These are fundamental errors with the request itself. This can include bad parameter values, requesting to ReJIT dynamic (Ref.Emit) code, out of memory, etc. If errors occur here, you’ll get a callback to your implementation of ReJITError(), sandwiched inside your call to RequestReJIT on your ReJIT Thread.
+- Actual ReJIT Time: These are errors we don’t encounter until actually trying to ReJIT the function itself. When these later errors occur, your implementation of ReJITError() is called on whatever CLR thread encountered the error.
You’ll note that ReJITError can provide you not only the ModuleID + mdMethodDef pair that caused the error, but optionally a FunctionID as well. Depending on the nature of the error occurred, the FunctionID may be available, so that your profiler may know the exact generic instantiation involved with the error. If FunctionID is null, then the error was fundamental to the generic function itself (and thus occurred for all instantiations).
-
+
Ok, that about covers it on how your profiler is expected to use ReJIT. As you can see, there are several different tasks your profiler needs to do at different times to get everything right. But I trust you, you’re smart.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Sample A Signature Blob Parser for your Profiler.md b/docs/design/coreclr/profiling/davbr-blog-archive/Sample A Signature Blob Parser for your Profiler.md
index 34be8594412d..88ab78844b3d 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Sample A Signature Blob Parser for your Profiler.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Sample A Signature Blob Parser for your Profiler.md
@@ -3,43 +3,46 @@
If your profiler plays with metadata, you've undoubtedly come across signature blobs. They’re used to encode type information for method definitions & references, local variables, and a whole lot more. They’re wonderfully compact, recursively versatile, and sometimes, well, challenging to parse. Fortunately, [Rico Mariani](https://docs.microsoft.com/en-us/archive/blogs/ricom/) was feeling generous one day, and churned out a simple parser that can read these types of signatures:
-MethodDefSig
-MethodRefSig
-StandAloneMethodSig
-FieldSig
-PropertySig
-LocalVarSig
-
-Here are the files:
-[sigparse.cpp](samples/sigparse.cpp) (Rico's signature parser)
-[sigformat.cpp](samples/sigformat.cpp) (An example extension to the parser)
-[PlugInToYourProfiler.cpp](samples/PlugInToYourProfiler.cpp) (Example code to plug the extension into your profiler)
+- MethodDefSig
+- MethodRefSig
+- StandAloneMethodSig
+- FieldSig
+- PropertySig
+- LocalVarSig
+
+Here are the files:
+
+- [sigparse.cpp](samples/sigparse.cpp) (Rico's signature parser)
+- [sigformat.cpp](samples/sigformat.cpp) (An example extension to the parser)
+- [PlugInToYourProfiler.cpp](samples/PlugInToYourProfiler.cpp) (Example code to plug the extension into your profiler)
Open up **sigparse.cpp** in your favorite editor and take a look at the grammar at the top. The grammar comes from the ECMA CLI spec. Jonathan Keljo has a [link](http://blogs.msdn.com/jkeljo/archive/2005/08/04/447726.aspx) to it from his blog. This tells you the types of signature blobs the parser can handle.
Sigparse.cpp is structured without any dependencies on any headers, so you can easily absorb it into your profiler project. There are two things you will need to do to make use of the code. I provided examples of each of these in the download above to help you out:
-1. You will **extend the code** to make use of the parsed components of the signature however you like. Perhaps you’ll build up your own internal structures based on what you find. Or maybe you’ll build a pretty-printer that displays method prototypes in the managed language of your choice.
-2. You will then **call the code** to perform the parse on signature blobs you encounter while profiling.
+1. You will **extend the code** to make use of the parsed components of the signature however you like. Perhaps you’ll build up your own internal structures based on what you find. Or maybe you’ll build a pretty-printer that displays method prototypes in the managed language of your choice.
+2. You will then **call the code** to perform the parse on signature blobs you encounter while profiling.
## Extending the code
Simply derive a new class from SigParser, and override the virtual functions. The functions you override are events to be handled as the parser traverses the signature in top-down fashion. For example, when the parser encounters a MethodDef, you might see calls to your overrides of:
-NotifyBeginMethod()
- NotifyParamCount()
- NotifyBeginRetType()
- NotifyBeginType()
- NotifyTypeSimple()
- NotifyEndType()
- NotifyEndRetType()
- NotifyBeginParam()
- NotifyBeginType()
- NotifyTypeSimple()
- NotifyEndType()
- NotifyEndParam()
- _… (more parameter notifications occur here if more parameters exist)_
+```
+NotifyBeginMethod()
+ NotifyParamCount()
+ NotifyBeginRetType()
+ NotifyBeginType()
+ NotifyTypeSimple()
+ NotifyEndType()
+ NotifyEndRetType()
+ NotifyBeginParam()
+ NotifyBeginType()
+ NotifyTypeSimple()
+ NotifyEndType()
+ NotifyEndParam()
+ _… (more parameter notifications occur here if more parameters exist)_
NotifyEndMethod()
+```
And yes, generics are handled as well.
@@ -60,4 +63,3 @@ Don't worry, it's optional. I mentioned above that only signatures whose grammar
The only gotcha is that TypeSpecs & MethodSpecs don’t have a unique byte that introduces them. For example, GENERICINST could indicate the beginning of a TypeSpec or a MethodSpec. You’ll see that SigParser::Parse() switches on the intro byte to determine what it’s looking at. So to keep things simple, you’ll want to add a couple more top-level functions to SigParser to parse TypeSpecs & MethodSpecs (say, ParseTypeSpec() & ParseMethodSpec()). You’d then call those functions instead of Parse() when you have a TypeSpec or MethodSpec on your hands. Of course, if you don’t care about TypeSpecs and MethodSpecs, you can use the code as is and not worry. But this stuff is so much fun, you’ll probably want to add the capability anyway.
Hope you find this useful. And thanks again to Rico Mariani for sigparse.cpp!
-
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Tail call JIT conditions.md b/docs/design/coreclr/profiling/davbr-blog-archive/Tail call JIT conditions.md
index 194c0ba517aa..ad3e937e8e3a 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Tail call JIT conditions.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Tail call JIT conditions.md
@@ -8,28 +8,28 @@ _First, Grant talked about the 64-bit JITs (one for x64, one for ia64):_
For the 64-bit JIT, we tail call whenever we’re allowed to. Here’s what prevents us from tail calling (in no particular order):
- We inline the call instead (we never inline recursive calls to the same method, but we will tail call them)
-- The call/callvirt/calli is followed by something other than nop or ret IL instructions.
-- The caller or callee return a value type.
-- The caller and callee return different types.
-- The caller is synchronized (MethodImplOptions.Synchronized).
-- The caller is a shared generic method.
-- The caller has imperative security (a call to Assert, Demand, Deny, etc.).
-- The caller has declarative security (custom attributes).
+- The call/callvirt/calli is followed by something other than nop or ret IL instructions.
+- The caller or callee return a value type.
+- The caller and callee return different types.
+- The caller is synchronized (MethodImplOptions.Synchronized).
+- The caller is a shared generic method.
+- The caller has imperative security (a call to Assert, Demand, Deny, etc.).
+- The caller has declarative security (custom attributes).
- The caller is varargs
-- The callee is varargs.
+- The callee is varargs.
- The runtime forbids the JIT to tail call. (_There are various reasons the runtime may disallow tail calling, such as caller / callee being in different assemblies, the call going to the application's entrypoint, any conflicts with usage of security features, and other esoteric cases._)
-- The il did not have the tail. prefix and we are not optimizing (the profiler and debugger control this)
-- The il did not have the tail. prefix and the caller had a localloc instruction (think alloca or dynamic stack allocation)
-- The caller is getting some GS security cookie checks
-- The il did not have the tail. prefix and a local or parameter has had its address taken (ldarga, or ldloca)
+- The il did not have the tail. prefix and we are not optimizing (the profiler and debugger control this)
+- The il did not have the tail. prefix and the caller had a localloc instruction (think alloca or dynamic stack allocation)
+- The caller is getting some GS security cookie checks
+- The il did not have the tail. prefix and a local or parameter has had its address taken (ldarga, or ldloca)
- The caller is the same as the callee and the runtime disallows inlining
- The callee is invoked via stub dispatch (_i.e., via intermediate code that's generated at runtime to optimize certain types of calls_).
-- For x64 we have these additional restrictions:
+- For x64 we have these additional restrictions:
- - The callee has one or more parameters that are valuetypes of size 3,5,6,7 or \>8 bytes
- - The callee has more than 4 arguments (don’t forget to count the this pointer, generics, etc.) and more than the caller
+ - The callee has one or more parameters that are valuetypes of size 3,5,6,7 or \>8 bytes
+ - The callee has more than 4 arguments (don’t forget to count the this pointer, generics, etc.) and more than the caller
- For all of the parameters passed on the stack the GC-ness must match between the caller and callee. (_"GC-ness" means the state of being a pointer to the beginning of an object managed by the GC, or a pointer to the interior of an object managed by the GC (e.g., a byref field), or neither (e.g., an integer or struct)._)
-- For ia64 we have this additional restriction:
+- For ia64 we have this additional restriction:
- Any of the callee arguments do not get passed in a register.
diff --git a/docs/design/coreclr/profiling/davbr-blog-archive/Type Forwarding.md b/docs/design/coreclr/profiling/davbr-blog-archive/Type Forwarding.md
index f503b612cda3..aae3f7d87402 100644
--- a/docs/design/coreclr/profiling/davbr-blog-archive/Type Forwarding.md
+++ b/docs/design/coreclr/profiling/davbr-blog-archive/Type Forwarding.md
@@ -9,14 +9,12 @@ Type forwarding is nothing new. However, in CLR V4, we are enabling type forwar
The example I’ll use where the .NET Framework uses type forwarding is the TimeZoneInfo class. In CLR V4, TimeZoneInfo is now forwarded from System.Core.dll to mscorlib.dll. If you open the CLR V4 copy of System.Core.dll in ildasm and choose Dump, you'll see the following:
-|
```
.class extern /*27000004*/ forwarder System.TimeZoneInfo
{
- .assembly extern mscorlib /*23000001*/
+ .assembly extern mscorlib /*23000001*/
}
```
- |
In each assembly’s metadata is an exported types table. The above means that System.Core.dll's exported types table includes an entry for System.TimeZoneInfo (indexed by token 27000004). What's significant is that System.Core.dll no longer has a typeDef for System.TimeZoneInfo, only an exported type. The fact that the token begins at the left with 0x27 tells you that it's an mdtExportedType (not a mdtTypeDef, which begins at the left with 0x02).
@@ -28,15 +26,15 @@ This walkthrough assumes you have .NET 4.0 or later installed **and** an older r
Code up a simple C# app that uses System.TimeZoneInfo:
```
-namespace test
-{
- class Class1
- {
- static void Main(string[] args)
- {
- System.TimeZoneInfo ti = null;
- }
- }
+namespace test
+{
+ class Class1
+ {
+ static void Main(string[] args)
+ {
+ System.TimeZoneInfo ti = null;
+ }
+ }
}
```
@@ -49,7 +47,7 @@ csc /debug+ /o- /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framew
Again, be sure you’re using an old csc.exe from, say, a NET 3.5 installation. To verify, open up Class1.exe in ildasm, and take a look at Main(). It should look something like this:
```
-.method /*06000001*/ private hidebysig static
+.method /*06000001*/ private hidebysig static
void Main(string[] args) cil managed
{
.entrypoint
@@ -70,11 +68,11 @@ Note that, if you were to build the above C# code using the .NET 4.0 C# compiler
Ok, so how do we run this pre-.NET 4.0 executable against .NET 4.0? A config file, of course. Paste the following into a file named Class1.exe.config that sits next to Class1.exe:
```
-
-
-
-
-
+
+
+
+
+
```
The above will force Class1.exe to bind against .NET 4.0 Beta 1. And when it comes time to look for TimeZoneInfo, the CLR will first look in System.Core.dll, find the exported types table entry, and then hop over to mscorlib.dll to load the type. What does that look like to your profiler? Make your guess and hold that thought. First, another walkthrough…
@@ -83,14 +81,14 @@ The above will force Class1.exe to bind against .NET 4.0 Beta 1. And when it co
To experiment with forwarding your own types, the process is:
-- Create Version 1 of your library
-
- - Create version 1 of your library assembly that defines your type (MyLibAssemblyA.dll)
- - Create an app that references your type in MyLibAssemblyA.dll (MyClient.exe)
-- Create version 2 of your library
-
- - Recompile MyLibAssemblyA.dll to forward your type elsewhere (MyLibAssemblyB.dll)
- - Don’t recompile MyClient.exe. Let it still think the type is defined in MyLibAssemblyA.dll.
+- Create Version 1 of your library
+
+ - Create version 1 of your library assembly that defines your type (MyLibAssemblyA.dll)
+ - Create an app that references your type in MyLibAssemblyA.dll (MyClient.exe)
+- Create version 2 of your library
+
+ - Recompile MyLibAssemblyA.dll to forward your type elsewhere (MyLibAssemblyB.dll)
+ - Don’t recompile MyClient.exe. Let it still think the type is defined in MyLibAssemblyA.dll.
### Version 1
@@ -140,9 +138,9 @@ Ok, time to upgrade!
### Version 2
Time goes by, your library is growing, and its time to split it into two DLLs. Gotta move Foo into the new DLL. Save this into MyLibAssemblyB.cs
```
-using System;
-public class Foo
-{
+using System;
+public class Foo
+{
}
```
@@ -170,7 +168,7 @@ Foo, MyLibAssemblyB, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
And this all despite the fact that MyClient.exe still believes that Foo lives in MyLibAssemblyA:
```
-.method /*06000001*/ public hidebysig static
+.method /*06000001*/ public hidebysig static
void Main() cil managed
{
.entrypoint
@@ -188,7 +186,6 @@ And this all despite the fact that MyClient.exe still believes that Foo lives in
IL\_001c: ret
} // end of method Test::Main
```
- |
## Profilers
@@ -199,5 +196,3 @@ This should make life easy for profilers, since they generally expect to be able
However, type forwarding is important to understand if your profiler needs to follow metadata references directly. More generally, if your profiler is reading through metadata and expects to come across a typeDef (e.g., perhaps a metadata reference points to a type in that module, or perhaps your profiler expects certain known types to be in certain modules), then your profiler should be prepared to find an mdtExportedType instead, and to deal gracefully with it rather than doing something silly like crashing.
In any case, whether you think your profiler will be affected by type forwarding, be sure to test, test, test!
-
-
\ No newline at end of file
diff --git a/docs/design/features/COM-activation.md b/docs/design/features/COM-activation.md
index c4302e53f2b1..409d950f045a 100644
--- a/docs/design/features/COM-activation.md
+++ b/docs/design/features/COM-activation.md
@@ -105,7 +105,7 @@ When `DllGetClassObject()` is called in a COM activation scenario, the following
```
Note this API is not exposed outside of `System.Private.CoreLib` and is subject to change at any time.
* The loading of the assembly will take place in a new [`AssemblyLoadContext`](https://docs.microsoft.com/dotnet/api/system.runtime.loader.assemblyloadcontext) for dependency isolation. Each assembly path will get a seperate `AssemblyLoadContext`. This means that if an assembly provides multiple COM servers all of the servers from that assembly will reside in the same `AssemblyLoadContext`.
- * The created `AssemblyLoadContext` will use an [`AssemblyDependencyResolver`](https://github.com/dotnet/corefx/issues/33165) that was supplied with the path to the assembly to load assemblies.
+ * The created `AssemblyLoadContext` will use an [`AssemblyDependencyResolver`](https://github.com/dotnet/runtime/issues/27787) that was supplied with the path to the assembly to load assemblies.
1) The `IClassFactory` instance is returned to the caller of `DllGetClassObject()` to attempt class activation.
The `DllCanUnloadNow()` function will always return `S_FALSE` indicating the shim is never able to be unloaded. This matches .NET Framework semantics but may be adjusted in the future if needed.
diff --git a/docs/design/features/DotNetCore-SharedPackageStore.md b/docs/design/features/DotNetCore-SharedPackageStore.md
index 45b7aaa01828..ad60f8e8a5dd 100644
--- a/docs/design/features/DotNetCore-SharedPackageStore.md
+++ b/docs/design/features/DotNetCore-SharedPackageStore.md
@@ -24,7 +24,7 @@ The package store can be either a global system-wide folder or a dotnet.exe rela
+ netcoreapp2.1
+ refs
+ netcoreapp2.0
- + netcoreapp2.1
+ + netcoreapp2.1
```
The layout within `netcoreapp*` folders is a NuGet cache layout.
@@ -34,7 +34,7 @@ The layout within `netcoreapp*` folders is a NuGet cache layout.
To compose the layout of the shared package store, we will use a dotnet command called `dotnet store`. We expect the *hosting providers* (ex: Antares) to use the command to prime their machines and framework authors who want to provide *pre-optimized package archives* create the compressed archive layouts.
-The layout is composed from a list of package names and versions specified as xml:
+The layout is composed from a list of package names and versions specified as xml:
**Roslyn Example**
```xml
@@ -72,7 +72,7 @@ The output folder will be consumed by the runtime by adding to the `DOTNET_SHARE
# Building apps with shared packages
-The current mechanism to build applications that share assemblies is by not specifying a RID in the project file. Then, a portable app model is assumed and assemblies that are part of Microsoft.NETCore.App are found under the `dotnet` install root. With shared package store, applications have the ability to filter any set of packages from their publish output. Thus the decision of a portable or a standalone application is not made at the time of project authoring but is instead done at publish time.
+The current mechanism to build applications that share assemblies is by not specifying a RID in the project file. Then, a portable app model is assumed and assemblies that are part of Microsoft.NETCore.App are found under the `dotnet` install root. With shared package store, applications have the ability to filter any set of packages from their publish output. Thus the decision of a portable or a standalone application is not made at the time of project authoring but is instead done at publish time.
## Project Authoring
We will by default treat `Microsoft.NETCore.App` as though `type: platform` is always specified, thus requiring no explicit RID specification by the user. It will be an `ERROR` to specify a RID in the csproj file using the `` tag.
diff --git a/docs/design/features/DynamicPgo.md b/docs/design/features/DynamicPgo.md
new file mode 100644
index 000000000000..b29f165ddd5e
--- /dev/null
+++ b/docs/design/features/DynamicPgo.md
@@ -0,0 +1,696 @@
+# Dynamic PGO
+
+The following document outlines the overall approach to profile guided optimization (aka PGO) that I'd like to see us adopt in the JIT.
+
+It is based on past experience and familiarity with profile guided optimization in several different AOT compilation toolchains, namely
+* HP-UX Compilers (circa 1993-1997, known as PBO)
+* MSVC's implementation of PGO (and PGO2)
+* Midori's implementation of PGO in Bartok/Phoenix
+* LLVM's implementation of PGO (known as FDO)
+
+However, the approach described here differs materially from those efforts because the primary focus of this work is a jitted environment. As such, it presents unique challenges and compelling new opportunities. That being said, much of the work proposed below will also benefit AOT scenarios.
+
+We are calling this effort "Dynamic PGO".
+
+A good portion of what follows is background and exposition. If you're mainly interested in the proposed work, you may want to [skip to that section](#ProposedWork).
+
+You may already be familiar with the legacy .NET approach to profile feedback, commonly called IBC (Instrumented Block Counts). If not, there is a brief [writeup on IBC](#IBC) at the end of the document.
+
+## General Idea
+
+Profile based optimization relies heavily on the principle that past behavior is a good predictor of future behavior. Thus observations about past program behavior can steer optimization decisions in profitable directions, so that future program execution is more efficient.
+
+These observations may come from the recent past, perhaps even from the current execution of a program, or from the distant past. Observations can be from the same version of the program or from different versions.
+
+Observations are most often block counts, but can cover many different aspects of behavior; some of these are sketched below.
+
+A number of important optimizations are really only practical when profile feedback is available. Key among these is aggressive inlining, but many other speculative, time-consuming, or size-expanding optimizations fall in this category.
+
+Profile feedback is especially crucial in JIT-based environments, where compile time is at a premium. Indeed, one can argue that the performance of modern Java and Javascript implementations hinges crucially on effective leverage of profile feedback.
+
+Profile guided optimization benefits both JIT and AOT compilation. While this document focuses largely on the benefits to JIT compilation, but much of what follows is also applicable to AOT. The big distinction is ease of use -- in a jitted environment profile based optimization can be done automatically, and so can be offered as a platform feature without requiring any changes to applications.
+
+.NET currently has a somewhat arm's-length approach to profile guided optimization, and does not obtain much benefit from it. Significant opportunity awaits us if we can tap into this technology.
+
+## Overview
+
+Broadly put, there are three main aspects to profile guided optimization:
+* How to [gather profile data](#Gather)
+* How to [represent and maintain profile data](#RepMain) during compilation
+* How to [leverage profile data](#Opt) for optimization
+
+The following sections explore these in detail.
+
+## Gathering Profile Data
+
+
+Profile data is most commonly thought of as execution counts for basic blocks. But other kinds of data can be collected, for instance histograms for the distribution of runtime types, indirect call targets, argument lengths to key methods, switch value histograms, and so on. Profile data can also be contextual, representing counts or distributions in specific circumstances. Profile data can try and capture traces or paths instead of simple counts.
+
+For histogram style data one can create approximate histograms using relatively small amounts space using techniques inspired by "online sampling" of data bases. Often exact counts are not needed; what is interesting are cases where a small number of items occur with high frequency. For example, when instrumenting an indirect call site, the interesting case is where one or two targets stand out from all the rest.
+
+Profile feedback can be approximate in other ways, for example derived via "random" sampling based on timers or hardware counter interrupts. It is important that the consumption of profile data be robust in the presence of errors and be tolerant of inconsistent information.
+
+Key techniques for profile feedback are:
+* Instrumentation
+* Sampling
+* Synthesis
+* User Annotation
+* Contextual Profiling
+* Hybrid Approaches
+
+### Instrumentation
+
+Instrumentation describes techniques where some version of the code being measured is explicitly modified to measure events of interest.
+
+#### The "Fixed Point"
+
+For a given class of instrumentation, there is typically one place in the JIT -- the so-called fixed point -- where code is instrumented and/or profile data is read from an external source.
+
+If the profile data is being used to drive optimization, the fixed point must happen before the optimizations. Since the major beneficiary of profile feedback is the inliner and the inlining phase runs quite early, the nominal place for the fixed point is just before inlining.
+
+If the profile data is used for other purposes (say offline analysis) then instrumentation can happen most anywhere. Often it is interesting to have a very late instrumentation pass that can measure the execution frequency of the basic blocks.
+
+#### Probes
+
+Instrumentation sequences to measure aspects of behavior are commonly called probes.
+
+#### Minimizing Probe Costs
+
+There are two aspects to probe costs.
+
+The first is a static cost proportional to the number of probes and the size of each probe. Instrumented code is larger and takes longer to produce. Thus it behooves us to use as few probes as possible and to try and produce compact instruction sequences for each probe.
+
+The second is a dynamic cost -- as each probe is executed at runtime it slows down the overall computation.
+
+As we'll see below there is considerable redundancy in the count data across the blocks and edges of a flow graph. So a simplistic instrumentation scheme that instruments each block collects more data than is strictly necessary. We can use a sparse instrumentation scheme.
+
+One common approach to building a sparse scheme is to leverage flow graph structure. We first build a spanning tree on the graph (a tree starting at method entry that connects all nodes, such that adding back any of the omitted edges would turn the tree into a dag or a graph with a cycle). Then we only need put probes on the edges of the graph not in the spanning tree. This will minimize static probe costs.
+
+If we've run profile synthesis or are instrumenting a flowgraph with profile data, we can form a maximum weight spanning tree. This will minimize dynamic probe costs.
+
+Proper count reconstruction from sparse instrumentation requires that at the point of profile ingestion we can build an exactly matching flow graph to the one we had at instrumentation time. Thus it's not well suited for cases where we have profile data from prior versions of the program. But for in-process profiling it should work well.
+
+One can also consider taking advantage of so-called "counted" loops to remove probes from some loop bodies. However this may require program analysis capabilities that are not available in the compiler doing the instrumentation.
+
+We should set goals for profiling overhead, including
+* additional time needed to generate Tier0 code
+* additional size for Tier0 code
+* additional time to execute Tier0 code
+* amount of memory needed to hold profile data
+
+#### Methods With No Control Flow
+
+If a method has no control flow we should consider not instrumenting it at all -- more precisely, there is not much point in gathering block counts. We'll lose any semblance of [global importance](#Global) (that is, we won't know how often such methods are called) but perhaps we can get at that information some other way (e.g. the call counting data the runtime keeps to trigger tiered compilation, or some kind of low-overhead background sampling).
+
+.NET, particularly Tier0, has lots of tiny simple methods like property getters that don't need any instrumentation.
+
+#### Dynamic Range
+
+Modern processors are fairly fast and a 32 bit count value can roll over or saturate in a matter of seconds for a compute intensive loop. We should seriously consider using 64 bit counters and/or using doubles for counts.
+
+Using doubles has the nice property that count values naturally saturate and so there is no concern of roll-over. However there tend not to be compact sequences for incrementing double values (or RMW ops) so this may also increase probe cost.
+
+If we do end up using 32 bit counts then the profile ingestion system will have to tolerate the cases where counts have rolled over. This will likely show up as large-scale inconsistencies in the ingested profile, and likely at that point the entire set of data will need to be dropped.
+
+#### Instrumentation and Inlining
+
+When producing instrumented code we may also want to enable other optimizations like inlining (this is especially important in AOT). The ideal situation here is for inlinees to "carry their probes" with them so that there is one set of counts per inlinee.
+
+Currently Crossgen's IBC mode inlines but does not put any probes in inlinees; this leads to an unfortunate data loss for any inlinee with control flow.
+
+One can consider more elaborate schemes where profile data for inlinees is collected per-caller or per-callsite. More on this below (see contextual profiling).
+
+Similar concerns apply to any other code duplicating optimization within the compiler. But since the profile fixed point tends to be early in the phase pipeline, the probe IR sequences are added early, and so these sequences get duplicated naturally as optimizations unfold. An optimization that duplicates a block -- say for example the `for loop` to `do-while loop` transformation -- will also create a duplicate count probe. The original probe and the duplicate probe will both increment to the same counter, and so at runtime, the counter will end up with a count value that properly reflects the count for the code seen when the code was instrumented.
+
+Whenever code is duplicated like this there is an opportunity here to instead create a distinct set of counters; this creates a version of [contextual profiling](#context) which can be useful -- for example, capturing zero trip counts of loops. More on this below too.
+
+#### Where Profile Data is Kept
+
+For dynamic PGO the probes need to write their data into some sort of storage pool that lives as long as the associated method.
+
+The current prototype (TieredPGO) has the runtime allocate a fixed-sized slab for profile data. As each method is instrumented during Tier0, a chunk of this slab is reserved for that method. The JIT fills in key bits of keying and schema information, and bakes the addresses of the counter slots into the individual probes. As the instrumented method runs these slots accumulate the counts. If the slab fills up then subsequently jitted Tier0 methods simply aren't instrumented.
+
+When a Tier1 method is jitted, the JIT asks the runtime to find the associated profile data; this currently uses the keying information to search the slab, and returns the reserved section. The JIT then reads the values from the section.
+
+Note the Tier0 method may still be running when the Tier1 rejit happens, so it's possible for the count data to be changing as the Tier1 rejit is reading it. This may cause issues for count consistency and may also make accurate SPMI replay tricky (SPMI will record possibly a different count snapshot than the JIT sees).
+
+The implementation for TieredPGO was intentionally kept simple (in part to allow easy import and export) and a "production ready" implementation will likely do things differently:
+* allow one slab per method, or multiple slabs
+* directly associate reserved part of slab with method so we don't have to search for it during Tier1
+* (perhaps) reclaim slabs once Tier0 code is retired
+* use a more memory efficient representation
+
+#### Externalizing Data
+
+If we want to externalize data for offline analysis or to feed into a subsequent run of the program, we also need to produce some keying data so that the per-method data can be matched up properly later on.
+
+This is surprisingly challenging in .NET as there's not a strong external notion of method identity from one run to the next. We currently rely on token, hash, and il size as keys. Note things like the multi-core JIT must solve similar problems. We will leverage David Wrighton's [dotnet-pgo](https://github.com/dotnet/runtime/blob/master/src/coreclr/src/tools/dotnet-pgo/dotnet-pgo-experiment.md) work here.
+
+We may also wish to externalize flow graphs to allow offline analysis or to allow some kind of fuzzy matching of old profile data in a new version of the program (this is done by MSVC for example).
+
+### Sampling
+
+Instead of instrumenting we can simply interrupt the running program and keep track of what code it is executing, similar to what a performance profiler would do. The appeal of sampling is that it can run on any version of the code and potentially has less overall overhead than instrumentation.
+
+But there are a number of challenges posed by sampling which we'll touch on briefly.
+
+The first is that sample data is sparse and so count reconstruction becomes more challenging. The second is that samples are often imprecise and implicate the wrong instructions or basic blocks (commonly called "sample skid"). The third is that sampling happens on the emitted code, and the results must be projected back to the desired profile fixed point, which is commonly early in the phase pipeline (this is especially challenging if we're sampling optimized code). The fourth is that samples can produce isolated profile islands (eg in a method with a hot loop, we may only see samples in the loop) and we might have no data on how control flow reached or left the loop.
+
+### Sampling-Instrumentation Hybrids
+
+Another technique for reducing dynamic instrumentation cost is to run the instrumented version of the code only every so often. That is, we prepare two ve versions of each method, one with probes and one without, and run the version with probes every so often, or randomly.
+
+[Arnold and Grove](#AG05) describe a technique like this used in the `Jikes RVM`, where the system leverages patchpoints to allow occasional transitions to instrumented versions of methods; we could consider something similar.
+
+### Synthesis
+
+Profile synthesis is the term we use for fabricating profile data out of thin air. While it might not seem prudent to make up data, program structure and programmer practice create learnable patterns of behavior that in turn can be used to produce plausible profiles (note: this is one area where we might be able to leverage machine learning / big data).
+
+Indeed many program optimizations already leverage program structure to guide their decision making, e.g. boosting the importance of code within loops, or reducing the importance of code that leads to exceptions. Profile synthesis, in effect, simply recasts this idea of leverage in the guise of profile data, so that these sorts of importance estimations are made uniformly and consistently across the compiler.
+
+And once we've done this all JIT optimizations can leverage profile data in a consistent and uniform manner, as profile data is always present, and always incorporates "the best information available."
+
+The classic paper on profile synthesis is [Ball-Larus](#BL93), which presents a set of local or near-local heuristics to predict block successor probabilities. These can be turned into profile counts using an algorithm like [Wu-Larus](#WL94) or by simply solving the associated system of linear equations. Other researchers have extended this work in various dimensions but the basic principle remains: use aspects of the program structure, operations, and data to predict execution flow.
+
+Profile synthesis is interesting even if instrumented or sampled profile data is available.
+
+First, even in a jitted environment, the JIT may be asked to generate code for methods that have not yet executed, or that have for various reasons bypassed the stage of the system that runs instrumented versions. Profile synthesis can step in and provide provisional profile data.
+
+Second, even if profile feedback is available, it may not be as representative as one might like. In particular parts of methods may not have been executed, or may have distorted profiles. Given the linearity of profile data, we can blend together the actual observations with a synthetic profile to produce a hybrid profile, so that our optimizations do not over-react to the actual profile (think of this as a kind of insurance policy: we want to make sure that if program behavior changes and we suddenly veer into un-profiled or thinly profiled areas, we don't fall off some kind of performance cliff). More on this below.
+
+### User Annotations
+
+There have been various proposals to allow users to convey profile data via annotations or more likely via a special set of intrinsic methods:
+```
+// indicates b is likely true with probability p
+[Intrinsic]
+bool Likely(bool b, double p = 0.9) => b
+
+// indicates b is likely false with probability p
+[Intrinsic]
+bool Unlikely(bool b, double p = 0.9) => b
+```
+Typical usage would be to control block layout or provide hints for the inliner
+```
+bool b = ...;
+
+while (Likely(b, 0.99))
+{
+ // expect this loop will iterate ~ 100 times
+}
+
+if (Unlikely(b))
+{
+ // this code is fairly cold
+}
+```
+We can consider others, e.g. for indicating likely types. Note if the probability is not a JIT-time constant the construct is ignored.
+
+GCC / LLVM have similar constructs.
+
+If used in a control flow context, these would feed values into profile synthesis, or additional `{eij}` into blended/hedged profile modes, if we also have actual profile feedback.
+
+### Contextual Profiling
+
+
+As noted above we sometimes may want to profile dependent aspects of program behavior. Assuming B and C call A, we could for instance keep separate counts for A called by B and A called by C. Since we expect callee behavior to be (to some extent) caller dependent, this potentially gives us a more precise picture.
+
+More simply, we may want to track context-dependent behavior of a block we know we are likely to duplicate based on flow. The common example here is the loop exit test for a `for loop` or `while loop`; frontend compilers will typically just include one such copy of this test block, but we commonly will duplicate the test block to create guarded `do-while` loops so we know loop bodies will execute at least one iteration (so we can do loop invariant code hoisting, etc). The key here is that we have a "critical block" in the flow graph, one with two incoming and two outgoing edges. For critical blocks a custom instrumentation scheme can track the outgoing edge probability based on which incoming edge was taken.
+
+Another example in this category is profiling to detect inherently unpredictable branches (to enable profitable use of `cmov` and similar instructions). A flat profile can identify potentially unpredictable branches; these are blocks with two successors where the successor probabilities are close to .50/.50. But that's not sufficient; the branch behavior may still be predictable by hardware. So a more sophisticated probing scheme is needed, one that keeps track of the recent history of the branch.
+
+The ingestion and maintenance of contextual profiling data is more challenging than for regular profiling. And contextual profiling can greatly increase the size of the collected profile data. In my experience, this extra complexity and cost makes contextual profiling less appealing and not a priority for the work proposed here.
+
+### Histogram Style Probes
+
+Lastly we consider probes that try and describe the distribution of values. For example the likely values of a code pointer at an indirect call, or of a class type at a class test, or of argument values to a callee or the trip count of a loop.
+
+A scheme I've used successfully in the past is to use randomized sampling to construct an approximate histogram for the distribution of values.
+
+For discrete things like types, the histogram aims to determine the frequency of occurrence of the most likely types. For continuous things like lengths we may be more interested in relative magnitudes rather than absolute values, so we
+may map the values to a discrete set first (say via approximate log2 or similar) and histogram that.
+
+These histogram probes must strike a balance between accuracy on the one hand and runtime size and cost on the other. Typically we don't need a lot of accuracy, but even a minimalist histogram probe will need enough space to hold some number of values and associated counts, so each histogram probe will occupy the space of some number of count probes.
+
+Ideally we'd be smart enough when instrumenting to not create redundant histogram probes. If we have say two back to back virtual calls:
+```C#
+ x->V();
+ x->V();
+```
+one probe would be sufficient to describe the possible types for `x`. But our current plans call for instrumenting at Tier0, and currently Tier0 has no dataflow analysis capabilities. We'll have to experiment to see whether or not we need to adjust our strategy here.
+
+### Other Considerations
+
+#### Global Importance
+
+
+TieredPGO doesn't give us profile data for all methods. And what data it does give us may not be sufficient to really optimize effectively.
+
+Ideally the JIT would focus optimization efforts on the methods that use the most CPU, or are otherwise performance critical -- that is the methods that are globally most important. We get hints of this from the fact that a method gets promoted to Tier1, but it's not a direct or strong a signal.
+
+If we do not have a good measure of global importance then we don't know which methods we should optimize more aggressively, so we have to be a bit more conservative than we'd like.
+
+If we confidently could identify the top N% of methods (say 5%) then one could imagine optimizing those more aggressively than others, with a larger code size and JIT time budget than normal.
+
+#### Dynamic PGO and R2R
+
+R2R methods bypass Tier0 and so don't get instrumentation in the current TieredPGO prototype. We probably don't want to instrument the code in the R2R image. And many of these R2R methods are key framework methods that are important for performance. So we need to find a way to get data for these methods.
+
+There are a few basic ideas:
+* Leverage IBC. If there is IBC data in the R2R image then we can make that data available to the JIT. It may not be as relevant as in-process collected data, but it's quite likely better than synthetic data or no data.
+* Sampled instrumentation for R2R methods. Produce an instrumented version and run it every so often before the method gets promoted to Tier1. This may be costly, especially if we have to use unoptimized methods for instrumentation, as we'll do quite a bit of extra jitting.
+* Make R2R methods go through Tier0 on their way to Tier1. Likely introduces an unacceptable perf hit.
+
+#### Dynamic PGO, QuickJitForLoops, OSR
+
+Some other methods also bypass Tier0 and so won't get profiled. Notably, in our current system, any method with a loop.
+
+We can address this by having loop methods run at Tier0; doing so safely also requires that we enable OSR so we can escape from long-running instance of these methods.
+
+OSR methods are jitted at Tier1 and so will pick up profile from their Tier0 counterparts. However OSR methods currently represent the "full continuation" of a method at a patchpoint, so if we have a method with multiple loops we may transition to the OSR version while we're still in the first loop and so never collect profile data for the other loops.
+
+A potential fix here is to have OSR methods only encompass a loop body, and rejoin the original Tier0 method upon exit from the loop. This approach is used in JavaScript engines like Chakra.
+
+#### Tier0 as a Data Provider
+
+It's possible we may not get good quality data out of the current scheme where we instrument Tier0 code. The number of times a Tier0 method runs before the Tier1 rejit happens is unpredictable, but it may be as few as 30. In the bring-up phase we can increase the call count threshold and force methods to remain in Tier0 longer, but we may need to find other solutions where we can get both good startup and good profile data.
+
+### Gathering Profile Data: Proposal for Initial Work
+
+For DynamicPGO, initially we'll rely on Tier0 for instrumentation, and use that to build up the capabilities of the JIT. We'll do both block instrumentation and some form of type profiling for virtual and interface calls.
+
+As the abilities of the JIT mature we will likely come back to ensuring that all the important code ends up passing through a profile gathering stage, and that the profiling process is efficient.
+
+## Handling of Profile Data in the JIT
+
+
+Once profile data has been collected, we need to incorporate, represent, and maintain the data during compilation.
+
+### Background and General Principles
+
+Block and edge count data is typically stored directly on the flow graph nodes and edges respectively. There are a number of design choices here but typically we prefer the "normalized" representation where counts are expressed relative to the method entry count.
+
+Other kinds of profile data are typically associated with the related IR construct -- e.g. an indirect call profile would be attached in some fashion to the indirect call node.
+
+Optimizations that are profile sensitive then will query these values as needed.
+
+As the flow graph and IR are transformed during compilation, we must take care to properly update profile data so that later phases still see reasonable values.
+
+One might object to the idea that we intentionally modify the profile data as we are compiling, but it is a necessary thing if relative counts from disparate parts of the method are to retain any sort of significance.
+
+One way of thinking about profile maintenance is that these modifications typically arise when we discover some fact about the program that could have been accurately described by the right sort of contextual profile. But we usually won't have that profile. So if all we have as "flat" profile we have to project what happens to profile data as we modify the program.
+
+For example, suppose we have A called by B and C. When we inline A into B we only have one set of counts for the blocks in A. So if there's a difference in how A behaves when called by B and C it might only become evident later as we optimize B+A. Initially we won't know if there is such behavior, and we have to produce some kind of profile for A, so we simply use appropriately scaled counts. And because this isn't always going to be correct, later on we may need to make some repairs.
+
+#### Kirchhoff's Laws
+
+In general we expect that the flow graph the JIT creates to be a comprehensive picture of actual control flow. In practice we often ignore certain details; e.g. exactly where in the flow exceptions might occur. But modulo these sorts of details, we can expect that execution flow must follow the paths described by the flow graph, and hence flow is "conserved" and can't randomly start or end at one place or another. Because of this, one can generally expect that the profile counts flowing into a basic block should match the profile counts flowing out of the block.
+
+This picture of profile flow is entirely analogous to the conservation of current in electrical circuits or other flow problems, and the same principles apply. Abstractly one can create a system of linear equations whose structure is induced by the flow graph that relates the counts in the various blocks and edges. Profile data also flows into the graph from entry points (method entries) and out of the graph at exit points (method returns); these establish the boundary conditions.
+
+For example consider a flow graph with 4 nodes and 4 edges arranged in a simple if-then-else-join diamond. Call the nodes `Xi` edges `Eij`, and where this does not lend to confusion, use the same symbols for the execution counts for these nodes and edges. Then the equations are:
+```
+Node X0 (entry, f): X0 = E01 + E02 = IN
+Node X1 (then): X1 = E01 = E13
+Node X2 (else): X2 = E02 = E23
+Node X3 (join, exit): X3 = E13 + E23 = OUT (= IN)
+```
+Note there are really only two independent values here, e.g. `IN` and `X1`; once we know those all other values are determined. Hence only two instrumentation probes are needed to fully determine the counts for every block and edge in this method. We'll explore the implications of this later.
+
+Kirchhoff's Laws take on the following general form (here focusing on flow into of blocks):
+```
+Xi = INi + Sum{j}(Eji)
+```
+That is, the counts flowing into block `i` are the sum of the external counts into `i` plus counts flowing into `i` from its predecessors. A similar equation holds for flows out of a block:
+```
+Xi = OUTi = Sum{j}(Eij)
+```
+
+#### Linearity
+
+A key property of the block and edge equations is that they are linear. This means if we have two consistent sets of counts (`IN`, `OUT`, `Bi`, `Eij`) and (`IN'`, `OUT'`, `Bi'`, `Eij'`) then any linear combination of these counts is also consistent. Typically we think of this as a weighed sum where the weights w determine the relative importance of the two sets of data:
+
+```
+IN'' = w * IN + w' * IN'
+Bi'' = w * Bi + w' + IN'
+Eij'' = w * Eij + w' * Eij'
+```
+
+Linearity comes in handy when we want to consider blending two or more sources of profile data, for example if we want to use synthetic profile data to hedge against over-reliance on sample or instrumented data. See below.
+
+#### Normalization
+
+If we divide all the counts by `IN` we end up with a "normalized" set of counts. Normalized counts have the nice property that the count value determines how often that part of the graph is traversed (on average) when the method is called. That is, a normalized value of 3 on a block with a call means that callee is called (from this point) 3 times as often as the root method. For most JIT optimizations the absolute value of counts is not as interesting as the normalized values.
+
+Normalized values greater than 1 are only possible in methods with loops.
+
+#### Branch Probability View
+
+An alternative representation to having node and edge counts is to have node counts and outgoing edge probabilities (`eij`). This is a kind of fine-scale normalization where edge counts are now implicit: `Eij = Ni * eij`.
+
+The benefit of this representation is that these edge probabilities tend to be somewhat stable as we modify the flow graph in various JIT phases.
+
+Also note there is redundancy here as `SUM(j){eij} == 1`, that is, the sum outgoing probabilities is 1 -- flow must leave this block somehow. Since most blocks have exactly 1 or 2 successors, we generally only need to record a single value for the probability.
+
+We will sometimes encounter degenerate cases where the only possible exit from a loop is via an exception or other runtime event that we don't model explicitly in the flow graph. If we're not careful these can lead to various profile computations diverging off to infinity. The usual remedy is to add an artificial exit edge of some sort with very low probability to limit the "amplification" this kind of loop can provide.
+
+In this view the input flow equations become
+```
+Xi = INi + Sum{j}(eji * Xj)
+```
+and the output flow equations
+```
+Xi = OUT + Sum{j}(eij * Xj)
+```
+
+### Incorporation of Data
+
+To incorporate profile data from an external source we need some kind of keying scheme to pair up an artifact from the current compilation with the corresponding information in the profile data source.
+
+For the JIT we use some aspect method of identity (say token + hash + ilSize) as the primary key to locate the information relevant to this method, and then some aspect of code identity (say ilOffset, for block counts) to locate the particular item.
+
+If the external data is from an older/different version of the application then some kind of fuzzy matching may be appropriate.
+
+External data may or may not be self-consistent, so one of the initial steps is to establish consistency.
+
+### Count Reconstruction from Probabilities
+
+It is possible to reconstruct node (and hence edge) counts from just the edge probabilities eij and the external counts. Given that edge probabilities are a somewhat durable "truth" this gives us an avenue to repairing profile data that has become inconsistent during optimization, and/or a methodology for updating profile data when we make flow graph edits, a way to reconstruct a full profile from locally deduced likelihoods in profile synthesis.
+
+For flow graphs without loops the counts can quickly be derived in one pass. For flow graphs with "reducible" loops we can use the classic [Wu-Larus](#WL94) algorithm. For more complex flow we can either try to solve the general linear system (via say Gauss-Seidel iteration) or just approximate. Note that the linear system is likely quite sparse and there is no need to form the full coefficient matrix `{eji}` explicitly, so using a general iterative solver may not be as expensive as one might imagine.
+
+### Initial consistency
+
+After the profile data is ingested we need to check consistency and possibly adjust counts. Once counts are consistent we can then derive the `{eij}` which we then rely on as the "source of truth" for the remainder of compilation.
+
+If we have dense counts then we can simply use the local `{eij}` derived from those counts. This may not be globally consistent, e.g. the system of equations
+```
+eij * Bi = I
+```
+where `I` is the input count vector may not hold (note if we've normalized and the entry block is `Bk` then `I` is a vector with `Ik=1` and all other entries zero).
+
+To solve this we simply find an `B'i` such that the above holds -- this is a straightforward linear system solution. Then we adjust the block counts as needed. Note we need to ensure that the solution `B'i` is strictly non-negative; it turns out that for a well-formed `eij` (exit probabilities between 0 and 1, and sum to 1 for each node) this is the case.
+
+If we have a mixture of profiled and synthesized nodes the above works equally well as synthesis establishes the `{eij}` for the unprofiled nodes.
+
+If we have sparse data (say from a spanning tree) then we may initially need to reconstruct some block counts; this again may produce inconsistent data. Once we've done that we can run the above.
+
+### Reconstruction
+
+As we optimize we may find the global counts again become inconsistent. Assuming we have trustworthy `{eij}` we can reconstruct globally consistent counts at any time.
+
+### Edges and Nodes
+
+As noted above there is some redundancy in a system that represents counts on both nodes and edges, and any time there is this kind of redundancy there is an increased chance of inconsistency and an extra maintenance burden.
+
+If the primary representation for profile data is block counts and successor probabilities then local maintenance is simple and does not require much data.
+
+One challenge we'd face here is that the current JIT flowgraph is predecessor oriented -- that is, from a node, one can easily enumerate the predecessor flow edges, but not so easily the successor edges. Updating it to be successor oriented may not be practical, and representing edge counts as block counts and predecessor probabilities is not semantically as meaningful.
+
+### Min and Max Edge Counts
+
+The current JIT actually keeps two sets of counts for edges, min and max. The motivation for this is unclear but it immediately poses a dilemma for any consumer: which count to use? I do not see this as adding value and suggest we simply rely on a single value (which would be the node count * successor probability).
+
+### Dynamic Range and Fractional Counts
+
+Profile counts can span a wide dynamic range, and we often will want to divide and scale them. Using an integer representation is challenging because of the limited dynamic range and the inability to represent fractions.
+
+The JIT has traditionally used a fixed-point representation where the count is scaled upwards by 100, so it can represent some fractions. However I propose that we simply use floats or doubles. This greatly simplifies a lot of the math.
+
+### Hedging (blending profiles)
+
+As noted above, even if we have profile data available, we may want to also run synthesis, both to fill in any gaps in profiling, and to provide "downside" insurance in case the profile data is not as representative as we'd like.
+
+The idea is to basically always run synthesis first, producing local probabilities `{eij}`. We then incorporate the actual profile data and update the `{eij}` to reflect primarily the profiled values. Where we have both a profiled and a synthesized probability, and they disagree, we blend the values using [Dempster-Shafer Theory](https://en.wikipedia.org/wiki/Dempster%E2%80%93Shafer_theory) or some other approach to combining predictions, strongly favoring the profile data.
+
+We then induce counts from the blended probabilities.
+
+To make this work, we need to ensure that synthetic profiles do not make too many harsh predictions; that is there should be relatively few cases where the synthetic profile predicts an edge is taken with zero probability, so that even in ostensibly cold areas of code we can reason about the relative importance of things. Note because we're using floating math we can have very small probabilities.
+
+### Ongoing Maintenance
+
+Whenever there is a change to the flow graph we must consider how best to update the profile information. Ideally we'd keep it consistent and correct at all times, but that is not possible or practical.
+
+The general principle here, following the approach outlined by [Wu](#W02), is to consider the local probabilities `{eij}` as the fundamental sources of best information. Everything else can be derived from those. So when we transform the flow graph at a minimum we should try and make sure the `{eij}` are locally consistent -- and local consistency is easy to achieve as we just need to make sure the exit probabilities of each block sum to one.
+
+Global consistency is harder and more costly, and we may be willing to allow the data to become globally inconsistent, and only try and re-establish global consistency when we know a phase will rely on it in some critical way. Past experience shows the key phases that rely on profile data are the inliner, block layout, and allocator; the first happens early in the phase pipeline and the others towards the end, so perhaps just one profile repair is needed, right before those latter phases.
+
+For some sorts of changes the updates are simple and local and preserve global consistency. e.g. inverting a branch condition simply swaps the probabilities of the associated edges; since the targets of those edges also get swapped, everything remains consistent.
+
+But other cases are not quite so simple:
+* conversion of computation to flow
+* optimizations that remove edges (or bypass creating edges)
+* optimizations that duplicate blocks
+* inlining
+* tail recursion to loop optimization
+
+We touch on each of these in turn.
+
+#### Conversion of computation to flow
+
+One example of this in the JIT is QMARK expansion. Here flow is introduced where there was a statement before. Since the overall computation is unchanged and the QMARK expands into a conditional execution tree, it is straight forward to reconstruct the counts if we know the relative probabilities. So the expansion needs simply set the `eij` for each newly introduced block, and then propagate the counts downwards.
+
+We can sometimes collapse control flow into computation, e.g. introducing conditionally executed code like CMOV. Typically a prerequisite for such transformations is the identification of a suitable "hammock" in the control flow graph, and the optimization shrinks the hammock to a single node whose profile count is the hammock entry or exit count.
+
+#### Removing Edges
+
+When an edge is removed it is generally expensive to regain global count consistency, as counts may need to be adjusted all over the graph.
+
+It might be surprising at first that edges with nonzero profile counts can be removed, or that blocks with nonzero counts can become dead. But recall that over time the profile data in the flow graph can diverge away from "true" behavior because we lack contextual information. And because of this, we may find ourselves removing blocks and edges with profile counts.
+
+#### Duplicating Blocks
+
+Whenever we duplicate flow we have to make some sort of determination about the profile counts in both the original and the duplicate regions.
+
+Sometimes this determination is simple; for example if we clone a finally we can generally presume the inlined version gets all the counts, and the remaining "fault" version has none (or some very minimally scaled down set of counts).
+
+When we duplicate a loop exit condition to convert loops to if-do-while, we need to determine how often the loop will "zero trip". Typically I've just preserved the probabilities here, so say if the loop originally iterated 8 times (so the exit test ran 9 times, and back-edge probability is 8/9) then we assume the loop is entered with that same probability. But this may not be at all accurate. It could be that the loop trip count varies widely at runtime.
+
+Similar considerations apply to other loop optimizations like unrolling.
+
+#### Inlining
+
+When inlining the common practice is to "normalize" the inlinee and then multiply each count by the call site count (or normalized call site count). This presumes that the behavior of the callee is not correlated with the call site.
+
+It turns out that callsite-callee correlations are common and one might consider techniques like contextual profiling where we capture callsite (or caller) specific behavior; however these impose extra costs during instrumentation and (in my opinion) haven't yet proven to be worth the extra trouble. Callsite specific specialization often happens organically during inlining direct substitution and/or subsequent optimization.
+
+#### Tail Recursion to Loop Optimization
+
+In this optimization, a tail-recursive call is replaced by a jump back to the method entry block. From a flow perspective this introduces a loop into a method where there wasn't one before, and one can reasonably expect that this in turn will increase the count of the blocks in the loop. But this increase might also seem a bit odd, especially in a world where we've normalized counts; how do we justify these increases?
+
+The resolution of this quandary is to realize that this optimization also reduces the call count of the method, and so also reduces the normalizing factor, so the extra counts added to the loop blocks are really just a "renormalization" of sorts.
+
+For example, suppose we have a method that is called 100 times and has a tail-recursive site that is hit 80 times. In the "before" picture the call site block has a normalized count of 0.8; if the "after" picture the proper normalized count is now 4 (80 / (100 - 80)).
+
+Two further points are worth mentioning.
+
+First, the normalized count of any recursive call site in any viable method must be less than 1; otherwise the method suffers from runaway recursion. Likewise, the total normalized sum of all the recursive call sites must be less than one. We can try and leverage this during profile synthesis; the more recursive sites a method has, the less likely each site is to be hit at runtime. Note these recursive sites may only become evident after inlining.
+
+This impacts tail recursion to loop optimizations because if we don't properly respect the recursive probability constraint, there's a chance that after converting the tail recursive sites to loop edges, profile re-computation for the method may diverge. So code that recomputes profiles from local block probabilities needs to guard against this case, and potentially must arbitrarily change some of those probabilities to recover convergence.
+
+Second, if we intend to assess or prioritize inlines based on profile feedback, we might want to anticipate this profile boosting effect. If a method A is tail recursive and also calls B along the path from entry to the tail recursive site, the absolute number of calls to B isn't altered when we convert A's tail call into a loop, but the relative number of calls to B per call to A increases, making B look like a more attractive inline in a relative sense. Since this transformation happens well after inlining and may not always be possible, we might need to develop an predictor that anticipates this optimization.
+
+### Handling Profile Data: Proposal for Initial Work
+
+The initial goal will be to ensure that the inliner and indirect call transformations see profile data. From there we'll broaden out to work on simplifying how data is represented in the JIT and to ensuring that downstream phases see reasonable data, perhaps working on count reconstruction.
+
+As we gain experience with Dynamic PGO we'll consider adding synthesis and hedging strategies to ensure that even unprofiled code gets reasonable performance.
+
+## Use of Profile Data in the JIT
+
+
+Experience has shown that while profile data can improve many optimizations, the main benefit accrues from inlining (and things that enable inlining) and code layout. Those will be our initial areas of focus.
+
+### Guarded Devirtualization
+
+In [dotnet/coreclr#21270](https://github.com/dotnet/coreclr/pull/21270) we introduced the Guarded Devirtualization optimization, where the JIT introduces an explicit class test upstream of a virtual or interface call, and then devirtualizes (and inlines) the call if the test succeeds.
+
+This is not enabled by default; two key ingredients are missing:
+* what class to guess for
+* when to guess
+
+Dynamic PGO can address both of these.
+
+Using customized probes to collect class histograms (we may also rely on runtime mechanisms here, e.g. the state of the VSD cache, or by some state tracking in the runtime itself), we can look for calls that have a single or preferred target, and guess for those.
+
+Using block profiles we can transform only highly profiled call sites, so that we do not cause too much code expansion. (Note code expansion can be further mitigated by partial compilation, but that most likely won't be a part of our toolbox, initially.)
+
+### Inlining
+
+The JIT's current inline heuristics already take profile data into account, but the modelling is simplistic. We envision creating a new profile-based policy that relies much more heavily on profile data to guide inlining. We may try and leverage machine learning to evolve such a policy.
+
+### Block Layout and Method Hot/Cold Splitting
+
+Block layout can have a significant impact on code execution time, and profile data provides strong clues on how to produce an effective layout.
+
+It also provides a built-in scoring mechanism (figure of merit) for a given layout that allows us to implement hill climbing or other randomized optimization approaches.
+
+In Midori we developed an algorithm based on an approach proposed by [Young et al](#Y93) that models block layout as a variant of a travelling salesperson problem (TSP) and then uses well-known iterative technique (3-OPT) to search for a better layout. It proved quite effective and I propose that we port it over to the JIT.
+
+One complication here is that it does not take code alignment demands into account; adding that in may be a challenge.
+
+Profile data also naturally leads to identification of hot and cold parts of methods. Performance gains can be had if the method is then split into two parts that are physically separated, aka hot/cold splitting. We already have JIT and runtime support for this in places (though mainly for prejitted code), so we propose to extend this to also cover jitted code.
+
+These gains mainly come because splitting allows the runtime to pack the hot parts of the application code into smaller numbers of cache lines and pages, reducing ICache and ITLB miss rates. For applications with large amounts of code these sorts of misses can often severely impact performance.
+
+### Other Optimizations
+
+Many other current and possible future heuristic-driven optimizations in the JIT can leverage profile data. We list some of them here:
+* basic block cloning
+* loop rotation (for loop -> do while loop)
+* loop cloning
+* finally cloning
+* loop unrolling
+* loop unswitching
+* common subexpression elimination
+* register allocation
+* if conversion (use of `cmov` and other conditional execution instructions) and other conversion of branching code to branch-free forms
+* partial inlining
+* shrink wrapping
+* struct promotion
+* ordering of locals on the stack frame
+
+The hope is that all current (and any future) optimizations are set up in such a way that "better" profile input yields better generated code. Unfortunately this is not always the case, and it's likely we'll have to spend some time sprucing up the heuristics for some of the above.
+
+### Other Phases
+
+The main work in other phases is to ensure that they maintain profile data appropriately, and that their heuristics make use of profile data (where it makes sense).
+
+Optimizations that involve tradeoffs need profitability heuristics; ideally these incorporate profile data as part of their reasoning. One of the initial tasks is to audit the various heuristics to see how much (or little) work is needed to ensure they make best use of profile information.
+
+### Using Profile Data: Proposal for Initial Work
+
+The initial focus will be on improving inline heuristics, and subsequently, to enabling guarded devirtualization.
+
+## Proposed Work
+
+
+The aspirational goal for Dynamic PGO is to have most of the key problems addressed during the .NET 6 development cycle, so we can enable it as a new mode of .NET operation.
+
+The initial focus of the work will be on the representation and use of data by the JIT. Once we are relatively happy with this (as demonstrated by performance improvements in key benchmarks and applications) we will work on ensuring that we have profile data for all methods.
+
+The key initial target for unlocking performance gains is the inliner. It would also be nice to enable guarded devirtualization; this will require some form of class type profiling.
+
+### Details of the Plan
+---
+#### Group 1: Make Profile Data Available
+
+1. Make DynamicPGO data available for inlinees (done)
+2. Implement profile count checker to look for inconsistencies (done)
+3. Fix significant profile maintenance issues
+4. Change profile data in JIT to be floating point
+5. Change most of JIT to only ever deal with normalized counts
+6. Remove min/max edge count in favor of just one count
+7. Read profiled data for R2R methods (runtime dependence)
+8. Support user annotations
+9. Remove explicit edge count in favor of successor probability
+10. Implement profile reconstruction from successor probabilities
+11. Implement custom probe for interface/virtual calls, or moral equivalent
+12. Move creation of "full" flow graph so it happens just after the importer
+13. Implement profile synthesis
+14. Implement blended / hedged profiles
+
+We likely need to get through at least item 7 to meet our aspirational goals.
+
+-----
+#### Group 2: Leverage Profile Data
+
+1. Implement new inlining policy
+2. Craft heuristics for the new policy
+3. Enable guarded devirtualization
+4. Enable hot/cold splitting (runtime dependence) for jitted code
+5. Implement profile-based block layout (based on "TSP" algorithm above)
+
+We likely need to get through at least item 3 to meet our aspirational goals.
+
+-----
+#### Group 3: Profile Handling by Runtime and JIT
+
+1. Update runtime to allow profile storage to grow over time
+2. Remove IL offsets from profile storage for dynamic PGO (?) This may be tricky because the Tier1 importer does not produce exactly the same flow graph as Tier0.
+3. If count tearing is an issue, implement copy scheme (?)
+4. Implement downstream count reconstruction (pre RA/Block Layout) if needed
+5. Fix heuristics in other optimization phases as needed
+
+We likely need at least item 1 here to meet our aspirational goals.
+
+-----
+#### Group 4: Efficient Instrumentation
+
+1. Don't instrument methods with no control flow
+2. Have the JIT produce compact instrumentation sequences
+3. Design and implement efficient probe for histogramming
+4. Implement spanning tree approach for flow counts
+5. Investigate feasibility of using float/double as counter type
+
+We likely need to get through at least item 3 to meet our aspirational goals.
+
+-----
+#### Group 5: Testing and Infrastructure
+
+1. Enable regular testing of Dynamic PGO (partially done)
+2. SPMI collection of profile-based runs
+3. Export and check in side-loaded PGO data so we can leverage PMI based diffs
+4. Regular runs of Dynamic PGO in the perf lab
+5. Regular runs of Dynamic PGO by key 1st party apps
+6. Ensure BenchmarkDotNet gives accurate measurements of Dynamic PGO perf
+
+We likely need to get through all these items to meet our aspirational goals.
+
+-----
+
+### Risks to the Plan
+
+We may find that the benefit of Dynamic PGO is hinges upon an effective solution for R2R compiled methods. Ideally we'll have IBC data for key methods in the framework, which should help.
+
+Likewise we may find that we need to enable QuickJitForLoops, and that may entail a fully supported (and perhaps modified) OSR.
+
+We may find that after aggressively inlining that downstream phases require modifications and upgrades, so that we can't exhibit the full performance we hope to see.
+
+We may need some better measure of [global importance](#Global) effectively manage code size growth and JIT time. Many methods in a long running program will eventually JIT at Tier1; not all of them are important.
+
+We may find that Tier0 instrumentation doesn't give us good quality profile data, because Tier0 methods run for unpredictable amounts of time.
+
+We may find that Tier0 methods don't give us representative sample data, because methods exhibit phased behavior.
+
+### Runtime Asks
+
+* Make IBC counts available to the JIT ([dotnet/runtime#13672](https://github.com/dotnet/runtime/issues/13672))
+* Support hot/cold splitting for jitted code and possibly for crossgenned code
+* Partner with us in evolving the runtime side of Dynamic PGO (exact work TBD)
+
+### Performance Team Asks
+
+* Ensure BenchmarkDotNet properly measures Dynamic PGO performance
+* Enable benchmark runs with Dynamic PGO and comparisons vs default runtime perf
+
+## Appendix: IBC
+
+
+NET's legacy approach to PGO is called IBC (Instrumented Block Counts). It is available for prejitted code only.
+
+A special instrumentation mode in crossgen/ngen instructs the JIT to add code to collect per-block counts and (for ngen) also instructs the runtime to track which ngen data structures are accessed at runtime, on a per-assembly basis. This information is externalized from the runtime and can be inspected and manipulated by IBCMerge. It is eventually packaged up and added back to the corresponding assembly, where it can be accessed by a subsequent "optimizing" run of crossgen/ngen. This run makes the per-block data available to the JIT and (for ngen) uses the internal runtime counters to rearrange the runtime data structures so they can be accessed more efficiently. Prejitting can also use the data to determine which methods should be prejitted (so called partial ngen).
+
+The JIT (when prejitting) uses the IBC data much as we propose to use PGO data to optimize the generated code. It also splits methods into hot and cold portions. The runtime leverages IBC data to
+
+The main aspiration of IBC is to improve startup, by ensuring that the important parts of prejitted code and data are compact and can be fetched efficiently from disk.
+
+IBC count data is not currently available to the JIT as the IBC payload is not copied to the optimized assembly.
+
+IBC is available in .NET Core, but is only usable by first-party assemblies; the IBCMerge tool is not available externally.
+
+With the advent of crossgen/R2R much of the startup benefit of IBC has been lost, as the data structures that were organized by ngen now simply get recreated. Also crossgen/R2R does not yet support hot/cold splitting of methods.
+
+## References
+
+Arnold, M., and Grove, D. Collecting and exploiting high-accuracy call graph profiles in virtual machines. CGO 2005.
+
+Ball, T. and Larus, J. Branch Prediction for Free, PLDI 93, 300-313.
+
+Calder, B., Grunwald, D., Lindsay, D., Martin, J., Mozer, M., & Zorn, B. Corpus-based Static Branch Prediction. PLDI 95, 79-92.
+
+Wu, Y., and Larus, J. Static Branch Frequency and Program Profile Analysis. MICRO 27 (1994). San Jose, CA: ACM.
+
+Wu, Y. Accuracy of Profile Maintenance in Optimizing Compilers. INTERACT 2002.
+
+Young, C., Johnson, D., Karger, D., and Smith. M. Near-optimal Intraprocedural Branch Alignment. PLDI 93.
diff --git a/docs/design/features/IJW-activation.md b/docs/design/features/IJW-activation.md
index 4f63f1327418..4d0fe9c17375 100644
--- a/docs/design/features/IJW-activation.md
+++ b/docs/design/features/IJW-activation.md
@@ -8,7 +8,7 @@ To support any C++/CLI users that wish to use .NET Core, the runtime and hosting
* Load the appropriate version of .NET Core for the assembly if a .NET Core instance is not running, or validate that the currently running .NET Core instance can satisfy the assemblies requirements.
* Load the (already-in-memory) assembly into the runtime.
* Patch the vtfixup table tokens to point to JIT stubs.
-
+
## Design
IJW activation has a variety of hard problems associated with it, mainly with loading in mixed mode assemblies that are not the application.
diff --git a/docs/design/features/Linux-Hugepage-Crossgen2.md b/docs/design/features/Linux-Hugepage-Crossgen2.md
index dcc37774b398..32083cc39eba 100644
--- a/docs/design/features/Linux-Hugepage-Crossgen2.md
+++ b/docs/design/features/Linux-Hugepage-Crossgen2.md
@@ -1,7 +1,7 @@
Configuring Huge Pages for loading composite binaries using CoreCLR on Linux
----
-Huge pages can provide performance benefits to reduce the cost of TLB cache misses when
+Huge pages can provide performance benefits to reduce the cost of TLB cache misses when
executing code. In general, the largest available wins may be achieved by enabling huge
pages for use by the GC, which will dominate the memory use in the process, but in some
circumstances, if the application is sufficiently large, there may be a benefit to using
@@ -16,7 +16,7 @@ images using the hugetlbfs. Doing some requires several steps.
2. The composite image must be copied into a hugetlbfs filesystem which is visible to the .NET process instead of the composite image being loaded from the normal path.
- IMPORTANT: The composite image must NOT be located in the normal path next to the application binary, or that file will be used instead of the huge page version.
- The environment variable `COMPlus_NativeImageSearchPaths` must be set to point at the location of the hugetlbfs in use. For instance, `COMPlus_NativeImageSearchPaths` might be set to `/var/lib/hugetlbfs/user/USER/pagesize-2MB`
- - As the cp command does not support copying into a hugetlbfs due to lack of support for the write syscall in that file system, a custom copy application must be used. A sample application that may be used to perform this task has a source listing in Appendix A.
+ - As the cp command does not support copying into a hugetlbfs due to lack of support for the write syscall in that file system, a custom copy application must be used. A sample application that may be used to perform this task has a source listing in Appendix A.
3. The machine must be configured to have sufficient huge pages available in the appropriate huge page pool. The memory requirements of huge page PE loading are as follows.
- Sufficient pages to hold the unmodified copy of the composite image in the hugetlbfs. These pages will be used by the initial copy which emplaces the composite image into huge pages.
- By default the runtime will map each page of the composite image using a MAP_PRIVATE mapping. This will require that the maximum number of huge pages is large enough to hold a completely separate copy of the image as loaded.
@@ -62,7 +62,7 @@ int main(int argc, char** argv)
printf("fdSrc fstat failed\n");
return 1;
}
-
+
addrSrc = mmap(0, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fdSrc, 0);
if (addrSrc == MAP_FAILED)
{
diff --git a/docs/design/features/OnStackReplacement.md b/docs/design/features/OnStackReplacement.md
index 905696875046..757eb05dcba0 100644
--- a/docs/design/features/OnStackReplacement.md
+++ b/docs/design/features/OnStackReplacement.md
@@ -120,7 +120,7 @@ while the old code is active in some stack frames. An implementation
must come up with solutions to several related sub problems, which we
describe briefly here, and in more detail below.
-* **Patchpoints** : Identify where in the original method OSR is possible.
+* **Patchpoints** : Identify where in the original method OSR is possible.
We will use the term _patchpoint_ to describe a particular location in a
method's code that supports OSR transitions.
* **Triggers** : Determine what will trigger an OSR transition
@@ -258,13 +258,13 @@ PatchpointHelper(int ppID, int* counter)
switch (s)
{
- case Unknown:
- *counter = initialThreshold;
+ case Unknown:
+ *counter = initialThreshold;
SetState(s, Active);
return;
- case Active:
- *counter = checkThreshold;
+ case Active:
+ *counter = checkThreshold;
SetState(s, Pending);
RequestAlternative(ppID);
return;
@@ -273,7 +273,7 @@ PatchpointHelper(int ppID, int* counter)
*counter = checkThreshold;
return;
- case Ready:
+ case Ready:
Transition(...); // does not return
}
}
@@ -483,7 +483,7 @@ this is to just leave the original frame in place, and have the OSR frame
#### 3.4.1 The Prototype
The original method conditionally calls to the patchpoint helper at
-patchpoints. The helper will return if there is no transition.
+patchpoints. The helper will return if there is no transition.
For a transition, the helper will capture context and virtually unwind itself
and the original method from the stack to recover callee-save register values
@@ -554,7 +554,7 @@ frame pointers.
When control is executing in a funclet there are effectively two activation
records on the stack that share a single frame: the parent frame and the
funclet frame. The funclet frame is largely a stub frame and most of the frame
-state is kept in the parent frame.
+state is kept in the parent frame.
These two frames are not adjacent; they are separated by some number of runtime
frames. This means it is going to be difficult for our system to handle
@@ -799,7 +799,7 @@ G_M6138_IG03:
FFC9 dec ecx
894DF0 mov dword ptr [rbp-10H], ecx
837DF000 cmp dword ptr [rbp-10H], 0 // ... > 0 ?
- 7F0E jg SHORT G_M6138_IG05
+ 7F0E jg SHORT G_M6138_IG05
G_M6138_IG04: ;; bbWeight=0.01
488D4DF0 lea rcx, bword ptr [rbp-10H] // &patchpointCounter
@@ -910,7 +910,7 @@ For example:
5F pop rdi
4883C448 add rsp, 72
5D pop rbp
- C3 ret
+ C3 ret
```
with unwind info:
```
diff --git a/docs/design/features/PinnedHeap.md b/docs/design/features/PinnedHeap.md
index d9d2ffa30047..81c76e620804 100644
--- a/docs/design/features/PinnedHeap.md
+++ b/docs/design/features/PinnedHeap.md
@@ -42,7 +42,7 @@ An object allocated on the pinned heap can be referenced by other objects normal
## API - allocating an array on the pinned heap
-For users who want to allocate their objects pinned, we provide [a new API](https://github.com/dotnet/corefx/issues/31787) to allocate such an object. The API declaration is the following:
+For users who want to allocate their objects pinned, we provide [a new API](https://github.com/dotnet/runtime/issues/27146) to allocate such an object. The API declaration is the following:
```csharp
class GC
@@ -154,7 +154,7 @@ It might make sense to provide an additional API to allocate an array of these o
**Alignment support**
-However, there is another scenario for high perf that could warrant a generational pinned heap which is objects with a specified alignment mostly [for SIMD operations](https://github.com/dotnet/corefx/issues/22790) or aligning on cache lines to avoid false sharing. This scenario doesn’t imply the object always needs to be pinned, however being pinned does mean they would be convenient for interop. For example, matrix multiplication with SIMD where the matrix is also used in native code. It also isn’t clear the object is necessarily long lived, however we do make the assumption that the amount of memory occupied by pinned objects should be small compared to non pinned objects so treating all of them as part of gen2 is acceptable. A different design option would be to allocate these on the normal heap but keep their alignment when compacting but this makes compaction slower.
+However, there is another scenario for high perf that could warrant a generational pinned heap which is objects with a specified alignment mostly [for SIMD operations](https://github.com/dotnet/runtime/issues/22990) or aligning on cache lines to avoid false sharing. This scenario doesn’t imply the object always needs to be pinned, however being pinned does mean they would be convenient for interop. For example, matrix multiplication with SIMD where the matrix is also used in native code. It also isn’t clear the object is necessarily long lived, however we do make the assumption that the amount of memory occupied by pinned objects should be small compared to non pinned objects so treating all of them as part of gen2 is acceptable. A different design option would be to allocate these on the normal heap but keep their alignment when compacting but this makes compaction slower.
For alignment support, we can also limit it to a few specific alignments if it makes the implementation noticeably easier – 16, 32, 64, 128 bytes, and possibly page size (unclear if this is really needed).
diff --git a/docs/design/features/StringDeduplication.md b/docs/design/features/StringDeduplication.md
index edd3d0abd9a7..fa69d2c21b88 100644
--- a/docs/design/features/StringDeduplication.md
+++ b/docs/design/features/StringDeduplication.md
@@ -14,18 +14,18 @@ Dedup - string deduplication is often shortened to dedup in this document.
This is an opt-in feature and should have no performance penalty when it’s off. And by default it’s off.
-When it’s on, we aim to –
+When it’s on, we aim to –
- Only deduplicate strings in old generations of the GC heap.
- Not increase the STW pauses for ephemeral GCs.
- Not regress string allocation speed.
-- Provide static analysis and runtime checks to detect patterns incompatible with string deduping. This is required to enable customers to opt-in into this feature with confidence.
+- Provide static analysis and runtime checks to detect patterns incompatible with string deduping. This is required to enable customers to opt-in into this feature with confidence.
## Details
-#### **History**
+#### **History**
-The string deduplication feature has been brought up before. See [runtime issue #9022](https://github.com/dotnet/runtime/issues/9022) for discussion.
+The string deduplication feature has been brought up before. See [runtime issue #9022](https://github.com/dotnet/runtime/issues/9022) for discussion.
And a proof of concept was gracefully [attempted](https://github.com/dotnet/coreclr/pull/15135) by [@Rattenkrieg](https://github.com/Rattenkrieg) before. But it was incomplete and the design didn’t have the kind of perf characteristics desired – it had most of the logic in GC vs outside GC.
@@ -33,9 +33,9 @@ An example of a user implemented string deduplication is Roslyn’s [StringTable
#### **Customer impact estimation and validation**
-As a general rule we want to have this for all features we add to the runtime.
+As a general rule we want to have this for all features we add to the runtime.
-Issue #[9022](https://github.com/dotnet/runtime/issues/9022) It mentioned some general data:
+Issue #[9022](https://github.com/dotnet/runtime/issues/9022) It mentioned some general data:
“The expectation is that typical apps have 20% of their GC heap be strings. Some measurements we have seen is that for at least some applications, 10-30% of strings all may be duplicated, so this might save 2-3% of the GC heap. Not huge, but the feature is not that difficult either.”
@@ -48,9 +48,9 @@ There are 2 sources of data we could get –
#### **Design outline**
-This is an opt in feature. When the runtime detects it’s turned on, it creates a dedup thread to do the work.
+This is an opt in feature. When the runtime detects it’s turned on, it creates a dedup thread to do the work.
-Detection of duplicated strings is done by looking into a hash table. The key into this hash table is the hash code of the content of a string. Detailed description of this detection is later in this doc.
+Detection of duplicated strings is done by looking into a hash table. The key into this hash table is the hash code of the content of a string. Detailed description of this detection is later in this doc.
As the dedup thread goes through the old generations linearly, it looks for references to a string object (denoted by the method table) and either calculates or looks up the hash code of that string to see if it already exists in the hash table. If so it will attempt to change the reference to point to that string with a CAS operation. If this fails, which means some other thread changed the reference at the mean time, we simply ignore this and move on. We expect the CAS failure rate to be very low.
@@ -58,17 +58,17 @@ Since the new string reference we will write to the heap has the exact same type
The dedup hash table acts as weak references to the strings. Depending on the scenario we might choose to null out these weak references or not (if it’s more performant to rebuild the hash table). If we we do the former these weak references would be treated as short weak handles so the following will happen before we scan for finalization -
-- During BGC final mark phase we will need to null out the strings that are not marked in the hash table. This can be made concurrent.
+- During BGC final mark phase we will need to null out the strings that are not marked in the hash table. This can be made concurrent.
- During a full blocking GC we will need to null out the strings that are not marked in the hash table, and relocate the ones that got promoted if we are doing a compacting GC.
**Alternate design points**
-- Should we create multiple threads to do the work?
+- Should we create multiple threads to do the work?
-Deduping can be done leisurely, so it doesn’t merit having multiple threads.
+Deduping can be done leisurely, so it doesn’t merit having multiple threads.
-- Can we use an existing thread to do the work on?
+- Can we use an existing thread to do the work on?
The finalizer thread is something that’s idling most of the time. However there are already plenty of types of work scheduled to potentially run on the finalizer thread so adding yet another thing, especially an opt in feature, can get messy.
@@ -80,9 +80,9 @@ Only strings allocated on the managed heap will be considered for deduplication.
Currently calling GetHashCode of a string calculates a 32-bit hash code. This is not stored anywhere, unlike the default hash code that’s stored either in the syncblk or a syncblk entry, depending whether the syncblk is also used by something else like locking. As the deduping thread goes through the heap it will calculate the 32-bit hash code and actually install it.
-However, a 32-bit hash code means we always need to check for collision by actually comparing the string content if the hash code is the same. And for large strings having to compare the string content could be very costly. For LOH compaction we already allocate a padding object for each large object (which currently takes up at most 0.4% of LOH space on 64-bit). We could make this padding object 1-ptr size larger and store the address of the string it’s deduped too. Likewise we can also use this to store the fact “this is the copy the hash table keeps track of so no need to dedup”. This way we can avoid having to do the detection multiple times for the same string. Below illustrates a scenario where large strings are deduplicated.
+However, a 32-bit hash code means we always need to check for collision by actually comparing the string content if the hash code is the same. And for large strings having to compare the string content could be very costly. For LOH compaction we already allocate a padding object for each large object (which currently takes up at most 0.4% of LOH space on 64-bit). We could make this padding object 1-ptr size larger and store the address of the string it’s deduped too. Likewise we can also use this to store the fact “this is the copy the hash table keeps track of so no need to dedup”. This way we can avoid having to do the detection multiple times for the same string. Below illustrates a scenario where large strings are deduplicated.
-`pad | s0 | pad | s1 | pad | s0_1`
+`pad | s0 | pad | s1 | pad | s0_1`
`obj0 (-> s0) | obj1 (-> s0_1) | obj2 (->s1) | obj3 (->s0_1) | obj4 (->s1) `
@@ -90,12 +90,12 @@ Each string obj, ie, s*, is a string on LOH and has a padding object in front of
s0_1 has the same content as s0. s1 has the same hash code but not the same content.
-"obj->s" means obj points to a string object s, or has a ref to s. So obj0 has a ref to s0, obj1 has a ref to s0_1, obj2 has a ref to s1 and so on.
+"obj->s" means obj points to a string object s, or has a ref to s. So obj0 has a ref to s0, obj1 has a ref to s0_1, obj2 has a ref to s1 and so on.
1. As we go through the heap, we see obj0 which points to s0.
2. s0’s hash is calculated which we use to look into the hash table.
3. We see that no entries exist for that hash so we create an entry for it and in s0’s padding indicates that it’s stored in the hash table, ie, it’s the copy we keep.
-4. Then we see obj1 which points to s0_1 whose hash doesn’t exist yet. We calculate the hash for s0_1, and see that there’s an entry for this hash already in the hash table, now we compare the content and see that it’s the same, now we store s0 in the padding object before s0_1 and change obj1’s ref to point to s0.
+4. Then we see obj1 which points to s0_1 whose hash doesn’t exist yet. We calculate the hash for s0_1, and see that there’s an entry for this hash already in the hash table, now we compare the content and see that it’s the same, now we store s0 in the padding object before s0_1 and change obj1’s ref to point to s0.
5. Then we see obj2 and calculate s1’s hash. We notice an entry already exists for that hash so we compare the content and the content is not the same as s0’s. So we enter s1 into the hash table and indicate that it’s stored in the hash table.
6. Then we see obj3, and s0_1 indicates that it should be deduped to s0 so we change obj3’s ref to point to s0_1 right away.
7. Then we see obj4 which points to s1 and s1 indicates it’s stored in the hash table so we don’t need to dedup.
@@ -106,11 +106,11 @@ Since we know the size of a string object trivially, we know which strings are o
- If `InterlockCompareExchangePointer` fails because the ref was modified while we were finding a copy to dedup to (or insert into the hash table), we skip this ref.
- If too many collisions exist for a hash code, we skip deduping for strings with that hash code. This avoids the DoS attack by creating too many strings for the same hash.
-- If the string is too large. At some point going through a very large string to calculate its hash code will become simply not worth the effort. We'll need to do some perf investigation to figure out a good limit.
+- If the string is too large. At some point going through a very large string to calculate its hash code will become simply not worth the effort. We'll need to do some perf investigation to figure out a good limit.
**Alternate design points**
-- Should we calculate the hash codes for SOH strings as gen1 GCs promote them into gen2?
+- Should we calculate the hash codes for SOH strings as gen1 GCs promote them into gen2?
This would increase gen1 pause.
@@ -132,7 +132,7 @@ The following scenarios become problematic or more problematic when deduping is
- Mutating the string content
-Strings are supposed to be immutable. However in unsafe code you can change the string content after it’s created. Changing string content already asking for trouble without deduping – you could be changing the interned copy which means you are modifying someone else’s string which could cause completely unpredictable results for them.
+Strings are supposed to be immutable. However in unsafe code you can change the string content after it’s created. Changing string content already asking for trouble without deduping – you could be changing the interned copy which means you are modifying someone else’s string which could cause completely unpredictable results for them.
The most common way is to use the fixed keyword:
@@ -143,7 +143,7 @@ fixed (char* p = str)
}
```
-There are other ways such as
+There are other ways such as
`((char*)(gcHandlePointingToString.AddrOfPinnedObject())) = 'c';`
@@ -153,7 +153,7 @@ Or
- Locking on a string
-Locking on a string object is already discouraged due to a string can be interned. Having string dedup on can make this problematic more often if the string you called lock on is now deduped to a different string object.
+Locking on a string object is already discouraged due to a string can be interned. Having string dedup on can make this problematic more often if the string you called lock on is now deduped to a different string object.
- Reference equality
@@ -187,7 +187,7 @@ To start with we will provide analysis for the following –
I’m seeing that there are almost 600 places in libraries that do `fixed (char*` but hopefully most of them do not actually modify the string content. We should definitely be encouraging folks to switch to using `string.Create` like what [PR#31700](https://github.com/dotnet/runtime/pull/31700) did.
-2. Using lock on a string object.
+2. Using lock on a string object.
- Reference equality checks on strings
@@ -195,13 +195,13 @@ Since `ReferenceEquals` is performance critical API, we cannot do checks in its
We do have some libraries that rely on `ReferenceEquals`. We need to figure out what to do about them. See discussion [here](https://github.com/dotnet/runtime/pull/31971#pullrequestreview-355531406).
-- Additional checks in heap verification
+- Additional checks in heap verification
Heap verification will now include checks to verify that no one changes the string content after it’s hash is computed. This can be turned on when a certain level of COMPlus_HeapVerify is specified.
- Stress mode
-Instead of waiting till the productive moment to start the next deduping cycle, we can have a stress mode where we dedup randomly to catch problems sooner, same idea as GC stress to detect GC holes sooner.
+Instead of waiting till the productive moment to start the next deduping cycle, we can have a stress mode where we dedup randomly to catch problems sooner, same idea as GC stress to detect GC holes sooner.
We could even artificially create duplicates in this stress mode to find places that depend on object identity.
@@ -219,8 +219,8 @@ We might see some performance gains using RTM (Restricted Transactional Memory)
**Deduping other types of objects**
-We might consider to not limit deduping to just strings. There was a discussion in [runtime issue #12628](https://github.com/dotnet/runtime/issues/12628).
+We might consider to not limit deduping to just strings. There was a discussion in [runtime issue #12628](https://github.com/dotnet/runtime/issues/12628).
-**Deduping long lived references on stack**
+**Deduping long lived references on stack**
-There might be merit to look into deduping long lived refs on the stack. The amount of work it requires and the return makes it low priority but it may help with some corner cases.
\ No newline at end of file
+There might be merit to look into deduping long lived refs on the stack. The amount of work it requires and the return makes it low priority but it may help with some corner cases.
diff --git a/docs/design/features/additional-deps.md b/docs/design/features/additional-deps.md
index b7046ea7067c..2bc3e59492c8 100644
--- a/docs/design/features/additional-deps.md
+++ b/docs/design/features/additional-deps.md
@@ -52,9 +52,7 @@ The proposal for this is to "roll-backwards" starting with the "found" version.
#### Roll-forward uses app's TFM
-A secondary issue with with the store's naming convention for framework. It contains a path such as:
- `\dotnet\store\x64\netcoreapp2.0\microsoft.applicationinsights\2.4.0`
-where 'netcoreapp2.0' is a "tfm" (target framework moniker). During roll-forward cases, the tfm is still the value specified in the app's runtimeconfig. The host only includes store folders that match that tfm, so it may not find packages from other deps files that were generated off a different tfm. In addition, with the advent of multiple frameworks, it makes it cumbersome to be forced to install to every tfm because multiple frameworks may use the same package, and because each package is still identified by an exact version.
+A secondary issue with with the store's naming convention for framework. It contains a path such as: `\dotnet\store\x64\netcoreapp2.0\microsoft.applicationinsights\2.4.0` where 'netcoreapp2.0' is a "tfm" (target framework moniker). During roll-forward cases, the tfm is still the value specified in the app's runtimeconfig. The host only includes store folders that match that tfm, so it may not find packages from other deps files that were generated off a different tfm. In addition, with the advent of multiple frameworks, it makes it cumbersome to be forced to install to every tfm because multiple frameworks may use the same package, and because each package is still identified by an exact version.
The proposal for this is to add an "any" tfm.
@@ -80,9 +78,8 @@ Where "found" means the version that is being used at run time including roll-fo
## 2.1 proposal (add an "any" tfm to store)
For example,
`\dotnet\store\x64\any\microsoft.applicationinsights\2.4.0`
-
-The `any` tfm would be used if the specified tfm (e.g. netcoreapp2.0) is not found:
- `\dotnet\store\x64\netcoreapp2.0\microsoft.applicationinsights\2.4.0`
+
+The `any` tfm would be used if the specified tfm (e.g. netcoreapp2.0) is not found: `\dotnet\store\x64\netcoreapp2.0\microsoft.applicationinsights\2.4.0`
_Possible risk: doesn't this make "uninstall" more difficult? Because multiple installs may write the same packages and try to remove packages that another installer created?_
@@ -95,7 +92,7 @@ The current ordering for resolving deps files is:
1) The app's deps file
2) The additional-deps file(s)
3) The framework(s) deps file(s)
-
+
The order is important because "first-in" wins. Since the additional-deps is before the framework, the additional-deps will "win" in all cases except during a minor\major roll-forward. The reason minor\major roll-forward is different is because the framework has special logic (new in 2.1) to compare assembly and file version numbers from the deps files, and pick the newest.
The proposed ordering change for 2.1 is:
@@ -108,7 +105,7 @@ In addition, the additional-deps will always look for assembly and file version
## 2.1 proposal (add runtimeconfig knob to to disable `%DOTNET_ADDITIONAL_DEPS%`)
Add an `additionalDepsLookup` option to the runtimeconfig with these values:
-
+
0) The `%DOTNET_ADDITIONAL_DEPS%` is not used
1) `DOTNET_ADDITIONAL_DEPS` is used (the default)
diff --git a/docs/design/features/arm64-intrinsics.md b/docs/design/features/arm64-intrinsics.md
index 67aff026878d..e814833ad126 100644
--- a/docs/design/features/arm64-intrinsics.md
+++ b/docs/design/features/arm64-intrinsics.md
@@ -289,7 +289,7 @@ This document will refer to half precision floating point as `Half`.
+ CoreCLR and `CIL` in general do not have general support for a `Half` type
+ There is an open request to expose `Half` intrinsics
+ There is an outstanding proposal to add `System.Half` to support this request
-https://github.com/dotnet/corefx/issues/25702
+https://github.com/dotnet/runtime/issues/936
+ Implementation of `Half` features will be adjusted based on
+ Implementation of the `System.Half` proposal
+ Availability of supporting hardware (extensions)
diff --git a/docs/design/features/code-versioning-profiler-breaking-changes.md b/docs/design/features/code-versioning-profiler-breaking-changes.md
index 7a7add6323b0..760623741cb6 100644
--- a/docs/design/features/code-versioning-profiler-breaking-changes.md
+++ b/docs/design/features/code-versioning-profiler-breaking-changes.md
@@ -26,4 +26,4 @@ Code versioning, and in particular its use for tiered compilation means that the
2. The timing of ReJITCompilationFinished has been adjusted to be slightly earlier (after the new code body is generated, but prior to updating the previous jitted code to modify control flow). This raises a slim possibility for a ReJIT error to be reported after ReJITCompilationFinished in the case of OOM or process memory corruption.
-There are likely some other variations of the changed behavior I haven't thought of yet, but if further testing, code review, or discussion brings it to the surface I'll add it here. Feel free to get in touch on github (@noahfalk), or if you have anything you want to discuss in private you can email me at noahfalk AT microsoft.com
\ No newline at end of file
+There are likely some other variations of the changed behavior I haven't thought of yet, but if further testing, code review, or discussion brings it to the surface I'll add it here. Feel free to get in touch on github (@noahfalk), or if you have anything you want to discuss in private you can email me at noahfalk AT microsoft.com
diff --git a/docs/design/features/covariant-return-methods.md b/docs/design/features/covariant-return-methods.md
index 3c9ac8c4db89..9416253ebf06 100644
--- a/docs/design/features/covariant-return-methods.md
+++ b/docs/design/features/covariant-return-methods.md
@@ -2,7 +2,7 @@
Covariant return methods is a runtime feature designed to support the [covariant return types](https://github.com/dotnet/csharplang/blob/master/proposals/covariant-returns.md) and [records](https://github.com/dotnet/csharplang/blob/master/proposals/records.md) C# language features posed for C# 9.0.
-This feature allows an overriding method to have a return type that is different than the one on the method it overrides, but compatible with it. The type compability rules are defined in ECMA I.8.7.1. Example: using a more derived return type.
+This feature allows an overriding method to have a return type that is different than the one on the method it overrides, but compatible with it. The type compability rules are defined in ECMA I.8.7.1. Example: using a more derived return type.
Covariant return methods can only be described through MethodImpl records, and as an initial implementation will only be applicable to methods on reference types. Methods on interfaces and value types will not be supported (may be supported later in the future).
@@ -24,9 +24,9 @@ During enumeration of MethodImpls on a type (`MethodTableBuilder::EnumerateMetho
+ Load the `TypeHandle` of the return type of the method on base type.
+ Load the `TypeHandle` of the return type of the method on the current type being validated.
+ Verify that the second `TypeHandle` is compatible with the first `TypeHandle` using the `MethodTable::CanCastTo()` API. If they are not compatible, a TypeLoadException is thrown.
-
+
The only exception where `CanCastTo()` will return true for an incompatible type according to the ECMA rules is for structs implementing interfaces, so we explicitly check for that case and throw a TypeLoadException if we hit it.
-
+
Once a method is flagged for return type checking, every time the vtable slot containing that method gets overridden on a derived type, the new override will also be checked for compatiblity. This is to ensure that no derived type can implicitly override some virtual method that has already been overridden by some MethodImpl with a covariant return type.
### VTable Slot Unification
@@ -64,7 +64,7 @@ This slot unification step will also take place during the last step of type loa
An interface method may be both non-final and have a MethodImpl that declares that it overrides another interface method. If it does, NO other interface method may .override it. Instead further overrides must override the method that it overrode. Also the overriding method may only override 1 method.
The default interface method resolution algorithm shall change from:
-
+
``` console
Given interface method M and type T.
Let MSearch = M
diff --git a/docs/design/features/cross-platform-cryptography.md b/docs/design/features/cross-platform-cryptography.md
index f93190aa63d9..b6f1d125552e 100644
--- a/docs/design/features/cross-platform-cryptography.md
+++ b/docs/design/features/cross-platform-cryptography.md
@@ -24,14 +24,23 @@ This would result in a `PlatformNotSupportedException` when invoking the `Create
The underlying ciphers and chaining are performed by the system libraries.
-| Cipher + Mode | Windows | Linux | macOS |
-|---------------|---------|-------|-------|
-| AES-CBC | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| AES-ECB | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| 3DES-CBC | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| 3DES-ECB | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| DES-CBC | :white_check_mark: | :white_check_mark: | :white_check_mark: |
-| DES-ECB | :white_check_mark: | :white_check_mark: | :white_check_mark: |
+| Cipher + Mode | Windows 8 - 10 | Windows 7 | Linux | macOS |
+|---------------|--------------------|----------------------|--------------------|--------------------|
+| AES-CBC | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
+| AES-ECB | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
+| AES-CFB8* | :white_check_mark: | :white_check_mark:** | :white_check_mark: | :white_check_mark: |
+| AES-CFB128* | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: |
+| 3DES-CBC | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
+| 3DES-ECB | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
+| 3DES-CFB8* | :white_check_mark: | :white_check_mark:** | :white_check_mark: | :white_check_mark: |
+| 3DES-CFB64* | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: |
+| DES-CBC | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
+| DES-ECB | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
+| DES-CFB8* | :white_check_mark: | :x: | :white_check_mark: | :white_check_mark: |
+
+\* Available starting in .NET 5.
+
+** Available starting in .NET 6.
In the future there is a possibility that new ciphers may be added to .NET Core before one (or more) supported platforms have system support for it.
This would result in a `PlatformNotSupportedException` when invoking the `Create()` method for the algorithm.
diff --git a/docs/design/features/crossgen2-compilation-structure-enhancements.md b/docs/design/features/crossgen2-compilation-structure-enhancements.md
index bf164d89fd0b..7f993df95e88 100644
--- a/docs/design/features/crossgen2-compilation-structure-enhancements.md
+++ b/docs/design/features/crossgen2-compilation-structure-enhancements.md
@@ -59,7 +59,7 @@ Note, this approach is probably more complete than we will finish in one release
For non-generic code this is straightforward. Either compile all the non-generic code in the binary, or compile only that which is specified via a profile guided optimization step. This choice shall be driven by a per "input assembly" switch as in the presence of a composite R2R image we likely will want to have different policy for different assemblies, as has proven valuable in the past. Until proven otherwise, per assembly specification of this behavior shall be considered to be sufficient.
-We shall set a guideline for how much generic code to generate, and the amount of generic code to generate shall be gated as a multiplier of the amount of non-generic code generated.
+We shall set a guideline for how much generic code to generate, and the amount of generic code to generate shall be gated as a multiplier of the amount of non-generic code generated.
For generic code we also need a per assembly switch to adjust between various behaviors, but the proposal is as follows:
@@ -87,7 +87,7 @@ Runtime Layer
Each layer in this stack will be compiled as a consistent set of crossgen2 compilations.
-I propose to reduce the generics duplication problem to allow duplication between layers, but not within a layer. There are two ways to do this. The first of which is to produce composite R2R images for a layer. Within a single composite R2R image generation, running heuristics and generating generics eagerly should be straightforward. This composite R2R image would have all instantiations statically computed that are local to that particular layer of compilation, and also any instantiations from other layers. The duplication problem would be reduced in that a single analysis would trigger these multi-layer dependent compilations, and so which there may be duplication between layers, there wouldn't be duplication within a layer. And given that the count of layers is not expected to exceed 3 or 4, that duplication will not be a major concern.
+I propose to reduce the generics duplication problem to allow duplication between layers, but not within a layer. There are two ways to do this. The first of which is to produce composite R2R images for a layer. Within a single composite R2R image generation, running heuristics and generating generics eagerly should be straightforward. This composite R2R image would have all instantiations statically computed that are local to that particular layer of compilation, and also any instantiations from other layers. The duplication problem would be reduced in that a single analysis would trigger these multi-layer dependent compilations, and so which there may be duplication between layers, there wouldn't be duplication within a layer. And given that the count of layers is not expected to exceed 3 or 4, that duplication will not be a major concern.
The second approach is to split compilation up into assembly level units, run the heuristics per assembly, generate the completely local generics in the individual assemblies, and then nominate a final mop up assembly that consumes a series of data files produced by the individual assembly compilations and holds all of the stuff that didn't make sense in the individual assemblies. In my opinion this second approach would be better for debug builds, but the first approach is strictly better for release builds, and really shouldn't be terribly slow.
diff --git a/docs/design/features/event-counter.md b/docs/design/features/event-counter.md
index 29fa231f03ae..935a42b47f86 100644
--- a/docs/design/features/event-counter.md
+++ b/docs/design/features/event-counter.md
@@ -108,4 +108,4 @@ For EventCounter and PollingCounter we expect simple viewers to use the display
### Metadata
-To add any optional metadata about the counters that we do not already provide a way of encoding, users can call the `AddMetaData(string key, string value)` API. This API exists on all variants of the Counter APIs, and allows users to add one or many key-value pairs of metadata, which is dumped to the Payload as a comma-separated string value. This API exists so that users can add any metadata about their Counter that is not known to us and is different from the ones we provide by default (i.e. `DisplayName`, `CounterType`, `DisplayRateTimeScale`).
\ No newline at end of file
+To add any optional metadata about the counters that we do not already provide a way of encoding, users can call the `AddMetaData(string key, string value)` API. This API exists on all variants of the Counter APIs, and allows users to add one or many key-value pairs of metadata, which is dumped to the Payload as a comma-separated string value. This API exists so that users can add any metadata about their Counter that is not known to us and is different from the ones we provide by default (i.e. `DisplayName`, `CounterType`, `DisplayRateTimeScale`).
diff --git a/docs/design/features/framework-version-resolution.md b/docs/design/features/framework-version-resolution.md
index cd20470ce34f..349d0f250191 100644
--- a/docs/design/features/framework-version-resolution.md
+++ b/docs/design/features/framework-version-resolution.md
@@ -30,8 +30,7 @@ In the `.runtimeconfig.json` these values are defined like this:
```
#### Framework name
-Each framework reference identifies the framework by its name.
-Framework names are case sensitive (since they're used as folder names even on Linux systems).
+Each framework reference identifies the framework by its name. Framework names are case sensitive (since they're used as folder names even on Linux systems).
#### Version
Framework version must be a [SemVer V2](https://semver.org) valid version.
@@ -146,13 +145,15 @@ Pros
Cons
* Testing behavior of new releases with pre-release versions is not fully possible (see below).
-* Some special cases don't work:
-One special case which would not work:
-*Component A which asks for `2.0.0 LatestMajor` is loaded first on a machine which has `3.0.0` and also `3.1.0-preview` installed. Because it's the first in the process it will resolve the runtime according to the above rules - that is prefer release version - and thus will select `3.0.0`.
-Later on component B is loaded which asks for `3.1.0-preview LatestMajor` (for example the one in active development). This load will fail since `3.0.0` is not enough to run this component.
-Loading the components in reverse order (B first and then A) will work since the `3.1.0-preview` runtime will be selected.*
+* Some special cases don't work.
-Modification to automatic roll forward to latest patch:
+ One special case which would not work:
+ *Component A which asks for `2.0.0 LatestMajor` is loaded first on a machine which has `3.0.0` and also `3.1.0-preview` installed. Because it's the first in the process it will resolve the runtime according to the above rules - that is prefer release version - and thus will select `3.0.0`.*
+
+ *Later on component B is loaded which asks for `3.1.0-preview LatestMajor` (for example the one in active development). This load will fail since `3.0.0` is not enough to run this component.*
+ *Loading the components in reverse order (B first and then A) will work since the `3.1.0-preview` runtime will be selected.*
+
+Modification to automatic roll forward to latest patch:
Existing behavior is to find a matching framework based on the above rules and then apply roll forward to latest patch (except if `Disable` is specified). The new behavior should be:
* If the above rules find a matching pre-release version of a framework, then automatic roll forward to latest patch is not applied.
* If the above rules find a matching release version of a framework, automatic roll forward to latest patch is applied.
@@ -218,12 +219,12 @@ Items lower in the list override those higher in the list. At each precedence sc
This setting is also described in [roll-forward-on-no-candidate-fx](roll-forward-on-no-candidate-fx.md). It can be specified as a property either for the entire `.runtimeconfig.json` or per framework reference (it has no environment variable of command line argument). It disables rolling forward to the latest patch.
The host will compute effective value of `applyPatches` for each framework reference.
-The `applyPatches` value is only considered if the effective `rollForward` value for a given framework reference is
+The `applyPatches` value is only considered if the effective `rollForward` value for a given framework reference is
* `LatestPatch`
* `Minor`
* `Major`
-For the other values `applyPatches` is ignored.
+For the other values `applyPatches` is ignored.
*This is to maintain backward compatibility with `rollForwardOnNoCandidateFx`. `applyPatches` is now considered obsolete.*
If `applyPatches` is set to `true` (the default), then the roll-forward rules described above apply fully.
@@ -259,7 +260,7 @@ There's a direct mapping from the `rollForward` setting to the internal represen
| `rollForward` | `version_compatibility_range` | `roll_to_highest_version` |
| --------------------- | ----------------------------- | ------------------------------------------ |
| `Disable` | `exact` | `false` |
-| `LatestPatch` | `patch` | `false` (always picks latest patch anyway) |
+| `LatestPatch` | `patch` | `false` (always picks latest patch anyway) |
| `Minor` | `minor` | `false` |
| `LatestMinor` | `minor` | `true` |
| `Major` | `major` | `false` |
@@ -306,7 +307,7 @@ Steps
* By doing this for all `framework references` here, before the next loop, we minimize the number of re-try attempts.
4. For each `framework reference` in `config fx references`:
5. --> If the framework's `name` is not in `resolved frameworks` Then resolve the `framework reference` to the actual framework on disk:
- * If the framework `name` already exists in the `effective fx references` reconcile the currently processed `framework reference` with the one from the `effective fx references` (see above for the algorithm).
+ * If the framework `name` already exists in the `effective fx references` reconcile the currently processed `framework reference` with the one from the `effective fx references` (see above for the algorithm).
*Term "reconcile framework references" is used for this in the code, this used to be called "soft-roll-forward" as well.*
* The reconciliation will always pick the higher `version` and will merge the `rollForward` and `applyPatches` settings.
* The reconciliation may fail if it's not possible to roll forward from one `framework reference` to the other.
@@ -368,7 +369,7 @@ This might be more of an issue for components (COM and such), which we will reco
The above proposal will impact behavior of existing apps (because framework resolution is in `hostfxr` which is global on the machine for all frameworks). This is a description of the changes as they apply to apps using either default settings, `rollForwardOnNoCandidateFx` or `applyPatches`.
### Fixing ordering issues
-In 2.* the algorithm had a bug in it which caused it to resolve different version depending solely on the order of framework references. Consider this example:
+In 2.* the algorithm had a bug in it which caused it to resolve different version depending solely on the order of framework references. Consider this example:
`Microsoft.NETCore.App` is available on the machine with versions `2.1.1` and `2.1.2`.
diff --git a/docs/design/features/globalization-invariant-mode.md b/docs/design/features/globalization-invariant-mode.md
index 3112ce7dd42a..f3c4132fcc0d 100644
--- a/docs/design/features/globalization-invariant-mode.md
+++ b/docs/design/features/globalization-invariant-mode.md
@@ -1,5 +1,5 @@
# .NET Core Globalization Invariant Mode
-
+
Author: [Tarek Mahmoud Sayed](https://github.com/tarekgh)
The globalization invariant mode - new in .NET Core 2.0 - enables you to remove application dependencies on globalization data and [globalization behavior](https://docs.microsoft.com/en-us/dotnet/standard/globalization-localization/). This mode is an opt-in feature that provides more flexibility if you care more about reducing dependencies and the size of distribution than globalization functionality or globalization-correctness.
@@ -17,7 +17,7 @@ The following scenarios are affected when the invariant mode is enabled. Their i
- Time Zone display name on Linux
## Background
-
+
Globalization rules and the data that represents those rules frequently change, often due to country-specific policy changes (for example, changes in currency symbol, sorting behavior or time zones). Developers expect globalization behavior to always be current and for their applications to adapt to new data over time. In order to keep up with those changes, .NET Core (and the .NET Framework, too) depends on the underlying OS to keep up with these changes.
Relying on the underlying OS for globalization data has the following benefits:
@@ -32,11 +32,11 @@ Globalization support has the following potential challenges for applications:
* Installing/carrying the [ICU](http://icu-project.org) package on Linux (~28 MB).
Note: On Linux, .NET Core relies on globalization data from ICU. For example, [.NET Core Linux Docker images](https://github.com/dotnet/dotnet-docker/blob/master/2.0/runtime-deps/stretch/amd64/Dockerfile) install this component. Globalization data is available on Windows and macOS as part of their base installs.
-
+
## Cultures and culture data
-
-When enabling the invariant mode, all cultures behave like the invariant culture. The invariant culture has the following characteristics:
-
+
+When enabling the invariant mode, all cultures behave like the invariant culture. The invariant culture has the following characteristics:
+
* Culture names (English, native display, ISO, language names) will return invariant names. For instance, when requesting culture native name, you will get "Invariant Language (Invariant Country)".
* All cultures LCID will have value 0x1000 (which means Custom Locale ID). The exception is the invariant cultures which will still have 0x7F.
* All culture parents will be invariant. In other word, there will not be any neutral cultures by default but the apps can still create a culture like "en".
@@ -45,45 +45,45 @@ When enabling the invariant mode, all cultures behave like the invariant culture
* Numbers will always be formatted as the invariant culture. For example, decimal point will always be formatted as ".". Number strings previously formatted with cultures that have different symbols will fail parsing.
* All cultures will have currency symbol as "¤"
* Culture enumeration will always return a list with one culture which is the invariant culture.
-
+
## String casing
-
+
String casing (ToUpper and ToLower) will be performed for the ASCII range only. Requests to case code points outside that range will not be performed, however no exception will be thrown. In other words, casing will only be performed for character range ['a'..'z'].
-
+
Turkish I casing will not be supported when using Turkish cultures.
-
+
## String sorting and searching
String operations like [Compare](https://docs.microsoft.com/dotnet/api/?term=string.compare), [IndexOf](https://docs.microsoft.com/dotnet/api/?term=string.indexof) and [LastIndexOf](https://docs.microsoft.com/dotnet/api/?term=string.lastindexof) are always performed as [ordinal](https://en.wikipedia.org/wiki/Ordinal_number) and not linguistic operations regardless of the string comparing options passed to the APIs.
-
+
The [ignore case](https://docs.microsoft.com/dotnet/api/system.globalization.compareoptions.ignorecase) string sorting option is supported but only for the ASCII range as mentioned previously.
-
+
For example, the following comparison will resolve to being unequal:
* 'i', compared to
* Turkish I '\u0130', given
-* Turkish culture, using
+* Turkish culture, using
* CompareOptions.Ignorecase
However, the following comparison will resolve to being equal:
* 'i', compared to
-* 'I', using
+* 'I', using
* CompareOptions.Ignorecase
-
+
It is worth noticing that all other [sort comparison options](https://docs.microsoft.com/dotnet/api/system.globalization.compareoptions) (for example, ignore symbols, ignore space, Katakana, Hiragana) will have no effect in the invariant mode (they are ignored).
-
+
## Sort keys
-
+
Sort keys are used mostly when indexing some data (for example, database indexing). When generating sort keys of 2 strings and comparing the sort keys the results should hold the exact same results as if comparing the original 2 strings. In the invariant mode, sort keys will be generated according to ordinal comparison while respecting ignore casing options.
-
+
## String normalization
-
-String normalization normalizes a string into some form (for example, composed, decomposed forms). Normalization data is required to perform these operations, which isn't available in invariant mode. In this mode, all strings are considered as already normalized, per the following behavior:
-* If the app requested to normalize any string, the original string is returned without modification.
+String normalization normalizes a string into some form (for example, composed, decomposed forms). Normalization data is required to perform these operations, which isn't available in invariant mode. In this mode, all strings are considered as already normalized, per the following behavior:
+
+* If the app requested to normalize any string, the original string is returned without modification.
* If the app asked if any string is normalized, the return value will always be `true`.
-
+
## Internationalized Domain Names (IDN) support
[Internationalized Domain Names](https://en.wikipedia.org/wiki/Internationalized_domain_name) require globalization data to perform conversion to ASCII or Unicode forms, which isn't available in the invariant mode. In this mode, IDN functionality has the following behavior:
@@ -91,13 +91,13 @@ String normalization normalizes a string into some form (for example, composed,
* IDN support doesn't conform to the latest standard.
* IDN support will be incorrect if the input IDN string is not normalized since normalization is not supported in invariant mode.
* Some basic IDN strings will still produce correct values.
-
+
## Time zone display name in Linux
-
+
When running on Linux, ICU is used to get the time zone display name. In invariant mode, the standard time zone names are returned instead.
-
+
## Enabling the invariant mode
-
+
Applications can enable the invariant mode by either of the following:
1. in project file:
@@ -119,13 +119,13 @@ Applications can enable the invariant mode by either of the following:
}
}
```
-
+
3. setting environment variable value `DOTNET_SYSTEM_GLOBALIZATION_INVARIANT` to `true` or `1`.
Note: value set in project file or `runtimeconfig.json` has higher priority than the environment variable.
## APP behavior with and without the invariant config switch
-
+
- If the invariant config switch is not set or it is set false
- The framework will depend on the OS for the globalization support.
- On Linux, if the ICU package is not installed, the application will fail to start.
diff --git a/docs/design/features/host-component-dependencies-resolution.md b/docs/design/features/host-component-dependencies-resolution.md
index 094f3d082e94..f107961714e5 100644
--- a/docs/design/features/host-component-dependencies-resolution.md
+++ b/docs/design/features/host-component-dependencies-resolution.md
@@ -40,4 +40,4 @@ This feature certainly provides a somewhat duplicate functionality to the existi
* Currently we don't consider frameworks for the app when computing probing paths for resolving assets from the component's `.deps.json`. This is a different behavior from the app startup where these are considered. Is it important - needed?
* Add ability to corelate tracing with the runtime - probably some kind of activity ID
* Handling of native assets - currently returning just probing paths. Would be cleaner to return full resolved paths. But we would have to keep some probing paths. In the case of missing `.deps.json` the native library should be looked for in the component directory - thus requires probing - we can't figure out which of the files in the folder are native libraries in the hosts.
-* Handling of satellite assemblies (resource assets) - currently returning just probing paths which exclude the culture. So from a resolved asset `./foo/en-us/resource.dll` we only take `./foo` as the probing path. Consider using full paths instead - probably would require more parsing as we would have to be able to figure out the culture ID somewhere to build the true map AssemblyName->path in the managed class. Just like for native assets, if there's no `.deps.json` the only possible solution is to use probing, so the probing semantics would have to be supported anyway.
\ No newline at end of file
+* Handling of satellite assemblies (resource assets) - currently returning just probing paths which exclude the culture. So from a resolved asset `./foo/en-us/resource.dll` we only take `./foo` as the probing path. Consider using full paths instead - probably would require more parsing as we would have to be able to figure out the culture ID somewhere to build the true map AssemblyName->path in the managed class. Just like for native assets, if there's no `.deps.json` the only possible solution is to use probing, so the probing semantics would have to be supported anyway.
diff --git a/docs/design/features/host-error-codes.md b/docs/design/features/host-error-codes.md
index 941c2a92a001..a041edb6d2c2 100644
--- a/docs/design/features/host-error-codes.md
+++ b/docs/design/features/host-error-codes.md
@@ -1,113 +1,51 @@
# Hosting layer error and exit codes
This document lists all the values returned as special exit codes when running `dotnet.exe` or `apphost` or returned by the hosting APIs (`hostfxr`, `hostpolicy` and `nethost`).
+Those exit codes are also specified in signed 32-bit form (what you would see if you run `echo %ERRORLEVEL%` on Winodws) and in 8-bit form (what you would see if you run `echo $?` on Linux).
Note that the exit code returned by running an application via `dotnet.exe` or `apphost` can either be one of the below values or the exit code of the managed application itself.
-
### Success error/exit codes
-
-* `Success` (`0`) - Operation was successful.
-
-* `Success_HostAlreadyInitialized` (`0x00000001`) - Initialization was successful, but another host context is already initialized, so the returned context is "secondary". The requested context was otherwise fully compatible with the already initialized context.
-This is returned by `hostfxr_initialize_for_runtime_config` if it's called when the host is already initialized in the process. Comes from `corehost_initialize` in `hostpolicy`.
-
-* `Success_DifferentRuntimeProperties` (`0x00000002`) - Initialization was successful, but another host context is already initialized and the requested context specified some runtime properties which are not the same (either in value or in presence) to the already initialized context.
-This is returned by `hostfxr_initialize_for_runtime_config` if it's called when the host is already initialized in the process. Comes from `corehost_initialize` in `hostpolicy`.
+| Name | Value | Value (signed, 32-bit) | Value (8-bit) | Description |
+| ------------------------------------- | ------------ | ---------------------- | ------------- | ----------- |
+| `Success` | `0x00000000` | `0` | `0` | Operation was successful. |
+| `Success_HostAlreadyInitialized` | `0x00000001` | `1` | `1` | Initialization was successful, but another host context is already initialized, so the returned context is "secondary". The requested context was otherwise fully compatible with the already initialized context. This is returned by `hostfxr_initialize_for_runtime_config` if it's called when the host is already initialized in the process. Comes from `corehost_initialize` in `hostpolicy`. |
+| `Success_DifferentRuntimeProperties` | `0x00000002` | `2` | `2` | Initialization was successful, but another host context is already initialized and the requested context specified some runtime properties which are not the same (either in value or in presence) to the already initialized context. This is returned by `hostfxr_initialize_for_runtime_config` if it's called when the host is already initialized in the process. Comes from `corehost_initialize` in `hostpolicy`. |
### Failure error/exit codes
-
-* `InvalidArgFailure` (`0x80008081`) - One of the specified arguments for the operation is invalid.
-
-* `CoreHostLibLoadFailure` (`0x80008082`) - There was a failure loading a dependent library. If any of the hosting components calls `LoadLibrary`/`dlopen` on a dependent library and the call fails, this error code is returned. The most common case for this failure is if the dependent library is missing some of its dependencies (for example the necessary CRT is missing on the machine), likely corrupt or incomplete install.
-This error code is also returned from `corehost_resolve_component_dependencies` if it's called on a `hostpolicy` which has not been initialized via the hosting layer. This would typically happen if `coreclr` is loaded directly without the hosting layer and then `AssemblyDependencyResolver` is used (which is an unsupported scenario).
-
-* `CoreHostLibMissingFailure` (`0x80008083`) - One of the dependent libraries is missing. Typically when the `hostfxr`, `hostpolicy` or `coreclr` dynamic libraries are not present in the expected locations. Probably means corrupted or incomplete installation.
-
-* `CoreHostEntryPointFailure` (`0x80008084`) - One of the dependent libraries is missing a required entry point.
-
-* `CoreHostCurHostFindFailure` (`0x80008085`) - If the hosting component is trying to use the path to the current module (the hosting component itself) and from it deduce the location of the installation. Either the location of the current module could not be determined (some weird OS call failure) or the location is not in the right place relative to other expected components.
-For example the `hostfxr` may look at its location and try to deduce the location of the `shared` folder with the framework from it. It assumes the typical install layout on disk. If this doesn't work, this error will be returned.
-
-* `CoreClrResolveFailure` (`0x80008087`) - If the `coreclr` library could not be found. The hosting layer (`hostpolicy`) looks for `coreclr` library either next to the app itself (for self-contained) or in the root framework (for framework-dependent). This search can be done purely by looking at disk or more commonly by looking into the respective `.deps.json`. If the `coreclr` library is missing in `.deps.json` or it's there but doesn't exist on disk, this error is returned.
-
-* `CoreClrBindFailure` (`0x80008088`) - The loaded `coreclr` library doesn't have one of the required entry points.
-
-* `CoreClrInitFailure` (`0x80008089`) - The call to `coreclr_initialize` failed. The actual error returned by `coreclr` is reported in the error message.
-
-* `CoreClrExeFailure` (`0x8000808a`) - The call to `coreclr_execute_assembly` failed. Note that this does not mean anything about the app's exit code, this failure occurs if `coreclr` failed to run the app itself.
-
-* `ResolverInitFailure` (`0x8000808b`) - Initialization of the `hostpolicy` dependency resolver failed. This can be:
- * One of the frameworks or the app is missing a required `.deps.json` file.
- * One of the `.deps.json` files is invalid (invalid JSON, or missing required properties and so on).
-
-* `ResolverResolveFailure` (`0x8000808c`) - Resolution of dependencies in `hostpolicy` failed. This can mean many different things, but in general one of the processed `.deps.json` contains entry for a file which could not found, or its resolution failed for some other reason (conflict for example).
-
-* `LibHostCurExeFindFailure` (`0x8000808d`) - Failure to determine the location of the current executable. The hosting layer uses the current executable path to deduce the install location in some cases. If this path can't be obtained (OS call fails, or the returned path doesn't exist), this error is returned.
-
-* `LibHostInitFailure` (`0x8000808e`) - Initialization of the `hostpolicy` library failed. The `corehost_load` method takes a structure with lot of initialization parameters. If the version of this structure doesn't match the expected value, this error code is returned. This would in general mean incompatibility between the `hostfxr` and `hostpolicy`, which should really only happen if somehow a newer `hostpolicy` is used by older `hostfxr`. This typically means corrupted installation.
-
-* `LibHostSdkFindFailure` (`0x80008091`) - Failure to find the requested SDK. This happens in the `hostfxr` when an SDK (also called CLI) command is used with `dotnet`. In this case the hosting layer tries to find an installed .NET SDK to run the command on. The search is based on deduced install location and on the requested version from potential `global.json` file. If either no matching SDK version can be found, or that version exists, but it's missing the `dotnet.dll` file, this error code is returned.
-
-* `LibHostInvalidArgs` (`0x80008092`) - Arguments to `hostpolicy` are invalid. This is used in three unrelated places in the `hostpolicy`, but in all cases it means the component calling `hostpolicy` did something wrong:
- * Command line arguments for the app - the failure would typically mean that wrong argument was passed or such. For example if the application main assembly is not specified on the command line. On its own this should not happen as `hostfxr` should have parsed and validated all command line arguments.
- * `hostpolicy` context's `get_delegate` - if the requested delegate enum value is not recognized. Again this would mean `hostfxr` passed the wrong value.
- * `corehost_resolve_component_dependencies` - if something went wrong initializing `hostpolicy` internal structures. Would happen for example when the `component_main_assembly_path` argument is wrong.
-
-* `InvalidConfigFile` (`0x80008093`) - The `.runtimeconfig.json` file is invalid. The reasons for this failure can be among these:
- * Failure to read from the file
- * Invalid JSON
- * Invalid value for a property (for example number for property which requires a string)
- * Missing required property
- * Other inconsistencies (for example `rollForward` and `applyPatches` are not allowed to be specified in the same config file)
- * Any of the above failures reading the `.runtimecofig.dev.json` file
- * Self-contained `.runtimeconfig.json` used in `hostfxr_initialize_for_runtime_config`
-Note that missing `.runtimconfig.json` is not an error (means self-contained app).
-This error code is also used when there is a problem reading the CLSID map file in `comhost`.
-
-* `AppArgNotRunnable` (`0x80008094`) - Used internally when the command line for `dotnet.exe` doesn't contain path to the application to run. In such case the command line is considered to be a CLI/SDK command. This error code should never be returned to external caller.
-
-* `AppHostExeNotBoundFailure` (`0x80008095`) - `apphost` failed to determine which application to run. This can mean:
- * The `apphost` binary has not been imprinted with the path to the app to run (so freshly built `apphost.exe` from the branch will fail to run like this)
- * The `apphost` is a bundle (single-file exe) and it failed to extract correctly.
-
-* `FrameworkMissingFailure` (`0x80008096`) - It was not possible to find a compatible framework version. This originates in `hostfxr` (`resolve_framework_reference`) and means that the app specified a reference to a framework in its `.runtimeconfig.json` which could not be resolved. The failure to resolve can mean that no such framework is available on the disk, or that the available frameworks don't match the minimum version specified or that the roll forward options specified excluded all available frameworks.
-Typically this would be used if a 3.0 app is trying to run on a machine which has no 3.0 installed.
-It would also be used for example if a 32bit 3.0 app is running on a machine which has 3.0 installed but only for 64bit.
-
-* `HostApiFailed` (`0x80008097`) - Returned by `hostfxr_get_native_search_directories` if the `hostpolicy` could not calculate the `NATIVE_DLL_SEARCH_DIRECTORIES`.
-
-* `HostApiBufferTooSmall` (`0x80008098`) - Returned when the buffer specified to an API is not big enough to fit the requested value. Can be returned from:
- * `hostfxr_get_runtime_properties`
- * `hostfxr_get_native_search_directories`
- * `get_hostfxr_path`
-
-* `LibHostUnknownCommand` (`0x80008099`) - Returned by `hostpolicy` if the `corehost_main_with_output_buffer` is called with unsupported host command. This error code means there is incompatibility between the `hostfxr` and `hostpolicy`. In reality this should pretty much never happen.
-
-* `LibHostAppRootFindFailure` (`0x8000809a`) - Returned by `apphost` if the imprinted application path doesn't exist. This would happen if the app is built with an executable (the `apphost`) and the main `app.dll` is missing.
-
-* `SdkResolverResolveFailure` (`0x8000809b`) - Returned from `hostfxr_resolve_sdk2` when it fails to find matching SDK. Similar to `LibHostSdkFindFailure` but only used in the `hostfxr_resolve_sdk2`.
-
-* `FrameworkCompatFailure` (`0x8000809c`) - During processing of `.runtimeconfig.json` there were two framework references to the same framework which were not compatible. This can happen if the app specified a framework reference to a lower-level framework which is also specified by a higher-level framework which is also used by the app.
-For example, this would happen if the app referenced `Microsoft.AspNet.App` version 2.0 and `Microsoft.NETCore.App` version 3.0. In such case the `Microsoft.AspNet.App` has `.runtimeconfig.json` which also references `Microsoft.NETCore.App` but it only allows versions 2.0 up to 2.9 (via roll forward options). So the version 3.0 requested by the app is incompatible.
-
-* `FrameworkCompatRetry` (`0x8000809d`) - Error used internally if the processing of framework references from `.runtimeconfig.json` reached a point where it needs to reprocess another already processed framework reference. If this error is returned to the external caller, it would mean there's a bug in the framework resolution algorithm.
-
-* `AppHostExeNotBundle` (`0x8000809e`) - Error reading the bundle footer metadata from a single-file `apphost`. This would mean a corrupted `apphost`.
-
-* `BundleExtractionFailure` (`0x8000809f`) - Error extracting single-file `apphost` bundle. This is used in case of any error related to the bundle itself. Typically would mean a corrupted bundle.
-
-* `BundleExtractionIOError` (`0x800080a0`) - Error reading or writing files during single-file `apphost` bundle extraction.
-
-* `LibHostDuplicateProperty` (`0x800080a1`) - The `.runtimeconfig.json` specified by the app contains a runtime property which is also produced by the hosting layer. For example if the `.runtimeconfig.json` would specify a property `TRUSTED_PLATFORM_ROOTS`, this error code would be returned. It is not allowed to specify properties which are otherwise populated by the hosting layer (`hostpolicy`) as there is not good way to resolve such conflicts.
-
-* `HostApiUnsupportedVersion` (`0x800080a2`) - Feature which requires certain version of the hosting layer binaries was used on a version which doesn't support it.
-For example if COM component specified to run on 2.0 `Microsoft.NETCore.App` - as that contains older version of `hostpolicy` which doesn't support the necessary features to provide COM services.
-
-* `HostInvalidState` (`0x800080a3`) - Error code returned by the hosting APIs in `hostfxr` if the current state is incompatible with the requested operation. There are many such cases, please refer to the documentation of the hosting APIs for details.
-For example if `hostfxr_get_runtime_property_value` is called with the `host_context_handle` `nullptr` (meaning get property from the active runtime) but there's no active runtime in the process.
-
-* `HostPropertyNotFound` (`0x800080a4`) - property requested by `hostfxr_get_runtime_property_value` doesn't exist.
-
-* `CoreHostIncompatibleConfig` (`0x800080a5`) - Error returned by `hostfxr_initialize_for_runtime_config` if the component being initialized requires framework which is not available or incompatible with the frameworks loaded by the runtime already in the process. For example trying to load a component which requires 3.0 into a process which is already running a 2.0 runtime.
-
-* `HostApiUnsupportedScenario` (`0x800080a6`) - Error returned by `hostfxr_get_runtime_delegate` when `hostfxr` doesn't currently support requesting the given delegate type using the given context.
+| Name | Value | Value (signed, 32-bit) | Value (8-bit) | Description |
+| ------------------------------------- | ------------ | ---------------------- | ------------- | ----------- |
+| `InvalidArgFailure` | `0x80008081` | `-2147450751` | `129` | One of the specified arguments for the operation is invalid. |
+| `CoreHostLibLoadFailure` | `0x80008082` | `-2147450750` | `130` | There was a failure loading a dependent library. If any of the hosting components calls `LoadLibrary`/`dlopen` on a dependent library and the call fails, this error code is returned. The most common case for this failure is if the dependent library is missing some of its dependencies (for example the necessary CRT is missing on the machine), likely corrupt or incomplete install. This error code is also returned from `corehost_resolve_component_dependencies` if it's called on a `hostpolicy` which has not been initialized via the hosting layer. This would typically happen if `coreclr` is loaded directly without the hosting layer and then `AssemblyDependencyResolver` is used (which is an unsupported scenario). |
+| `CoreHostLibMissingFailure` | `0x80008083` | `-2147450749` | `131` | One of the dependent libraries is missing. Typically when the `hostfxr`, `hostpolicy` or `coreclr` dynamic libraries are not present in the expected locations. Probably means corrupted or incomplete installation. |
+| `CoreHostEntryPointFailure` | `0x80008084` | `-2147450748` | `132` | One of the dependent libraries is missing a required entry point. |
+| `CoreHostCurHostFindFailure` | `0x80008085` | `-2147450747` | `133` | If the hosting component is trying to use the path to the current module (the hosting component itself) and from it deduce the location of the installation. Either the location of the current module could not be determined (some weird OS call failure) or the location is not in the right place relative to other expected components. For example the `hostfxr` may look at its location and try to deduce the location of the `shared` folder with the framework from it. It assumes the typical install layout on disk. If this doesn't work, this error will be returned. |
+| `CoreClrResolveFailure` | `0x80008087` | `-2147450745` | `135` | If the `coreclr` library could not be found. The hosting layer (`hostpolicy`) looks for `coreclr` library either next to the app itself (for self-contained) or in the root framework (for framework-dependent). This search can be done purely by looking at disk or more commonly by looking into the respective `.deps.json`. If the `coreclr` library is missing in `.deps.json` or it's there but doesn't exist on disk, this error is returned. |
+| `CoreClrBindFailure` | `0x80008088` | `-2147450744` | `136` | The loaded `coreclr` library doesn't have one of the required entry points. |
+| `CoreClrInitFailure` | `0x80008089` | `-2147450743` | `137` | The call to `coreclr_initialize` failed. The actual error returned by `coreclr` is reported in the error message. |
+| `CoreClrExeFailure` | `0x8000808a` | `-2147450742` | `138` | The call to `coreclr_execute_assembly` failed. Note that this does not mean anything about the app's exit code, this failure occurs if `coreclr` failed to run the app itself. |
+| `ResolverInitFailure` | `0x8000808b` | `-2147450741` | `139` | Initialization of the `hostpolicy` dependency resolver failed. This can be:
One of the frameworks or the app is missing a required `.deps.json` file.
One of the `.deps.json` files is invalid (invalid JSON, or missing required properties and so on).
|
+| `ResolverResolveFailure` | `0x8000808c` | `-2147450740` | `140` | Resolution of dependencies in `hostpolicy` failed. This can mean many different things, but in general one of the processed `.deps.json` contains entry for a file which could not found, or its resolution failed for some other reason (conflict for example). |
+| `LibHostCurExeFindFailure` | `0x8000808d` | `-2147450739` | `141` | Failure to determine the location of the current executable. The hosting layer uses the current executable path to deduce the install location in some cases. If this path can't be obtained (OS call fails, or the returned path doesn't exist), this error is returned. |
+| `LibHostInitFailure` | `0x8000808e` | `-2147450738` | `142` | Initialization of the `hostpolicy` library failed. The `corehost_load` method takes a structure with lot of initialization parameters. If the version of this structure doesn't match the expected value, this error code is returned. This would in general mean incompatibility between the `hostfxr` and `hostpolicy`, which should really only happen if somehow a newer `hostpolicy` is used by older `hostfxr`. This typically means corrupted installation. |
+| `LibHostSdkFindFailure` | `0x80008091` | `-2147450735` | `145` | Failure to find the requested SDK. This happens in the `hostfxr` when an SDK (also called CLI) command is used with `dotnet`. In this case the hosting layer tries to find an installed .NET SDK to run the command on. The search is based on deduced install location and on the requested version from potential `global.json` file. If either no matching SDK version can be found, or that version exists, but it's missing the `dotnet.dll` file, this error code is returned. |
+| `LibHostInvalidArgs` | `0x80008092` | `-2147450734` | `146` | Arguments to `hostpolicy` are invalid. This is used in three unrelated places in the `hostpolicy`, but in all cases it means the component calling `hostpolicy` did something wrong:
Command line arguments for the app - the failure would typically mean that wrong argument was passed or such. For example if the application main assembly is not specified on the command line. On its own this should not happen as `hostfxr` should have parsed and validated all command line arguments.
`hostpolicy` context's `get_delegate` - if the requested delegate enum value is not recognized. Again this would mean `hostfxr` passed the wrong value.
`corehost_resolve_component_dependencies` - if something went wrong initializing `hostpolicy` internal structures. Would happen for example when the `component_main_assembly_path` argument is wrong.
|
+| `InvalidConfigFile` | `0x80008093` | `-2147450733` | `147` | The `.runtimeconfig.json` file is invalid. The reasons for this failure can be among these:
Failure to read from the file
Invalid JSON
Invalid value for a property (for example number for property which requires a string)
Missing required property
Other inconsistencies (for example `rollForward` and `applyPatches` are not allowed to be specified in the same config file)
Any of the above failures reading the `.runtimecofig.dev.json` file
Self-contained `.runtimeconfig.json` used in `hostfxr_initialize_for_runtime_config`. Note that missing `.runtimconfig.json` is not an error (means self-contained app). This error code is also used when there is a problem reading the CLSID map file in `comhost`.
|
+| `AppArgNotRunnable` | `0x80008094` | `-2147450732` | `148` | Used internally when the command line for `dotnet.exe` doesn't contain path to the application to run. In such case the command line is considered to be a CLI/SDK command. This error code should never be returned to external caller. |
+| `AppHostExeNotBoundFailure` | `0x80008095` | `-2147450731` | `149` | `apphost` failed to determine which application to run. This can mean:
The `apphost` binary has not been imprinted with the path to the app to run (so freshly built `apphost.exe` from the branch will fail to run like this)
The `apphost` is a bundle (single-file exe) and it failed to extract correctly.
|
+| `FrameworkMissingFailure` | `0x80008096` | `-2147450730` | `150` | It was not possible to find a compatible framework version. This originates in `hostfxr` (`resolve_framework_reference`) and means that the app specified a reference to a framework in its `.runtimeconfig.json` which could not be resolved. The failure to resolve can mean that no such framework is available on the disk, or that the available frameworks don't match the minimum version specified or that the roll forward options specified excluded all available frameworks. Typically this would be used if a 3.0 app is trying to run on a machine which has no 3.0 installed. It would also be used for example if a 32bit 3.0 app is running on a machine which has 3.0 installed but only for 64bit. |
+| `HostApiFailed` | `0x80008097` | `-2147450729` | `151` | Returned by `hostfxr_get_native_search_directories` if the `hostpolicy` could not calculate the `NATIVE_DLL_SEARCH_DIRECTORIES`. |
+| `HostApiBufferTooSmall` | `0x80008098` | `-2147450728` | `152` | Returned when the buffer specified to an API is not big enough to fit the requested value. Can be returned from:
`hostfxr_get_runtime_properties`
`hostfxr_get_native_search_directories`
`get_hostfxr_path`
|
+| `LibHostUnknownCommand` | `0x80008099` | `-2147450727` | `153` | Returned by `hostpolicy` if the `corehost_main_with_output_buffer` is called with unsupported host command. This error code means there is incompatibility between the `hostfxr` and `hostpolicy`. In reality this should pretty much never happen. |
+| `LibHostAppRootFindFailure` | `0x8000809a` | `-2147450726` | `154` | Returned by `apphost` if the imprinted application path doesn't exist. This would happen if the app is built with an executable (the `apphost`) and the main `app.dll` is missing. |
+| `SdkResolverResolveFailure` | `0x8000809b` | `-2147450725` | `155` | Returned from `hostfxr_resolve_sdk2` when it fails to find matching SDK. Similar to `LibHostSdkFindFailure` but only used in the `hostfxr_resolve_sdk2`. |
+| `FrameworkCompatFailure` | `0x8000809c` | `-2147450724` | `156` | During processing of `.runtimeconfig.json` there were two framework references to the same framework which were not compatible. This can happen if the app specified a framework reference to a lower-level framework which is also specified by a higher-level framework which is also used by the app. For example, this would happen if the app referenced `Microsoft.AspNet.App` version 2.0 and `Microsoft.NETCore.App` version 3.0. In such case the `Microsoft.AspNet.App` has `.runtimeconfig.json` which also references `Microsoft.NETCore.App` but it only allows versions 2.0 up to 2.9 (via roll forward options). So the version 3.0 requested by the app is incompatible. |
+| `FrameworkCompatRetry` | `0x8000809d` | `-2147450723` | `157` | Error used internally if the processing of framework references from `.runtimeconfig.json` reached a point where it needs to reprocess another already processed framework reference. If this error is returned to the external caller, it would mean there's a bug in the framework resolution algorithm. |
+| `AppHostExeNotBundle` | `0x8000809e` | `-2147450722` | `158` | Error reading the bundle footer metadata from a single-file `apphost`. This would mean a corrupted `apphost`. |
+| `BundleExtractionFailure` | `0x8000809f` | `-2147450721` | `159` | Error extracting single-file `apphost` bundle. This is used in case of any error related to the bundle itself. Typically would mean a corrupted bundle. |
+| `BundleExtractionIOError` | `0x800080a0` | `-2147450720` | `160` | Error reading or writing files during single-file `apphost` bundle extraction. |
+| `LibHostDuplicateProperty` | `0x800080a1` | `-2147450719` | `161` | The `.runtimeconfig.json` specified by the app contains a runtime property which is also produced by the hosting layer. For example if the `.runtimeconfig.json` would specify a property `TRUSTED_PLATFORM_ROOTS`, this error code would be returned. It is not allowed to specify properties which are otherwise populated by the hosting layer (`hostpolicy`) as there is not good way to resolve such conflicts. |
+| `HostApiUnsupportedVersion` | `0x800080a2` | `-2147450718` | `162` | Feature which requires certain version of the hosting layer binaries was used on a version which doesn't support it. For example if COM component specified to run on 2.0 `Microsoft.NETCore.App` - as that contains older version of `hostpolicy` which doesn't support the necessary features to provide COM services. |
+| `HostInvalidState` | `0x800080a3` | `-2147450717` | `163` | Error code returned by the hosting APIs in `hostfxr` if the current state is incompatible with the requested operation. There are many such cases, please refer to the documentation of the hosting APIs for details. For example if `hostfxr_get_runtime_property_value` is called with the `host_context_handle` `nullptr` (meaning get property from the active runtime) but there's no active runtime in the process. |
+| `HostPropertyNotFound` | `0x800080a4` | `-2147450716` | `164` | property requested by `hostfxr_get_runtime_property_value` doesn't exist. |
+| `CoreHostIncompatibleConfig` | `0x800080a5` | `-2147450715` | `165` | Error returned by `hostfxr_initialize_for_runtime_config` if the component being initialized requires framework which is not available or incompatible with the frameworks loaded by the runtime already in the process. For example trying to load a component which requires 3.0 into a process which is already running a 2.0 runtime. |
+| `HostApiUnsupportedScenario` | `0x800080a6` | `-2147450714` | `166` | Error returned by `hostfxr_get_runtime_delegate` when `hostfxr` doesn't currently support requesting the given delegate type using the given context. |
diff --git a/docs/design/features/host-probing.md b/docs/design/features/host-probing.md
index 9883c676ca08..38df2347406b 100644
--- a/docs/design/features/host-probing.md
+++ b/docs/design/features/host-probing.md
@@ -25,29 +25,29 @@ The dotnet host uses probing when it searches for actual file on disk for a give
The library relative path in this case is `newtonsoft.json/11.0.2` and the asset relative path is `lib/netstandard2.0/Newtonsoft.Json.dll`. So the goal of the probing logic is to find the `Newtonsoft.Json.dll` file using the above relative paths.
## Probing
-The probing itself is done by going over a list of probing paths, which are ordered according to their priority. For each path, the host will append the relative parts of the path as per above and see if the file actually exists on the disk.
-If the file is found, the probing is done, and the full path just resolved is stored.
+The probing itself is done by going over a list of probing paths, which are ordered according to their priority. For each path, the host will append the relative parts of the path as per above and see if the file actually exists on the disk.
+If the file is found, the probing is done, and the full path just resolved is stored.
If the file is not found, the probing continues with the next path on the list.
If all paths are tried and the asset is still not found this is reported as an error (with the exception of app's `.deps.json` asset, in which case it's ignored).
## Probing paths
The list of probing paths ordered according to their priority. First path in the list below is tried first and so on.
-* Servicing paths
- Servicing paths are only used for serviceable assets, that is the corresponding library record must specify `serviceable: true`.
+* Servicing paths
+ Servicing paths are only used for serviceable assets, that is the corresponding library record must specify `serviceable: true`.
The base servicing path is
* On Windows x64 `%ProgramFiles(x86)%\coreservicing`
* On Windows x86 `%ProgramFiles%\coreservicing`
- * Otherwise (Linux/Mac) `$CORE_SERVICING`
+ * Otherwise (Linux/Mac) `$CORE_SERVICING`
Given the base servicing path, the probing paths are
* Servicing NI probe path `/|arch|` - this is used only for `runtime` assets
* Servicing normal probe path `/pkgs` - this is used for all assets
* The application (or framework if we're resolving framework assets) directory
-* Framework directories
- If the app (or framework) has dependencies on frameworks, these frameworks are used as probing paths.
- The order is from the higher level framework to lower level framework. The app is considered the highest level, it direct dependencies are next and so on.
- For assets from frameworks, only that framework and lower level frameworks are considered.
+* Framework directories
+ If the app (or framework) has dependencies on frameworks, these frameworks are used as probing paths.
+ The order is from the higher level framework to lower level framework. The app is considered the highest level, it direct dependencies are next and so on.
+ For assets from frameworks, only that framework and lower level frameworks are considered.
Note: These directories come directly out of the framework resolution process. Special note on Windows where global locations are always considered even if the app is not executed via the shared `dotnet.exe`. More details can be found in [Multi-level Shared FX Lookup](multilevel-sharedfx-lookup.md).
* Shared store paths
* `$DOTNET_SHARED_STORE/|arch|/|tfm|` - The environment variable `DOTNET_SHARED_STORE` can contain multiple paths, in which case each is appended with `|arch|/|tfm|` and used as a probing path.
@@ -56,10 +56,10 @@ The list of probing paths ordered according to their priority. First path in the
* On Windows, the global shared store is used
* If running in WOW64 mode - `%ProgramFiles(x86)%\dotnet\store\|arch|\|tfm|`
* Otherwise - `%ProgramFiles%\dotnet\store\|arch|\|tfm|`
-* Additional probing paths
+* Additional probing paths
In these paths the `|arch|/|tfm|` string can be used and will be replaced with the actual values before using the path.
* `--additionalprobingpath` command line arguments
* `additionalProbingPaths` specified in `.runtimeconfig.json` and `.runtimeconfig.dev.json` for the app and each framework (highest to lowest)
- Note about framework-dependent and self-contained apps. With regard to probing the main difference is that self-contained apps don't have any framework dependencies, so all assets (including assemblies which normally come from a framework) are probed for in the app's directory.
\ No newline at end of file
+ Note about framework-dependent and self-contained apps. With regard to probing the main difference is that self-contained apps don't have any framework dependencies, so all assets (including assemblies which normally come from a framework) are probed for in the app's directory.
diff --git a/docs/design/features/host-startup-hook.md b/docs/design/features/host-startup-hook.md
index b5c29871a282..e2b4623fab03 100644
--- a/docs/design/features/host-startup-hook.md
+++ b/docs/design/features/host-startup-hook.md
@@ -57,8 +57,8 @@ Each part may be either
* the assembly name must be considered a valid assembly name as specified
by the `AssemblyName` class.
-Note that white-spaces are preserved and considered part of the specified
-path/name. So for example path separator followed by a white-space and
+Note that white-spaces are preserved and considered part of the specified
+path/name. So for example path separator followed by a white-space and
another path separator is invalid, since the white-space only string
in between the path separators will be considered as assembly name.
@@ -90,10 +90,10 @@ centralized, while still allowing user code to do its own thing if it
so desires.
The producer of `StartupHook.dll` needs to ensure that
-`StartupHook.dll` is compatible with the dependencies specified in the
-main application's deps.json, since those dependencies are put on the
-Trusted Platform Assemblies (TPA) list during the runtime startup,
-before `StartupHook.dll` is loaded. This means that `StartupHook.dll`
+`StartupHook.dll` is compatible with the dependencies specified in the
+main application's deps.json, since those dependencies are put on the
+Trusted Platform Assemblies (TPA) list during the runtime startup,
+before `StartupHook.dll` is loaded. This means that `StartupHook.dll`
needs to be built against the same or lower version of .NET Core than the app.
## Example
diff --git a/docs/design/features/host-tracing.md b/docs/design/features/host-tracing.md
index be60e9e5db2c..78f4b3ca4e75 100644
--- a/docs/design/features/host-tracing.md
+++ b/docs/design/features/host-tracing.md
@@ -1,6 +1,6 @@
# Host tracing
-The various .NET Core host components provide detailed tracing of diagnostic information which can help solve issues around runtime, framework and assembly resolution and others.
+The various .NET Core host components provide detailed tracing of diagnostic information which can help solve issues around runtime, framework and assembly resolution and others.
## Existing support
Currently (as of .NET Core 2.1) the host tracing is only written to the `stderr` output of the process. It can be turned on by setting `COREHOST_TRACE=1`.
@@ -47,13 +47,13 @@ The functions behave exactly the same in both components. The `listener` paramet
* a pointer to an implementation of `host_trace_listener` which is then registered the only listener for all tracing.
* `NULL` value which unregisters any previously registered listener. After this call tracing is disabled.
-Custom host can and should register the trace listener as the first thing it does with the respective host component to ensure that all tracing is routed to it.
+Custom host can and should register the trace listener as the first thing it does with the respective host component to ensure that all tracing is routed to it.
-Only one trace listener can be registered at any given time.
+Only one trace listener can be registered at any given time.
Registering custom trace listener or setting it to `NULL` doesn't override the tracing enabled by environment variables. If a trace listener is registered and the `COREHOST_TRACE=1` is set as well, the traces will be routed to both the `stderr` as well as the registered listener.
-The `hostfxr` component will propagate the trace listener to the `hostpolicy` component before it calls into it. So custom host only needs to register its trace listener with the `hostfxr` component and not both. The propagation of the trace listener is only done for the duration necessary after which it will be unregistered again. So custom host might need to register its own listener if it makes calls directly to `hostpolicy` on top of the calls to `hostfxr`.
+The `hostfxr` component will propagate the trace listener to the `hostpolicy` component before it calls into it. So custom host only needs to register its trace listener with the `hostfxr` component and not both. The propagation of the trace listener is only done for the duration necessary after which it will be unregistered again. So custom host might need to register its own listener if it makes calls directly to `hostpolicy` on top of the calls to `hostfxr`.
In case of new (.NET Core 3) `hostfxr` component which would call into an old (.NET Core 2.1) `hostpolicy` component, the `hostfxr` will not perform the propagation in any way since the older `hostpolicy` doesn't support this mechanism.
The trace listener interface looks like this:
@@ -68,14 +68,14 @@ struct host_trace_listener
}
```
-The `message` parameter is a standard `NUL` terminated string and it's the message to trace with the respective verbosity level.
+The `message` parameter is a standard `NUL` terminated string and it's the message to trace with the respective verbosity level.
The `activityId` parameter is a standard `NUL` terminated string. It's used to correlate traces for a given binding event. The content of the string is not yet defined, but the trace listeners should consider it opaque. Trace listeners should include this string in the trace of the message in some form. The parameter may be `NULL` in which case the trace doesn't really belong to any specific binding event.
Methods on the trace listener interface can be called from any thread in the app, and should be able to handle multiple calls at the same time from different threads.
## Future investments
### Trace content
-Currently the host components tend to trace a lot. The trace contains lot of interesting information but it's done in a very verbose way which is sometimes hard to navigate. Future investment should look at the common scenarios which are using the host tracing and optimize the trace output for those scenarios. This doesn't necessarily mean decrease the amount of tracing, but possibly introduce "summary sections" which would describe the end result decisions for certain scenarios.
+Currently the host components tend to trace a lot. The trace contains lot of interesting information but it's done in a very verbose way which is sometimes hard to navigate. Future investment should look at the common scenarios which are using the host tracing and optimize the trace output for those scenarios. This doesn't necessarily mean decrease the amount of tracing, but possibly introduce "summary sections" which would describe the end result decisions for certain scenarios.
It would also be good to review the usage of verbose versus info tracing and make it consistent.
### Interaction with other diagnostics in the .NET Core
diff --git a/docs/design/features/hw-intrinsics.md b/docs/design/features/hw-intrinsics.md
index fb1287c42185..0abddc147cae 100644
--- a/docs/design/features/hw-intrinsics.md
+++ b/docs/design/features/hw-intrinsics.md
@@ -30,7 +30,7 @@ The vector types supported by one or more target ISAs are supported across platf
* `Vector256` - A 256-bit vector of type `T`
* `Vector256` intrinsics are supported only on x86 (and x64).
-Note that these are generic types, which distinguishes these from native intrinsic vector types. It also somewhat complicates interop, as the runtime currently doesn't support interop for generic types. See https://github.com/dotnet/coreclr/issues/1685
+Note that these are generic types, which distinguishes these from native intrinsic vector types. It also somewhat complicates interop, as the runtime currently doesn't support interop for generic types. See https://github.com/dotnet/runtime/issues/4547
Not all intrinsics defined on these types support all primitive type parameters. When not supported, they are expected to throw `NotSupportedException`. This is generally handled by the C# implementation code, though for the most part this is a non-issue, as the ISA-specific intrinsics are declared over all supported concrete types (e.g. `Vector128` rather than `Vector128`).
@@ -69,7 +69,7 @@ Currently, the JIT determines in the importer whether it will:
* Generate a call (e.g. if it is a recognized intrinsic but an operand is not immediate as it is expected to be). The `mustExpand` option, which is returned by the VM as an "out" parameter to the `getIntrinsicID` method, must be false in this case.
* Throw `PlatformNotSupportedException` if it is not a recognized and supported intrinsic for the current platform.
-There is some room for improvement here. For example, it may be that an argument that appears to be non-constant could later be determined to be a constant value (https://github.com/dotnet/coreclr/issues/17108).
+There is some room for improvement here. For example, it may be that an argument that appears to be non-constant could later be determined to be a constant value (https://github.com/dotnet/runtime/issues/9989).
### Hardware Intrinsics Table
@@ -114,7 +114,7 @@ The only thing that makes the hardware intrinsics different in the area of instr
The encodings are largely specified by `coreclr\src\jit\instrs{arch}.h`, and most of the target-specific code is in the `emit{arch}.*` files.
-This is an area of the JIT that could use some redesign and refactoring (https://github.com/dotnet/coreclr/issues/23006 and https://github.com/dotnet/coreclr/issues/21441 among others).
+This is an area of the JIT that could use some redesign and refactoring (https://github.com/dotnet/runtime/issues/12178 and https://github.com/dotnet/runtime/issues/11631 among others).
## Testing
diff --git a/docs/design/features/raw-eventlistener.md b/docs/design/features/raw-eventlistener.md
index f13b6a6096e0..aaf562ff3b72 100644
--- a/docs/design/features/raw-eventlistener.md
+++ b/docs/design/features/raw-eventlistener.md
@@ -23,7 +23,7 @@ public enum EventListenerSettings
None,
RawEventDispatch
}
-```
+```
This parameter is used to specify the desired dispatch behavior (in this case, do not deserialize event payloads).
@@ -33,7 +33,7 @@ The new raw dispatch API will be:
```
public void OnEventWrittenRaw(RawEventWrittenEventArgs args);
-
+
public sealed class RawEventWrittenEventArgs
{
@@ -52,9 +52,9 @@ public sealed class RawEventWrittenEventArgs
public EventLevel Level { get; }
public long OSThreadId { get; }
public DateTime TimeStamp { get; }
-
+
// Replacement properties for Payload and PayloadNames.
- public ReadOnlySpan Metadata { get; }
+ public ReadOnlySpan Metadata { get; }
public ReadOnlySpan Payload { get; }
}
```
diff --git a/docs/design/features/readytorun-composite-format-design.md b/docs/design/features/readytorun-composite-format-design.md
index b0fcf288874b..afa7a4ed1574 100644
--- a/docs/design/features/readytorun-composite-format-design.md
+++ b/docs/design/features/readytorun-composite-format-design.md
@@ -50,7 +50,7 @@ we propose using two complementary strategies:
* In the composite R2R file with embedded metadata, there must be a new table of COR headers
and metadata blobs representing the MSIL metadata from all the input assemblies. The table
-must be indexable by simple assembly name for fast lookup.
+must be indexable by simple assembly name for fast lookup.
* in contrast to managed assemblies and single-input R2R executables, composite R2R files
don't expose any COR header (it's not meaningful as the file potentially contains a larger
@@ -98,7 +98,7 @@ this encoding are still work in progress and likely to further evolve.
version bubble is represented by an arbitrary mixture of single-input and composite R2R files.
If that is the case, manifest metadata would need to be decoupled from the index to
`READYTORUN_SECTION_ASSEMBLIES`.
-
+
Alternatively we could make it such that `READYTORUN_SECTION_MANIFEST_METADATA` holds all
component assemblies of the current composite image at the beginning of the AssemblyRef table
followed by the other needed assemblies *within the version bubble outside of the current
@@ -157,7 +157,7 @@ that could be subsequently opened by ILDASM or ILSpy.
Ideally we should patch ILDASM / ILSpy to cleanly handle the composite R2R file format; sadly this may
end up being a relatively complex change due to the presence of multiple MSIL metadata blocks in the
-file.
+file.
# Required diagnostic changes
diff --git a/docs/design/features/roll-forward-on-no-candidate-fx.md b/docs/design/features/roll-forward-on-no-candidate-fx.md
index dbfc04b632cb..7417498675d4 100644
--- a/docs/design/features/roll-forward-on-no-candidate-fx.md
+++ b/docs/design/features/roll-forward-on-no-candidate-fx.md
@@ -11,19 +11,19 @@ If the version specified is a _production_ version, the default behavior is:
```
For instance:
-
+
Desired version: 1.0.1
Available versions: 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.1.0, 1.1.1, 2.0.1
Chosen version: 1.0.3
-
+
Desired version: 1.0.1
Available versions: 1.0.0, 1.1.0-preview1-x, 1.1.0-preview2-x, 1.2.0-preview1-x
Chosen version: 1.1.0-preview2-x
-
+
Desired version: 1.0.1
Available versions: 1.0.0, 1.1.0-preview1-x, 1.2.0, 1.2.1-preview1-x
Chosen version: 1.2.0
-
+
Desired version: 1.0.1
Available versions: 1.0.0, 2.0.0
Chosen version: there is no compatible version available
@@ -40,14 +40,14 @@ This means _preview_ is never rolled forward to _production_.
Desired version: 1.0.1-preview2-x
Available versions: 1.0.1-preview2-x, 1.0.1-preview3-x
Chosen version: 1.0.1-preview2-x
-
+
Desired version: 1.0.1-preview2-x
Available versions: 1.0.1-preview3-x
Chosen version: 1.0.1-preview3-x
-
+
Desired version: 1.0.1-preview2-x
Available versions: 1.0.1, 1.0.2-preview3-x
- Chosen version: there is no compatible version available
+ Chosen version: there is no compatible version available
## Settings to control behavior
### applyPatches
@@ -59,7 +59,7 @@ Once a compatible framework version is chosen as explained above, the latest pat
Desired version: 1.0.1
Available versions: 1.0.1, 1.0.2
Chosen version: 1.0.2
-
+
Patch roll forward: disabled
Desired version: 1.0.1
Available versions: 1.0.1, 1.0.2
@@ -79,7 +79,7 @@ To specify the exact desired framework version, use the command line argument '-
- Command line argument ('--roll-forward-on-no-candidate-fx' argument)
- Runtime configuration file ('rollForwardOnNoCandidateFx' property)
- DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX environment variable
-
+
The valid values:
0) Off (_do not roll forward_)
@@ -101,7 +101,7 @@ If this feature is enabled and no compatible framework version is found, we'll s
Desired Version: 1.0.0
Available versions: 1.1.1, 1.1.3, 1.2.0
Chosen version: 1.1.1
-
+
Patch roll forward: enabled
Roll Forward On No Candidate Fx: 0 (disabled)
Desired Version: 1.0.0
@@ -111,7 +111,7 @@ If this feature is enabled and no compatible framework version is found, we'll s
It's important to notice that, even if "Roll Forward On No Candidate Fx" is enabled, only the specified framework version will be accepted if the '--fx-version' argument is used.
-Since there are three ways to specify the values, conflicts will be resolved by the order listed above (command line has priority over config, which has priority over the environment variable).
+Since there are three ways to specify the values, conflicts will be resolved by the order listed above (command line has priority over config, which has priority over the environment variable).
```
For instance:
@@ -123,8 +123,8 @@ Since there are three ways to specify the values, conflicts will be resolved by
'rollForwardOnNoCandidateFx' property is set to '1'
DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX env var is set to '1'
The feature is DISABLED.
-```
-
+```
+
There is no inheritance when there are chained framework references. If the app references FX1, and FX1 references FX2, then the resolution of FX2 only takes into account settings from `.runtimeconfig.json` in FX1, CLI and env. variable. The settings in the app's `.runtimeconfig.json` have no effect on resolution of FX2.
## Multilevel SharedFx Lookup
diff --git a/docs/design/features/source-generator-pinvokes.md b/docs/design/features/source-generator-pinvokes.md
index 1efec51604bc..fbd588950df9 100644
--- a/docs/design/features/source-generator-pinvokes.md
+++ b/docs/design/features/source-generator-pinvokes.md
@@ -2,7 +2,7 @@
## Purpose
-The CLR possesses a rich built-in marshaling mechanism for interoperability with native code that is handled at runtime. This system was designed to free .NET developers from having to author complex and potentially ABI sensitive [type conversion code][typemarshal_link] from a managed to an unmanaged environment. The built-in system works with both [P/Invoke][pinvoke_link] (i.e. `DllImportAttribute`) and [COM interop](https://docs.microsoft.com/dotnet/standard/native-interop/cominterop). The generated portion is typically called an ["IL Stub"][il_stub_link] since the stub is generated by inserting IL instructions into a stream and then passing that stream to the JIT for compilation.
+The CLR possesses a rich built-in marshaling mechanism for interoperability with native code that is handled at runtime. This system was designed to free .NET developers from having to author complex and potentially ABI sensitive [type conversion code][typemarshal_link] from a managed to an unmanaged environment. The built-in system works with both [P/Invoke][pinvoke_link] (i.e. `DllImportAttribute`) and [COM interop](https://docs.microsoft.com/dotnet/standard/native-interop/cominterop). The generated portion is typically called an ["IL Stub"][il_stub_link] since the stub is generated by inserting IL instructions into a stream and then passing that stream to the JIT for compilation.
A consequence of this approach is that marshaling code is not immediately available post-link for AOT scenarios (e.g. [`crossgen`](../../workflow/building/coreclr/crossgen.md) and [`crossgen2`](crossgen2-compilation-structure-enhancements.md)). The immediate unavailability of this code has been mitigated by a complex mechanism to have marshalling code generated by during AOT compilation. The [IL Linker][ilinker_link] is another tool that struggles with runtime generated code since it is unable to understand all potential used types without seeing what is generated.
diff --git a/docs/design/features/tiered-compilation.md b/docs/design/features/tiered-compilation.md
index 242dbc94b3ac..caedd79f94f1 100644
--- a/docs/design/features/tiered-compilation.md
+++ b/docs/design/features/tiered-compilation.md
@@ -92,4 +92,4 @@ Most of the implementation is relatively straightforward given the design and be
1. The current call counter implementation is utterly naive and using the PreStub has a high per-invocation cost relative to other more sophisticated implementation options. We expected it would need to change sooner, but so far despite having some measurable cost it hasn't been reached the top of the priority list for performance gain vs. work necessary. Part of what makes it not as bad as it looks is that there is a bound on the number of times it can be called for any one method and relative to typical 100,000 cycle costs for jitting a method even an expensive call counter doesn't make a huge impact.
-2. Right now background compilation is limited to a single thread taken from the threadpool and used for up to 10ms. If we need more time than that we return the thread and request another. The goal is to be a good citizen in the threadpool's overall workload while still doing enough work in chunks that we get decent cache and thread quantum utilization. It's possible we could do better as the policy here hasn't been profiled much. Thus far we haven't profiled any performance issues that suggested we should be handling this differently.
\ No newline at end of file
+2. Right now background compilation is limited to a single thread taken from the threadpool and used for up to 10ms. If we need more time than that we return the thread and request another. The goal is to be a good citizen in the threadpool's overall workload while still doing enough work in chunks that we get decent cache and thread quantum utilization. It's possible we could do better as the policy here hasn't been profiled much. Thus far we haven't profiled any performance issues that suggested we should be handling this differently.
diff --git a/docs/design/features/unloadability.md b/docs/design/features/unloadability.md
index 4b61b0f8b3ce..0d1cddd0f096 100644
--- a/docs/design/features/unloadability.md
+++ b/docs/design/features/unloadability.md
@@ -1,4 +1,4 @@
-# `AssemblyLoadContext` unloadability
+# `AssemblyLoadContext` unloadability
## Goals
* Provide a building block for unloadable plug-ins
* Users can load an assembly and its dependencies into an unloadable `AssemblyLoadContext`.
@@ -100,7 +100,7 @@ Unloading is initialized by the user code calling `AssemblyLoadContext.Unload` m
* The `AssemblyLoadContext` fires the `Unloading` event to allow the user code to perform cleanup if required (e.g. stop threads running inside of the context, remove references and destroy handles, etc.)
* The `AssemblyLoadContext.InitiateUnload` method is called. It creates a strong GC handle referring to the `AssemblyLoadContext` to keep it around until the unload is complete. For example, finalizers of types that are loaded into the `AssemblyLoadContext` may need access to the `AssemblyLoadContext`.
* Then it calls `AssemblyNative::PrepareForAssemblyLoadContextRelease` method with that strong handle as an argument, which in turn calls `CLRPrivBinderAssemblyLoadContext::PrepareForLoadContextRelease`
-* That method stores the passed in strong GC handle in `CLRPrivBinderAssemblyLoadContext::m_ptrManagedStrongAssemblyLoadContext`.
+* That method stores the passed in strong GC handle in `CLRPrivBinderAssemblyLoadContext::m_ptrManagedStrongAssemblyLoadContext`.
* Then it decrements refcount of the `AssemblyLoaderAllocator` the `CLRPrivBinderAssemblyLoadContext` points to.
* Finally, it destroys the strong handle to the managed `LoaderAllocator`. That allows the `LoaderAllocator` to be collected.
### Second phase of unloading
diff --git a/docs/design/specs/Ecma-335-Augments.md b/docs/design/specs/Ecma-335-Augments.md
index 1d42a5e4c909..df4e429912a1 100644
--- a/docs/design/specs/Ecma-335-Augments.md
+++ b/docs/design/specs/Ecma-335-Augments.md
@@ -147,7 +147,7 @@ error with a suitable message rather than a stack overflow.
Related issues:
* https://github.com/dotnet/roslyn/issues/7971
-* https://github.com/dotnet/coreclr/issues/2674
+* https://github.com/dotnet/runtime/issues/4945
#### Proposed specification change
@@ -195,13 +195,13 @@ c) In section II.23.2.6 LocalVarSig, replace the diagram with production rules:
```ebnf
LocalVarSig ::=
LOCAL_SIG Count LocalVarType+
-
+
LocalVarType ::=
Type
CustomMod* Constraint BYREF? Type
CustomMod* BYREF Type
CustomMod* TYPEDBYREF
-
+
```
d) In section II.23.2.10 Param, replace the diagram with production rules:
@@ -227,7 +227,7 @@ f) In section II.23.2.12 Type, add a production rule to the definition of `Type`
```ebnf
Type ::= CustomMod* Type
-
+
```
g) In sections II.23.2.12 Type and II.23.2.14 TypeSpec replace production rule
diff --git a/docs/design/specs/PE-COFF.md b/docs/design/specs/PE-COFF.md
index 69074307155d..dff7248a326c 100644
--- a/docs/design/specs/PE-COFF.md
+++ b/docs/design/specs/PE-COFF.md
@@ -19,11 +19,11 @@ PE/COFF Specification defines the structure of Debug Directory in section 5.1.1.
| Offset | Size | Field | Description |
|:-------|:-----|:---------------|----------------------------------------------------------------|
| 0 | 4 | Signature | 0x52 0x53 0x44 0x53 (ASCII string: "RSDS") |
-| 4 | 16 | Guid | GUID (Globally Unique Identifier) of the associated PDB.
+| 4 | 16 | Guid | GUID (Globally Unique Identifier) of the associated PDB.
| 20 | 4 | Age | Iteration of the PDB. The first iteration is 1. The iteration is incremented each time the PDB content is augmented.
| 24 | | Path | UTF-8 NUL-terminated path to the associated .pdb file |
-Guid and Age are used to match PE/COFF image with the associated PDB.
+Guid and Age are used to match PE/COFF image with the associated PDB.
The associated .pdb file may not exist at the path indicated by Path field. If it doesn't the Path, Guid and Age can be used to find the corresponding PDB file locally or on a symbol server. The exact search algorithm used by tools to locate the PDB depends on the tool and its configuration.
@@ -37,11 +37,11 @@ If the containing PE/COFF file is deterministic the Guid field above and DateTim
The entry doesn't have any data associated with it. All fields of the entry, but Type shall be zero.
-Presence of this entry indicates that the containing PE/COFF file is deterministic.
+Presence of this entry indicates that the containing PE/COFF file is deterministic.
### Embedded Portable PDB Debug Directory Entry (type 17)
-Declares that debugging information is embedded in the PE file at location specified by PointerToRawData.
+Declares that debugging information is embedded in the PE file at location specified by PointerToRawData.
*Version Major=any, Minor=0x0100* of the data format:
@@ -49,7 +49,7 @@ Declares that debugging information is embedded in the PE file at location speci
|:-------|:---------------|:-----------------|-------------------------------------------------------|
| 0 | 4 | Signature | 0x4D 0x50 0x44 0x42 |
| 4 | 4 | UncompressedSize | The size of decompressed Portable PDB image |
-| 8 | SizeOfData - 8 | PortablePdbImage | Portable PDB image compressed using Deflate algorithm |
+| 8 | SizeOfData - 8 | PortablePdbImage | Portable PDB image compressed using Deflate algorithm |
If both CodeView and Embedded Portable PDB entries are present then they shall represent the same data.
@@ -70,9 +70,9 @@ The value of Stamp field in the entry shall be 0.
Stores crypto hash of the content of the symbol file the PE/COFF file was built with.
-The hash can be used to validate that a given PDB file was built with the PE/COFF file and not altered in any way.
+The hash can be used to validate that a given PDB file was built with the PE/COFF file and not altered in any way.
-More than one entry can be present, in case multiple PDBs were produced during the build of the PE/COFF file (e.g. private and public symbols).
+More than one entry can be present, in case multiple PDBs were produced during the build of the PE/COFF file (e.g. private and public symbols).
*Version Major=0x0001, Minor=0x0000* of the entry data format is following:
@@ -103,7 +103,7 @@ When validating that Portable PDB matches the debug directory record check that
If the symbol format is Windows PDB the checksum is calculated by hashing the entire content of the PDB file with the PDB signature comprising of 16B GUID and 4B timestamp zeroed.
-When validating that Windows PDB matches the debug directory record check that the checksums match and that the PDB signature (both GUID and timestamp values) match the data in the corresponding [CodeView record](#WindowsCodeViewEntry).
+When validating that Windows PDB matches the debug directory record check that the checksums match and that the PDB signature (both GUID and timestamp values) match the data in the corresponding [CodeView record](#WindowsCodeViewEntry).
> Note that when the debugger (or other tool) searches for the PDB only GUID and Age fields are used to match the PDB, but the timestamp of the CodeView debug directory entry does not need to match the timestamp stored in the PDB. Therefore, to verify byte-for-byte identity of the PDB, the timestamp field should also be checked.
diff --git a/docs/design/specs/PortablePdb-Metadata.md b/docs/design/specs/PortablePdb-Metadata.md
index d3d9b1277abd..d642bc0a6523 100644
--- a/docs/design/specs/PortablePdb-Metadata.md
+++ b/docs/design/specs/PortablePdb-Metadata.md
@@ -34,7 +34,7 @@ When debugging metadata is generated to a separate data blob "#Pdb" and "#~" str
#### #Pdb stream
The #Pdb stream has the following structure:
-
+
| Offset | Size | Field | Description |
|:-------|:-----|:---------------|----------------------------------------------------------------|
| 0 | 20 | PDB id | A byte sequence uniquely representing the debugging metadata blob content. |
@@ -42,10 +42,10 @@ The #Pdb stream has the following structure:
| 24 | 8 | ReferencedTypeSystemTables | Bit vector of referenced type system metadata tables, let n be the number of bits that are 1. |
| 32 | 4*n | TypeSystemTableRows | Array of n 4-byte unsigned integers indicating the number of rows for each referenced type system metadata table. |
-#### #~ stream
+#### #~ stream
"#~" stream shall only contain debugging information tables defined above.
-
+
References to heaps (strings, blobs, guids) are references to heaps of the debugging metadata. The sizes of references to type system tables are determined using the algorithm described in ECMA-335-II Chapter 24.2.6, except their respective row counts are found in _TypeSystemTableRows_ field of the #Pdb stream.
### Document Table: 0x30
@@ -58,7 +58,7 @@ The Document table has the following columns:
The table is not required to be sorted.
-There shall be no duplicate rows in the _Document_ table, based upon document name.
+There shall be no duplicate rows in the _Document_ table, based upon document name.
_Name_ shall not be nil. It can however encode an empty name string.
@@ -170,7 +170,7 @@ _InitialDocument_ is only present if the _Document_ field of the _MethodDebugInf
| _δILOffset_ | 0 | unsigned compressed |
| _Document_ | Document row id | unsigned compressed |
-Each _SequencePointRecord_ represents a single sequence point. The sequence point inherits the value of _Document_ property from the previous record (_SequencePointRecord_ or _document-record_), from the _Document_ field of the _MethodDebugInformation_ table if it's the first sequence point of a method body that spans a single document, or from _InitialDocument_ if it's the first sequence point of a method body that spans multiple documents. The value of _IL Offset_ is calculated using the value of the previous sequence point (if any) and the value stored in the record.
+Each _SequencePointRecord_ represents a single sequence point. The sequence point inherits the value of _Document_ property from the previous record (_SequencePointRecord_ or _document-record_), from the _Document_ field of the _MethodDebugInformation_ table if it's the first sequence point of a method body that spans a single document, or from _InitialDocument_ if it's the first sequence point of a method body that spans multiple documents. The value of _IL Offset_ is calculated using the value of the previous sequence point (if any) and the value stored in the record.
The values of _Start Line_, _Start Column_, _End Line_ and _End Column_ of a non-hidden sequence point are calculated based upon the values of the previous non-hidden sequence point (if any) and the data stored in the record.
@@ -253,14 +253,14 @@ There shall be no duplicate rows in the LocalConstant table, based upon owner an
The structure of the blob is
Blob ::= CustomMod* (PrimitiveConstant | EnumConstant | GeneralConstant)
-
- PrimitiveConstant ::= PrimitiveTypeCode PrimitiveValue
+
+ PrimitiveConstant ::= PrimitiveTypeCode PrimitiveValue
PrimitiveTypeCode ::= BOOLEAN | CHAR | I1 | U1 | I2 | U2 | I4 | U4 | I8 | U8 | R4 | R8 | STRING
-
- EnumConstant ::= EnumTypeCode EnumValue EnumType
+
+ EnumConstant ::= EnumTypeCode EnumValue EnumType
EnumTypeCode ::= BOOLEAN | CHAR | I1 | U1 | I2 | U2 | I4 | U4 | I8 | U8
EnumType ::= TypeDefOrRefOrSpecEncoded
-
+
GeneralConstant ::= (CLASS | VALUETYPE) TypeDefOrRefOrSpecEncoded GeneralValue? |
OBJECT
@@ -289,18 +289,18 @@ The encoding of the _PrimitiveValue_ and _EnumValue_ is determined based upon th
| ```U8``` | uint64 |
| ```R4``` | float32 |
| ```R8``` | float64 |
-| ```STRING``` | A single byte 0xff (represents a null string reference), or a UTF-16 little-endian encoded string (possibly empty). |
+| ```STRING``` | A single byte 0xff (represents a null string reference), or a UTF-16 little-endian encoded string (possibly empty). |
The numeric values of the type codes are defined by ECMA-335 §II.23.1.16.
_EnumType_ must be an enum type as defined in ECMA-335 §II.14.3. The value of _EnumTypeCode_ must match the underlying type of the _EnumType_.
-The encoding of the _GeneralValue_ is determined based upon the type expressed by _TypeDefOrRefOrSpecEncoded_ specified in _GeneralConstant_. _GeneralValue_ for special types listed in the table below has to be present and is encoded as specified. If the _GeneralValue_ is not present the value of the constant is the default value of the type. If the type is a reference type the value is a null reference, if the type is a pointer type the value is a null pointer, etc.
+The encoding of the _GeneralValue_ is determined based upon the type expressed by _TypeDefOrRefOrSpecEncoded_ specified in _GeneralConstant_. _GeneralValue_ for special types listed in the table below has to be present and is encoded as specified. If the _GeneralValue_ is not present the value of the constant is the default value of the type. If the type is a reference type the value is a null reference, if the type is a pointer type the value is a null pointer, etc.
| Namespace | Name | _GeneralValue_ encoding |
|:--------------|:---------|:-------------------------|
| System | Decimal | sign (highest bit), scale (bits 0..7), low (uint32), mid (uint32), high (uint32) |
-| System | DateTime | int64: ticks |
+| System | DateTime | int64: ticks |
### ImportScope Table: 0x35
The ImportScope table has the following columns:
diff --git a/docs/infra/buildtriage.md b/docs/infra/buildtriage.md
new file mode 100644
index 000000000000..ed0589f986e7
--- /dev/null
+++ b/docs/infra/buildtriage.md
@@ -0,0 +1,45 @@
+## Build Triage Rotation
+
+The responsibility of this role is triaging our rolling / official builds, filing issues to track broken tests, submitting changes to dotnet/runtime to work around issues (disabling a test, undoing a PR that broke the build).
+
+In some cases this will require working with core-eng team when the issues are in Helix / Azure / Arcade. This person will also attend CI Council with the infra manager to provide updates on our reliability status.
+
+This directly impacts developer productivity and the need to promptly fix such breaks can span across time zones. Hence it will be the collective responsibility of the Scout pool to investigate such breaks.
+
+This role will work on a rotation basis. There are six people in the role and each rotation will last for a calendar month.
+
+## Tracking Build Failures
+All the CI failures can be tracked through the CI Council dashboards i.e. [Public](https://dev.azure.com/dnceng/public/_dashboards/dashboard/40ac4990-3498-4b3a-85dd-2ffde961d672), [Internal](https://dev.azure.com/dnceng/internal/_dashboards/dashboard/e1bb572d-a2b0-488f-a58a-54c73a547f0d).
+We have different dashboards for public(Rolling & PR Builds) and internal builds.
+
+Tests are not run during the internal builds. Publishing and signing steps are run only during internal builds. Rolling builds run tests for the full matrix.
+
+For new issues, try to provide a runfo search which will make it easy to isolate repeated instances of that failure.
+
+Contact @chcosta if you are having any trouble accessing the dashboards.
+Contact @Chrisboh if you don't have the calendar invite for the CI Council meeting.
+Contact @jaredpar if you are having any trouble with runfo, site or utility.
+
+## Ongoing Issues
+
+All the issues causing the builds to fail should be marked with [`blocking-clean-ci`](https://github.com/dotnet/runtime/issues?q=is%3Aissue+is%3Aopen+label%3Ablocking-clean-ci) label.
+Any issues causing build breaks in the official build should be marked with [`blocking-clean-official`](https://github.com/dotnet/runtime/issues?q=is%3Aissue+is%3Aopen+label%3Ablocking-clean-official).
+It helps in tracking issues effectively.
+
+The main meta-bug linking to currently tracked issues is [here](https://github.com/dotnet/runtime/issues/702).
+
+## Some helpful resources
+- [runfo Website](https://runfo.azurewebsites.net/)
+- [runfo command-line util](https://github.com/jaredpar/devops-util)
+- [runfo Documentation](https://github.com/jaredpar/devops-util/tree/master/runfo)
+- [Internal Build Definition](https://dev.azure.com/dnceng/internal/_build?definitionId=679)
+- [Public Build Definition](https://dev.azure.com/dnceng/public/_build?definitionId=686)
+
+## Build Rotation for upcoming months
+
+| Month | Alias |
+|-------|-----------|
+| September | @directhex |
+| October | @jkoritzinsky |
+| November | @aik-jahoda |
+| December | @akoeplinger |
diff --git a/docs/issues-pr-management.md b/docs/issues-pr-management.md
index 05090b2332e5..503de72b452d 100644
--- a/docs/issues-pr-management.md
+++ b/docs/issues-pr-management.md
@@ -12,7 +12,7 @@ dotnet/runtime issues and pull requests are a shared resource. As such, it will
Here are a few of the most salient components of working well together, and the FAQ has much more detail.
## Scenarios where we all have to work together:
-- All incoming issues and pull requests will be automatically labeled with an `area-*` label. The bot will also assign the `untriaged` label to only issues, once they get created.
+- All incoming issues and pull requests will be automatically labeled with an `area-*` label. The bot will also assign the `untriaged` label to only issues, once they get created.
- All issues and pull requests should have exactly 1 `area-*` label.
- Issues are considered triaged when the `untriaged` label has been removed.
- When issues have `area-*` labels switched, the `untriaged` label must be added. This prevents issues being lost in a `triaged` state when they have not actually been triaged by the area owner. In the future, a bot may automatically ensure this happens.
diff --git a/docs/pr-guide.md b/docs/pr-guide.md
index 9074d699186f..7e1454b0bf9c 100644
--- a/docs/pr-guide.md
+++ b/docs/pr-guide.md
@@ -27,7 +27,7 @@ Anyone with write access can merge a pull request manually or by setting the [au
* The PR successfully builds and passes all tests in the Continuous Integration (CI) system.
* Depending on your change, you may need to re-run validation. See [rerunning validation](#rerunning-validation) below.
-Please always **squash** the pull request unless there are special circumstances. Do so, even if the PR contains only one commit. It creates a simpler history than a Merge Commit. "Special circumstances" are rare, and typically mean that there are a series of cleanly separated changes that will be too hard to understand if squashed together, or for some reason we want to preserve the ability to bisect them.
+Typically, PRs are merged as one commit. It creates a simpler history than a Merge Commit. "Special circumstances" are rare, and typically mean that there are a series of cleanly separated changes that will be too hard to understand if squashed together, or for some reason we want to preserve the ability to bisect them.
## Rerunning Validation
diff --git a/docs/project/dogfooding.md b/docs/project/dogfooding.md
index 6b564f7ec239..b6de50d2d3f6 100644
--- a/docs/project/dogfooding.md
+++ b/docs/project/dogfooding.md
@@ -1,10 +1,6 @@
-# How to get up and running on .NET Core
+# Dogfooding nightly builds of .NET
-This document provides the steps necessary to consume a nightly build of
-.NET runtime and SDK.
-
-Please note that these steps are likely to change as we're simplifying
-this experience. Make sure to consult this document often.
+This document provides the steps necessary to consume a nightly build of .NET runtime and SDK.
## Obtaining nightly builds of NuGet packages
@@ -17,51 +13,51 @@ dotnet new nugetconfig
Next, add the package source to NuGet.Config with the [dotnet nuget add source](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-add-source) command:
```
-dotnet nuget add source -n dotnet5 https://dnceng.pkgs.visualstudio.com/public/_packaging/dotnet5/nuget/v3/index.json
+dotnet nuget add source -n dotnet6 https://dnceng.pkgs.visualstudio.com/public/_packaging/dotnet6/nuget/v3/index.json
```
Then, you will be able to add the latest prerelease version of the desired package to your project.
-**Example:** To add version 5.0.0-preview.1.20120.5 of the System.Data.OleDb package, use the [dotnet add package](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-add-package) command:
+**Example:** To add version 6.0.0-alpha.1.20468.7 of the System.Data.OleDb package, use the [dotnet add package](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-add-package) command:
```
-dotnet add package System.Data.OleDb -v 5.0.0-preview.1.20120.5
+dotnet add package System.Data.OleDb -v 6.0.0-alpha.1.20468.7
```
To use nightly builds of the entire runtime, follow the steps given in the rest of this document instead.
## Install prerequisites
-1. Acquire the latest nightly .NET SDK by downloading the zip or tarball listed in https://github.com/dotnet/core-sdk#installers-and-binaries (for example, https://dotnetcli.blob.core.windows.net/dotnet/Sdk/master/dotnet-sdk-latest-win-x64.zip ) into a new folder, for instance `C:\dotnet`.
+1. Acquire the latest nightly .NET SDK by downloading and extracting a zip/tarball or using an installer from the [installers and binaries table in dotnet/installer](https://github.com/dotnet/installer#installers-and-binaries) (for example, https://aka.ms/dotnet/net6/dev/Sdk/dotnet-sdk-win-x64.zip).
-2. By default, the dotnet CLI will use the globally installed SDK if it matches the major/minor version you request and has a higher revision. To force it to use the locally installed SDK, you must set an environment variable `DOTNET_MULTILEVEL_LOOKUP=0` in your shell. You can use `dotnet --info` to verify what version of the Shared Framework it is using.
+2. By default, the dotnet CLI will use the globally installed SDK if it matches the major/minor version you request and has a higher revision. To force it to use a locally installed SDK, you must set an environment variable `DOTNET_MULTILEVEL_LOOKUP=0` in your shell. You can use `dotnet --info` to verify what version of the Shared Framework it is using.
-3. Reminder: if you are using a local copy of the dotnet CLI, take care that when you type `dotnet` you do not inadvertently pick up a different copy that you may have in your path. On Windows, for example, if you use a Command Prompt, a global copy may be in the path, so use the fully qualified path to your local `dotnet` (e.g. `C:\dotnet\dotnet.exe`). If you receive an error "error NETSDK1045: The current .NET SDK does not support targeting .NET Core 5.0." then you may be executing an older `dotnet`.
+3. Reminder: if you are using a local copy of the dotnet CLI, take care that when you type `dotnet` you do not inadvertently pick up a different copy that you may have in your path. On Windows, for example, if you use a Command Prompt, a global copy may be in the path, so use the fully qualified path to your local `dotnet` (e.g. `C:\dotnet\dotnet.exe`). If you receive an error "error NETSDK1045: The current .NET SDK does not support targeting .NET 6.0." then you may be executing an older `dotnet`.
After setting up dotnet you can verify you are using the dogfooding version by executing `dotnet --info`. Here is an example output at the time of writing:
```
>dotnet --info
-.NET Core SDK (reflecting any global.json):
- Version: 5.0.100-preview.1.20167.6
- Commit: 00255dd10b
+.NET SDK (reflecting any global.json):
+ Version: 6.0.100-alpha.1.20514.11
+ Commit: 69ee2fdd13
Runtime Environment:
OS Name: Windows
- OS Version: 10.0.18363
+ OS Version: 10.0.19042
OS Platform: Windows
RID: win10-x64
- Base Path: c:\dotnet\sdk\5.0.100-preview.1.20167.6\
+ Base Path: c:\dotnet\sdk\6.0.100-alpha.1.20514.11\
Host (useful for support):
- Version: 5.0.0-preview.1.20120.5
- Commit: 3c523a6a7a
+ Version: 6.0.0-alpha.1.20468.7
+ Commit: a820ca1c4f
.NET Core SDKs installed:
- 5.0.100-preview.1.20167.6 [c:\dotnet\sdk]
+ 6.0.100-alpha.1.20514.11 [c:\dotnet\sdk]
.NET Core runtimes installed:
- Microsoft.AspNetCore.App 5.0.0-preview.1.20124.5 [c:\dotnet\shared\Microsoft.AspNetCore.App]
- Microsoft.NETCore.App 5.0.0-preview.1.20120.5 [c:\dotnet\shared\Microsoft.NETCore.App]
- Microsoft.WindowsDesktop.App 5.0.0-preview.1.20127.5 [c:\dotnet\shared\Microsoft.WindowsDesktop.App]
+ Microsoft.AspNetCore.App 5.0.0-rc.2.20466.8 [c:\dotnet\shared\Microsoft.AspNetCore.App]
+ Microsoft.NETCore.App 6.0.0-alpha.1.20468.7 [c:\dotnet\shared\Microsoft.NETCore.App]
+ Microsoft.WindowsDesktop.App 5.0.0-rc.1.20417.4 [c:\dotnet\shared\Microsoft.WindowsDesktop.App]
To install additional .NET Core runtimes or SDKs:
https://aka.ms/dotnet-download
@@ -70,10 +66,10 @@ To install additional .NET Core runtimes or SDKs:
4. Our nightly builds are uploaded to dotnet-blob feeds, not NuGet - so ensure the .NET Core blob feed is in your nuget configuration in case you need other packages from .NET Core that aren't included in the download. For example, on Windows you could edit `%userprofile%\appdata\roaming\nuget\nuget.config` or on Linux edit `~/.nuget/NuGet/NuGet.Config` to add these lines:
```xml
-
+
...
-
+
```
(Documentation for configuring feeds is [here](https://docs.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior).)
@@ -110,17 +106,16 @@ this, there are two options you can take.
This is the default case for applications - running against an installed .NET runtime.
1. You still need to install the prerequisite .NET SDK from above.
-2. Optionally, install the specific .NET runtime you require:
- - https://github.com/dotnet/core-sdk#installers-and-binaries
+2. Optionally, install the specific .NET runtime you require globally or download get the latest one available from the [nightly build table](#nightly-builds-table)
3. Modify your .csproj to reference the nightly build of Microsoft.NETCore.App
```XML
Exe
-
- net5.0
+
+ net6.0
- 5.0.0-preview.1.20120.5
+ 6.0.0-alpha.1.20468.7
```
@@ -140,11 +135,11 @@ make it self-contained by adding a RuntimeIdentifier (RID).
```XML
Exe
-
- net5.0
+
+ net6.0
-
- 5.0.0-preview.1.20120.5
+
+ 6.0.0-alpha.1.20468.7win-x64
```
@@ -152,95 +147,219 @@ make it self-contained by adding a RuntimeIdentifier (RID).
```
$ dotnet restore
$ dotnet publish
-$ bin\Debug\net5.0\win-x64\publish\App.exe
-```
-
-## More Advanced Scenario - Using your local CoreFx build
-
-If you built corefx locally with `build -allconfigurations` after building binaries it will build NuGet packages containing them. You can use those in your projects.
-
-To use your local built corefx packages you will need to be a self-contained application and so you will
-need to follow the "Self-contained" steps from above. Once you can successfully restore, build, publish,
-and run a self-contained application you need the following steps to consume your local built package.
-
-#### 1 - Get the Version number of the CoreFx package you built.
-
-Look for a package named `Microsoft.Private.CoreFx.NETCoreApp..nupkg` under `corefx\artifacts\packages\Debug` (or Release if you built a release version of corefx).
-
-Once you find the version number (for this example assume it is `4.6.0-dev.18626.1`) you need to add the following line to your project file:
-
+$ bin\Debug\net6.0\win-x64\publish\App.exe
```
-
-
-
-```
-
-Because assets in `Microsoft.Private.CoreFx.NETCoreApp` conflict with the normal `Microsoft.NETCore.App` package,
-you need to tell the tooling to use the assets from your local package. To do this, add the following property to your project file:
-
-```xml
-
- Microsoft.Private.CoreFx.NETCoreApp;runtime.win-x64.Microsoft.Private.CoreFx.NETCoreApp;$(PackageConflictPreferredPackages)
-
-```
-
-Replacing the RID (`win-x64` in this case) in `runtime.win-x64.Microsoft.Private.CoreFx.NETCoreApp` with the RID of your current build.
-
-Note these instructions above were only about updates to the binaries that are part of Microsoft.NETCore.App, if you want to test a package for library that ships in its own nuget package you can follow the same steps above but instead add a package reference to that package instead of "Microsoft.Private.CoreFx.NETCoreApp".
-#### 2 - Add your bin directory to the Nuget feed list
-
-By default the dogfooding dotnet SDK will create a Nuget.Config file next to your project, if it doesn't
-you can create one. Your config file will need a source for your local corefx package directory as well
-as a reference to our nightly dotnet-core blob feed. The Nuget.Config file content should be:
-
-```xml
-
-
-
-
-
-
-```
-Be sure to correct the path to your build output above.
-
-You also have the alternative of modifying the Nuget.Config
-at `%HOMEPATH%\AppData\Roaming\Nuget\Nuget.Config` (Windows) or `~/.nuget/NuGet/NuGet.Config` (Linux) with the new location.
-This will allow your new runtime to be used on any 'dotnet restore' run by the current user.
-Alternatively you can skip creating this file and pass the path to your package directory using
-the -s SOURCE qualifier on the dotnet restore command below. The important part is that somehow
-you have told the tools where to find your new package.
-
-Once have made these modifications you will need to rerun the restore and publish as such.
-
-```
-dotnet restore
-dotnet publish
-```
-Now your publication directory should contain your local built CoreFx binaries.
-
-#### 3 - Consuming subsequent code changes by overwriting the binary (Alternative 1)
-
-To apply changes you subsequently make in your source tree, it's usually easiest to just overwrite the binary in the publish folder. Build the assembly containing your change as normal, then overwrite the assembly in your publish folder and running the app will pick up that binary. This relies on the fact that all the other binaries still match what is in your bin folder so everything works together.
-
-#### 3 - Consuming subsequent code changes by rebuilding the package (Alternative 2)
-
-This is more cumbersome than just overwriting the binaries, but is more correct.
-
-First note that Nuget assumes that distinct builds have distinct version numbers.
-Thus if you modify the source and create a new NuGet package you must give it a new version number and use that in your
-application's project. Otherwise the dotnet.exe tool will assume that the existing version is fine and you
-won't get the updated bits. This is what the Minor Build number is all about. By default it is 0, but you can
-give it a value by setting the BuildNumberMinor environment variable.
-```bat
- set BuildNumberMinor=3
-```
-before packaging. You should see this number show up in the version number (e.g. 4.6.0-dev.18626.1).
-
-Alternatively just delete the existing copy of the package from the Nuget cache. For example on
-windows (on Linux substitute ~/ for %HOMEPATH%) you could delete
-```bat
- %HOMEPATH%\.nuget\packages\Microsoft.Private.CoreFx.NETCoreApp\4.6.0-dev.18626.1
- %HOMEPATH%\.nuget\packages\runtime.win-x64.microsoft.private.corefx.netcoreapp\4.6.0-dev.18626.1
-```
-which should make `dotnet restore` now pick up the new copy.
+### Nightly builds table
+
+
+
+
+| Platform | Master |
+| --- | :---: |
+| **Windows (x64)** | [![][win-x64-badge-6.0.X]][win-x64-version-6.0.X] [Installer][win-x64-installer-6.0.X] ([Checksum][win-x64-installer-checksum-6.0.X]) [zip][win-x64-zip-6.0.X] ([Checksum][win-x64-zip-checksum-6.0.X]) [NetHost (zip)][win-x64-nethost-zip-6.0.X] [Symbols (zip)][win-x64-symbols-zip-6.0.X] |
+| **Windows (x86)** | [![][win-x86-badge-6.0.X]][win-x86-version-6.0.X] [Installer][win-x86-installer-6.0.X] ([Checksum][win-x86-installer-checksum-6.0.X]) [zip][win-x86-zip-6.0.X] ([Checksum][win-x86-zip-checksum-6.0.X]) [NetHost (zip)][win-x86-nethost-zip-6.0.X] [Symbols (zip)][win-x86-symbols-zip-6.0.X] |
+| **Windows (arm64)** | [![][win-arm64-badge-6.0.X]][win-arm64-version-6.0.X] [Installer][win-arm64-installer-6.0.X] ([Checksum][win-arm64-installer-checksum-6.0.X]) [zip][win-arm64-zip-6.0.X] ([Checksum][win-arm64-zip-checksum-6.0.X]) [NetHost (zip)][win-arm64-nethost-zip-6.0.X] [Symbols (zip)][win-arm64-symbols-zip-6.0.X] |
+| **macOS (x64)** | [![][osx-x64-badge-6.0.X]][osx-x64-version-6.0.X] [Installer][osx-x64-installer-6.0.X] ([Checksum][osx-x64-installer-checksum-6.0.X]) [tar.gz][osx-x64-targz-6.0.X] ([Checksum][osx-x64-targz-checksum-6.0.X]) [NetHost (tar.gz)][osx-x64-nethost-targz-6.0.X] [Symbols (tar.gz)][osx-x64-symbols-targz-6.0.X] |
+| **macOS (arm64)** | [![][osx-arm64-badge-6.0.X]][osx-arm64-version-6.0.X] [Installer][osx-arm64-installer-6.0.X] ([Checksum][osx-arm64-installer-checksum-6.0.X]) [tar.gz][osx-arm64-targz-6.0.X] ([Checksum][osx-arm64-targz-checksum-6.0.X]) [NetHost (tar.gz)][osx-arm64-nethost-targz-6.0.X] [Symbols (tar.gz)][osx-arm64-symbols-targz-6.0.X] |
+| **Linux (x64)** (for glibc based OS) | [![][linux-x64-badge-6.0.X]][linux-x64-version-6.0.X] [tar.gz][linux-x64-targz-6.0.X] ([Checksum][linux-x64-targz-checksum-6.0.X]) [NetHost (tar.gz)][linux-x64-nethost-targz-6.0.X] [Symbols (tar.gz)][linux-x64-symbols-targz-6.0.X] |
+| **Linux (armhf)** (for glibc based OS) | [![][linux-arm-badge-6.0.X]][linux-arm-version-6.0.X] [tar.gz][linux-arm-targz-6.0.X] ([Checksum][linux-arm-targz-checksum-6.0.X]) [NetHost (tar.gz)][linux-arm-nethost-targz-6.0.X] [Symbols (tar.gz)][linux-arm-symbols-targz-6.0.X] |
+| **Linux (arm64)** (for glibc based OS) | [![][linux-arm64-badge-6.0.X]][linux-arm64-version-6.0.X] [tar.gz][linux-arm64-targz-6.0.X] ([Checksum][linux-arm64-targz-checksum-6.0.X]) [NetHost (tar.gz)][linux-arm64-nethost-targz-6.0.X] [Symbols (tar.gz)][linux-arm64-symbols-targz-6.0.X] |
+| **Linux-musl (x64)** | [![][linux-musl-x64-badge-6.0.X]][linux-musl-x64-version-6.0.X] [tar.gz][linux-musl-x64-targz-6.0.X] ([Checksum][linux-musl-x64-targz-checksum-6.0.X]) [NetHost (tar.gz)][linux-musl-x64-nethost-targz-6.0.X] [Symbols (tar.gz)][linux-musl-x64-symbols-targz-6.0.X] |
+| **Linux-musl (arm)** | [![][linux-musl-arm-badge-6.0.X]][linux-musl-arm-version-6.0.X] [tar.gz][linux-musl-arm-targz-6.0.X] ([Checksum][linux-musl-arm-targz-checksum-6.0.X]) [NetHost (tar.gz)][linux-musl-arm-nethost-targz-6.0.X] [Symbols (tar.gz)][linux-musl-arm-symbols-targz-6.0.X] |
+| **Linux-musl (arm64)** | [![][linux-musl-arm64-badge-6.0.X]][linux-musl-arm64-version-6.0.X] [tar.gz][linux-musl-arm64-targz-6.0.X] ([Checksum][linux-musl-arm64-targz-checksum-6.0.X]) [NetHost (tar.gz)][linux-musl-arm64-nethost-targz-6.0.X] [Symbols (tar.gz)][linux-musl-arm64-symbols-targz-6.0.X] |
+| **Dpkg Based Systems (x64)** | [![][deb-badge-6.0.X]][deb-version-6.0.X] [Runtime-Deps][deb-runtime-deps-6.0.X] ([Checksum][deb-runtime-deps-checksum-6.0.X]) [Host][deb-host-6.0.X] ([Checksum][deb-host-checksum-6.0.X]) [App Hosts][deb-apphost-pack-6.0.X] ([Checksum][deb-apphost-pack-checksum-6.0.X]) [Host FX Resolver][deb-hostfxr-6.0.X] ([Checksum][deb-hostfxr-checksum-6.0.X]) [Targeting Pack][deb-targeting-pack-6.0.X] ([Checksum][deb-targeting-pack-checksum-6.0.X]) [Shared Framework][deb-sharedfx-6.0.X] ([Checksum][deb-sharedfx-checksum-6.0.X]) |
+| **CentOS 7 (x64)** | [![][centos-7-badge-6.0.X]][centos-7-version-6.0.X] [Runtime-Deps][centos-7-runtime-deps-6.0.X] ([Checksum][centos-7-runtime-deps-checksum-6.0.X]) [Host][centos-7-host-6.0.X] ([Checksum][centos-7-host-checksum-6.0.X]) [App Hosts][centos-7-apphost-pack-6.0.X] ([Checksum][centos-7-apphost-pack-checksum-6.0.X]) [Host FX Resolver][centos-7-hostfxr-6.0.X] ([Checksum][centos-7-hostfxr-checksum-6.0.X]) [Targeting Pack][centos-7-targeting-pack-6.0.X] ([Checksum][centos-7-targeting-pack-checksum-6.0.X]) [Shared Framework][centos-7-sharedfx-6.0.X] ([Checksum][centos-7-sharedfx-checksum-6.0.X]) |
+| **RHEL 7.2 (x64)** | [![][rhel7-badge-6.0.X]][rhel7-version-6.0.X] [Host][rhel7-host-6.0.X] ([Checksum][rhel7-host-checksum-6.0.X]) [App Hosts][rhel7-apphost-pack-6.0.X] ([Checksum][rhel7-apphost-pack-checksum-6.0.X]) [Host FX Resolver][rhel7-hostfxr-6.0.X] ([Checksum][rhel7-hostfxr-checksum-6.0.X]) [Targeting Pack][rhel7-targeting-pack-6.0.X] ([Checksum][rhel7-targeting-pack-checksum-6.0.X]) [Shared Framework][rhel7-sharedfx-6.0.X] ([Checksum][rhel7-sharedfx-checksum-6.0.X]) |
+| **Fedora 27 (x64)** | [![][fedora-27-badge-6.0.X]][fedora-27-version-6.0.X] [Runtime-Deps][fedora-27-runtime-deps-6.0.X] ([Checksum][fedora-27-runtime-deps-checksum-6.0.X]) [Host][fedora-27-host-6.0.X] ([Checksum][fedora-27-host-checksum-6.0.X]) [App Hosts][fedora-27-apphost-pack-6.0.X] ([Checksum][fedora-27-apphost-pack-checksum-6.0.X]) [Host FX Resolver][fedora-27-hostfxr-6.0.X] ([Checksum][fedora-27-hostfxr-checksum-6.0.X]) [Targeting Pack][fedora-27-targeting-pack-6.0.X] ([Checksum][fedora-27-targeting-pack-checksum-6.0.X]) [Shared Framework][fedora-27-sharedfx-6.0.X] ([Checksum][fedora-27-sharedfx-checksum-6.0.X]) |
+| **SLES 12 (x64)** | [![][sles-12-badge-6.0.X]][sles-12-version-6.0.X] [Runtime-Deps][sles-12-runtime-deps-6.0.X] ([Checksum][sles-12-runtime-deps-checksum-6.0.X]) [Host][sles-12-host-6.0.X] ([Checksum][sles-12-host-checksum-6.0.X]) [App Hosts][sles-12-apphost-pack-6.0.X] ([Checksum][sles-12-apphost-pack-checksum-6.0.X]) [Host FX Resolver][sles-12-hostfxr-6.0.X] ([Checksum][sles-12-hostfxr-checksum-6.0.X]) [Targeting Pack][sles-12-targeting-pack-6.0.X] ([Checksum][sles-12-targeting-pack-checksum-6.0.X]) [Shared Framework][sles-12-sharedfx-6.0.X] ([Checksum][sles-12-sharedfx-checksum-6.0.X]) |
+| **OpenSUSE 42 (x64)** | [![][OpenSUSE-42-badge-6.0.X]][OpenSUSE-42-version-6.0.X] [Runtime-Deps][OpenSUSE-42-runtime-deps-6.0.X] ([Checksum][OpenSUSE-42-runtime-deps-checksum-6.0.X]) [Host][OpenSUSE-42-host-6.0.X] ([Checksum][OpenSUSE-42-host-checksum-6.0.X]) [App Hosts][OpenSUSE-42-apphost-pack-6.0.X] ([Checksum][OpenSUSE-42-apphost-pack-checksum-6.0.X]) [Host FX Resolver][OpenSUSE-42-hostfxr-6.0.X] ([Checksum][OpenSUSE-42-hostfxr-checksum-6.0.X]) [Targeting Pack][OpenSUSE-42-targeting-pack-6.0.X] ([Checksum][OpenSUSE-42-targeting-pack-checksum-6.0.X]) [Shared Framework][OpenSUSE-42-sharedfx-6.0.X] ([Checksum][OpenSUSE-42-sharedfx-checksum-6.0.X]) |
+
+
+
+*Note: Our Linux packages (.deb and .rpm) are put together slightly differently than the Windows and Mac specific installers. Instead of combining everything, we have separate component packages that depend on each other. If you're installing these directly from the installer files (via dpkg or similar), then you'll need to install them in the order presented above.*
+
+
+
+[win-x64-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_win-x64_Release_version_badge.svg?no-cache
+[win-x64-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[win-x64-installer-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-x64.exe
+[win-x64-installer-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-x64.exe.sha512
+[win-x64-zip-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-x64.zip
+[win-x64-zip-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-x64.zip.sha512
+[win-x64-nethost-zip-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-win-x64.zip
+[win-x64-symbols-zip-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-win-x64.zip
+
+[win-x86-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_win-x86_Release_version_badge.svg?no-cache
+[win-x86-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[win-x86-installer-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-x86.exe
+[win-x86-installer-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-x86.exe.sha512
+[win-x86-zip-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-x86.zip
+[win-x86-zip-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-x86.zip.sha512
+[win-x86-nethost-zip-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-win-x86.zip
+[win-x86-symbols-zip-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-win-x86.zip
+
+[win-arm64-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_win-arm64_Release_version_badge.svg?no-cache
+[win-arm64-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[win-arm64-installer-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-arm64.exe
+[win-arm64-installer-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-arm64.exe.sha512
+[win-arm64-zip-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-arm64.zip
+[win-arm64-zip-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-win-arm64.zip.sha512
+[win-arm64-nethost-zip-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-win-arm64.zip
+[win-arm64-symbols-zip-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-win-arm64.zip
+
+[osx-x64-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_osx-x64_Release_version_badge.svg?no-cache
+[osx-x64-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[osx-x64-installer-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-osx-x64.pkg
+[osx-x64-installer-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-osx-x64.pkg.sha512
+[osx-x64-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-osx-x64.tar.gz
+[osx-x64-targz-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-osx-x64.tar.gz.sha512
+[osx-x64-nethost-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-osx-x64.tar.gz
+[osx-x64-symbols-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-osx-x64.tar.gz
+
+[osx-arm64-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_osx-arm64_Release_version_badge.svg?no-cache
+[osx-arm64-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[osx-arm64-installer-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-osx-arm64.pkg
+[osx-arm64-installer-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-osx-arm64.pkg.sha512
+[osx-arm64-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-osx-arm64.tar.gz
+[osx-arm64-targz-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-osx-arm64.tar.gz.sha512
+[osx-arm64-nethost-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-osx-arm64.tar.gz
+[osx-arm64-symbols-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-osx-arm64.tar.gz
+
+[linux-x64-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_linux-x64_Release_version_badge.svg?no-cache
+[linux-x64-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[linux-x64-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-x64.tar.gz
+[linux-x64-targz-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-x64.tar.gz.sha512
+[linux-x64-nethost-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-linux-x64.tar.gz
+[linux-x64-symbols-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-linux-x64.tar.gz
+
+[linux-arm-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_linux-arm_Release_version_badge.svg?no-cache
+[linux-arm-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[linux-arm-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-arm.tar.gz
+[linux-arm-targz-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-arm.tar.gz.sha512
+[linux-arm-nethost-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-linux-arm.tar.gz
+[linux-arm-symbols-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-linux-arm.tar.gz
+
+[linux-arm64-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_linux-arm64_Release_version_badge.svg?no-cache
+[linux-arm64-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[linux-arm64-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-arm64.tar.gz
+[linux-arm64-targz-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-arm64.tar.gz.sha512
+[linux-arm64-nethost-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-linux-arm64.tar.gz
+[linux-arm64-symbols-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-linux-arm64.tar.gz
+
+[deb-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_ubuntu.14.04-x64_Release_version_badge.svg?no-cache
+[deb-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[deb-apphost-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.deb
+[deb-apphost-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.deb.sha512
+[deb-host-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.deb
+[deb-runtime-deps-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-x64.deb
+[deb-runtime-deps-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-x64.deb.sha512
+[deb-host-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.deb.sha512
+[deb-hostfxr-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.deb
+[deb-hostfxr-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.deb.sha512
+[deb-sharedfx-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.deb
+[deb-sharedfx-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.deb.sha512
+[deb-targeting-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.deb
+[deb-targeting-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.deb.sha512
+
+[rhel7-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_rhel.7-x64_Release_version_badge.svg?no-cache
+[rhel7-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[rhel7-runtime-deps-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-centos.7-x64.rpm
+[rhel7-runtime-deps-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-centos.7-x64.rpm.sha512
+[rhel7-apphost-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm
+[rhel7-apphost-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm.sha512
+[rhel7-host-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm
+[rhel7-host-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm.sha512
+[rhel7-hostfxr-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm
+[rhel7-hostfxr-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm.sha512
+[rhel7-sharedfx-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm
+[rhel7-sharedfx-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm.sha512
+[rhel7-targeting-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm
+[rhel7-targeting-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm.sha512
+
+[centos-7-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_centos.7-x64_Release_version_badge.svg?no-cache
+[centos-7-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[centos-7-runtime-deps-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-centos.7-x64.rpm
+[centos-7-runtime-deps-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-centos.7-x64.rpm.sha512
+[centos-7-apphost-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm
+[centos-7-apphost-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm.sha512
+[centos-7-host-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm
+[centos-7-host-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm.sha512
+[centos-7-hostfxr-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm
+[centos-7-hostfxr-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm.sha512
+[centos-7-sharedfx-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm
+[centos-7-sharedfx-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm.sha512
+[centos-7-targeting-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm
+[centos-7-targeting-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm.sha512
+
+[fedora-27-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_fedora.27-x64_Release_version_badge.svg?no-cache
+[fedora-27-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[fedora-27-runtime-deps-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-fedora.27-x64.rpm
+[fedora-27-runtime-deps-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-fedora.27-x64.rpm.sha512
+[fedora-27-apphost-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm
+[fedora-27-apphost-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm.sha512
+[fedora-27-host-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm
+[fedora-27-host-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm.sha512
+[fedora-27-hostfxr-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm
+[fedora-27-hostfxr-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm.sha512
+[fedora-27-sharedfx-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm
+[fedora-27-sharedfx-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm.sha512
+[fedora-27-targeting-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm
+[fedora-27-targeting-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm.sha512
+
+[sles-12-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_sles.12-x64_Release_version_badge.svg?no-cache
+[sles-12-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[sles-12-runtime-deps-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-sles.12-x64.rpm
+[sles-12-runtime-deps-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-sles.12-x64.rpm.sha512
+[sles-12-apphost-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm
+[sles-12-apphost-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm.sha512
+[sles-12-host-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm
+[sles-12-host-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm.sha512
+[sles-12-hostfxr-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm
+[sles-12-hostfxr-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm.sha512
+[sles-12-sharedfx-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm
+[sles-12-sharedfx-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm.sha512
+[sles-12-targeting-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm
+[sles-12-targeting-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm.sha512
+
+[OpenSUSE-42-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_opensuse.42-x64_Release_version_badge.svg?no-cache
+[OpenSUSE-42-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[OpenSUSE-42-runtime-deps-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-opensuse.42-x64.rpm
+[OpenSUSE-42-runtime-deps-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-deps-opensuse.42-x64.rpm.sha512
+[OpenSUSE-42-apphost-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm
+[OpenSUSE-42-apphost-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-apphost-pack-x64.rpm.sha512
+[OpenSUSE-42-host-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm
+[OpenSUSE-42-host-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-host-x64.rpm.sha512
+[OpenSUSE-42-hostfxr-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm
+[OpenSUSE-42-hostfxr-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-hostfxr-x64.rpm.sha512
+[OpenSUSE-42-sharedfx-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm
+[OpenSUSE-42-sharedfx-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-x64.rpm.sha512
+[OpenSUSE-42-targeting-pack-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm
+[OpenSUSE-42-targeting-pack-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-targeting-pack-x64.rpm.sha512
+
+[linux-musl-x64-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_linux-musl-x64_Release_version_badge.svg?no-cache
+[linux-musl-x64-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[linux-musl-x64-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-musl-x64.tar.gz
+[linux-musl-x64-targz-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-musl-x64.tar.gz.sha512
+[linux-musl-x64-nethost-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-linux-musl-x64.tar.gz
+[linux-musl-x64-symbols-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-linux-musl-x64.tar.gz
+
+[linux-musl-arm-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_linux-musl-arm_Release_version_badge.svg?no-cache
+[linux-musl-arm-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[linux-musl-arm-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-musl-arm.tar.gz
+[linux-musl-arm-targz-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-musl-arm.tar.gz.sha512
+[linux-musl-arm-nethost-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-linux-musl-arm.tar.gz
+[linux-musl-arm-symbols-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-linux-musl-arm.tar.gz
+
+[linux-musl-arm64-badge-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/sharedfx_linux-musl-arm64_Release_version_badge.svg?no-cache
+[linux-musl-arm64-version-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/productVersion.txt
+[linux-musl-arm64-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-musl-arm64.tar.gz
+[linux-musl-arm64-targz-checksum-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-linux-musl-arm64.tar.gz.sha512
+[linux-musl-arm64-nethost-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-nethost-linux-musl-arm64.tar.gz
+[linux-musl-arm64-symbols-targz-6.0.X]: https://aka.ms/dotnet/net6/dev/Runtime/dotnet-runtime-symbols-linux-musl-arm64.tar.gz
+
+
diff --git a/docs/project/glossary.md b/docs/project/glossary.md
index f69d3749938b..c1b6b687354b 100644
--- a/docs/project/glossary.md
+++ b/docs/project/glossary.md
@@ -24,7 +24,7 @@ terminology.
| JIT | [Just-in-Time](https://github.com/dotnet/runtime/blob/master/docs/design/coreclr/jit/ryujit-overview.md) compiler. RyuJIT is the code name for the next generation Just-in-Time(aka "JIT") for the .NET runtime. |
| LCG | Lightweight Code Generation. An early name for [dynamic methods](https://github.com/dotnet/runtime/blob/master/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/DynamicMethod.cs). |
| MD | MetaData. |
-| MDA | Managed Debugging Assistant - see [details](https://docs.microsoft.com/en-us/dotnet/framework/debug-trace-profile/diagnosing-errors-with-managed-debugging-assistants) (Note: Not in .NET Core, equivalent diagnostic functionality is made available on a case-by-case basis, e.g. [#15465](https://github.com/dotnet/coreclr/issues/15465)) |
+| MDA | Managed Debugging Assistant - see [details](https://docs.microsoft.com/en-us/dotnet/framework/debug-trace-profile/diagnosing-errors-with-managed-debugging-assistants) (Note: Not in .NET Core, equivalent diagnostic functionality is made available on a case-by-case basis, e.g. [#9418](https://github.com/dotnet/runtime/issues/9418)) |
| NGen | Native Image Generator. |
| NYI | Not Yet Implemented. |
| PAL | [Platform Adaptation Layer](http://archive.oreilly.com/pub/a/dotnet/2002/03/04/rotor.html). Provides an abstraction layer between the runtime and the operating system. |
diff --git a/docs/project/jit-testing.md b/docs/project/jit-testing.md
index 6d127bc705cc..01be1b927e37 100644
--- a/docs/project/jit-testing.md
+++ b/docs/project/jit-testing.md
@@ -69,9 +69,9 @@ moving these.
We need to ensure that the CoreCLR repo contains a suitably
hookable test script. Core testing is driven by xunit but there's typically a
-wrapper around this (runtest.cmd today) to facilitate test execution.
+wrapper around this (run.cmd today) to facilitate test execution.
-The proposal is to implement platform-neutral variant of runtest.cmd that
+The proposal is to implement platform-neutral variant of run.cmd that
contains all the existing functionality plus some additional capabilities for
JIT testing. Initially this will mean:
diff --git a/docs/project/library-servicing.md b/docs/project/library-servicing.md
index 29934d1606f1..0347adacc9c2 100644
--- a/docs/project/library-servicing.md
+++ b/docs/project/library-servicing.md
@@ -1,22 +1,22 @@
-# How to service a library in CoreFx
+# How to service a library
-This document provides the steps necessary after modifying a CoreFx library in a servicing branch (where "servicing branch" refers to any branch whose name begins with `release/`).
+This document provides the steps necessary after modifying a library in a servicing branch (where "servicing branch" refers to any branch whose name begins with `release/`).
## Check for existence of a .pkgproj
-Most CoreFx libraries are not packaged by default. Some libraries have their output packaged in `Microsoft.Private.CoreFx.NetCoreApp`, which is always built, while other libraries have their own specific packages, which are only built on-demand. Your first step is to determine whether or not your library has its own package. To do this, go into the root folder for the library you've made changes to. If there is a `pkg` folder there (which should have a `.pkgproj` file inside of it), your library does have its own package. If there is no `pkg` folder there, the library should be built as part of `Microsoft.Private.CoreFx.NetCoreApp` and shipped as part of `Microsoft.NetCore.App`. To confirm this, check for the `IsNETCoreApp` property being set to `true` in the library's `Directory.Build.props` (or dir.props). If it is, then there is nothing that needs to be done. If it's not, contact a member of the servicing team for guidance, as this situation goes against our convention.
+Your first step is to determine whether or not your library has its own package. To do this, go into the root folder for the library you've made changes to. If there is a `pkg` folder there (which should have a `.pkgproj` file inside of it), your library does have its own package. If there is no `pkg` folder there, the library is the part of the shared framework. If it is, then there is nothing that needs to be done.
-For example, if you made changes to [System.Data.SqlClient](https://github.com/dotnet/runtime/tree/master/src/libraries/Microsoft.Win32.Registry), then you have a .pkgproj, and will have to follow the steps in this document. However, if you made changes to [System.Collections](https://github.com/dotnet/runtime/tree/master/src/libraries/System.Collections), then you don't have a .pkgproj, and you do not need to do any further work for servicing.
+For example, if you made changes to [Microsoft.Win32.Primitives](https://github.com/dotnet/runtime/tree/master/src/libraries/Microsoft.Win32.Primitives), then you have a `.pkgproj`, and will have to follow the steps in this document. However, if you made changes to [System.Collections](https://github.com/dotnet/runtime/tree/master/src/libraries/System.Collections), then you don't have a `.pkgproj`, and you do not need to do any further work for servicing.
## Determine PackageVersion
-Each package has a property called `PackageVersion`. When you make a change to a library & ship it, the `PackageVersion` must be bumped. This property could either be in one of two places inside your library's source folder: `Directory.Build.Props` (or dir.props), or the `.pkgproj`. It's also possible that the property is in neither of those files, in which case we're using the default version from [Packaging.props](https://github.com/dotnet/runtime/blob/master/eng/packaging.props#L25) (IMPORTANT - make sure to check the default version from the branch that you're making changes to, not from master). You'll need to increment this package version. If the property is already present in your library's source folder, just increment the patch version by 1 (e.g. `4.6.0` -> `4.6.1`). If it's not present, add it to the library's `Directory.Build.props` (or dir.props), where it is equal to the version in `Packaging.props`, with the patch version incremented by 1.
+Each package has a property called `PackageVersion`. When you make a change to a library & ship it, the `PackageVersion` must be bumped. This property could either be in one of two places inside your library's source folder: `Directory.Build.Props` (or dir.props), or the `.pkgproj`. It's also possible that the property is in neither of those files, in which case we're using the default version from [Packaging.props](https://github.com/dotnet/runtime/blob/master/eng/packaging.props#L25) (IMPORTANT - make sure to check the default version from the branch that you're making changes to, not from master). You'll need to increment this package version. If the property is already present in your library's source folder, just increment the patch version by 1 (e.g. `4.6.0` -> `4.6.1`). If it's not present, add it to the library's `Directory.Build.props`, where it is equal to the version in `Packaging.props`, with the patch version incremented by 1.
Note that it's possible that somebody else has already incremented the package version since our last release. If this is the case, you don't need to increment it yourself. To confirm, check [Nuget.org](https://www.nuget.org/) to see if there is already a published version of your package with the same package version. If so, the `PackageVersion` must be incremented. If not, there's still a possibility that the version should be bumped, in the event that we've already built the package with its current version in an official build, but haven't released it publicly yet. If you see that the `PackageVersion` has been changed in the last 1-2 months, but don't see a matching package in Nuget.org, contact somebody on the servicing team for guidance.
## Determine AssemblyVersion
-Each library has a property called `AssemblyVersion` which will be in either the library `.csproj` or in `Directory.Build.Props` (or dir.props). For servcing events you will want to increment the revision by 1 (e.g `4.0.0.0` -> `4.0.0.1`) in the library's `Directory.Build.Props` (or dir.props) if the library ships in its own package and has an asset that is applicable to .NET Framework. To determine if it applies to .NET Framework you should check to see if there are any `netstandard` or `net4x` configurations in the ref and/or src project, if there are then it has assets that apply.
+Each library has a property called `AssemblyVersion` which will be in either the library `.csproj` or in `Directory.Build.Props`. For servicing events you will want to increment the revision by 1 (e.g `4.0.0.0` -> `4.0.0.1`) in the library's `Directory.Build.Props` if the library ships in its own package and has an asset that is applicable to .NET Framework. To determine if it applies to .NET Framework you should check to see if there are any `netstandard` or `net4x` configurations in the ref and/or src project, if there are then it has assets that apply.
The reason we need to increment the assembly version for things running on .NET Framework is because of the way binding works there. If there are two assemblies with the same assembly version the loader will essentially pick the first one it finds and use that version so applications don't have full control over using the later build with a particular fix included. This is worse if someone puts the older assembly in the GAC as the GAC will always win for matching assembly versions so an application couldn't load the newer one because it has the same assembly version.
@@ -47,3 +47,7 @@ All that's left is to ensure that your changes have worked as expected. To do so
3. Try installing the built package in a test application, testing that your changes to the library are present & working as expected.
To install your package add your local packages folder as a feed source in VS or your nuget.config and then add a PackageReference to the specific version of the package you built then try using the APIs.
+
+## Approval Process
+
+All the servicing change must go through an approval process. Please create your PR using [this template](https://github.com/dotnet/runtime/compare/template?expand=1&template=servicing_pull_request_template.md). You should also add `servicing-consider` label to the pull request and bring it to the attention of the engineering lead responsible for the area.
diff --git a/docs/project/linux-performance-tracing.md b/docs/project/linux-performance-tracing.md
index 2899d7e683a2..ff70c266acec 100644
--- a/docs/project/linux-performance-tracing.md
+++ b/docs/project/linux-performance-tracing.md
@@ -1,4 +1,4 @@
-Performance Tracing on Linux
+Performance Tracing on Linux
============================
When a performance problem is encountered on Linux, these instructions can be used to gather detailed information about what was happening on the machine at the time of the performance problem.
@@ -260,7 +260,7 @@ dotnet tool install --global dotnet-trace
## Collecting a trace ##
To see which .NET processes are available for collecting traces on, you can run the following command to get their process IDs (PID):
```
-dotnet-trace list-processes
+dotnet-trace ps
```
Once you know the PID of the process you want to collect traces, you can run the following command to start tracing:
diff --git a/docs/project/list-of-obsoletions.md b/docs/project/list-of-obsoletions.md
index 3b7d6696c62d..0b23c097979f 100644
--- a/docs/project/list-of-obsoletions.md
+++ b/docs/project/list-of-obsoletions.md
@@ -24,3 +24,4 @@ Currently the identifiers `SYSLIB0001` through `SYSLIB0999` are carved out for o
| __`SYSLIB0009`__ | The AuthenticationManager Authenticate and PreAuthenticate methods are not supported and throw PlatformNotSupportedException. |
| __`SYSLIB0010`__ | This Remoting API is not supported and throws PlatformNotSupportedException. |
| __`SYSLIB0011`__ | `BinaryFormatter` serialization is obsolete and should not be used. See https://aka.ms/binaryformatter for recommended alternatives. |
+| __`SYSLIB0012`__ | Assembly.CodeBase and Assembly.EscapedCodeBase are only included for .NET Framework compatibility. Use Assembly.Location instead. |
diff --git a/docs/project/performance-guidelines.md b/docs/project/performance-guidelines.md
index d2cee51456f8..c3fe57a9c865 100644
--- a/docs/project/performance-guidelines.md
+++ b/docs/project/performance-guidelines.md
@@ -34,30 +34,14 @@ A microbenchmark is an application that executes a specific codepath multiple ti
- **DO** run many iterations of the code in question to filter out noise.
- **DO** minimize the effects of other applications on the performance of the microbenchmark by closing as many unnecessary applications as possible.
+The microbenchmarks used to test the performance of all .NET Runtimes live in [dotnet/performance repository](https://github.com/dotnet/performance/tree/master/src/benchmarks/micro). The benchmarking workflow is described [here](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md).
+
# Profiling and Performance Tracing #
Measuring performance is an important part of ensuring that changes do not regress the performance of a feature or scenario.
Using a profiler allows you to run an existing workload without adding tracing statements or otherwise modifying it, and at the same time, get rich information on how the workload performs.
-On the .NET team, we use a tool called **PerfView**, which runs on Windows, and allows for collection of performance data across an entire machine.
-
-Capturing a trace using PerfView will allow you to:
-
-- Investigate CPU usage and blocked time.
-- Understand the performance of various runtime services (GC, JIT, etc.)
-- Compare the performance of a workload by diffing before and after traces.
-- Much, much more.
-
-PerfView is available at the [PerfView repo](https://github.com/microsoft/perfview/releases). The help documentation is quite substantial and can help you get started. Clicking the blue links throughout PerfView's UI will also take you to the appropriate help topic. It is also recommended that you watch the [PerfView Tutorial Videos](http://channel9.msdn.com/Series/PerfView-Tutorial).
-
-# Running the CoreCLR Performance Tests on Windows #
-1. The first step to running the performance tests locally is to do a release build of CoreCLR and all of the performance tests. You can do this with the command `build.cmd x64 Release`, this will of course build the x64 runtime, and you should use x86 if you want to test x86.
-
-2. After building the runtime you will need to generate a core root that contains all of the binaries we just built along with the required dependencies. This can be done with the command `tests\runtest.cmd Release x64 GenerateLayoutOnly`, with the same caveat that x86 should be used if that is the platform that you are testing.
-
-3. Now we need to actually run the performance tests. The performance tests live in the [dotnet/performance](https://github.com/dotnet/performance) repo. Instructions for running them are [here](https://github.com/dotnet/performance/blob/master/docs/benchmarking-workflow-dotnet-runtime.md).
-
-4. Navigate to the `sandbox` directory in the root of your repo. Inside that directory you will find a bunch of files that follow the name Perf-*.md. These will contain the results, formatted as Markdown files, for each test that was run.
+The profiling workflow is described [here](https://github.com/dotnet/performance/blob/master/docs/profiling-workflow-dotnet-runtime.md).
# Additional Help #
If you have questions, run into any issues, or would like help with any performance related topics, please feel free to post a question. Someone from the .NET performance team will be happy to help.
diff --git a/docs/project/profiling-api-status.md b/docs/project/profiling-api-status.md
index a9279b69d428..5e649414cea8 100644
--- a/docs/project/profiling-api-status.md
+++ b/docs/project/profiling-api-status.md
@@ -20,7 +20,7 @@ ReJIT feature is only available on x86/x64 for now.
### Profiler Attach/Detach
-We only support launch at the moment, see https://github.com/dotnet/coreclr/issues/16796
+We only support launch at the moment, see https://github.com/dotnet/runtime/issues/9886
### Any issues we missed?
diff --git a/docs/project/strong-name-signing.md b/docs/project/strong-name-signing.md
index c082df374305..269bb102c4ad 100644
--- a/docs/project/strong-name-signing.md
+++ b/docs/project/strong-name-signing.md
@@ -10,7 +10,7 @@ All .NET Core assemblies are [strong-named](https://docs.microsoft.com/en-us/dot
## FAQ
### 1. Microsoft strong-names their assemblies, should I?
-For the most part, the majority of applications do not need strong-names. Strong-names are left over from previous eras of .NET where [sandboxing](https://en.wikipedia.org/wiki/Sandbox_(computer_security)) needed to differentiate between code that was trusted, versus code that was untrusted. However in recent years, sandboxing via AppDomains, especially to [isolate ASP.NET web applications](https://support.microsoft.com/en-us/help/2698981/asp-net-partial-trust-does-not-guarantee-application-isolation), is no longer guaranteed and is not recommended.
+For the most part, the majority of applications do not need strong-names. Strong-names are left over from previous eras of .NET where [sandboxing](https://en.wikipedia.org/wiki/Sandbox_(computer_security)) needed to differentiate between code that was trusted, versus code that was untrusted. However in recent years, sandboxing via AppDomains, especially to [isolate ASP.NET web applications](https://support.microsoft.com/en-us/help/2698981/asp-net-partial-trust-does-not-guarantee-application-isolation), is no longer guaranteed and is not recommended.
However, strong-names are still required in applications in some rare situations, most of which are called out on this page: [Strong-Named Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/app-domains/strong-named-assemblies).
@@ -21,6 +21,6 @@ There are three major problems that developers run into after strong naming thei
1. _Binding Policy_. When developers talk about strong-names, they are usually conflating it with the strict binding policy of the .NET Framework that kicks in _when_ you strong-name. This binding policy is problematic because it forces, by default, an exact match between reference and version, and requires developers to author complex [binding redirects](https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/bindingredirect-element) when they don't. In recent versions of Visual Studio, however, we've added [Automatic Binding Redirection](https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection) as an attempt to reduce pain of this policy on developers. On top of this, all newer platforms, including _Silverlight_, _WinRT-based platforms_ (Phone and Store), _.NET Native_ and _ASP.NET 5_ this policy has been loosened, allowing later versions of an assembly to satisfy earlier references, thereby completely removing the need to ever write binding redirects on those platforms.
-2. _Virality_. Once you've strong-named an assembly, you can only statically reference other strong-named assemblies.
+2. _Virality_. Once you've strong-named an assembly, you can only statically reference other strong-named assemblies.
3. _No drop-in replacement_. This is a problem for open source libraries where the strong-name private key is not checked into the repository. This means that developers are unable to build to their own version of the library and then use it as a drop-in replacement without recompiling _all_ consuming libraries up stack to pick up the new identity. This is extremely problematic for libraries, such as Json.NET, which have large incoming dependencies. Firstly, we would recommend that these open source projects check-in their private key (remember, [strong-names are used for identity, and not for security](https://docs.microsoft.com/en-us/dotnet/framework/app-domains/strong-named-assemblies)). Failing that, however, we've introduced a new concept called [Public Signing](public-signing.md) that enables developers to build drop-in replacements without needing access to the strong-name private key. This is the mechanism that .NET Core libraries use by default.
diff --git a/docs/project/versioning.md b/docs/project/versioning.md
index ab5b027397e2..728195b10845 100644
--- a/docs/project/versioning.md
+++ b/docs/project/versioning.md
@@ -57,4 +57,4 @@ The version we produce by our calculations is mainly used in two places:
- As the [Assembly File Version](https://msdn.microsoft.com/en-us/library/51ket42z(v=vs.110).aspx)
- As the packages version number
-To get more information on where are we doing the calculations for the versioning, you can [click here](https://github.com/dotnet/buildtools/blob/master/src/Microsoft.DotNet.Build.Tasks/PackageFiles/versioning.targets) to find the targets file where we create the versioning assets, and [here](https://github.com/dotnet/buildtools/blob/master/src/Microsoft.DotNet.Build.Tasks/GenerateCurrentVersion.cs) to see the code on where we calculate BuildNumberMajor and BuildNumberMinor.
\ No newline at end of file
+To get more information on where are we doing the calculations for the versioning, you can [click here](https://github.com/dotnet/buildtools/blob/master/src/Microsoft.DotNet.Build.Tasks/PackageFiles/versioning.targets) to find the targets file where we create the versioning assets, and [here](https://github.com/dotnet/buildtools/blob/master/src/Microsoft.DotNet.Build.Tasks/GenerateCurrentVersion.cs) to see the code on where we calculate BuildNumberMajor and BuildNumberMinor.
diff --git a/docs/project/windows-performance-tracing.md b/docs/project/windows-performance-tracing.md
deleted file mode 100644
index 04fab29feca9..000000000000
--- a/docs/project/windows-performance-tracing.md
+++ /dev/null
@@ -1,14 +0,0 @@
-Performance Tracing on Windows
-=====================================
-
-Performance tracing on Windows is done using the PerfView, which can be downloaded at .
-
-PerfView has significant documentation built-in, which includes:
-
-- Getting started help.
-- Collection and investigation walk-through videos.
-- An extensive users guide.
-
-To get started, download PerfView and use the links on the main screen to get help.
-
-If you have specific questions, please post them in an issue here.
\ No newline at end of file
diff --git a/docs/project/writing-tests.md b/docs/project/writing-tests.md
index f2984f020b7b..dd66fc96cd2b 100644
--- a/docs/project/writing-tests.md
+++ b/docs/project/writing-tests.md
@@ -56,7 +56,7 @@ public async Task Headers_SetAfterRequestSubmitted_ThrowsInvalidOperationExcepti
```
# OuterLoop
-This one is fairly simple but often used incorrectly. When running tests which depend on outside influences like e.g. Hardware (Internet, SerialPort, ...) and you can't mitigate these dependencies, you might consider using the `[OuterLoop]` attribute for your test.
+This one is fairly simple but often used incorrectly. When running tests which depend on outside influences like e.g. Hardware (Internet, SerialPort, ...) and you can't mitigate these dependencies, you might consider using the `[OuterLoop]` attribute for your test.
With this attribute, tests are executed in a dedicated CI loop and won't break the default CI loops which get created when you submit a PR.
To run OuterLoop tests locally you need to set the msbuild property "OuterLoop" to true: `/p:OuterLoop=true`.
To run OuterLoop tests in CI you need to mention dotnet-bot and identify the tests you want to run. See `@dotnet-bot help` for the exact loop names.
diff --git a/docs/workflow/README.md b/docs/workflow/README.md
index 7a17fecd50ef..25b9f3f877d9 100644
--- a/docs/workflow/README.md
+++ b/docs/workflow/README.md
@@ -40,9 +40,13 @@ On Unix like systems, arguments can be passed in with a single `-` or double hyp
The repository currently consists of different major parts: the runtimes, the libraries, and the installer.
To build just one part you use the root build script (build.cmd/sh), and you add the `-subset` flag.
+## Editing and Debugging
+
+For instructions on how to edit code and debug your changes, see [Editing and Debugging](editing-and-debugging.md).
+
## Configurations
-You may need to build the tree in a combination of configurations. This section explains why.
+You may need to build the tree in a combination of configurations. This section explains why.
A quick reminder of some concepts -- see the [glossary](../project/glossary.md) for more on these:
@@ -51,7 +55,7 @@ A quick reminder of some concepts -- see the [glossary](../project/glossary.md)
* **Release Configuration** -- Optimized code. Asserts are disabled. Runs at the best speed, and suitable for performance profiling. You will have limited debugging experience.
When we talk about mixing configurations, we're discussing the following sub-components:
-
+
* **Runtime** is the execution engine for managed code and there are two different implementations available. Both are written in C/C++, therefore, easier to debug when built in a Debug configuration.
* CoreCLR is the comprehensive execution engine which if build in Debug Configuration it executes managed code very slowly. For example, it will take a long time to run the managed code unit tests. The code lives under [src/coreclr](../../src/coreclr).
* Mono is portable and also slimmer runtime and it's not that sensitive to Debug Configuration for running managed code. You will still need to build it without optimizations to have good runtime debugging experience though. The code lives under [src/mono](../../src/mono).
diff --git a/docs/workflow/building/coreclr/README.md b/docs/workflow/building/coreclr/README.md
index c00d90a9799a..d74a7ad3b739 100644
--- a/docs/workflow/building/coreclr/README.md
+++ b/docs/workflow/building/coreclr/README.md
@@ -22,6 +22,15 @@ CoreCLR also supports a 'checked' build type which has asserts enabled like 'deb
./build.sh -subset clr -configuration checked
```
+If you want to use Ninja to drive the native build instead of Visual Studio MSBuild (on Windows) or Make (on non-Windows), you can pass the `-ninja` flag to the build script as follows:
+```
+./build.cmd -subset clr -ninja
+```
+
+We recommend using Ninja for building the project on Windows since it more efficiently uses the build machine's resources for the native runtime build in comparison to Visual Studio's MSBuild.
+
+To pass extra compiler/linker flags to the coreclr build, set the environment variables `EXTRA_CFLAGS`, `EXTRA_CXXFLAGS` and `EXTRA_LDFLAGS` as needed. Don't set `CFLAGS`/`CXXFLAGS`/`LDFLAGS` directly as that might lead to configure-time tests failing.
+
This will produce outputs as follows:
- Product binaries will be dropped in `artifacts\bin\coreclr\..` folder.
diff --git a/docs/workflow/building/coreclr/freebsd-instructions.md b/docs/workflow/building/coreclr/freebsd-instructions.md
index 49c29f49deff..ef31a0b4d215 100644
--- a/docs/workflow/building/coreclr/freebsd-instructions.md
+++ b/docs/workflow/building/coreclr/freebsd-instructions.md
@@ -10,7 +10,7 @@ These instructions are written assuming FreeBSD 10.1-RELEASE, since that's the r
These instructions assume you use the binary package tool `pkg` (analog to `apt-get` or `yum` on Linux) to install the environment. Compiling the dependencies from source using the ports tree might work too, but is untested.
-Minimum RAM required to build is 1GB. The build is known to fail on 512 MB VMs ([Issue 536](https://github.com/dotnet/coreclr/issues/536)).
+Minimum RAM required to build is 1GB. The build is known to fail on 512 MB VMs ([Issue 4069](https://github.com/dotnet/runtime/issues/4069)).
Toolchain Setup
---------------
@@ -166,7 +166,7 @@ Download NuGet Packages
With Mono and NuGet in hand, you can use NuGet to get the required dependencies.
-Make a `packages.config` file with the following text. These are the required dependencies of this particular app. Different apps will have different dependencies and require a different `packages.config` - see [Issue #480](https://github.com/dotnet/coreclr/issues/480).
+Make a `packages.config` file with the following text. These are the required dependencies of this particular app. Different apps will have different dependencies and require a different `packages.config` - see [Issue #4053](https://github.com/dotnet/runtime/issues/4053).
```xml
@@ -198,7 +198,7 @@ And restore your packages.config file:
janhenke@freebsd-frankfurt:~/coreclr-demo/packages % mono nuget.exe restore -Source https://www.myget.org/F/dotnet-corefx/ -PackagesDirectory .
```
-NOTE: This assumes you already installed the default CA certs. If you have problems downloading the packages please see [Issue #602](https://github.com/dotnet/coreclr/issues/602#issuecomment-88203778). The command for FreeBSD is:
+NOTE: This assumes you already installed the default CA certs. If you have problems downloading the packages please see [Issue #4089](https://github.com/dotnet/runtime/issues/4089#issuecomment-88203778). The command for FreeBSD is:
```sh
janhenke@freebsd-frankfurt:~/coreclr-demo/packages % mozroots --import --sync
diff --git a/docs/workflow/building/coreclr/linux-instructions.md b/docs/workflow/building/coreclr/linux-instructions.md
index 30bfb72f9d71..674465b871e8 100644
--- a/docs/workflow/building/coreclr/linux-instructions.md
+++ b/docs/workflow/building/coreclr/linux-instructions.md
@@ -53,7 +53,7 @@ This table of images might often become stale as we change our images as our req
| Alpine | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.9-WithNode-0fc54a3-20190918214015` | - | -clang9 |
| CentOS 7 (build for RHEL 7) | x64 | `mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-359e48e-20200313130914` | - | -clang9 |
| Ubuntu 16.04 | arm32 (armhf) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-20200413125008-09ec757` | `/crossrootfs/arm` | -clang9 |
-| Ubuntu 16.04 | arm64 (arm64v8) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-20200413125008-cfdd435` | `/crossrootfs/arm64` | -clang9 |
+| Ubuntu 16.04 | arm64 (arm64v8) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-20201022204150-b2c2436` | `/crossrootfs/arm64` | -clang9 |
| Alpine | arm64 (arm64v8) | `mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-alpine-20200413125008-406629a` | `/crossrootfs/arm64` | -clang5.0 |
Environment
@@ -91,7 +91,7 @@ The Core_Root folder will contain the built binaries, generated by `build.sh`, a
the libraries subset (`-subset libs`) before this command can be run.
```
-./src/coreclr/build-test.sh generatelayoutonly
+./src/tests/build.sh generatelayoutonly
```
After the build is complete you will find the output in the `artifacts/tests/coreclr/Linux.x64.Debug/Tests/Core_Root` folder.
@@ -99,7 +99,7 @@ After the build is complete you will find the output in the `artifacts/tests/cor
Running a single test
===================
-After `src/coreclr/build-test.sh` is run, `corerun` from the Core_Root folder is ready to be run. This can be done by using the full absolute path to `corerun`, or by setting an environment variable to the Core_Root folder.
+After `src/tests/build.sh` is run, `corerun` from the Core_Root folder is ready to be run. This can be done by using the full absolute path to `corerun`, or by setting an environment variable to the Core_Root folder.
```sh
export CORE_ROOT=/runtime/artifacts/tests/coreclr/Linux.x64.Debug/Tests/Core_Root
diff --git a/docs/workflow/building/coreclr/osx-instructions.md b/docs/workflow/building/coreclr/osx-instructions.md
index 9e363f2fb276..d8bf4fe604fc 100644
--- a/docs/workflow/building/coreclr/osx-instructions.md
+++ b/docs/workflow/building/coreclr/osx-instructions.md
@@ -66,7 +66,7 @@ Create the Core_Root
The Core_Root folder will have the built binaries, from `src/coreclr/build.sh` and it will also include the CoreFX packages required to run tests.
```
-./src/coreclr/build-test.sh generatelayoutonly
+./src/tests/build.sh generatelayoutonly
```
After the build is complete you will be able to find the output in the `artifacts/tests/coreclr/OSX.x64.Debug/Tests/Core_Root` folder.
@@ -74,7 +74,7 @@ After the build is complete you will be able to find the output in the `artifact
Running a single test
===================
-After `src/coreclr/build-test.sh` is run, corerun from the Core_Root folder is ready to be run. This can be done by using the full absolute path to corerun, or by setting
+After `src/tests/build.sh` is run, corerun from the Core_Root folder is ready to be run. This can be done by using the full absolute path to corerun, or by setting
an environment variable to the Core_Root folder.
```sh
diff --git a/docs/workflow/building/libraries/README.md b/docs/workflow/building/libraries/README.md
index 44eb0eb209ee..de6969f28658 100644
--- a/docs/workflow/building/libraries/README.md
+++ b/docs/workflow/building/libraries/README.md
@@ -9,11 +9,11 @@ Here is one example of a daily workflow for a developer working mainly on the li
git clean -xdf
git pull upstream master & git push origin master
:: Build Debug libraries on top of Release runtime:
-build -subset clr+libs -runtimeConfiguration Release
+build.cmd clr+libs -rc Release
:: The above you may only perform once in a day, or when you pull down significant new changes.
:: If you use Visual Studio, you might open System.Text.RegularExpressions.sln here.
-build -vs System.Text.RegularExpressions
+build.cmd -vs System.Text.RegularExpressions
:: Switch to working on a given library (RegularExpressions in this case)
cd src\libraries\System.Text.RegularExpressions
@@ -33,7 +33,7 @@ The instructions for Linux and macOS are essentially the same:
git clean -xdf
git pull upstream master & git push origin master
# Build Debug libraries on top of Release runtime:
-./build.sh -subset clr+libs -runtimeconfiguration Release
+./build.sh clr+libs -rc Release
# The above you may only perform once in a day, or when you pull down significant new changes.
# Switch to working on a given library (RegularExpressions in this case)
@@ -56,12 +56,12 @@ These example commands will build a release CoreCLR (and CoreLib), debug librari
For Linux:
```bash
-./build.sh -runtimeConfiguration Release
+./build.sh -rc Release
```
For Windows:
```bat
-./build.cmd -runtimeConfiguration Release
+./build.cmd -rc Release
```
Detailed information about building and testing runtimes and the libraries is in the documents linked below.
@@ -74,7 +74,7 @@ The libraries build has two logical components, the native build which produces
The build settings (BuildTargetFramework, TargetOS, Configuration, Architecture) are generally defaulted based on where you are building (i.e. which OS or which architecture) but we have a few shortcuts for the individual properties that can be passed to the build scripts:
-- `-framework|-f` identifies the target framework for the build. Possible values include `net5.0` (currently the latest .NET version) or `net472`. (msbuild property `BuildTargetFramework`)
+- `-framework|-f` identifies the target framework for the build. Possible values include `net5.0` (currently the latest .NET version) or `net48` (the latest .NETFramework version). (msbuild property `BuildTargetFramework`)
- `-os` identifies the OS for the build. It defaults to the OS you are running on but possible values include `Windows_NT`, `Unix`, `Linux`, or `OSX`. (msbuild property `TargetOS`)
- `-configuration|-c Debug|Release` controls the optimization level the compilers use for the build. It defaults to `Debug`. (msbuild property `Configuration`)
- `-arch` identifies the architecture for the build. It defaults to `x64` but possible values include `x64`, `x86`, `arm`, or `arm64`. (msbuild property `TargetArchitecture`)
@@ -83,26 +83,20 @@ For more details on the build settings see [project-guidelines](../../../coding-
If you invoke the `build` script without any actions, the default action chain `-restore -build` is executed.
-By default the `build` script only builds the product libraries and none of the tests. If you want to include tests, you want to add the subset `-subset libtests`. If you want to run the tests you want to use the `-test` action instead of the `-build`, e.g. `build.cmd/sh -subset libs.tests -test`. To specify just the libraries, use `-subset libs`.
+By default the `build` script only builds the product libraries and none of the tests. If you want to include tests, you want to add the subset `libs.tests`. If you want to run the tests you want to use the `-test` action instead of the `-build`, e.g. `build.cmd/sh libs.tests -test`. To specify just the libraries, use `libs`.
**Examples**
- Building in release mode for platform x64 (restore and build are implicit here as no actions are passed in)
```bash
-./build.sh -subset libs -c Release -arch x64
+./build.sh libs -c Release -arch x64
```
- Building the src assemblies and build and run tests (running all tests takes a considerable amount of time!)
```bash
-./build.sh -subset libs -test
+./build.sh libs -test
```
-- Building for different target frameworks (restore and build are implicit again as no action is passed in)
-```bash
-./build.sh -subset libs -framework net5.0
-./build.sh -subset libs -framework net472
-```
-
-- Clean the entire solution
+- Clean the entire artifacts folder
```bash
./build.sh -clean
```
@@ -191,7 +185,7 @@ You can iterate on `System.Private.CoreLib` by running:
build.cmd clr.corelib+clr.nativecorelib+libs.pretest -rc Release
```
-When this `System.Private.CoreLib` will be built in Release mode, then it will be crossgen'd and we will update the testhost to the latest version of corelib.
+When this `System.Private.CoreLib` will be built in Release mode, then it will be crossgen'd and we will update the testhost to the latest version of corelib.
You can use the same workflow for mono runtime by using `mono.corelib+libs.pretest` subsets.
@@ -199,24 +193,24 @@ You can use the same workflow for mono runtime by using `mono.corelib+libs.prete
By default the libraries will attempt to build using the CoreCLR version of `System.Private.CoreLib.dll`. In order to build against the Mono version you need to use the `/p:RuntimeFlavor=Mono` argument.
```
-.\build.cmd -subset libs /p:RuntimeFlavor=Mono
+.\build.cmd libs /p:RuntimeFlavor=Mono
```
### Building all for other OSes
By default, building from the root will only build the libraries for the OS you are running on. One can
-build for another OS by specifying `./build.sh -subset libs -os [value]`.
+build for another OS by specifying `./build.sh libs -os [value]`.
Note that you cannot generally build native components for another OS but you can for managed components so if you need to do that you can do it at the individual project level or build all via passing `/p:BuildNative=false`.
### Building in Release or Debug
By default, building from the root or within a project will build the libraries in Debug mode.
-One can build in Debug or Release mode from the root by doing `./build.sh -subset libs -c Release` or `./build.sh -subset libs -c Debug`.
+One can build in Debug or Release mode from the root by doing `./build.sh libs -c Release` or `./build.sh libs`.
### Building other Architectures
-One can build 32- or 64-bit binaries or for any architecture by specifying in the root `./build.sh -subset libs -arch [value]` or in a project `/p:TargetArchitecture=[value]` after the `dotnet build` command.
+One can build 32- or 64-bit binaries or for any architecture by specifying in the root `./build.sh libs -arch [value]` or in a project `/p:TargetArchitecture=[value]` after the `dotnet build` command.
## Working in Visual Studio
@@ -227,3 +221,17 @@ If you are working on Windows, and use Visual Studio, you can open individual li
For more details about running tests inside Visual Studio, [go here](../../testing/visualstudio.md).
For more about running tests, read the [running tests](../../testing/libraries/testing.md) document.
+
+## Build packages
+To build a library's package, simply invoke `dotnet pack` on the src project after you successfully built the .NETCoreApp vertical from root:
+
+```
+build libs
+dotnet pack src\libraries\System.Text.Json\src\
+```
+
+Same as for `dotnet build` or `dotnet publish`, you can specify the desired configuration via the `-c` flag:
+
+```
+dotnet pack src\libraries\System.Text.Json\src\ -c Release
+```
diff --git a/docs/workflow/building/libraries/cross-building.md b/docs/workflow/building/libraries/cross-building.md
index c7b0fe1fda42..24393ba5cf73 100644
--- a/docs/workflow/building/libraries/cross-building.md
+++ b/docs/workflow/building/libraries/cross-building.md
@@ -90,7 +90,7 @@ The output is at `artifacts/bin/[BuildSettings]` where `BuildSettings` looks som
Building corefx for Linux ARM Emulator
=======================================
-It is possible to build corefx binaries (native and managed) for the Linux ARM Emulator (latest version provided here: [#3805](https://github.com/dotnet/coreclr/issues/3805)).
+It is possible to build corefx binaries (native and managed) for the Linux ARM Emulator (latest version provided here: [#5394](https://github.com/dotnet/runtime/issues/5394)).
The `scripts/arm32_ci_script.sh` script does this.
The following instructions assume that:
diff --git a/docs/workflow/building/libraries/freebsd-instructions.md b/docs/workflow/building/libraries/freebsd-instructions.md
index 09008a4f49c4..d62686b60839 100644
--- a/docs/workflow/building/libraries/freebsd-instructions.md
+++ b/docs/workflow/building/libraries/freebsd-instructions.md
@@ -20,18 +20,18 @@ This is certainly undesirable and it should be avoided if possible.
```
mkdir ~/dotnet
cd ~/dotnet
-curl https://dotnetcli.blob.core.windows.net/dotnet/Sdk/master/dotnet-sdk-latest-freebsd-x64.tar.gz | tar xfz -
+curl https://dotnetcli.blob.core.windows.net/dotnet/Sdk/master/dotnet-sdk-latest-freebsd-x64.tar.gz | tar xfz -
```
-if on 12.x you may also need to set `LD_PRELOAD` to `/usr/lib/libpthread.so` to avoid issue when cli freezes.
+if on 12.x you may also need to set `LD_PRELOAD` to `/usr/lib/libpthread.so` to avoid issue when cli freezes.
As of summer 2019 this CLI is no longer good enough to build all repos. If that is your case jump to section [Updating CLI](#updating--bootstrap-cli)
Binary snapshot can be obtained from https://github.com/wfurt/blob as dotnet-sdk-freebsd-x64-latest.tgz
## Getting sources
-master of source-build pulls in source code of specific snapshot instead of tip of master branches.
-That is generally OK but in case of FreeBSD it may miss some changes crucial for build.
-(or pending un-submitted change)
+master of source-build pulls in source code of specific snapshot instead of tip of master branches.
+That is generally OK but in case of FreeBSD it may miss some changes crucial for build.
+(or pending un-submitted change)
```
git clone https://github.com/dotnet/source-build
@@ -44,9 +44,9 @@ git submodule update
(cd src/coreclr ; git checkout master)
```
-port change from
+port change from
```https://github.com/dotnet/corefx/commit/037859ac403ef17879655bb2f2e821d52e6eb4f3```
-In ideal case we could sync up to **master** but that brings Arcade changes and **breaks** the build.
+In ideal case we could sync up to **master** but that brings Arcade changes and **breaks** the build.
Bootstrap Arcade
```
@@ -86,8 +86,8 @@ index 81b8c7b..bb26868 100644
$(BuildArguments) -PortableBuild=$(PortableBuild)
```
-Depending of the day and moon phase you may need to get some updates as well.
-If build breaks look for pending PRs with FreeBSD tag or label and pull pending changes.
+Depending of the day and moon phase you may need to get some updates as well.
+If build breaks look for pending PRs with FreeBSD tag or label and pull pending changes.
## Building
@@ -106,7 +106,7 @@ export DOTNET_CLI_TELEMETRY_OPTOUT=1
```
In ideal situation this will build whole sdk. Right now it fails somewhere in cli.
-There is problem with rebuild and build will attempt to patch files again and/or make git updates.
+There is problem with rebuild and build will attempt to patch files again and/or make git updates.
```export SOURCE_BUILD_SKIP_SUBMODULE_CHECK=1```
@@ -114,23 +114,23 @@ To build single repo again one can do:
```./build.sh /p:RootRepo=corefx /p:SkipRepoReferences=true ```
## Resolving issues
-Rebuild or source-build has issues.
-Often running ```clean.sh``` from top helps. Be careful, that may undo any local pending changes.
+Rebuild or source-build has issues.
+Often running ```clean.sh``` from top helps. Be careful, that may undo any local pending changes.
Sometimes it would try to apply patches and it would fail.
-You can pass
-```/p:SkipPatches=true``` to top level build.sh script.
+You can pass
+```/p:SkipPatches=true``` to top level build.sh script.
## Running CoreFX tests
-Follow steps above to build at least corefx and it's dependencies.
+Follow steps above to build at least corefx and it's dependencies.
TBD
## Updating bootstrap CLI.
-As build changes, previous versions of CLI may not be good enough any more. Changes in runtime or build dependency on 3.0 JSON are some example of braking changes. Following steps outline steps to update published CLI to what build needs. It will require other system where builds is supported. As close similarity and availability Linux will be used in examples bellow but Windows or MacOS should also yield same result.
+As build changes, previous versions of CLI may not be good enough any more. Changes in runtime or build dependency on 3.0 JSON are some example of braking changes. Following steps outline steps to update published CLI to what build needs. It will require other system where builds is supported. As close similarity and availability Linux will be used in examples bellow but Windows or MacOS should also yield same result.
Often build would ask for slightly different version without actually have real dependency on it (that is part of rolling updates across repos).
One can cheat in this case and simply:
@@ -138,12 +138,12 @@ One can cheat in this case and simply:
ln -s ~/dotnet/sdk/old_version ~/dotnet/sdk/new_version
```
-
+
### Finding versions and commit hashes
-First we need to find what version are are trying to recreate. That is 'sdk' section in global.json in each repo. As of preview9ih time, this is set to 3.0.100-preview6-012264 and such version will be used in examples. One advantage of using release branches is that it is in coherent state e.g. all repos should need exactly same version.
+First we need to find what version are are trying to recreate. That is 'sdk' section in global.json in each repo. As of preview9ih time, this is set to 3.0.100-preview6-012264 and such version will be used in examples. One advantage of using release branches is that it is in coherent state e.g. all repos should need exactly same version.
-Let's get SDK for supported OS. Sync code base to same version you are trying to build on FreeBSD.
+Let's get SDK for supported OS. Sync code base to same version you are trying to build on FreeBSD.
```
./eng/common/build.sh --restore
Downloading 'https://dot.net/v1/dotnet-install.sh'
@@ -186,7 +186,7 @@ cd core-sdk
git checkout be3f0c1a03f80492d45396c9f5b855b10a8a0b79
```
-Set variables and assemble SKD without crossgen. (set DropSuffix=true to strip `preview6` from version).
+Set variables and assemble SKD without crossgen. (set DropSuffix=true to strip `preview6` from version).
```
export DISABLE_CROSSGEN=true
export CLIBUILD_SKIP_TESTS=true
@@ -212,7 +212,7 @@ cd coreclr
git checkout 7ec87b0097fdd4400a8632a2eae56612914579ef
```
-and build
+and build
```
mkdir -p .dotnet
curl https://dotnetcli.blob.core.windows.net/dotnet/Sdk/master/dotnet-sdk-latest-freebsd-x64.tar.gz | tar xfz - -C .dotnet
@@ -247,7 +247,7 @@ git checkout d47cae744ddfb625db8e391cecb261e4c3d7bb1c
```
#### Building core-setup
-As this has very little platform dependency it is unlikely this needs to be touched.
+As this has very little platform dependency it is unlikely this needs to be touched.
If we want to do this to pick up fix or for consistency than ... TBD
```
diff --git a/docs/workflow/building/libraries/webassembly-instructions.md b/docs/workflow/building/libraries/webassembly-instructions.md
index c3195a30665e..d8667ddec1a0 100644
--- a/docs/workflow/building/libraries/webassembly-instructions.md
+++ b/docs/workflow/building/libraries/webassembly-instructions.md
@@ -4,108 +4,123 @@
If you haven't already done so, please read [this document](../../README.md#Build_Requirements) to understand the build requirements for your operating system.
-An installation of the emsdk needs to be installed. Follow the installation guide [here](https://emscripten.org/docs/getting_started/downloads.html#sdk-download-and-install). Once installed the EMSDK_PATH needs to be set:
+The Emscripten SDK (emsdk) needs to be installed. Follow the installation guide [here](https://emscripten.org/docs/getting_started/downloads.html#sdk-download-and-install) or run `make -C src/mono/wasm provision-wasm` to install emsdk into `src/mono/wasm/emsdk`.
-On Linux and MacOSX:
+Once installed the `EMSDK_PATH` environment variable needs to be set:
+
+On Linux and macOS:
```bash
-export EMSDK_PATH=PATH_TO_SDK_INSTALL/emsdk
+export EMSDK_PATH=/emsdk
```
## Building everything
-At this time no other build configurations are necessary to start building for WebAssembly. The CoreLib for WebAssembly build configurations will be built by default using the WebAssembly configuration shown below.
+At this time no other build dependencies are necessary to start building for WebAssembly.
-This document explains how to work on libraries. In order to work on library projects or run library tests it is necessary to have built the runtime to give the libraries something to run on. If you haven't already done so, please read [this document](../../README.md#Configurations) to understand configurations.
+This document explains how to work on the runtime or libraries. If you haven't already done so, please read [this document](../../README.md#Configurations) to understand configurations.
+For Linux and macOS:
-For Linux and MacOSX:
```bash
-./build.sh --arch wasm --os Browser --configuration release
+./build.sh -os Browser -configuration Release
```
-Detailed information about building and testing runtimes and the libraries is in the documents linked below.
+Artifacts will be placed in `artifacts/bin/microsoft.netcore.app.runtime.browser-wasm/Release/`. When rebuilding with `build.sh` after a code change, you need to ensure that the `mono.wasmruntime` and `libs.pretest` subsets are included even for a Mono-only change or this directory will not be updated (details below).
-## How to build native components only
+### Note: do not mix runtime and library configurations
-The libraries build contains some native code. This includes shims over libc, openssl, gssapi, and zlib. The build system uses CMake to generate Makefiles using clang. The build also uses git for generating some version information.
+At this time, it is not possible to specify different configurations for the runtime and libraries. That is mixing a Release `-runtimeConfiguration` with a Debug `-libraryConfiguration` (or `-configuration`), or vice versa will not work.
-**Examples**
+Please only use the `-configuration` option with `Debug` or `Release`, and do not specify a `-runtimeConfiguration` and `-libraryConfiguration`.
+
+This is tracked in https://github.com/dotnet/runtime/issues/42553
+
+
+## Building Mono's System.Private.CoreLib or runtime
+
+If you are working on core parts of Mono you will probably need to build the Mono runtime and [System.Private.CoreLib](../../../design/coreclr/botr/corelib.md) which can be built with the following:
-- Building in debug mode for platform wasm and Browser operating system
```bash
-./build.sh --arch wasm --os Browser --subset Libs.Native --configuration Debug
+./build.sh mono -os Browser -c Debug|Release
```
-- Building in release mode for platform wasm and Browser operating system
+To build just System.Private.CoreLib without the Mono runtime you can use the `Mono.CoreLib` subset:
+
```bash
-./build.sh --arch wasm --os Browser --subset Libs.Native --configuration Release
+./build.sh mono.corelib -os Browser -c Debug|Release
```
-## How to build mono System.Private.CoreLib
+To build just the Mono runtime without System.Private.CoreLib use the `Mono.Runtime` subset:
-If you are working on core parts of mono libraries you will probably need to build the [System.Private.CoreLib](../../../design/coreclr/botr/corelib.md) which can be built with the following:
+```bash
+./build.sh mono.runtime -os Browser -c Debug|Release
+```
+Building both Mono/System.Private.CoreLib and the managed libraries:
```bash
-./build.sh --arch wasm --os Browser --configuration release --subset Mono
+./build.sh mono+libs -os Browser -c Debug|Release
```
-To build just SPC without mono you can use the Mono.CoreLib subset.
+## Building the WebAssembly runtime files
+
+The WebAssembly implementation files are built after the libraries source build and made available in the artifacts folder. If you are working on the code base and need to compile just these modules then building the `Mono.WasmRuntime` subset will allow one to do that:
```bash
-./build.sh --arch wasm --os Browser --configuration release --subset Mono.CoreLib
+./build.sh mono.wasmruntime -os Browser -c Debug|Release
```
+## Updating in-tree runtime pack
-Building the managed libraries as well:
+If you don't run the full `Libs` subset then you can use the `Libs.PreTest` subset to copy updated runtime/corelib binaries to the runtime pack which is used for running tests:
```bash
-./build.sh --arch wasm --os Browser --configuration release --subset Mono+Libs
+./build.sh libs.pretest -os Browser -c Debug|Release
+```
+
+## Building libraries native components only
+
+The libraries build contains some native code. This includes shims over libc, openssl, gssapi, and zlib. The build system uses CMake to generate Makefiles using clang. The build also uses git for generating some version information.
+
+```bash
+./build.sh libs.native -os Browser -c Debug|Release
```
## Building individual libraries
Individual projects and libraries can be build by specifying the build configuration.
-Building individual libraries
**Examples**
-- Build all projects for a given library (e.g.: System.Net.Http) including running the tests
+- Build all projects for a given library (e.g.: System.Net.Http) including the tests
```bash
- ./build.sh --arch wasm --os Browser --configuration release --projects src/libraries/System.Net.Http/System.Net.Http.sln
+./build.sh -os Browser -c Release --projects /src/libraries/System.Net.Http/System.Net.Http.sln
```
- Build only the source project of a given library (e.g.: System.Net.Http)
```bash
- ./build.sh --arch wasm --os Browser --configuration release --projects src/libraries/System.Net.Http/src/System.Net.Http.csproj
+ ./build.sh -os Browser -c Release --projects /src/libraries/System.Net.Http/src/System.Net.Http.csproj
```
More information and examples can be found in the [libraries](./README.md#building-individual-libraries) document.
-## Building the WebAssembly runtime files
-
-The WebAssembly implementation files are built and made available in the artifacts folder. If you are working on the code base and need to compile just these modules then the following will allow one to do that.
-
-For Linux and MacOSX:
-```bash
-./dotnet.sh build /p:Configuration=Debug|Release /p:TargetArchitecture=wasm /p:TargetOS=Browser src/libraries/src.proj /t:NativeBinPlace
-```
+## Notes
-__Note__: A `Debug` build sets the following environment variables by default. When built from the command line this way the `Configuration` value is case sensitive.
+A `Debug` build sets the following environment variables by default:
- debugging and logging which will log garbage collection information to the console.
```
- monoeg_g_setenv ("MONO_LOG_LEVEL", "debug", 0);
- monoeg_g_setenv ("MONO_LOG_MASK", "gc", 0);
+MONO_LOG_LEVEL=debug
+MONO_LOG_MASK=gc
```
#### Example:
```
-L: GC_MAJOR_SWEEP: major size: 752K in use: 39K
+L: GC_MAJOR_SWEEP: major size: 752K in use: 39K
L: GC_MAJOR: (user request) time 3.00ms, stw 3.00ms los size: 0K in use: 0K
```
@@ -126,7 +141,7 @@ First update emscripten version in the [webassembly Dockerfile](https://github.c
ENV EMSCRIPTEN_VERSION=1.39.16
```
-Submit a PR request with the updated version, wait for all checks to pass and for the request to be merged. A [master.json file](https://github.com/dotnet/versions/blob/master/build-info/docker/image-info.dotnet-dotnet-buildtools-prereqs-docker-master.json#L1126) will be updated with the a new docker image.
+Submit a PR request with the updated version, wait for all checks to pass and for the request to be merged. A [master.json file](https://github.com/dotnet/versions/blob/master/build-info/docker/image-info.dotnet-dotnet-buildtools-prereqs-docker-master.json#L1126) will be updated with the a new docker image.
```
{
@@ -155,4 +170,4 @@ container:
registry: mcr
```
-Open a PR request with the new image.
\ No newline at end of file
+Open a PR request with the new image.
diff --git a/docs/workflow/building/mono/README.md b/docs/workflow/building/mono/README.md
index 276ae512ceda..d1f2851ef217 100644
--- a/docs/workflow/building/mono/README.md
+++ b/docs/workflow/building/mono/README.md
@@ -10,19 +10,19 @@ Before proceeding further, please click on the link above that matches your mach
## Concept
-To build the Mono runtime, you must first do a complete runtime build (coreclr, libraries, and then mono). At the repo root, simply execute:
+To build a complete runtime environment, you need to build both the Mono runtime and libraries. At the repo root, simply execute:
```bash
-./build.sh
+./build.sh --subset mono+libs
```
or on Windows,
```bat
-build.cmd
+build.cmd -subset mono+libs
```
Note that the debug configuration is the default option. It generates a 'debug' output and that includes asserts, fewer code optimizations, and is easier for debugging. If you want to make performance measurements, or just want tests to execute more quickly, you can also build the 'release' version which does not have these checks by adding the flag `-configuration release` (or `-c release`).
-
-Once you've built the whole runtime and assuming you want to work with just mono, you want to use the following command:
+
+Once you've built the complete runtime and assuming you want to work with just mono, you want to use the following command:
```bash
./build.sh --subset mono
@@ -40,7 +40,7 @@ Here are a list of build arguments that may be of use:
`/p:MonoEnableLlvm=true /p:MonoLLVMDir=path/to/llvm` - Builds mono w/ LLVM from a custom path
-`/p:MonoEnableLlvm=true /p:MonoLLVMDir=path/to/llvm /p:MonoLLVMUseCxx11Abi=true` - Builds mono w/ LLVM
+`/p:MonoEnableLlvm=true /p:MonoLLVMDir=path/to/llvm /p:MonoLLVMUseCxx11Abi=true` - Builds mono w/ LLVM
from a custom path (and that LLVM was built with C++11 ABI)
For `build.sh`
@@ -49,6 +49,18 @@ For `build.sh`
The build has a number of options that you can learn about using build -?.
+### WebAssembly
+
+See the instructions for [Building WebAssembly](../../building/libraries/webassembly-instructions.md).
+
+### Android
+
+See the instructions for [Testing Android](../../testing/libraries/testing-android.md)
+
+### iOS
+
+See the instructions for [Testing iOS](../../testing/libraries/testing-apple.md)
+
## Packages
To generate nuget packages:
@@ -68,7 +80,15 @@ The following packages will be created under `artifacts\packages\
- `transport.Microsoft.NETCore.Runtime.Mono.-dev..1.nupkg`
- `transport.runtime..Microsoft.NETCore.Runtime.Mono.-dev..1.nupkg`
-## Important Notes
+## To get started with "Hello World"
+
+Try the sample at `src/mono/netcore/sample/HelloWorld`.
+To run this sample, from the above folder
+```cd ../..
+make run-sample
+```
+
+## Important Notes
Test binaries are not yet available for mono.
diff --git a/docs/workflow/ci/coreclr-ci-health.md b/docs/workflow/ci/coreclr-ci-health.md
index 5e095b6af444..935b6c9087f4 100644
--- a/docs/workflow/ci/coreclr-ci-health.md
+++ b/docs/workflow/ci/coreclr-ci-health.md
@@ -1,10 +1,10 @@
# CI Health and Investigation
-`dotnet/runtime` runs testing accross many different architectures and operating systems. The breadth of testing that happens lends itself to a complex system which is susceptible to different points of failure.
+`dotnet/runtime` runs testing across many different architectures and operating systems. The breadth of testing that happens lends itself to a complex system which is susceptible to different points of failure.
Note that this document focuses on coreclr testing in `dotnet/runtime`.
-https://github.com/dotnet/coreclr/issues/27231 was opened as a way to simply view in one place all issues that are affecting `dotnet/runtime`'s CI.
+https://github.com/dotnet/runtime/issues/702 was opened as a way to simply view in one place all issues that are affecting `dotnet/runtime`'s CI.
## TOC
@@ -15,7 +15,7 @@ https://github.com/dotnet/coreclr/issues/27231 was opened as a way to simply vie
#### Terminology
-In order to follow some of the terminology used, there is an expected familiarity of Azure DevOps required. For an in depth guide with Azure DevOps pipeline definitions, please see: https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema.
+In order to follow some of the terminology used, there is an expected familiarity of Azure DevOps required. For an in depth guide with Azure DevOps pipeline definitions, please see: https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema.
The most common terminology and most important are the different containers work happens in.
@@ -25,7 +25,7 @@ The most common terminology and most important are the different containers work
`Job`: Jobs are the smallest unit of work which happen on a unique machine. Jobs by default run in parallel, but may be set to depend on another job. **Every job executes its work on a unique machine**.
-`Steps`: Steps are the smallest unit of work, they generally correspond to one command that will happen in a job. Normally a job contains steps, which execute serially.
+`Steps`: Steps are the smallest unit of work, they generally correspond to one command that will happen in a job. Normally a job contains steps, which execute serially.
## CI Overview
@@ -103,7 +103,7 @@ In order to view the analytics of the pipeline navigate to [runtime-coreclr](htt
**Pipeline Pass Rate**
-This is tracking the pipeline pass rate generally over two weeks. This view is not very useful for [runtime-coreclr](https://dev.azure.com/dnceng/public/_build?definitionId=649) as the PR pipeline is expected to break during PR validation. Therefore, it is generally recommended to view [runtime-coreclr outerloop](https://dev.azure.com/dnceng/public/_build?definitionId=655) to get a better idea of what the overall success rate is for [runtime-coreclr](https://dev.azure.com/dnceng/public/_build?definitionId=228). Note that this is not exactly a fair comparison as we run signicantly more tests in [runtime-outerloop](https://dev.azure.com/dnceng/public/_build?definitionId=655) accross more platforms. It is however, a good proxy to see the overall CI health.
+This is tracking the pipeline pass rate generally over two weeks. This view is not very useful for [runtime-coreclr](https://dev.azure.com/dnceng/public/_build?definitionId=649) as the PR pipeline is expected to break during PR validation. Therefore, it is generally recommended to view [runtime-coreclr outerloop](https://dev.azure.com/dnceng/public/_build?definitionId=655) to get a better idea of what the overall success rate is for [runtime-coreclr](https://dev.azure.com/dnceng/public/_build?definitionId=228). Note that this is not exactly a fair comparison as we run signicantly more tests in [runtime-outerloop](https://dev.azure.com/dnceng/public/_build?definitionId=655) across more platforms. It is however, a good proxy to see the overall CI health.
Opening the [runtime-outerloop Pipeline Pass Rate](https://dev.azure.com/dnceng/public/_pipeline/analytics/stageawareoutcome?definitionId=655&contextType=build) there is a presentation of a line graph of the end to end success rate for the pipeline over time.
@@ -157,7 +157,7 @@ This tracks the overall end to end run time of a pipeline. This graph is useful
Specifically the query is useful for finding out whether a specific Helix Queue (a group of machines) is overloaded or not. This is useful for diagnosing arm hardware issues, because we have a fixed amount that is easily overloaded.
```
-WorkItems
+WorkItems
| where QueueName == "ubuntu.1804.armarch.open"
| extend DaysAgo = datetime_diff('Day', now(), Queued)
| extend QueueTimeInSeconds = datetime_diff('Second', Started, Queued)
diff --git a/docs/workflow/debugging/coreclr/debugging.md b/docs/workflow/debugging/coreclr/debugging.md
index 41a4b9c5dcaf..580032545d29 100644
--- a/docs/workflow/debugging/coreclr/debugging.md
+++ b/docs/workflow/debugging/coreclr/debugging.md
@@ -19,10 +19,18 @@ Debugging CoreCLR on Windows
7. Set Command Arguments=`` (e.g. HelloWorld.dll)
8. Set Working Directory=`$(SolutionDir)\..\..\..\bin\coreclr\Windows_NT.$(Platform).$(Configuration)`
1. This points to the folder containing CoreCLR binaries.
-9. Press F11 to start debugging at wmain in corerun (or set a breakpoint in source and press F5 to run to it)
+9. Set Environment=`CORE_LIBRARIES=$(SolutionDir)\..\..\..\bin\runtime\-Windows_NT-$(Configuration)-$(Platform)`,
+ where '\' is the target framework of current branch, for example `netcoreapp3.1` `net5.0`.
+ 1. This points to the folder containing core libraries except `System.Private.CoreLib`.
+ 2. This step can be skipped if you are debugging CLR tests that references only `System.Private.CoreLib`.
+ Otherwise, it's required to debug a realworld application that references anything else, including `System.Runtime`.
+10. Right-click the INSTALL project and choose 'Build'
+ 1. This will load necessary information from cmake to Visual Studio.
+11. Press F11 to start debugging at wmain in corerun (or set a breakpoint in source and press F5 to run to it)
1. As an example, set a breakpoint for the EEStartup function in ceemain.cpp to break into CoreCLR startup.
-Steps 1-8 only need to be done once, and then (9) can be repeated whenever you want to start debugging. The above can be done with Visual Studio 2013.
+Steps 1-10 only need to be done once, and then (11) can be repeated whenever you want to start debugging. The above can be done with Visual Studio 2019 as writing.
+Keeping with latest version of Visual Studio is recommended.
### Using SOS with windbg or cdb on Windows ###
diff --git a/docs/workflow/debugging/libraries/debugging-packages.md b/docs/workflow/debugging/libraries/debugging-packages.md
index 5b25a1ffb14f..f72887149b7f 100644
--- a/docs/workflow/debugging/libraries/debugging-packages.md
+++ b/docs/workflow/debugging/libraries/debugging-packages.md
@@ -14,13 +14,13 @@ Debugging CoreFX build issues
(This documentation is work in progress.)
-I found the following process to help when investigating some of the build issues caused by incorrect packaging.
+I found the following process to help when investigating some of the build issues caused by incorrect packaging.
-To quickly validate if a given project compiles on all supported configurations use `dotnet build /t:RebuildAll`. This applies for running tests as well. For more information, see [Building individual libraries](../../building/libraries/README.md#building-individual-libraries)
+To quickly validate if a given project compiles on all supported configurations use `dotnet build /t:RebuildAll`. This applies for running tests as well. For more information, see [Building individual libraries](../../building/libraries/README.md#building-individual-libraries)
Assuming the current directory is `\src\contractname\`:
-1. Build the `\ref` folder: `dotnet build`
+1. Build the `\ref` folder: `dotnet build`
Check the logs for output such as:
@@ -58,7 +58,7 @@ Use the same technique above to ensure that the binaries include the correct imp
Ensure that all Build Pivots are actually being built. This should build all .\ref and .\src variations as well as actually creating the NuGet packages.
-Verify that the contents of the nuspec as well as the actual package is correct. You can find the packages by searching for the following pattern in the msbuild output:
+Verify that the contents of the nuspec as well as the actual package is correct. You can find the packages by searching for the following pattern in the msbuild output:
```
GetPkgProjPackageDependencies:
diff --git a/docs/workflow/debugging/libraries/windows-instructions.md b/docs/workflow/debugging/libraries/windows-instructions.md
index ec075d8b10bd..46d916e74da8 100644
--- a/docs/workflow/debugging/libraries/windows-instructions.md
+++ b/docs/workflow/debugging/libraries/windows-instructions.md
@@ -25,16 +25,16 @@ As Administrator:
windbg -I
```
-You may need to do this for both x64 and x86 versions.
+You may need to do this for both x64 and x86 versions.
Any application that crashes should now automatically start a WinDBG session.
## Debugging tests
To run a single test from command line:
-* Locate the test binary folder based on the CSPROJ name.
+* Locate the test binary folder based on the CSPROJ name.
For example: `src\System.Net.Sockets\tests\Functional\System.Net.Sockets.Tests.csproj` will build and output binaries at `bin\tests\Windows_NT.AnyCPU.Debug\System.Net.Sockets.Tests\netcoreapp1.0`.
-
+
* Execute the test
Assuming that your repo is at `C:\corefx`:
@@ -44,7 +44,7 @@ cd C:\corefx\bin\tests\Windows_NT.AnyCPU.Debug\System.Net.Sockets.Tests\netcorea
C:\corefx\bin\tests\Windows_NT.AnyCPU.Debug\System.Net.Sockets.Tests\netcoreapp1.0\CoreRun.exe xunit.console.dll System.Net.Sockets.Tests.dll -xml testResults.xml -notrait category=nonwindowstests -notrait category=OuterLoop -notrait category=failing
```
-* If the test crashes or encounters a `Debugger.Launch()` method call, WinDBG will automatically start and attach to the `CoreRun.exe` process
+* If the test crashes or encounters a `Debugger.Launch()` method call, WinDBG will automatically start and attach to the `CoreRun.exe` process
The following commands will properly configure the debugging extension and fix symbol and source-code references:
@@ -129,7 +129,7 @@ Logs are going to be placed in %SYSTEMDRIVE%\sockets.etl.
1. Install [PerfView](https://github.com/Microsoft/perfview/blob/master/documentation/Downloading.md)
2. Run PerfView as Administrator
-3. Press Alt+C to collect events
+3. Press Alt+C to collect events
4. Disable all other collection parameters
5. Add Additional Providers (see below - Important: keep the "*" wildcard before the names.)
@@ -137,7 +137,7 @@ Logs are going to be placed in %SYSTEMDRIVE%\sockets.etl.
### Built-in EventSource tracing
-The following EventSources are built-in to CoreFX. The ones that are not marked as [__TestCode__] can be enabled in production scenarios for log collection.
+The following EventSources are built-in to CoreFX. The ones that are not marked as [__TestCode__] can be enabled in production scenarios for log collection.
#### Global
* `*System.Diagnostics.Eventing.FrameworkEventSource {8E9F5090-2D75-4d03-8A81-E5AFBF85DAF1}`: Global EventSource used by multiple namespaces.
@@ -169,5 +169,5 @@ Helper scripts are available at https://github.com/dotnet/runtime/tree/master/sr
* `*System.Threading.Tasks.Parallel.EventSource`: Provides an event source for tracing TPL information.
* `*System.Threading.Tasks.Dataflow.DataflowEventSource {16F53577-E41D-43D4-B47E-C17025BF4025}`: Provides an event source for tracing Dataflow information.
-## Notes
+## Notes
* You can find the test invocation command-line by looking at the logs generated after the `dotnet build /t:test` within the test folder.
diff --git a/docs/workflow/editing-and-debugging.md b/docs/workflow/editing-and-debugging.md
index e5c142966663..5143ca82b240 100644
--- a/docs/workflow/editing-and-debugging.md
+++ b/docs/workflow/editing-and-debugging.md
@@ -31,7 +31,7 @@ what are in the repository. In particular
Thus opening one of these two solution files (double clicking on them in Explorer) is typically all you need
to do most editing.
-Notice that the CoreCLR solution is under the 'bin' directory. This is because it is created as part of the build.
+Notice that the CoreCLR solution is under the `artifacts` directory. This is because it is created as part of the build.
Thus you can only launch this solution after you have built at least once.
* See [Debugging CoreCLR](debugging/coreclr/debugging.md)
diff --git a/docs/workflow/requirements/freebsd-requirements.md b/docs/workflow/requirements/freebsd-requirements.md
index 59b3c64d928f..986425cbe3e8 100644
--- a/docs/workflow/requirements/freebsd-requirements.md
+++ b/docs/workflow/requirements/freebsd-requirements.md
@@ -21,7 +21,7 @@ with all needed prerequisites to build. As the example bellow may become stale,
```sh
TAG=mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-freebsd-11-20200430154008-a84b0d2
-docker run --rm --volume $(pwd):$(pwd) --workdir $(pwd) --env ROOTFS_DIR=/crossrootfs/x64 -ti $TAG ./build.sh -cross -FreeBSD
+docker run --rm --volume $(pwd):$(pwd) --workdir $(pwd) --env ROOTFS_DIR=/crossrootfs/x64 -ti $TAG ./build.sh -cross -os FreeBSD
```
Build using Toolchain Setup
@@ -57,11 +57,12 @@ Install the following packages:
- lttng-ust
- krb5
- openssl (optional)
+- ninja (optional, enables building native code with ninja instead of make)
The lines to install all the packages above using package manager.
```sh
-sudo pkg install --yes libunwind icu libinotify lttng-ust krb5 cmake autoconf automake openssl
+sudo pkg install --yes libunwind icu libinotify lttng-ust krb5 cmake autoconf automake openssl ninja
```
Additionally, working dotnet cli with SDK is needed. On other platforms this would be downloaded automatically during build but it is not currently available for FreeBSD.
diff --git a/docs/workflow/requirements/linux-requirements.md b/docs/workflow/requirements/linux-requirements.md
index 0cdd9cc39978..7563fdf7d7c0 100644
--- a/docs/workflow/requirements/linux-requirements.md
+++ b/docs/workflow/requirements/linux-requirements.md
@@ -50,13 +50,19 @@ Install the following packages for the toolchain:
- libkrb5-dev
- libnuma-dev (optional, enables numa support)
- zlib1g-dev
+- ninja (optional, enables building native code with ninja instead of make)
The following dependencies are needed if Mono Runtime is enabled (default behavior):
- autoconf
- automake
-- libtool
+- libtool
- ~$ sudo apt-get install cmake llvm-9 clang-9 autoconf automake libtool build-essential python curl git lldb-6.0 liblldb-6.0-dev libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev libssl-dev libnuma-dev libkrb5-dev zlib1g-dev
+```
+sudo apt-get install -y cmake llvm-9 clang-9 autoconf automake \
+libtool build-essential python curl git lldb-6.0 liblldb-6.0-dev \
+libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev \
+libssl-dev libnuma-dev libkrb5-dev zlib1g-dev ninja
+```
You now have all the required components.
diff --git a/docs/workflow/requirements/macos-requirements.md b/docs/workflow/requirements/macos-requirements.md
index 4604b87f60f8..d1ef93078164 100644
--- a/docs/workflow/requirements/macos-requirements.md
+++ b/docs/workflow/requirements/macos-requirements.md
@@ -28,8 +28,9 @@ Install the following packages:
- openssl 1.1
- pkg-config
- python3
+- ninja (optional, enables building native code with ninja instead of make)
-You can install all the packages above using Homebrew by running this command in the repository root:
+You can install all the required packages above using Homebrew by running this command in the repository root:
```
brew bundle --no-lock --file eng/Brewfile
diff --git a/docs/workflow/requirements/windows-requirements.md b/docs/workflow/requirements/windows-requirements.md
index 35229d2a3ea8..021145865c13 100644
--- a/docs/workflow/requirements/windows-requirements.md
+++ b/docs/workflow/requirements/windows-requirements.md
@@ -42,7 +42,13 @@ The dotnet/runtime repository requires at least Visual Studio 2019 16.6.
- Add its location (e.g. C:\Program Files (x86)\CMake\bin) to the PATH environment variable.
The installation script has a check box to do this, but you can do it yourself after the fact following the instructions at [Adding to the Default PATH variable](#adding-to-the-default-path-variable).
-The dotnet/runtime repository requires at least CMake 3.15.5.
+The dotnet/runtime repository recommends using CMake 3.16.0 or newer, but works with CMake 3.15.5.
+
+## Ninja (optional)
+
+- Install Ninja in one of the two following ways
+ - [Download the executable](https://github.com/ninja-build/ninja/releases) and add its location to [the Default PATH variable](#adding-to-the-default-path-variable).
+ - [Install via a package manager](https://github.com/ninja-build/ninja/wiki/Pre-built-Ninja-packages), which should automatically add it to the PATH environment variable.
## Python
diff --git a/docs/workflow/testing/coreclr/running-aspnet-benchmarks-with-crossgen2.md b/docs/workflow/testing/coreclr/running-aspnet-benchmarks-with-crossgen2.md
index 55ffc5f7459a..b68e3cebc080 100644
--- a/docs/workflow/testing/coreclr/running-aspnet-benchmarks-with-crossgen2.md
+++ b/docs/workflow/testing/coreclr/running-aspnet-benchmarks-with-crossgen2.md
@@ -24,16 +24,14 @@ For Windows:
```powershell
.\build.cmd -subset clr+libs -c release
-cd src\coreclr
-.\build-test.cmd Release generatelayoutonly
+.\src\tests\build.cmd Release generatelayoutonly
```
For Linux:
```bash
./build.sh -subset clr+libs -c release
-cd src/coreclr
-./build-test.sh -release -generatelayoutonly
+./src/tests/build.sh -release -generatelayoutonly
```
### Generate a Configuration File for ASP.NET Benchmarking Runs
@@ -84,10 +82,10 @@ profiles:
cores: 12
jobs:
application:
- endpoints:
+ endpoints:
- http://asp-perf-win:5001
load:
- endpoints:
+ endpoints:
- http://asp-perf-load:5001
aspnet-physical-lin:
@@ -96,18 +94,18 @@ profiles:
cores: 12
jobs:
application:
- endpoints:
+ endpoints:
- http://asp-perf-lin:5001
load:
- endpoints:
+ endpoints:
- http://asp-perf-load:5001
```
Now, what does this configuration mean and how is it applied? Let's go over
the most important fields to understand its main functionality.
-* **Imports**: These are external tools hosted in the Benchmarks repo.
-In this case, we only need `wrk`, which is a tool that loads and tests
+* **Imports**: These are external tools hosted in the Benchmarks repo.
+In this case, we only need `wrk`, which is a tool that loads and tests
performance in Web applications.
* **Jobs**: Here go the job descriptions. A job in this context is the set of
diff --git a/docs/workflow/testing/coreclr/testing.md b/docs/workflow/testing/coreclr/testing.md
index 286a425932be..23a7287d6abc 100644
--- a/docs/workflow/testing/coreclr/testing.md
+++ b/docs/workflow/testing/coreclr/testing.md
@@ -9,9 +9,9 @@ Details on test metadata can be found in [test-configuration.md](test-configurat
* [macOS](../../building/coreclr/osx-instructions.md)
* [Windows](../../building/coreclr/README.md)
2) [Build the libraries](../../building/libraries/README.md) in Release configuration. Pass the configuration of CoreCLR you just built to the build script (e.g. `-runtimeconfiguration debug`).
-3) From the `src/coreclr` directory run the following command:
- * Non-Windows - `./build-test.sh`
- * Windows - `build-test.cmd`
+3) From the root directory run the following command:
+ * Non-Windows - `src/tests/build.sh`
+ * Windows - `src\tests\build.cmd`
* Supply `-h` for usage flags
### Test priority
@@ -21,16 +21,16 @@ The CoreCLR tests have two priorities, 0 and 1. The priority 0 tests run by defa
### Examples
* Build all tests priority 1 and higher
- * `build-test.cmd -priority=1`
- * `build-test.sh -priority1`
+ * `build.cmd -priority=1`
+ * `build.sh -priority1`
## Build Individual Test
Note: CoreCLR must be built prior to building an individual test. See the first step, above, for building all tests.
* Native Test: Build the generated CMake projects
- * Projects are auto-generated when the `build-test.sh`/`build-test.cmd` script is run
- * It is possible to explicitly run only the native test build with `build-test.sh/cmd skipmanaged`
+ * Projects are auto-generated when the `build.sh`/`build.cmd` script is run
+ * It is possible to explicitly run only the native test build with `build.sh/cmd skipmanaged`
* Managed Test: Invoke `dotnet build` on the project directly. `dotnet` can be the `dotnet.sh` or `dotnet.cmd` script in the repo root.
```
/dotnet.sh build /src/coreclr/tests/src/JIT/CodegenBringupTests/Array1_d.csproj /p:Configuration=Release
diff --git a/docs/workflow/testing/coreclr/unix-test-instructions.md b/docs/workflow/testing/coreclr/unix-test-instructions.md
index 6c86c041947e..aae608d27210 100644
--- a/docs/workflow/testing/coreclr/unix-test-instructions.md
+++ b/docs/workflow/testing/coreclr/unix-test-instructions.md
@@ -15,13 +15,13 @@ Dotnet CLI is required to build the tests. This can be done on any platform then
To build the tests on Unix:
```sh
-./src/coreclr/build-test.sh
+./src/tests/build.sh
```
Please note that this builds the Priority 0 tests. To build priority 1:
```sh
-./src/coreclr/build-test.sh -priority1
+./src/tests/build.sh -priority1
```
## Building Individual Tests
@@ -41,16 +41,16 @@ During development there are many instances where building an individual test is
The following instructions assume that on the Unix machine:
- The CoreCLR repo is cloned at `/mnt/coreclr`
-`src/coreclr/build-test.sh` will have set up the `Core_Root` directory correctly after the test build.
+`src/tests/build.sh` will have set up the `Core_Root` directory correctly after the test build.
```sh
-./src/coreclr/tests/runtest.sh x64 checked
+./src/tests/run.sh x64 checked
```
Please use the following command for help.
```sh
-./src/coreclr/tests/runtest.sh -h
+./src/tests/run.sh -h
```
### Unsupported and temporarily disabled tests
@@ -65,7 +65,7 @@ the conditional property
This property disables building of a test in a default build. It also
disables running a test in the bash/batch wrapper scripts. It allows the
test to be built on any target in CI when the `allTargets` option is
-passed to the `build-test.*` scripts.
+passed to the `build.*` scripts.
Tests which never should be built or run are marked
@@ -82,14 +82,23 @@ PAL tests
Build CoreCLR with PAL tests on the Unix machine:
```sh
-./src/coreclr/build-runtime.sh -skipgenerateversion -nopgooptimize \
- -cmakeargs -DCLR_CMAKE_BUILD_TESTS=1
+./build.sh clr.paltests
```
Run tests:
+To run all tests including disabled tests
```sh
-./src/coreclr/src/pal/tests/palsuite/runpaltests.sh $(pwd)/artifacts/obj/coreclr/$(uname).x64.Debug
+./src/coreclr/src/pal/tests/palsuite/runpaltests.sh $(pwd)/artifacts/bin/coreclr/$(uname).x64.Debug/paltests
+# on macOS, replace $(uname) with OSX
+```
+To only run enabled tests for the platform the tests were built for:
+```sh
+artifacts/bin/coreclr/$(uname).x64.Debug/paltests/runpaltests.sh $(pwd)/artifacts/bin/coreclr/$(uname).x64.Debug/paltests
+# on macOS, replace $(uname) with OSX
```
Test results will go into: `/tmp/PalTestOutput/default/pal_tests.xml`
+
+To disable tests in the CI edit
+`src/coreclr/src/pal/tests/palsuite/issues.targets`
diff --git a/docs/workflow/testing/coreclr/windows-test-instructions.md b/docs/workflow/testing/coreclr/windows-test-instructions.md
index 1dc8551c9514..c581c3529e96 100644
--- a/docs/workflow/testing/coreclr/windows-test-instructions.md
+++ b/docs/workflow/testing/coreclr/windows-test-instructions.md
@@ -6,13 +6,13 @@ Building and running tests on Windows
Building coreclr tests must be done using a specific script as follows:
```
-> src\coreclr\build-test.cmd
+> src\tests\build.cmd
```
## Building Precompiled Tests
```
-> src\coreclr\build-test.cmd crossgen
+> src\tests\build.cmd crossgen
```
This will use `crossgen.exe` to precompile test executables before they are executed.
@@ -20,7 +20,7 @@ This will use `crossgen.exe` to precompile test executables before they are exec
## Building Specific Priority Tests
```
-> src\coreclr\build-test.cmd -priority=1
+> src\tests\build.cmd -priority=1
```
The above is an example of requesting that priority '1' and below be built. The default priority value is '0'. If '1' is specified, all tests with `CLRTestPriorty` `0` **and** `1` will be built and run.
@@ -30,18 +30,18 @@ The above is an example of requesting that priority '1' and below be built. The
To run a priority '0' and '1' and crossgen'd test pass:
```
-> src\coreclr\build-test.cmd crossgen -priority=1
+> src\tests\build.cmd crossgen -priority=1
```
For additional supported parameters use the following:
```
-> src\coreclr\build-test.cmd -?
+> src\tests\build.cmd -?
```
### Building Individual Tests
-**Note:** `build-test.cmd skipmanaged [Any additional flags]` needs to be run at least once if the individual test has native assets.
+**Note:** `build.cmd skipmanaged [Any additional flags]` needs to be run at least once if the individual test has native assets.
* Native Test: Build the generated Visual Studio solution or makefile corresponding to test cmake file.
@@ -52,13 +52,13 @@ For additional supported parameters use the following:
Will list supported parameters.
```
-> src\coreclr\tests\runtest.cmd /?
+> src\tests\run.cmd /?
```
In order to run all of the tests using your checked build:
```
-> src\coreclr\tests\runtest.cmd checked
+> src\tests\run.cmd checked
```
This will generate a report named `TestRun__.html` (e.g. `TestRun_Windows_NT_x64_Checked.html`) in the subdirectory `\artifacts\log`. Any tests that failed will be listed in `TestRunResults_Windows_NT_x64_Checked.err`.
@@ -78,7 +78,7 @@ There are 2 files of interest:
If you wish to re-run a failed test, follow the following steps:
-1) Set an environment variable, `CORE_ROOT`, pointing to the path to product binaries that was passed to runtest.cmd.
+1) Set an environment variable, `CORE_ROOT`, pointing to the path to product binaries that was passed to run.cmd.
For example using a checked build the location would be: `\artifacts\tests\coreclr\Windows_NT.x64.Checked\Tests\Core_Root`
2) Run the failed test, the command to which is also present in the test report for a failed test. It will be something like `\artifacts\tests\coreclr\Windows_NT.x64.Checked\Exceptions\Finalization\Finalizer.cmd`.
diff --git a/docs/workflow/testing/libraries/testing-android.md b/docs/workflow/testing/libraries/testing-android.md
index 7ac22f84062f..5ad1b27f7900 100644
--- a/docs/workflow/testing/libraries/testing-android.md
+++ b/docs/workflow/testing/libraries/testing-android.md
@@ -88,4 +88,4 @@ Or simply open `logcat` window in Android Studio or Visual Stuido.
### Existing Limitations
- `-os Android` is not supported for Windows yet (`WSL` can be used instead)
- XHarness.CLI is not able to boot emulators yet (so you need to boot via `AVD Manager` or IDE)
-- AOT and Interpreter modes are not supported yet
\ No newline at end of file
+- AOT and Interpreter modes are not supported yet
diff --git a/docs/workflow/testing/libraries/testing-wasm.md b/docs/workflow/testing/libraries/testing-wasm.md
index 8e067e9f6e49..7e530859bed4 100644
--- a/docs/workflow/testing/libraries/testing-wasm.md
+++ b/docs/workflow/testing/libraries/testing-wasm.md
@@ -7,14 +7,14 @@ In order to be able to run tests, the following JavaScript engines should be ins
They can be installed as a part of [jsvu](https://github.com/GoogleChromeLabs/jsvu).
-Please make sure that a JavaScript engine binary is available via command line,
+Please make sure that a JavaScript engine binary is available via command line,
e.g. for V8:
```bash
$ v8
V8 version 8.5.62
```
-If you use `jsvu`, first add its location to PATH variable
+If you use `jsvu`, first add its location to PATH variable
e.g. for V8
```bash
@@ -25,24 +25,24 @@ PATH=/Users//.jsvu/:$PATH V8
Now we're ready to build everything for WebAssembly (for more details, please read [this document](../../building/libraries/webassembly-instructions.md#building-everything)):
```bash
-./build.sh --arch wasm --os Browser -c release
+./build.sh -os Browser -c Release
```
and even run tests one by one for each library:
```
-./build.sh --subset libs.tests -t --arch wasm --os Browser -c release
+./build.sh libs.tests -test -os Browser -c Release
```
### Running individual test suites
The following shows how to run tests for a specific library
```
-./dotnet.sh build /t:Test src/libraries/System.AppContext/tests /p:TargetOS=Browser /p:TargetArchitecture=wasm /p:Configuration=release
+./dotnet.sh build /t:Test src/libraries/System.AppContext/tests /p:TargetOS=Browser /p:TargetArchitecture=wasm /p:Configuration=Release
```
### Running tests using different JavaScript engines
-It's possible to set a JavaScript engine explicitly by adding `/p:JSEngine` property:
+It's possible to set a JavaScript engine explicitly by adding `/p:JSEngine` property:
```
-./dotnet.sh build /t:Test src/libraries/System.AppContext/tests /p:TargetOS=Browser /p:TargetArchitecture=wasm /p:Configuration=release /p:JSEngine=SpiderMonkey
+./dotnet.sh build /t:Test src/libraries/System.AppContext/tests /p:TargetOS=Browser /p:TargetArchitecture=wasm /p:Configuration=Release /p:JSEngine=SpiderMonkey
```
At the moment supported values are:
diff --git a/docs/workflow/testing/mono/testing.md b/docs/workflow/testing/mono/testing.md
index e710b77e00b4..1bffa1de3389 100644
--- a/docs/workflow/testing/mono/testing.md
+++ b/docs/workflow/testing/mono/testing.md
@@ -1,10 +1,10 @@
# Running Tests using Mono Runtime
## Running Runtime Tests
-We currently only support running tests against coreclr. There are additional mono runtime tests in mono/mono, but they
+We currently only support running tests against coreclr. There are additional mono runtime tests in mono/mono, but they
have not been moved over yet. Simply run the following command:
-```
+```
dotnet build /t:RunCoreClrTests $(REPO_ROOT)/src/mono/mono.proj
```
@@ -36,8 +36,8 @@ dotnet build /t:Test /p:RuntimeFlavor=mono
```
# Patching Local dotnet (.dotnet-mono)
-Another way to test mono out is by 'patching' a local dotnet with our runtime bits. This is a good way to write simple
-test programs and get a glimpse of how mono will work with the dotnet tooling.
+Another way to test mono out is by 'patching' a local dotnet with our runtime bits. This is a good way to write simple
+test programs and get a glimpse of how mono will work with the dotnet tooling.
To generate a local .dotnet-mono, execute this command:
@@ -51,4 +51,4 @@ You can then, for example, run our HelloWorld sample via:
dotnet build -c Release $(REPO_ROOT)/src/mono/netcore/sample/HelloWorld
MONO_ENV_OPTIONS="" COMPlus_DebugWriteToStdErr=1 \
$(REPO_ROOT)/.dotnet-mono/dotnet $(REPO_ROOT)/src/mono/netcore/sample/HelloWorld/bin/HelloWorld.dll
-```
\ No newline at end of file
+```
diff --git a/docs/workflow/testing/using-corerun.md b/docs/workflow/testing/using-corerun.md
index 989a44669d6a..01a2aedffa1b 100644
--- a/docs/workflow/testing/using-corerun.md
+++ b/docs/workflow/testing/using-corerun.md
@@ -61,7 +61,7 @@ your new runtime.
## How CoreCLR Tests use corerun.exe
-When you execute 'runtime/src/coreclr/build-test.cmd' one of the things that it does is set up a directory where it
+When you execute 'runtime/src/tests/build.cmd' one of the things that it does is set up a directory where it
gathers the CoreCLR that has just been built with the pieces of the class library that tests need.
It places this runtime in the directory
```bat
@@ -70,7 +70,7 @@ It places this runtime in the directory
off the CoreCLR Repository. The way the tests are expected to work is that you set the environment
variable CORE_ROOT to this directory
(you don't have to set CORE_LIBRARIES) and you can run any tests. For example after building the tests
-(running build-test at the repository base) and running 'test\runtest') you can do the following
+(running src\tests\build from the repository base) and running 'src\tests\run') you can do the following
```bat
set PATH=%PATH%;%CoreCLR%\artifacts\Product\Windows_NT.x64.Debug
diff --git a/docs/workflow/testing/using-your-build.md b/docs/workflow/testing/using-your-build.md
index 31a7f6bc8d3f..33e5ef19e174 100644
--- a/docs/workflow/testing/using-your-build.md
+++ b/docs/workflow/testing/using-your-build.md
@@ -1,7 +1,7 @@
# Using your .NET Runtime Build
-We assume that you have successfully built CoreCLR repository and thus have files of the form
+We assume that you have successfully built the repository and thus have files of the form
```
~/runtime/artifacts/bin/coreclr/../
```
@@ -11,7 +11,7 @@ a 'host' program that will load the Runtime as well as all the other .NET librar
code that your application needs. The easiest way to get all this other stuff is to simply use the
standard 'dotnet' host that installs with .NET SDK.
-The released version of 'dotnet' tool may not be compatible with the live CoreCLR repository. The following steps
+The released version of 'dotnet' tool may not be compatible with the live repository. The following steps
assume use of a dogfood build of the .NET SDK.
## Acquire the latest nightly .NET SDK
@@ -157,7 +157,7 @@ Assert failure(PID 13452 [0x0000348c], Thread: 10784 [0x2a20]): Consistency chec
## Using .NET SDK to run your .NET Application
If you don't like the idea of copying files manually you can follow [these instructions](../using-dotnet-cli.md) to use dotnet cli to do this for you.
-However the steps described here are the simplest and most commonly used by CoreCLR developers for ad-hoc testing.
+However the steps described here are the simplest and most commonly used by runtime developers for ad-hoc testing.
## Using CoreRun to run your .NET Application
diff --git a/docs/workflow/testing/visualstudio.md b/docs/workflow/testing/visualstudio.md
index c8c20b9cfc7f..b519aa3a400a 100644
--- a/docs/workflow/testing/visualstudio.md
+++ b/docs/workflow/testing/visualstudio.md
@@ -1,9 +1,25 @@
-# Visual Studio Test Explorer support
-For Visual Studio Test Explorer to work in dotnet/runtime, the following test settings need to be enabled:
-- Test parameters (like which `dotnet` host to use) are persisted in an auto-generated .runsettings file. For that to work, make sure that the "Auto detect runsettings Files" (`Options -> Test`) option is enabled.
-- Make sure that the "Processor Architecture for AnyCPU project" (`Test Explore pane -> Test Explorer toolbar options --> Settings`) value is set to `auto`.
+# Working in dotnet/runtime using Visual Studio
+
+Visual Studio is a great tool to use when working in the dotnet/runtime repo.
+
+Almost all its features should work well, but there are a few special considerations to bear in mind:
+
+## Test Explorer
+
+You can run tests from the Visual Studio Test Explorer, but there are a few settings you need:
+- Enable `Auto detect runsettings Files` (`Test Explorer window -> Settings button -> Options`). Test parameters (like which `dotnet` host to use) are persisted in an auto-generated .runsettings file, and it's important that Visual Studio knows to use it.
+- Set `Processor Architecture for AnyCPU project` to `auto` (`Test Explorer window -> Settings button`).
+- Consider whether to disable `Discover tests in real time from C# and Visual Basic .NET source files` (`Test explorer window -> Settings button -> Options`).
+ - You may want it enabled if you're actively writing new tests and want them to show up in Test Explorer without building first.
+ - You may want it disabled if you're mostly running existing tests, and some of them have conditional attributes. Many of our unit tests have attributes, like `[SkipOnTargetFramework]`, to indicate that they're only valid in certain configurations. Because the real-time discovery feature does not currently recognize these attributes the tests will show up in Test Explorer as well, and fail or possibly hang when you try to run them.
+- Consider whether to enable `Run tests in Parallel` (`Test Explorer window -> Settings button`).
+ - You may want it enabled if some of the unit tests you're working with run slowly or there's many of them.
+ - You may want it disabled if you want to simplify debugging or viewing debug output.
+
+If you encounter puzzling behavior while running tests within Visual Studio, first check the settings above, verify they run correctly from the command line, and also make sure you're using the latest Visual Studio. It can be helpful to enable detailed logging of the test runner (`Test explorer window -> Settings button -> Options > Logging Level: Trace`) - it may suggest the problem, or at least provide more information to share.
+
+## Start with Debugging (F5)
-# Visual Studio F5 Debugging support
dotnet/runtime uses `dotnet test` ([VSTest](https://github.com/Microsoft/vstest)) which spawns child processes during test execution.
Visual Studio by default doesn't automatically debug child processes, therefore preliminary steps need to be done to enable Debugging "F5" support.
Note that these steps aren't necessary for Visual Studio Test Explorer support.
@@ -14,3 +30,4 @@ Note that these steps aren't necessary for Visual Studio Test Explorer support.
## References
- https://github.com/dotnet/project-system/issues/6176 tracks enabling the native code debugging functionality for multiple projects without user interaction.
- https://github.com/dotnet/sdk/issues/7419#issuecomment-298261617 explains the necessary steps to install and enable the mentioned extension in more detail.
+- https://github.com/microsoft/vstest/ is the repo for issues with the Visual Studio test execution features.
diff --git a/docs/workflow/using-dotnet-cli.md b/docs/workflow/using-dotnet-cli.md
index 7c9efa28c829..8090f0eddc2c 100644
--- a/docs/workflow/using-dotnet-cli.md
+++ b/docs/workflow/using-dotnet-cli.md
@@ -1,23 +1,23 @@
# Using your .NET Runtime build with .NET SDK
-This walkthrough explains how to run against your local CoreCLR build using .NET SDK only.
+This walkthrough explains how to run your own app against your local build using only the .NET SDK.
For other walkthroughs see:
-- [Using Your Build - Update CoreCLR from raw binary output](./testing/using-your-build.md)
+- [Using Your Build - Update from raw build output](./testing/using-your-build.md)
- [Using CoreRun To Run .NET Application](./testing/using-corerun.md)
- [Dogfooding .NET SDK](https://github.com/dotnet/runtime/blob/master/docs/project/dogfooding.md).
## Prerequisites
-1. Successfully built CoreCLR repository and thus have files of the form shown below. From now on we call this folder NuGet package folder.
+1. Successfully built this repository and thus have files of the form shown below. From now on we call this folder NuGet package folder.
```
- artifacts\bin\coreclr\..\.nuget\pkg\runtime.-.Microsoft.NETCore.Runtime.CoreCLR..nupkg
+ artifacts\packages\\Shipping\
```
-2. Acquired the latest nightly .NET SDK from [here](https://github.com/dotnet/cli/blob/master/README.md#installers-and-binaries) and added it's root folder to your [path](requirements/windows-requirements.md#adding-to-the-default-path-variable)
+2. Acquired the latest nightly .NET SDK from [here](https://github.com/dotnet/installer) and added its root folder to your [path](requirements/windows-requirements.md#adding-to-the-default-path-variable)
## First Run
@@ -29,13 +29,11 @@ From now on all instructions relate to this folder as "app folder".
### 2. Create NuGet.Config file
-The build script creates NuGet packages and puts them to `artifacts\bin\coreclr\..\.nuget\pkg\`. .NET SDK has no idea about its existence and we need to tell it where to search for the packages.
+The build script creates NuGet packages and puts them to `artifacts\packages\\Shipping\`. .NET SDK has no idea about its existence and we need to tell it where to search for the packages.
Please run `dotnet new nugetconfig` in the app folder and update the created `NuGet.Config` file:
-* **set path to local CoreCLR NuGet folder!!**
-* add address to dotnet core tools NuGet feed
-
+* ** adjust path below to point to your in-repo NuGet folder**
```xml
@@ -44,11 +42,9 @@ Please run `dotnet new nugetconfig` in the app folder and update the created `Nu
-
-
+
-
```
### 3. Create and update the Project file
@@ -60,39 +56,37 @@ Please run `dotnet new console` in the app folder and update the created `.cspro
Exe
- netcoreapp3.0
+ net5.0win-x64
- 3.0.0-preview1-26210-0
-
-
+
```
-**You have to set the correct values for `RuntimeIdentifier` (RI), `RuntimeFrameworkVersion` and versions of both packages.**
+**You have to set the correct values for `RuntimeIdentifier` (RI) and `RuntimeFrameworkVersion`.**
You can generally figure that out by looking at the packages you found in your output.
-In our example you will see there is a package with the name `runtime.win-x64.Microsoft.NETCore.Runtime.CoreCLR.3.0.0-preview1-26210-0.nupkg`
+In our example you will see there is a package with the name `Microsoft.NETCore.App.Runtime.win-x64.5.0.0-dev.nupkg`
```
-runtime.win-x64.Microsoft.NETCore.Runtime.CoreCLR.3.0.0-preview1-26210-0.nupkg
- ^--RI---^ ^--------version-------^
+Microsoft.NETCore.App.Runtime.win-x64.5.0.0-dev.nupkg
+ ^-RI--^ ^version^
```
### 4. Change Program.cs
-To make sure that you run against your local coreclr build please change your `Main` method in `Program.cs` file to:
+To make sure that you run against your local build of this repo please change your `Main` method in `Program.cs` file to:
```cs
static void Main(string[] args)
{
- var coreAssemblyInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(object).Assembly.Location);
- Console.WriteLine($"Hello World from Core {coreAssemblyInfo.ProductVersion}");
- Console.WriteLine($"The location is {typeof(object).Assembly.Location}");
+ var coreAssemblyInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(typeof(object).Assembly.Location);
+ Console.WriteLine($"Hello World from .NET {coreAssemblyInfo.ProductVersion}");
+ Console.WriteLine($"The location is {typeof(object).Assembly.Location}");
}
```
@@ -108,40 +102,56 @@ dotnet publish
Make sure that restoring done by `dotnet publish` installed the explicit version of the Runtime that you have specified:
```
-PS C:\coreclr\helloWorld> dotnet publish
- Restoring packages for C:\coreclr\helloWorld\helloWorld.csproj...
- Installing runtime.win-x64.Microsoft.NETCore.Runtime.CoreCLR 3.0.0-preview1-26210-
+c:\runtime\helloworld>dotnet publish
+Microsoft (R) Build Engine version 16.7.0-preview-20360-03+188921e2f for .NET
+Copyright (C) Microsoft Corporation. All rights reserved.
+
+ Determining projects to restore...
+ Restored c:\runtime\helloworld\helloworld.csproj (in 114 ms).
+ You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
+ helloworld -> c:\runtime\helloworld\bin\Debug\net5.0\win-x64\helloworld.dll
+ helloworld -> c:\runtime\helloworld\bin\Debug\net5.0\win-x64\publish\
```
If you see something like the message below it means that it has failed to restore your local runtime packages. In such case double check your `NuGet.config` file and paths used in it.
```
-C:\coreclr\helloWorld\helloWorld.csproj : warning NU1603: helloWorld depends on runtime.win-x64.Microsoft.NETCore.Runtime.CoreCLR (>= 3.0.0-preview1-26210-0) but runtime.win-x64.Microsoft.NETCore.Runtime.CoreCLR 3.0.0-preview1-26210-0 was not found. An approximate best match of runtime.win-x64.Microsoft.NETCore.Runtime.CoreCLR 3.0.0-preview2-25501-02 was resolved.
+c:\runtime\helloworld>dotnet publish
+Microsoft (R) Build Engine version 16.7.0-preview-20360-03+188921e2f for .NET
+Copyright (C) Microsoft Corporation. All rights reserved.
+
+ Determining projects to restore...
+c:\runtime\helloworld\helloworld.csproj : error NU1102: Unable to find package Microsoft.NETCore.App.Runtime.win-x64 with version (= 5.0.0-does-not-exist)
+c:\runtime\helloworld\helloworld.csproj : error NU1102: - Found 25 version(s) in nuget [ Nearest version: 5.0.0-preview.1.20120.5 ]
+c:\runtime\helloworld\helloworld.csproj : error NU1102: - Found 1 version(s) in local runtime [ Nearest version: 5.0.0-dev ]
+c:\runtime\helloworld\helloworld.csproj : error NU1102: Unable to find package Microsoft.NETCore.App.Host.win-x64 with version (= 5.0.0-does-not-exist)
+c:\runtime\helloworld\helloworld.csproj : error NU1102: - Found 27 version(s) in nuget [ Nearest version: 5.0.0-preview.1.20120.5 ]
+c:\runtime\helloworld\helloworld.csproj : error NU1102: - Found 1 version(s) in local runtime [ Nearest version: 5.0.0-dev ]
+ Failed to restore c:\runtime\helloworld\helloworld.csproj (in 519 ms).
```
### 6. Run the app
-After you publish you will find all the binaries needed to run your application under `bin\Debug\netcoreapp3.0\win-x64\publish\`.
+After you publish you will find all the binaries needed to run your application under `bin\Debug\net5.0\win-x64\publish\`.
To run the application simply run the EXE that is in this publish directory (it is the name of the app, or specified in the project file).
```
-.\bin\Debug\netcoreapp3.0\win-x64\publish\HelloWorld.exe
+.\bin\Debug\net5.0\win-x64\publish\HelloWorld.exe
```
-Running the app should tell you the version and which user and machine build the assembly as well as the commit hash of the code
-at the time of building:
+Running the app should tell you the version and where the location of System.Private.CoreLib in the publish directory:
```
-Hello World from Core 4.6.26210.0 @BuiltBy: adsitnik-MININT-O513E3V @SrcCode: https://github.com/dotnet/runtime/tree/3d6da797d1f7dc47d5934189787a4e8006ab3a04
-The location is C:\coreclr\helloWorld\bin\Debug\netcoreapp3.0\win-x64\publish\System.Private.CoreLib.dll
+Hello World from .NET 5.0.0-dev
+The location is c:\runtime\helloworld\bin\Debug\net5.0\win-x64\publish\System.Private.CoreLib.dll
```
-**Congratulations! You have just run your first app against local CoreCLR build!**
+**Congratulations! You have just run your first app against your local build of this repo**
-## Update CoreCLR using runtime nuget package
+## Update using runtime nuget package
-Updating CoreCLR from raw binary output is easier for quick one-off testing but using the nuget package is better
-for referencing your CoreCLR build in your actual application because of it does not require manual copying of files
+Updating the runtime from raw binary output is easier for quick one-off testing but using the nuget package is better
+for referencing your build in your actual application because of it does not require manual copying of files
around each time the application is built and plugs into the rest of the tool chain. This set of instructions will cover
the further steps needed to consume the runtime nuget package.
diff --git a/eng/Analyzers.props b/eng/Analyzers.props
index 2c9b1c8bee44..4405ca11687f 100644
--- a/eng/Analyzers.props
+++ b/eng/Analyzers.props
@@ -2,11 +2,12 @@
$(MSBuildThisFileDirectory)CodeAnalysis.ruleset
- false
+ false
-
+
-
-
+
+
+
diff --git a/eng/AvoidRestoreCycleOnSelfReference.targets b/eng/AvoidRestoreCycleOnSelfReference.targets
new file mode 100644
index 000000000000..cb665cb070d9
--- /dev/null
+++ b/eng/AvoidRestoreCycleOnSelfReference.targets
@@ -0,0 +1,14 @@
+
+
+
+ <_PackageIdTemp>$(PackageId)
+ $(PackageId)_temp
+
+
+
+
+ $(_PackageIdTemp)
+
+
+
\ No newline at end of file
diff --git a/eng/BeforeTargetFrameworkInference.targets b/eng/BeforeTargetFrameworkInference.targets
index 92adb5df6353..abef4c8981a2 100644
--- a/eng/BeforeTargetFrameworkInference.targets
+++ b/eng/BeforeTargetFrameworkInference.targets
@@ -6,10 +6,6 @@
$(TargetFramework.SubString(0, $(TargetFramework.IndexOf('-'))))
-
- $([MSBuild]::NormalizeDirectory('$(RefRootPath)', '$(TargetFramework)'))
-
-
diff --git a/eng/CodeAnalysis.ruleset b/eng/CodeAnalysis.ruleset
index 42ea385a079d..12e930144ed2 100644
--- a/eng/CodeAnalysis.ruleset
+++ b/eng/CodeAnalysis.ruleset
@@ -1,371 +1,496 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eng/CodeAnalysis.test.ruleset b/eng/CodeAnalysis.test.ruleset
new file mode 100644
index 000000000000..f46a2f8157a8
--- /dev/null
+++ b/eng/CodeAnalysis.test.ruleset
@@ -0,0 +1,546 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/eng/Configurations.props b/eng/Configurations.props
index aa8e9add17dd..352e32f6cab0 100644
--- a/eng/Configurations.props
+++ b/eng/Configurations.props
@@ -21,17 +21,19 @@
TODO: Update to $(MajorVersion).$(MinorVersion) when all sub-repos import
Arcade at the beginning (SkipImportArcadeSdkFromRoot=false).
-->
- 5.0
+ 6.0
+ 5.0
+ 5.0.NETCoreApp$(NetCoreAppCurrentIdentifier),Version=v$(NetCoreAppCurrentVersion)net$(NetCoreAppCurrentVersion)
+ net$(AspNetCoreAppCurrentVersion)
+ net$(NetCoreAppToolCurrentVersion)
+ $(NetCoreAppCurrentIdentifier),Version=v$(NetCoreAppToolCurrentVersion)$(NetCoreAppCurrent)Microsoft.NETCore.App.NET $(NetCoreAppCurrentVersion)
-
- net472
- WINDOWS7.0
@@ -71,5 +73,7 @@
truetrue
+
+ false
diff --git a/eng/DefaultGenApiDocIds.txt b/eng/DefaultGenApiDocIds.txt
index 5576d9fad6ae..8b2af83b92d4 100644
--- a/eng/DefaultGenApiDocIds.txt
+++ b/eng/DefaultGenApiDocIds.txt
@@ -1,11 +1,6 @@
// These attributes should be excluded from reference assemblies.
-T:System.ComponentModel.DesignerAttribute
-T:System.ComponentModel.Design.Serialization.DesignerSerializerAttribute
T:System.ComponentModel.Design.Serialization.RootDesignerSerializerAttribute
-T:System.ComponentModel.EditorAttribute
-T:System.ComponentModel.ToolboxItemAttribute
-T:System.ComponentModel.TypeDescriptionProviderAttribute
T:System.Configuration.ConfigurationPropertyAttribute
T:System.Diagnostics.CodeAnalysis.DynamicDependencyAttribute
T:System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute
diff --git a/eng/SignCheckExclusionsFile.txt b/eng/SignCheckExclusionsFile.txt
index dc77ca3e4603..b45e2daaceb8 100644
--- a/eng/SignCheckExclusionsFile.txt
+++ b/eng/SignCheckExclusionsFile.txt
@@ -6,10 +6,10 @@
;; The apphost and comhost are template files, modified by the SDK to produce the executable for FDE
;; and SCD apps. If they are signed, the file that the SDK produces has an invalid signature and
;; can't be signed again. More info at https://github.com/dotnet/core-setup/pull/7549.
-*apphost.exe;;Template, https://github.com/dotnet/core-setup/pull/7549
-*singlefilehost.exe;;Template, https://github.com/dotnet/core-setup/pull/7549
-*comhost.dll;;Template, https://github.com/dotnet/core-setup/pull/7549
-*apphosttemplateapphostexe.exe;;Template, https://github.com/dotnet/core-setup/pull/7549
-*comhosttemplatecomhostdll.dll;;Template, https://github.com/dotnet/core-setup/pull/7549
-*staticapphosttemplateapphostexe.exe;;Template, https://github.com/dotnet/core-setup/pull/7549
+*apphost.exe;;Template, DO-NOT-SIGN, https://github.com/dotnet/core-setup/pull/7549
+*singlefilehost.exe;;Template, DO-NOT-SIGN, https://github.com/dotnet/core-setup/pull/7549
+*comhost.dll;;Template, DO-NOT-SIGN, https://github.com/dotnet/core-setup/pull/7549
+*apphosttemplateapphostexe.exe;;Template, DO-NOT-SIGN, https://github.com/dotnet/core-setup/pull/7549
+*comhosttemplatecomhostdll.dll;;Template, DO-NOT-SIGN, https://github.com/dotnet/core-setup/pull/7549
+*staticapphosttemplateapphostexe.exe;;Template, DO-NOT-SIGN, https://github.com/dotnet/core-setup/pull/7549
*dotnet.js;;Workaround, https://github.com/dotnet/core-eng/issues/9933
diff --git a/eng/Signing.props b/eng/Signing.props
index 34821db7fc4e..471473fc7d97 100644
--- a/eng/Signing.props
+++ b/eng/Signing.props
@@ -28,11 +28,18 @@
+
+
+
+
+
+
+
-
-
-
+
+
+
@@ -47,10 +54,15 @@
-
+
-
-
+
+
+
+
+
+
+
@@ -104,15 +116,15 @@
+
+
+
-
-
-
-
-
diff --git a/eng/Subsets.props b/eng/Subsets.props
index 958389db150f..e2c4d1602f5b 100644
--- a/eng/Subsets.props
+++ b/eng/Subsets.props
@@ -54,37 +54,50 @@
- clr.runtime+linuxdac+clr.corelib+clr.nativecorelib+clr.tools+clr.packages
+ clr.runtime+clr.jit+clr.alljits+linuxdac+clr.corelib+clr.nativecorelib+clr.tools+clr.packagesmono.llvm+
- $(DefaultMonoSubsets)mono.runtime+mono.corelib
+ mono.llvm+
+ $(DefaultMonoSubsets)mono.wasmruntime+
+ $(DefaultMonoSubsets)mono.runtime+mono.corelib+mono.packages
- libs.depprojs+libs.native+libs.ref+libs.src+libs.pretest+libs.packages
+ libs.native+libs.ref+libs.src+libs.pretest+libs.packagescorehost+installer.managed+installer.depprojs+installer.pkgprojs+bundles+installers+installer.testsinstaller.pkgprojs
+ corehost+$(DefaultInstallerSubsets)
+ <_subset>$(_subset.Replace('+clr.paltests+', '+clr.paltests+clr.paltestlist+'))
<_subset>$(_subset.Replace('+clr+', '+$(DefaultCoreClrSubsets)+'))
<_subset>$(_subset.Replace('+mono+', '+$(DefaultMonoSubsets)+'))
<_subset>$(_subset.Replace('+libs+', '+$(DefaultLibrariesSubsets)+'))
<_subset>$(_subset.Replace('+installer+', '+$(DefaultInstallerSubsets)+'))
+ <_subset>$(_subset.Replace('+installer.nocorehost+', '+$(DefaultInstallerSubsets.Replace('corehost+', ''))+'))
<_subset>+$(_subset.Trim('+'))+
+
+
+ ClrRuntimeSubset=true;ClrJitSubset=true
+
+
+
+
+
-
+
@@ -92,10 +105,11 @@
+
+
-
@@ -106,6 +120,7 @@
+
@@ -113,6 +128,10 @@
+
+
+
+
@@ -130,16 +149,42 @@
-
-
+
+
+
+
+
+ $(ClrRuntimeBuildSubsets);ClrRuntimeSubset=true;ClrJitSubset=true
+
+
+
+ $(ClrRuntimeBuildSubsets);ClrJitSubset=true
+
+
+
+ $(ClrRuntimeBuildSubsets);ClrPalTestsSubset=true
+
+
+
+ $(ClrRuntimeBuildSubsets);ClrAllJitsSubset=true;ClrJitSubset=true
+
+
+
+
+
+
+
+
-
+
-
-
+
+
@@ -168,6 +213,10 @@
+
+
+
+
@@ -177,12 +226,6 @@
-
-
- Configuration=$(LibrariesConfiguration)
-
-
-
@@ -195,6 +238,10 @@
+
+
+
+
@@ -222,15 +269,11 @@
-
-
-
-
@@ -259,6 +302,11 @@
+
+
+
+
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 2940b3c13c76..a769f55ebd2b 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -4,167 +4,171 @@
https://github.com/dotnet/standardcfe95a23647c7de1fe1a349343115bd7720d6949
-
+ https://github.com/dotnet/icu
- 797c523dd8d75096319f3591958f703b8d74d04b
+ ba48e6f5e60aa200a567f9dadef1046f7bf374ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://github.com/dotnet/arcade
- ff5d4b6c8dbdaeacb6e6159d3f8185118dffd915
+ 19e7e769f7ca2ece42221f7ff951e7ec705498ec
-
+ https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- d0bb63d2ec7060714e63ee4082fac48f2e57f3e2
+ f69d7fc09c4fdb9e9427741b9a176e867dab577f
-
+ https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- d0bb63d2ec7060714e63ee4082fac48f2e57f3e2
+ f69d7fc09c4fdb9e9427741b9a176e867dab577f
-
+ https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- d0bb63d2ec7060714e63ee4082fac48f2e57f3e2
+ f69d7fc09c4fdb9e9427741b9a176e867dab577f
-
+ https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- d0bb63d2ec7060714e63ee4082fac48f2e57f3e2
+ f69d7fc09c4fdb9e9427741b9a176e867dab577f
-
+ https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- d0bb63d2ec7060714e63ee4082fac48f2e57f3e2
+ f69d7fc09c4fdb9e9427741b9a176e867dab577f
-
+ https://github.com/microsoft/vstest
- 069d8bd6357e2dbc260a35016ddbefe5dfec4102
+ b195e2589980861425b331e73a859252c3f2b71a
-
+ https://github.com/dotnet/runtime-assets
- 5a041ae14a25fe6e5db62666778a7adb59d5a056
+ edc9df4021be1dff54b8d8be88b4bee7626cb6a5
-
+ https://github.com/dotnet/runtime-assets
- 5a041ae14a25fe6e5db62666778a7adb59d5a056
+ edc9df4021be1dff54b8d8be88b4bee7626cb6a5
-
+ https://github.com/dotnet/runtime-assets
- 5a041ae14a25fe6e5db62666778a7adb59d5a056
+ edc9df4021be1dff54b8d8be88b4bee7626cb6a5
-
+ https://github.com/dotnet/runtime-assets
- 5a041ae14a25fe6e5db62666778a7adb59d5a056
+ edc9df4021be1dff54b8d8be88b4bee7626cb6a5
-
+ https://github.com/dotnet/runtime-assets
- 5a041ae14a25fe6e5db62666778a7adb59d5a056
+ edc9df4021be1dff54b8d8be88b4bee7626cb6a5
-
+ https://github.com/dotnet/runtime-assets
- 5a041ae14a25fe6e5db62666778a7adb59d5a056
+ edc9df4021be1dff54b8d8be88b4bee7626cb6a5
-
+ https://github.com/dotnet/runtime-assets
- 5a041ae14a25fe6e5db62666778a7adb59d5a056
+ edc9df4021be1dff54b8d8be88b4bee7626cb6a5
-
+ https://github.com/dotnet/runtime-assets
- 5a041ae14a25fe6e5db62666778a7adb59d5a056
+ edc9df4021be1dff54b8d8be88b4bee7626cb6a5
-
+
+ https://github.com/dotnet/runtime-assets
+ edc9df4021be1dff54b8d8be88b4bee7626cb6a5
+
+ https://github.com/dotnet/llvm-project
- 4e6a09468cb4e4e1be38ac25fcf866ca8136638b
+ 69cf173ab66c68e4282c1da56628b36d4ae2acc2
-
+ https://github.com/dotnet/llvm-project
- 4e6a09468cb4e4e1be38ac25fcf866ca8136638b
+ 69cf173ab66c68e4282c1da56628b36d4ae2acc2
-
+ https://github.com/dotnet/llvm-project
- 4e6a09468cb4e4e1be38ac25fcf866ca8136638b
+ 69cf173ab66c68e4282c1da56628b36d4ae2acc2
-
+ https://github.com/dotnet/llvm-project
- 4e6a09468cb4e4e1be38ac25fcf866ca8136638b
+ 69cf173ab66c68e4282c1da56628b36d4ae2acc2
-
+ https://github.com/dotnet/llvm-project
- 4e6a09468cb4e4e1be38ac25fcf866ca8136638b
+ 69cf173ab66c68e4282c1da56628b36d4ae2acc2
-
+ https://github.com/dotnet/llvm-project
- 4e6a09468cb4e4e1be38ac25fcf866ca8136638b
+ 69cf173ab66c68e4282c1da56628b36d4ae2acc2
-
+ https://github.com/dotnet/llvm-project
- 4e6a09468cb4e4e1be38ac25fcf866ca8136638b
+ 69cf173ab66c68e4282c1da56628b36d4ae2acc2
-
+ https://github.com/dotnet/llvm-project
- 4e6a09468cb4e4e1be38ac25fcf866ca8136638b
+ 69cf173ab66c68e4282c1da56628b36d4ae2acc2
-
+ https://github.com/dotnet/runtime
- 0375524a91a47ca4db3ee1be548f74bab7e26e76
+ 38017c3935de95d0335bac04f4901ddfc2718656
-
+ https://github.com/dotnet/runtime
- 0375524a91a47ca4db3ee1be548f74bab7e26e76
+ 2544c744d204c6ae0e20ba78c9cb8832a92091f3
-
+ https://github.com/dotnet/runtime
- 0375524a91a47ca4db3ee1be548f74bab7e26e76
+ 2544c744d204c6ae0e20ba78c9cb8832a92091f3https://github.com/dotnet/runtime
@@ -178,21 +182,21 @@
https://github.com/dotnet/runtimebdfbf0cf85878673a80d7822cc11bde5c9fda30c
-
+ https://github.com/dotnet/runtime
- 0375524a91a47ca4db3ee1be548f74bab7e26e76
+ 38017c3935de95d0335bac04f4901ddfc2718656
-
+ https://github.com/mono/linker
- f7c8a2a9e5aa47718169140db23c42f3439e6660
+ 57974c1f5790e6fb33f5fce161707be5cd86c4d3
-
+ https://github.com/dotnet/xharness
- 5c95b40b725e1aa9d596411c453900385cf6f84c
+ bdad61dfc3d09ae826ba940d92e43a7441ec83b0
-
+ https://github.com/dotnet/xharness
- 5c95b40b725e1aa9d596411c453900385cf6f84c
+ bdad61dfc3d09ae826ba940d92e43a7441ec83b0
diff --git a/eng/Versions.props b/eng/Versions.props
index f398f9af2353..89c9cbf2c774 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -1,16 +1,18 @@
- 5.0.0
+ 6.0.0
- 5
+ 600JsonCodeGen1
- $(MajorVersion).$(MinorVersion).0.0
+
+ 5.0.0.0falserelease
@@ -18,6 +20,7 @@
truetruefalse
+ truedotnet$(ContainerName)
@@ -45,50 +48,81 @@
-
-
-
+ 6.0.0-preview1.20513.4
+ 3.8.0-4.20503.2
- 5.0.0-beta.20364.3
- 5.0.0-beta.20364.3
- 5.0.0-beta.20364.3
- 5.0.0-beta.20364.3
- 5.0.0-beta.20364.3
- 5.0.0-beta.20364.3
- 2.5.1-beta.20364.3
- 5.0.0-beta.20364.3
- 5.0.0-beta.20364.3
- 5.0.0-beta.20364.3
+ 6.0.0-beta.20529.1
+ 6.0.0-beta.20529.1
+ 6.0.0-beta.20529.1
+ 6.0.0-beta.20529.1
+ 6.0.0-beta.20529.1
+ 6.0.0-beta.20529.1
+ 2.5.1-beta.20529.1
+ 6.0.0-beta.20529.1
+ 6.0.0-beta.20529.1
+ 6.0.0-beta.20529.1
- 5.0.0-preview.4.20202.18
- 5.0.0-preview.4.20202.18
- 5.0.0-preview.4.20202.18
+ 5.0.0-rc.1.20451.14
+ 6.0.0-alpha.1.20501.4
+ 6.0.0-alpha.1.20501.43.1.05.0.0-preview.8.20359.4
- 5.0.0-preview.4.20202.18
+ 1.2.0-beta.205
+ 4.5.1
+ 4.3.0
+ 4.3.0
+ 4.7.0
+ 4.8.1
+ 4.3.0
+ 4.3.0
+ 4.3.0
+ 4.3.0
+ 4.3.0
+ 4.5.4
+ 4.3.4
+ 4.3.1
+ 4.5.0
+ 4.3.0
+ 4.3.1
+ 4.3.1
+ 4.3.0
+ 4.3.0
+ 4.3.0
+ 4.3.1
+ 4.7.0
+ 4.7.0
+ 4.7.0
+ 5.0.0-rc.1.20451.14
+ 4.3.0
+ 4.5.4
+ 4.5.0
+ 1.1.1
+ 4.3.05.0.0-alpha.1.19563.3
- 5.0.0-beta.20364.1
- 5.0.0-beta.20364.1
- 5.0.0-beta.20364.1
- 5.0.0-beta.20364.1
- 5.0.0-beta.20364.1
- 5.0.0-beta.20364.1
- 5.0.0-beta.20364.1
- 5.0.0-beta.20364.1
+ 5.0.0-beta.20527.1
+ 5.0.0-beta.20527.1
+ 5.0.0-beta.20527.1
+ 5.0.0-beta.20527.1
+ 5.0.0-beta.20527.1
+ 5.0.0-beta.20527.1
+ 5.0.0-beta.20527.1
+ 5.0.0-beta.20527.1
+ 5.0.0-beta.20527.12.2.0-prerelease.19564.1
+ 2.0.3
- 99.99.99-master-20200228.3
- 99.99.99-master-20200228.3
- 99.99.99-master-20200228.3
- 99.99.99-master-20200228.3
- 99.99.99-master-20200228.3
-
+ 99.99.99-master-20200806.6
+ 99.99.99-master-20200806.6
+ 99.99.99-master-20200806.6
+ 99.99.99-master-20200806.6
+ 99.99.99-master-20200806.6
+
3.6.0-3.20207.23.0.0-beta2.final3.6.0.0
@@ -105,33 +139,32 @@
$(RefOnlyMicrosoftBuildVersion)4.9.44.9.4
-
- 4.8.0
- 16.8.0-preview-20200716-03
- 1.0.0-prerelease.20352.3
- 1.0.0-prerelease.20352.3
+ 16.8.0-release-20201022-02
+ 1.0.0-prerelease.20530.4
+ 1.0.0-prerelease.20530.42.4.12.4.21.3.02.0.512.0.34.12.0
+ 2.14.3
- 3.0.0-preview-20200715.1
+ 5.0.0-preview-20201009.2
- 5.0.0-preview.3.20366.2
+ 6.0.0-alpha.1.20527.2
- 5.0.0-preview.8.20370.1
+ 6.0.0-alpha.1.20526.1
- 9.0.1-alpha.1.20365.1
- 9.0.1-alpha.1.20365.1
- 9.0.1-alpha.1.20365.1
- 9.0.1-alpha.1.20365.1
- 9.0.1-alpha.1.20365.1
- 9.0.1-alpha.1.20365.1
- 9.0.1-alpha.1.20365.1
- 9.0.1-alpha.1.20365.1
+ 9.0.1-alpha.1.20530.2
+ 9.0.1-alpha.1.20530.2
+ 9.0.1-alpha.1.20530.2
+ 9.0.1-alpha.1.20530.2
+ 9.0.1-alpha.1.20530.2
+ 9.0.1-alpha.1.20530.2
+ 9.0.1-alpha.1.20530.2
+ 9.0.1-alpha.1.20530.2
@@ -150,7 +183,7 @@
Microsoft.NETCore.Runtime.ICU.Transport$([MSBuild]::NormalizeDirectory('$(NuGetPackageRoot)', '$(MicrosoftPrivateIntellisensePackage)', '$(MicrosoftPrivateIntellisenseVersion)', 'IntellisenseFiles', 'net'))
diff --git a/eng/actions/backport/action.yml b/eng/actions/backport/action.yml
new file mode 100644
index 000000000000..c136dd5ff6d4
--- /dev/null
+++ b/eng/actions/backport/action.yml
@@ -0,0 +1,18 @@
+name: 'PR Backporter'
+description: 'Backports a pull request to a branch using the "/backport to " comment'
+inputs:
+ auth_token:
+ description: 'The token used to authenticate to GitHub.'
+ pr_title_template:
+ description: 'The template used for the PR title. Special placeholder tokens that will be replaced with a value: %target_branch%, %source_pr_title%, %source_pr_number%, %cc_users%.'
+ default: '[%target_branch%] %source_pr_title%'
+ pr_description_template:
+ description: 'The template used for the PR description. Special placeholder tokens that will be replaced with a value: %target_branch%, %source_pr_title%, %source_pr_number%, %cc_users%.'
+ default: |
+ Backport of #%source_pr_number% to %target_branch%
+
+ /cc %cc_users%
+
+runs:
+ using: 'node12'
+ main: 'index.js'
diff --git a/eng/actions/backport/index.js b/eng/actions/backport/index.js
new file mode 100644
index 000000000000..076196100f37
--- /dev/null
+++ b/eng/actions/backport/index.js
@@ -0,0 +1,174 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+function BackportException(message, postToGitHub = true) {
+ this.message = message;
+ this.postToGitHub = postToGitHub;
+}
+
+async function run() {
+ const util = require("util");
+ const jsExec = util.promisify(require("child_process").exec);
+
+ console.log("Installing npm dependencies");
+ const { stdout, stderr } = await jsExec("npm install @actions/core @actions/github @actions/exec");
+ console.log("npm-install stderr:\n\n" + stderr);
+ console.log("npm-install stdout:\n\n" + stdout);
+ console.log("Finished installing npm dependencies");
+
+ const core = require("@actions/core");
+ const github = require("@actions/github");
+ const exec = require("@actions/exec");
+
+ if (github.context.eventName !== "issue_comment") throw "Error: This action only works on issue_comment events.";
+
+ const run_id = process.env.GITHUB_RUN_ID;
+ const repo_owner = github.context.payload.repository.owner.login;
+ const repo_name = github.context.payload.repository.name;
+ const pr_number = github.context.payload.issue.number;
+ const pr_source_ref = process.env.GITHUB_REF;
+ const comment_user = github.context.payload.comment.user.login;
+
+ let octokit = github.getOctokit(core.getInput("auth_token"));
+ let target_branch = "";
+
+ try {
+ // verify the comment user is a repo collaborator
+ try {
+ await octokit.repos.checkCollaborator({
+ owner: repo_owner,
+ repo: repo_name,
+ username: comment_user
+ });
+ console.log(`Verified ${comment_user} is a repo collaborator.`);
+ } catch {
+ throw new BackportException(`Error: @${comment_user} is not a repo collaborator, backporting is not allowed.`);
+ }
+
+ // extract the target branch name from the trigger phrase containing these characters: a-z, A-Z, digits, forward slash, dot, hyphen, underscore
+ console.log(`Extracting target branch`);
+ const regex = /\/backport to ([a-zA-Z\d\/\.\-\_]+)/;
+ target_branch = regex.exec(github.context.payload.comment.body)[1];
+ if (target_branch == null) throw new BackportException("Error: No backport branch found in the trigger phrase.");
+ try { await exec.exec(`git ls-remote --exit-code --heads origin ${target_branch}`) } catch { throw new BackportException(`Error: The specified backport target branch ${target_branch} wasn't found in the repo.`); }
+ console.log(`Backport target branch: ${target_branch}`);
+
+ // Post backport started comment to pull request
+ const backport_start_body = `Started backporting to ${target_branch}: https://github.com/${repo_owner}/${repo_name}/actions/runs/${run_id}`;
+ await octokit.issues.createComment({
+ owner: repo_owner,
+ repo: repo_name,
+ issue_number: pr_number,
+ body: backport_start_body
+ });
+
+ console.log("Applying backport patch");
+
+ await exec.exec(`git -c protocol.version=2 fetch --no-tags --progress --no-recurse-submodules origin ${target_branch} ${pr_source_ref}`);
+ await exec.exec(`git checkout ${target_branch}`);
+ await exec.exec(`git clean -xdff`);
+
+ // configure git
+ await exec.exec(`git config user.name "github-actions"`);
+ await exec.exec(`git config user.email "github-actions@github.com"`);
+
+ // create temporary backport branch
+ const temp_branch = `backport/pr-${pr_number}-to-${target_branch}`;
+ await exec.exec(`git checkout -b ${temp_branch}`);
+
+ // skip opening PR if the branch already exists on the origin remote since that means it was opened
+ // by an earlier backport and force pushing to the branch updates the existing PR
+ let should_open_pull_request = true;
+ try {
+ await exec.exec(`git ls-remote --exit-code --heads origin ${temp_branch}`);
+ should_open_pull_request = false;
+ } catch { }
+
+ // download and apply patch
+ await exec.exec(`curl -sSL "${github.context.payload.issue.pull_request.patch_url}" --output changes.patch`);
+
+ const git_am_command = "git am --3way --ignore-whitespace --keep-non-patch changes.patch";
+ let git_am_output = `$ ${git_am_command}\n\n`;
+ let git_am_failed = false;
+ try {
+ await exec.exec(git_am_command, [], {
+ listeners: {
+ stdout: function stdout(data) { git_am_output += data; },
+ stderr: function stderr(data) { git_am_output += data; }
+ }
+ });
+ } catch (error) {
+ git_am_output += error;
+ git_am_failed = true;
+ }
+
+ if (git_am_failed) {
+ const git_am_failed_body = `@${github.context.payload.comment.user.login} backporting to ${target_branch} failed, the patch most likely resulted in conflicts:\n\n\`\`\`shell\n${git_am_output}\n\`\`\`\n\nPlease backport manually!`;
+ await octokit.issues.createComment({
+ owner: repo_owner,
+ repo: repo_name,
+ issue_number: pr_number,
+ body: git_am_failed_body
+ });
+ throw new BackportException("Error: git am failed, most likely due to a merge conflict.", false);
+ }
+ else {
+ // push the temp branch to the repository
+ await exec.exec(`git push --force --set-upstream origin HEAD:${temp_branch}`);
+ }
+
+ if (!should_open_pull_request) {
+ console.log("Backport temp branch already exists, skipping opening a PR.");
+ return;
+ }
+
+ // prepate the GitHub PR details
+ let backport_pr_title = core.getInput("pr_title_template");
+ let backport_pr_description = core.getInput("pr_description_template");
+
+ // get users to cc (append PR author if different from user who issued the backport command)
+ let cc_users = `@${comment_user}`;
+ if (comment_user != github.context.payload.issue.user.login) cc_users += ` @${github.context.payload.issue.user.login}`;
+
+ // replace the special placeholder tokens with values
+ backport_pr_title = backport_pr_title
+ .replace(/%target_branch%/g, target_branch)
+ .replace(/%source_pr_title%/g, github.context.payload.issue.title)
+ .replace(/%source_pr_number%/g, github.context.payload.issue.number)
+ .replace(/%cc_users%/g, cc_users);
+
+ backport_pr_description = backport_pr_description
+ .replace(/%target_branch%/g, target_branch)
+ .replace(/%source_pr_title%/g, github.context.payload.issue.title)
+ .replace(/%source_pr_number%/g, github.context.payload.issue.number)
+ .replace(/%cc_users%/g, cc_users);
+
+ // open the GitHub PR
+ await octokit.pulls.create({
+ owner: repo_owner,
+ repo: repo_name,
+ title: backport_pr_title,
+ body: backport_pr_description,
+ head: temp_branch,
+ base: target_branch
+ });
+
+ console.log("Successfully opened the GitHub PR.");
+ } catch (error) {
+
+ core.setFailed(error);
+
+ if (error.postToGitHub === undefined || error.postToGitHub == true) {
+ // post failure to GitHub comment
+ const unknown_error_body = `@${comment_user} an error occurred while backporting to ${target_branch}, please check the run log for details!\n\n${error.message}`;
+ await octokit.issues.createComment({
+ owner: repo_owner,
+ repo: repo_name,
+ issue_number: pr_number,
+ body: unknown_error_body
+ });
+ }
+ }
+}
+
+run();
diff --git a/eng/build.ps1 b/eng/build.ps1
index f8b205bd3930..df1750a87103 100644
--- a/eng/build.ps1
+++ b/eng/build.ps1
@@ -15,6 +15,8 @@ Param(
[Parameter(Position=0)][string][Alias('s')]$subset,
[ValidateSet("Debug","Release","Checked")][string][Alias('rc')]$runtimeConfiguration,
[ValidateSet("Debug","Release")][string][Alias('lc')]$librariesConfiguration,
+ [ValidateSet("CoreCLR","Mono")][string][Alias('rf')]$runtimeFlavor,
+ [switch]$ninja,
[Parameter(ValueFromRemainingArguments=$true)][String[]]$properties
)
@@ -38,6 +40,8 @@ function Get-Help() {
Write-Host " Checked is exclusive to the CLR runtime. It is the same as Debug, except code is"
Write-Host " compiled with optimizations enabled."
Write-Host " [Default: Debug]"
+ Write-Host " -runtimeFlavor (-rf) Runtime flavor: CoreCLR or Mono."
+ Write-Host " [Default: CoreCLR]"
Write-Host " -subset (-s) Build a subset, print available subsets with -subset help."
Write-Host " '-subset' can be omitted if the subset is given as the first argument."
Write-Host " [Default: Builds the entire repo.]"
@@ -65,12 +69,15 @@ function Get-Help() {
Write-Host "Libraries settings:"
Write-Host " -allconfigurations Build packages for all build configurations."
Write-Host " -coverage Collect code coverage when testing."
- Write-Host " -framework (-f) Build framework: net5.0 or net472."
- Write-Host " [Default: net5.0]"
+ Write-Host " -framework (-f) Build framework: net6.0 or net48."
+ Write-Host " [Default: net6.0]"
Write-Host " -testnobuild Skip building tests when invoking -test."
Write-Host " -testscope Scope tests, allowed values: innerloop, outerloop, all."
Write-Host ""
+ Write-Host "Native build settings:"
+ Write-Host " -ninja Use Ninja instead of MSBuild to run the native build."
+
Write-Host "Command-line arguments not listed above are passed through to MSBuild."
Write-Host "The above arguments can be shortened as much as to be unambiguous."
Write-Host "(Example: -con for configuration, -t for test, etc.)."
@@ -103,7 +110,7 @@ function Get-Help() {
Write-Host "For more information, check out https://github.com/dotnet/runtime/blob/master/docs/workflow/README.md"
}
-if ($help -or (($null -ne $properties) -and ($properties.Contains('/help') -or $properties.Contains('/?')))) {
+if ($help) {
Get-Help
exit 0
}
@@ -114,25 +121,63 @@ if ($subset -eq 'help') {
}
if ($vs) {
- . $PSScriptRoot\common\tools.ps1
-
- if (-Not (Test-Path $vs)) {
+ if ($vs -ieq "coreclr.sln") {
+ # If someone passes in coreclr.sln (case-insensitive),
+ # launch the generated CMake solution.
+ $archToOpen = $arch[0]
+ $configToOpen = $configuration[0]
+ if ($runtimeConfiguration) {
+ $configToOpen = $runtimeConfiguration
+ }
+ $vs = Split-Path $PSScriptRoot -Parent | Join-Path -ChildPath "artifacts\obj\coreclr" | Join-Path -ChildPath "Windows_NT.$archToOpen.$((Get-Culture).TextInfo.ToTitleCase($configToOpen))" | Join-Path -ChildPath "CoreCLR.sln"
+ if (-Not (Test-Path $vs)) {
+ $repoRoot = Split-Path $PSScriptRoot -Parent
+ Invoke-Expression "& `"$repoRoot/src/coreclr/build-runtime.cmd`" -configureonly -$archToOpen -$configToOpen"
+ if ($lastExitCode -ne 0) {
+ Write-Error "Failed to generate the CoreCLR solution file."
+ exit 1
+ }
+ if (-Not (Test-Path $vs)) {
+ Write-Error "Unable to find the CoreCLR solution file at $vs."
+ }
+ }
+ }
+ elseif (-Not (Test-Path $vs)) {
$solution = $vs
- # Search for the solution in libraries
- $vs = Split-Path $PSScriptRoot -Parent | Join-Path -ChildPath "src\libraries" | Join-Path -ChildPath $vs | Join-Path -ChildPath "$vs.sln"
+
+ if ($runtimeFlavor -eq "Mono") {
+ # Search for the solution in mono
+ $vs = Split-Path $PSScriptRoot -Parent | Join-Path -ChildPath "src\mono\netcore" | Join-Path -ChildPath $vs | Join-Path -ChildPath "$vs.sln"
+ } else {
+ # Search for the solution in coreclr
+ $vs = Split-Path $PSScriptRoot -Parent | Join-Path -ChildPath "src\coreclr\src" | Join-Path -ChildPath $vs | Join-Path -ChildPath "$vs.sln"
+ }
+
if (-Not (Test-Path $vs)) {
$vs = $solution
- # Search for the solution in installer
- if (-Not ($vs.endswith(".sln"))) {
- $vs = "$vs.sln"
- }
- $vs = Split-Path $PSScriptRoot -Parent | Join-Path -ChildPath "src\installer" | Join-Path -ChildPath $vs
+
+ # Search for the solution in libraries
+ $vs = Split-Path $PSScriptRoot -Parent | Join-Path -ChildPath "src\libraries" | Join-Path -ChildPath $vs | Join-Path -ChildPath "$vs.sln"
+
if (-Not (Test-Path $vs)) {
- Write-Error "Passed in solution cannot be resolved."
- exit 1
+ $vs = $solution
+
+ # Search for the solution in installer
+ if (-Not ($vs.endswith(".sln"))) {
+ $vs = "$vs.sln"
+ }
+
+ $vs = Split-Path $PSScriptRoot -Parent | Join-Path -ChildPath "src\installer" | Join-Path -ChildPath $vs
+
+ if (-Not (Test-Path $vs)) {
+ Write-Error "Passed in solution cannot be resolved."
+ exit 1
+ }
}
}
}
+
+ . $PSScriptRoot\common\tools.ps1
# This tells .NET Core to use the bootstrapped runtime
$env:DOTNET_ROOT=InitializeDotNetCli -install:$true -createSdkLocationFile:$true
@@ -151,7 +196,7 @@ if ($vs) {
# Respect the RuntimeConfiguration variable for building inside VS with different runtime configurations
$env:RUNTIMECONFIGURATION=$runtimeConfiguration
}
-
+
# Restore the solution to workaround https://github.com/dotnet/runtime/issues/32205
Invoke-Expression "& dotnet restore $vs"
@@ -177,12 +222,14 @@ foreach ($argument in $PSBoundParameters.Keys)
switch($argument)
{
"runtimeConfiguration" { $arguments += " /p:RuntimeConfiguration=$((Get-Culture).TextInfo.ToTitleCase($($PSBoundParameters[$argument])))" }
+ "runtimeFlavor" { $arguments += " /p:RuntimeFlavor=$($PSBoundParameters[$argument].ToLowerInvariant())" }
"librariesConfiguration" { $arguments += " /p:LibrariesConfiguration=$((Get-Culture).TextInfo.ToTitleCase($($PSBoundParameters[$argument])))" }
"framework" { $arguments += " /p:BuildTargetFramework=$($PSBoundParameters[$argument].ToLowerInvariant())" }
"os" { $arguments += " /p:TargetOS=$($PSBoundParameters[$argument])" }
"allconfigurations" { $arguments += " /p:BuildAllConfigurations=true" }
"properties" { $arguments += " " + $properties }
"verbosity" { $arguments += " -$argument " + $($PSBoundParameters[$argument]) }
+ "ninja" { $arguments += " /p:Ninja=$($PSBoundParameters[$argument])" }
# configuration and arch can be specified multiple times, so they should be no-ops here
"configuration" {}
"arch" {}
diff --git a/eng/build.sh b/eng/build.sh
index eb0cb586ebf3..5904565f9143 100755
--- a/eng/build.sh
+++ b/eng/build.sh
@@ -36,6 +36,8 @@ usage()
echo " Checked is exclusive to the CLR runtime. It is the same as Debug, except code is"
echo " compiled with optimizations enabled."
echo " [Default: Debug]"
+ echo " -runtimeFlavor (-rf) Runtime flavor: CoreCLR or Mono."
+ echo " [Default: CoreCLR]"
echo " --subset (-s) Build a subset, print available subsets with -subset help."
echo " '--subset' can be omitted if the subset is given as the first argument."
echo " [Default: Builds the entire repo.]"
@@ -60,8 +62,8 @@ usage()
echo "Libraries settings:"
echo " --allconfigurations Build packages for all build configurations."
echo " --coverage Collect code coverage when testing."
- echo " --framework (-f) Build framework: net5.0 or net472."
- echo " [Default: net5.0]"
+ echo " --framework (-f) Build framework: net6.0 or net48."
+ echo " [Default: net6.0]"
echo " --testnobuild Skip building tests when invoking -test."
echo " --testscope Test scope, allowed values: innerloop, outerloop, all."
echo ""
@@ -74,6 +76,8 @@ usage()
echo " --gcc Optional argument to build using gcc in PATH (default)."
echo " --gccx.y Optional argument to build using gcc version x.y."
echo " --portablebuild Optional argument: set to false to force a non-portable build."
+ echo " --keepnativesymbols Optional argument: set to true to keep native symbols/debuginfo in generated binaries."
+ echo " --ninja Optional argument: set to true to use Ninja instead of Make to run the native build."
echo ""
echo "Command line arguments starting with '/p:' are passed through to MSBuild."
@@ -97,6 +101,9 @@ usage()
echo "* Build CoreCLR for Linux x64 on Debug configuration using GCC 8.4."
echo "./build.sh clr -gcc8.4"
echo ""
+ echo "* Build CoreCLR for Linux x64 using extra compiler flags (-fstack-clash-protection)."
+ echo "EXTRA_CFLAGS=-fstack-clash-protection EXTRA_CXXFLAGS=-fstack-clash-protection ./build.sh clr"
+ echo ""
echo "* Cross-compile CoreCLR runtime for Linux ARM64 on Release configuration."
echo "./build.sh clr.runtime -arch arm64 -c release -cross"
echo ""
@@ -127,8 +134,8 @@ initDistroRid()
local isCrossBuild="$3"
local isPortableBuild="$4"
- # Only pass ROOTFS_DIR if __DoCrossArchBuild is specified.
- if (( isCrossBuild == 1 )); then
+ # Only pass ROOTFS_DIR if __DoCrossArchBuild is specified and the current platform is not OSX that doesn't use rootfs
+ if [[ $isCrossBuild == 1 && "$targetOs" != "OSX" ]]; then
passedRootfsDir=${ROOTFS_DIR}
fi
initDistroRidGlobal ${targetOs} ${buildArch} ${isPortableBuild} ${passedRootfsDir}
@@ -147,6 +154,8 @@ portableBuild=1
source $scriptroot/native/init-os-and-arch.sh
+hostArch=$arch
+
# Check if an action is passed in
declare -a actions=("b" "build" "r" "restore" "rebuild" "testnobuild" "sign" "publish" "clean")
actInt=($(comm -12 <(printf '%s\n' "${actions[@]/#/-}" | sort) <(printf '%s\n' "${@/#--/-}" | sort)))
@@ -169,7 +178,7 @@ while [[ $# > 0 ]]; do
firstArgumentChecked=1
case "$opt" in
- -help|-h)
+ -help|-h|-\?|/?)
usage
exit 0
;;
@@ -319,6 +328,26 @@ while [[ $# > 0 ]]; do
shift 2
;;
+ -runtimeflavor|-rf)
+ if [ -z ${2+x} ]; then
+ echo "No runtime flavor supplied. See help (--help) for supported runtime flavors." 1>&2
+ exit 1
+ fi
+ passedRuntimeFlav="$(echo "$2" | awk '{print tolower($0)}')"
+ case "$passedRuntimeFlav" in
+ coreclr|mono)
+ val="$(tr '[:lower:]' '[:upper:]' <<< ${passedRuntimeFlav:0:1})${passedRuntimeFlav:1}"
+ ;;
+ *)
+ echo "Unsupported runtime flavor '$2'."
+ echo "The allowed values are CoreCLR and Mono."
+ exit 1
+ ;;
+ esac
+ arguments="$arguments /p:RuntimeFlavor=$val"
+ shift 2
+ ;;
+
-librariesconfiguration|-lc)
if [ -z ${2+x} ]; then
echo "No libraries configuration supplied. See help (--help) for supported libraries configurations." 1>&2
@@ -377,6 +406,38 @@ while [[ $# > 0 ]]; do
shift 2
;;
+ -keepnativesymbols)
+ if [ -z ${2+x} ]; then
+ echo "No value for keepNativeSymbols is supplied. See help (--help) for supported values." 1>&2
+ exit 1
+ fi
+ passedKeepNativeSymbols="$(echo "$2" | awk '{print tolower($0)}')"
+ if [ "$passedKeepNativeSymbols" = true ]; then
+ arguments="$arguments /p:KeepNativeSymbols=true"
+ fi
+ shift 2
+ ;;
+
+
+ -ninja)
+ if [ -z ${2+x} ]; then
+ arguments="$arguments /p:Ninja=true"
+ shift 1
+ else
+ ninja="$(echo "$2" | awk '{print tolower($0)}')"
+ if [ "$ninja" = true ]; then
+ arguments="$arguments /p:Ninja=true"
+ shift 2
+ elif [ "$ninja" = false ]; then
+ arguments="$arguments /p:Ninja=false"
+ shift 2
+ else
+ arguments="$arguments /p:Ninja=true"
+ shift 1
+ fi
+ fi
+ ;;
+
*)
extraargs="$extraargs $1"
shift 1
@@ -388,11 +449,16 @@ if [ ${#actInt[@]} -eq 0 ]; then
arguments="-restore -build $arguments"
fi
+if [ "$os" = "Browser" ] && [ "$arch" != "wasm" ]; then
+ # override default arch for Browser, we only support wasm
+ arch=wasm
+fi
+
initDistroRid $os $arch $crossBuild $portableBuild
# URL-encode space (%20) to avoid quoting issues until the msbuild call in /eng/common/tools.sh.
# In *proj files (XML docs), URL-encoded string are rendered in their decoded form.
cmakeargs="${cmakeargs// /%20}"
-arguments="$arguments /p:TargetArchitecture=$arch"
+arguments="$arguments /p:TargetArchitecture=$arch /p:BuildArchitecture=$hostArch"
arguments="$arguments /p:CMakeArgs=\"$cmakeargs\" $extraargs"
"$scriptroot/common/build.sh" $arguments
diff --git a/eng/common/SetupNugetSources.ps1 b/eng/common/SetupNugetSources.ps1
index dc22178125a6..bb3617133f09 100644
--- a/eng/common/SetupNugetSources.ps1
+++ b/eng/common/SetupNugetSources.ps1
@@ -11,6 +11,8 @@
# See example YAML call for this script below. Note the use of the variable `$(dn-bot-dnceng-artifact-feeds-rw)`
# from the AzureDevOps-Artifact-Feeds-Pats variable group.
#
+# Any disabledPackageSources entries which start with "darc-int" will be re-enabled as part of this script executing
+#
# - task: PowerShell@2
# displayName: Setup Private Feeds Credentials
# condition: eq(variables['Agent.OS'], 'Windows_NT')
@@ -94,6 +96,14 @@ function InsertMaestroPrivateFeedCredentials($Sources, $Creds, $Username, $Passw
}
}
+function EnablePrivatePackageSources($DisabledPackageSources) {
+ $maestroPrivateSources = $DisabledPackageSources.SelectNodes("add[contains(@key,'darc-int')]")
+ ForEach ($DisabledPackageSource in $maestroPrivateSources) {
+ Write-Host "`tEnsuring private source '$($DisabledPackageSource.key)' is enabled"
+ $DisabledPackageSource.SetAttribute("value", "false")
+ }
+}
+
if (!(Test-Path $ConfigFile -PathType Leaf)) {
Write-PipelineTelemetryError -Category 'Build' -Message "Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. Couldn't find the NuGet config file: $ConfigFile"
ExitWithExitCode 1
@@ -123,6 +133,13 @@ if ($creds -eq $null) {
$doc.DocumentElement.AppendChild($creds) | Out-Null
}
+# Check for disabledPackageSources; we'll enable any darc-int ones we find there
+$disabledSources = $doc.DocumentElement.SelectSingleNode("disabledPackageSources")
+if ($disabledSources -ne $null) {
+ Write-Host "Checking for any darc-int disabled package sources in the disabledPackageSources node"
+ EnablePrivatePackageSources -DisabledPackageSources $disabledSources
+}
+
$userName = "dn-bot"
# Insert credential nodes for Maestro's private feeds
diff --git a/eng/common/SetupNugetSources.sh b/eng/common/SetupNugetSources.sh
index f33e37711e72..ef33382954cf 100644
--- a/eng/common/SetupNugetSources.sh
+++ b/eng/common/SetupNugetSources.sh
@@ -13,6 +13,8 @@
# See example YAML call for this script below. Note the use of the variable `$(dn-bot-dnceng-artifact-feeds-rw)`
# from the AzureDevOps-Artifact-Feeds-Pats variable group.
#
+# Any disabledPackageSources entries which start with "darc-int" will be re-enabled as part of this script executing.
+#
# - task: Bash@3
# displayName: Setup Private Feeds Credentials
# inputs:
@@ -63,7 +65,7 @@ if [ "$?" != "0" ]; then
ConfigNodeHeader=""
PackageSourcesTemplate="${TB}${NL}${TB}"
- sed -i.bak "s|$ConfigNodeHeader|$ConfigNodeHeader${NL}$PackageSourcesTemplate|" NuGet.config
+ sed -i.bak "s|$ConfigNodeHeader|$ConfigNodeHeader${NL}$PackageSourcesTemplate|" $ConfigFile
fi
# Ensure there is a ... section.
@@ -74,7 +76,7 @@ if [ "$?" != "0" ]; then
PackageSourcesNodeFooter=""
PackageSourceCredentialsTemplate="${TB}${NL}${TB}"
- sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourcesNodeFooter${NL}$PackageSourceCredentialsTemplate|" NuGet.config
+ sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourcesNodeFooter${NL}$PackageSourceCredentialsTemplate|" $ConfigFile
fi
PackageSources=()
@@ -146,3 +148,20 @@ for FeedName in ${PackageSources[@]} ; do
sed -i.bak "s|$PackageSourceCredentialsNodeFooter|$NewCredential${NL}$PackageSourceCredentialsNodeFooter|" $ConfigFile
fi
done
+
+# Re-enable any entries in disabledPackageSources where the feed name contains darc-int
+grep -i "" $ConfigFile
+if [ "$?" == "0" ]; then
+ DisabledDarcIntSources=()
+ echo "Re-enabling any disabled \"darc-int\" package sources in $ConfigFile"
+ DisabledDarcIntSources+=$(grep -oh '"darc-int-[^"]*" value="true"' $ConfigFile | tr -d '"')
+ for DisabledSourceName in ${DisabledDarcIntSources[@]} ; do
+ if [[ $DisabledSourceName == darc-int* ]]
+ then
+ OldDisableValue="add key=\"$DisabledSourceName\" value=\"true\""
+ NewDisableValue="add key=\"$DisabledSourceName\" value=\"false\""
+ sed -i.bak "s|$OldDisableValue|$NewDisableValue|" $ConfigFile
+ echo "Neutralized disablePackageSources entry for '$DisabledSourceName'"
+ fi
+ done
+fi
diff --git a/eng/common/build.ps1 b/eng/common/build.ps1
index 67ee6d28d3fa..94a91c0817e8 100644
--- a/eng/common/build.ps1
+++ b/eng/common/build.ps1
@@ -23,6 +23,8 @@ Param(
[switch][Alias('nobl')]$excludeCIBinarylog,
[switch] $ci,
[switch] $prepareMachine,
+ [string] $runtimeSourceFeed = '',
+ [string] $runtimeSourceFeedKey = '',
[switch] $help,
[Parameter(ValueFromRemainingArguments=$true)][String[]]$properties
)
diff --git a/eng/common/build.sh b/eng/common/build.sh
index 6d7c5a1f69c2..252b63604e6e 100755
--- a/eng/common/build.sh
+++ b/eng/common/build.sh
@@ -76,9 +76,10 @@ projects=''
configuration='Debug'
prepare_machine=false
verbosity='minimal'
+runtime_source_feed=''
+runtime_source_feed_key=''
properties=''
-
while [[ $# > 0 ]]; do
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
case "$opt" in
@@ -151,6 +152,14 @@ while [[ $# > 0 ]]; do
node_reuse=$2
shift
;;
+ -runtimesourcefeed)
+ runtime_source_feed=$2
+ shift
+ ;;
+ -runtimesourcefeedkey)
+ runtime_source_feed_key=$2
+ shift
+ ;;
*)
properties="$properties $1"
;;
diff --git a/eng/common/cross/arm64/tizen-build-rootfs.sh b/eng/common/cross/arm64/tizen-build-rootfs.sh
old mode 100644
new mode 100755
diff --git a/eng/common/cross/arm64/tizen-fetch.sh b/eng/common/cross/arm64/tizen-fetch.sh
old mode 100644
new mode 100755
index 338d1c3bf3c7..a48a6f51c49d
--- a/eng/common/cross/arm64/tizen-fetch.sh
+++ b/eng/common/cross/arm64/tizen-fetch.sh
@@ -161,7 +161,7 @@ fetch_tizen_pkgs aarch64 gcc glibc glibc-devel libicu libicu-devel libatomic lin
Inform "fetch coreclr packages"
fetch_tizen_pkgs aarch64 lldb lldb-devel libgcc libstdc++ libstdc++-devel libunwind libunwind-devel lttng-ust-devel lttng-ust userspace-rcu-devel userspace-rcu
Inform "fetch corefx packages"
-fetch_tizen_pkgs aarch64 libcom_err libcom_err-devel zlib zlib-devel libopenssl libopenssl1.1-devel krb5 krb5-devel
+fetch_tizen_pkgs aarch64 libcom_err libcom_err-devel zlib zlib-devel libopenssl11 libopenssl1.1-devel krb5 krb5-devel
Inform "Initialize standard unified"
fetch_tizen_pkgs_init standard unified
diff --git a/eng/common/cross/armel/tizen-build-rootfs.sh b/eng/common/cross/armel/tizen-build-rootfs.sh
index 25a0efa0bdd6..9a4438af61c2 100755
--- a/eng/common/cross/armel/tizen-build-rootfs.sh
+++ b/eng/common/cross/armel/tizen-build-rootfs.sh
@@ -30,8 +30,6 @@ rm -rf $TIZEN_TMP_DIR
# Configure Tizen rootfs
echo ">>Start configuring Tizen rootfs"
-rm ./usr/lib/libunwind.so
-ln -s libunwind.so.8 ./usr/lib/libunwind.so
ln -sfn asm-arm ./usr/include/asm
patch -p1 < $__TIZEN_CROSSDIR/tizen.patch
echo "<
+
diff --git a/eng/common/performance/blazor_perf.proj b/eng/common/performance/blazor_perf.proj
new file mode 100644
index 000000000000..3b25359c4380
--- /dev/null
+++ b/eng/common/performance/blazor_perf.proj
@@ -0,0 +1,30 @@
+
+
+ python3
+ $(HelixPreCommands);chmod +x $HELIX_WORKITEM_PAYLOAD/SOD/SizeOnDisk
+
+
+
+
+ %(Identity)
+
+
+
+
+ %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\
+ $(ScenarioDirectory)blazor\
+
+
+ $HELIX_CORRELATION_PAYLOAD/performance/src/scenarios/
+ $(ScenarioDirectory)blazor/
+
+
+
+
+ $(WorkItemDirectory)
+ cd $(BlazorDirectory);$(Python) pre.py publish --msbuild %27/p:_TrimmerDumpDependencies=true%27 --msbuild-static AdditionalMonoLinkerOptions=%27"%24(AdditionalMonoLinkerOptions) --dump-dependencies"%27 --binlog %27./traces/blazor_publish.binlog%27
+ $(Python) test.py sod --scenario-name "%(Identity)"
+ $(Python) post.py
+
+
+
\ No newline at end of file
diff --git a/eng/common/performance/crossgen_perf.proj b/eng/common/performance/crossgen_perf.proj
new file mode 100644
index 000000000000..79a5486546ea
--- /dev/null
+++ b/eng/common/performance/crossgen_perf.proj
@@ -0,0 +1,110 @@
+
+
+
+
+ %(Identity)
+
+
+
+
+
+ py -3
+ $(HelixPreCommands)
+ %HELIX_CORRELATION_PAYLOAD%\Core_Root
+ %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\
+ $(ScenarioDirectory)crossgen\
+ $(ScenarioDirectory)crossgen2\
+
+
+ python3
+ $(HelixPreCommands);chmod +x $HELIX_WORKITEM_PAYLOAD/startup/Startup;chmod +x $HELIX_WORKITEM_PAYLOAD/startup/perfcollect;sudo apt update
+ $HELIX_CORRELATION_PAYLOAD/Core_Root
+ $HELIX_CORRELATION_PAYLOAD/performance/src/scenarios/
+ $(ScenarioDirectory)crossgen/
+ $(ScenarioDirectory)crossgen2/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $(WorkItemDirectory)
+ $(Python) $(CrossgenDirectory)test.py crossgen --core-root $(CoreRoot) --test-name %(Identity)
+
+
+
+
+
+ $(WorkItemDirectory)
+ $(Python) $(Crossgen2Directory)test.py crossgen2 --core-root $(CoreRoot) --single %(Identity)
+
+
+
+
+
+ $(WorkItemDirectory)
+ $(Python) $(Crossgen2Directory)test.py crossgen2 --core-root $(CoreRoot) --single %(Identity) --singlethreaded True
+
+
+
+
+
+ $(WorkItemDirectory)
+ $(Python) pre.py crossgen --core-root $(CoreRoot) --single %(Identity)
+ $(Python) test.py sod --scenario-name "Crossgen %(Identity) Size" --dirs ./crossgen/
+ $(Python) post.py
+
+
+
+
+
+ $(WorkItemDirectory)
+ $(Python) $(Crossgen2Directory)pre.py crossgen2 --core-root $(CoreRoot) --single %(Identity)
+ $(Python) test.py sod --scenario-name "Crossgen2 %(Identity) Size" --dirs ./crossgen/
+ $(Python) post.py
+
+
+
+
+
+
+ 4:00
+
+
+
+ 4:00
+
+
+ 4:00
+
+
+ $(WorkItemDirectory)
+ $(Python) $(Crossgen2Directory)test.py crossgen2 --core-root $(CoreRoot) --composite $(Crossgen2Directory)framework-r2r.dll.rsp
+ 1:00
+
+
+ 4:00
+
+
+ 4:00
+
+
+
\ No newline at end of file
diff --git a/eng/common/performance/microbenchmarks.proj b/eng/common/performance/microbenchmarks.proj
new file mode 100644
index 000000000000..94b6efbc9297
--- /dev/null
+++ b/eng/common/performance/microbenchmarks.proj
@@ -0,0 +1,144 @@
+
+
+
+ %HELIX_CORRELATION_PAYLOAD%\performance\scripts\benchmarks_ci.py --csproj %HELIX_CORRELATION_PAYLOAD%\performance\$(TargetCsproj)
+ --dotnet-versions %DOTNET_VERSION% --cli-source-info args --cli-branch %PERFLAB_BRANCH% --cli-commit-sha %PERFLAB_HASH% --cli-repository https://github.com/%PERFLAB_REPO% --cli-source-timestamp %PERFLAB_BUILDTIMESTAMP%
+ py -3
+ %HELIX_CORRELATION_PAYLOAD%\Core_Root\CoreRun.exe
+ %HELIX_CORRELATION_PAYLOAD%\Baseline_Core_Root\CoreRun.exe
+
+ $(HelixPreCommands);call %HELIX_CORRELATION_PAYLOAD%\performance\tools\machine-setup.cmd;set PYTHONPATH=%HELIX_WORKITEM_PAYLOAD%\scripts%3B%HELIX_WORKITEM_PAYLOAD%
+ %HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts
+ %HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts_Baseline
+ %HELIX_CORRELATION_PAYLOAD%\performance\src\tools\ResultsComparer\ResultsComparer.csproj
+ %HELIX_CORRELATION_PAYLOAD%\performance\tools\dotnet\$(Architecture)\dotnet.exe
+ %25%25
+ %HELIX_WORKITEM_ROOT%\testResults.xml
+
+
+
+ $HELIX_CORRELATION_PAYLOAD
+ $(BaseDirectory)/performance
+
+
+
+ $HELIX_WORKITEM_PAYLOAD
+ $(BaseDirectory)
+
+
+
+ $(PerformanceDirectory)/scripts/benchmarks_ci.py --csproj $(PerformanceDirectory)/$(TargetCsproj)
+ --dotnet-versions $DOTNET_VERSION --cli-source-info args --cli-branch $PERFLAB_BRANCH --cli-commit-sha $PERFLAB_HASH --cli-repository https://github.com/$PERFLAB_REPO --cli-source-timestamp $PERFLAB_BUILDTIMESTAMP
+ python3
+ $(BaseDirectory)/Core_Root/corerun
+ $(BaseDirectory)/Baseline_Core_Root/corerun
+ $(HelixPreCommands);chmod +x $(PerformanceDirectory)/tools/machine-setup.sh;. $(PerformanceDirectory)/tools/machine-setup.sh
+ $(BaseDirectory)/artifacts/BenchmarkDotNet.Artifacts
+ $(BaseDirectory)/artifacts/BenchmarkDotNet.Artifacts_Baseline
+ $(PerformanceDirectory)/src/tools/ResultsComparer/ResultsComparer.csproj
+ $(PerformanceDirectory)/tools/dotnet/$(Architecture)/dotnet
+ %25
+ $HELIX_WORKITEM_ROOT/testResults.xml
+
+
+
+ $(CliArguments) --wasm
+
+
+
+ --corerun %HELIX_CORRELATION_PAYLOAD%\dotnet-mono\shared\Microsoft.NETCore.App\6.0.0\corerun.exe
+
+
+ --corerun $(BaseDirectory)/dotnet-mono/shared/Microsoft.NETCore.App/6.0.0/corerun
+
+
+
+ --corerun $(CoreRun)
+
+
+
+ --corerun $(BaselineCoreRun)
+
+
+
+ $(Python) $(WorkItemCommand) --incremental no --architecture $(Architecture) -f $(_Framework) $(PerfLabArguments)
+
+
+
+ $(WorkItemCommand) $(CliArguments)
+
+
+
+ 2:30
+ 0:15
+
+
+
+
+ %(Identity)
+
+
+
+
+ 30
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+
+
+
+ $(WorkItemDirectory)
+ $(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)"
+ $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)"
+ $(DotnetExe) run -f $(_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults);$(FinalCommand)
+ $(WorkItemTimeout)
+
+
+
+
+
+ $(WorkItemDirectory)
+ $(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument)"
+ $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument)"
+ $(DotnetExe) run -f $(_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults)
+ 4:00
+
+
+
\ No newline at end of file
diff --git a/eng/common/performance/perfhelixpublish.proj b/eng/common/performance/perfhelixpublish.proj
deleted file mode 100644
index 272366da95fc..000000000000
--- a/eng/common/performance/perfhelixpublish.proj
+++ /dev/null
@@ -1,192 +0,0 @@
-
-
-
- %HELIX_CORRELATION_PAYLOAD%\performance\scripts\benchmarks_ci.py --csproj %HELIX_CORRELATION_PAYLOAD%\performance\$(TargetCsproj)
- --dotnet-versions %DOTNET_VERSION% --cli-source-info args --cli-branch %PERFLAB_BRANCH% --cli-commit-sha %PERFLAB_HASH% --cli-repository https://github.com/%PERFLAB_REPO% --cli-source-timestamp %PERFLAB_BUILDTIMESTAMP%
- py -3
- %HELIX_CORRELATION_PAYLOAD%\Core_Root\CoreRun.exe
- %HELIX_CORRELATION_PAYLOAD%\Baseline_Core_Root\CoreRun.exe
-
- $(HelixPreCommands);call %HELIX_CORRELATION_PAYLOAD%\performance\tools\machine-setup.cmd;set PYTHONPATH=%HELIX_WORKITEM_PAYLOAD%\scripts%3B%HELIX_WORKITEM_PAYLOAD%
- %HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts
- %HELIX_CORRELATION_PAYLOAD%\artifacts\BenchmarkDotNet.Artifacts_Baseline
- %HELIX_CORRELATION_PAYLOAD%\performance\src\tools\ResultsComparer\ResultsComparer.csproj
- %HELIX_CORRELATION_PAYLOAD%\performance\tools\dotnet\$(Architecture)\dotnet.exe
- %25%25
- %HELIX_WORKITEM_ROOT%\testResults.xml
-
-
-
- $HELIX_CORRELATION_PAYLOAD
- $(BaseDirectory)/performance
-
-
-
- $HELIX_WORKITEM_PAYLOAD
- $(BaseDirectory)
-
-
-
- $(PerformanceDirectory)/scripts/benchmarks_ci.py --csproj $(PerformanceDirectory)/$(TargetCsproj)
- --dotnet-versions $DOTNET_VERSION --cli-source-info args --cli-branch $PERFLAB_BRANCH --cli-commit-sha $PERFLAB_HASH --cli-repository https://github.com/$PERFLAB_REPO --cli-source-timestamp $PERFLAB_BUILDTIMESTAMP
- python3
- $(BaseDirectory)/Core_Root/corerun
- $(BaseDirectory)/Baseline_Core_Root/corerun
- $(HelixPreCommands);chmod +x $(PerformanceDirectory)/tools/machine-setup.sh;. $(PerformanceDirectory)/tools/machine-setup.sh
- $(BaseDirectory)/artifacts/BenchmarkDotNet.Artifacts
- $(BaseDirectory)/artifacts/BenchmarkDotNet.Artifacts_Baseline
- $(PerformanceDirectory)/src/tools/ResultsComparer/ResultsComparer.csproj
- $(PerformanceDirectory)/tools/dotnet/$(Architecture)/dotnet
- %25
- $HELIX_WORKITEM_ROOT/testResults.xml
-
-
-
- --corerun %HELIX_CORRELATION_PAYLOAD%\dotnet-mono\shared\Microsoft.NETCore.App\5.0.0\corerun.exe
-
-
- --corerun $(BaseDirectory)/dotnet-mono/shared/Microsoft.NETCore.App/5.0.0/corerun
-
-
-
- --corerun $(CoreRun)
-
-
-
- --corerun $(BaselineCoreRun)
-
-
-
- $(Python) $(WorkItemCommand) --incremental no --architecture $(Architecture) -f $(_Framework) $(PerfLabArguments)
-
-
-
- $(WorkItemCommand) $(CliArguments)
-
-
-
- 2:30
- 0:15
-
-
-
-
- %(Identity)
-
-
-
-
- 30
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- false
-
-
-
-
-
- $(WorkItemDirectory)
- $(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)"
- $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument) --partition-count $(PartitionCount) --partition-index %(HelixWorkItem.Index)"
- $(DotnetExe) run -f $(_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults);$(FinalCommand)
- $(WorkItemTimeout)
-
-
-
-
-
- $(WorkItemDirectory)
- $(WorkItemCommand) --bdn-artifacts $(BaselineArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(BaselineCoreRunArgument)"
- $(WorkItemCommand) --bdn-artifacts $(ArtifactsDirectory) --bdn-arguments="--anyCategories $(BDNCategories) $(ExtraBenchmarkDotNetArguments) $(CoreRunArgument)"
- $(DotnetExe) run -f $(_Framework) -p $(ResultsComparer) --base $(BaselineArtifactsDirectory) --diff $(ArtifactsDirectory) --threshold 2$(Percent) --xml $(XMLResults)
- 4:00
-
-
-
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name System.Private.Xml.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name System.Linq.Expressions.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name Microsoft.CodeAnalysis.VisualBasic.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name Microsoft.CodeAnalysis.CSharp.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen\test.py crossgen --test-name System.Private.CoreLib.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
-
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen2\test.py crossgen2 --single System.Private.Xml.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen2\test.py crossgen2 --single System.Linq.Expressions.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen2\test.py crossgen2 --single Microsoft.CodeAnalysis.VisualBasic.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen2\test.py crossgen2 --single Microsoft.CodeAnalysis.CSharp.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen2\test.py crossgen2 --single System.Private.CoreLib.dll --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
-
-
- $(WorkItemDirectory)\ScenarioCorrelation
- $(Python) %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen2\test.py crossgen2 --composite %HELIX_CORRELATION_PAYLOAD%\performance\src\scenarios\crossgen2\framework-r2r.dll.rsp --core-root %HELIX_CORRELATION_PAYLOAD%\Core_Root
- 1:00
-
-
-
-
\ No newline at end of file
diff --git a/eng/common/performance/performance-setup.sh b/eng/common/performance/performance-setup.sh
index c87cbf0fc232..9c0f6c909145 100755
--- a/eng/common/performance/performance-setup.sh
+++ b/eng/common/performance/performance-setup.sh
@@ -24,6 +24,9 @@ run_from_perf_repo=false
use_core_run=true
use_baseline_core_run=true
using_mono=false
+wasm_runtime_loc=
+using_wasm=false
+use_latest_dotnet=false
while (($# > 0)); do
lowerI="$(echo $1 | awk '{print tolower($0)}')"
@@ -70,7 +73,7 @@ while (($# > 0)); do
;;
--kind)
kind=$2
- configurations="CompliationMode=$compilation_mode RunKind=$kind"
+ configurations="CompilationMode=$compilation_mode RunKind=$kind"
shift 2
;;
--runcategories)
@@ -101,6 +104,10 @@ while (($# > 0)); do
mono_dotnet=$2
shift 2
;;
+ --wasm)
+ wasm_runtime_loc=$2
+ shift 2
+ ;;
--compare)
compare=true
shift 1
@@ -109,7 +116,11 @@ while (($# > 0)); do
configurations=$2
shift 2
;;
- --help)
+ --latestdotnet)
+ use_latest_dotnet=true
+ shift 1
+ ;;
+ *)
echo "Common settings:"
echo " --corerootdirectory Directory where Core_Root exists, if running perf testing with --corerun"
echo " --architecture Architecture of the testing being run"
@@ -130,6 +141,8 @@ while (($# > 0)); do
echo " --runcategories Related to csproj. Categories of benchmarks to run. Defaults to \"coreclr corefx\""
echo " --internal If the benchmarks are running as an official job."
echo " --monodotnet Pass the path to the mono dotnet for mono performance testing."
+ echo " --wasm Path to the unpacked wasm runtime pack."
+ echo " --latestdotnet --dotnet-versions will not be specified. --dotnet-versions defaults to LKG version in global.json "
echo ""
exit 0
;;
@@ -141,7 +154,7 @@ if [ "$repository" == "dotnet/performance" ] || [ "$repository" == "dotnet-perfo
fi
if [ -z "$configurations" ]; then
- configurations="CompliationMode=$compilation_mode"
+ configurations="CompilationMode=$compilation_mode"
fi
if [ -z "$core_root_directory" ]; then
@@ -187,23 +200,31 @@ if [[ "$internal" == true ]]; then
fi
fi
-if [[ "$mono_dotnet" != "" ]]; then
+if [[ "$mono_dotnet" != "" ]] && [[ "$monointerpreter" == "false" ]]; then
configurations="$configurations LLVM=$llvm MonoInterpreter=$monointerpreter MonoAOT=$monoaot"
+ extra_benchmark_dotnet_arguments="$extra_benchmark_dotnet_arguments --category-exclusion-filter NoMono"
+fi
+
+if [[ "$wasm_runtime_loc" != "" ]]; then
+ configurations="CompilationMode=wasm RunKind=$kind"
+ extra_benchmark_dotnet_arguments="$extra_benchmark_dotnet_arguments --category-exclusion-filter NoInterpreter NoWASM NoMono"
fi
-if [[ "$monointerpreter" == "true" ]]; then
- extra_benchmark_dotnet_arguments="--category-exclusion-filter NoInterpreter"
+if [[ "$mono_dotnet" != "" ]] && [[ "$monointerpreter" == "true" ]]; then
+ configurations="$configurations LLVM=$llvm MonoInterpreter=$monointerpreter MonoAOT=$monoaot"
+ extra_benchmark_dotnet_arguments="$extra_benchmark_dotnet_arguments --category-exclusion-filter NoInterpreter NoMono"
fi
common_setup_arguments="--channel master --queue $queue --build-number $build_number --build-configs $configurations --architecture $architecture"
setup_arguments="--repository https://github.com/$repository --branch $branch --get-perf-hash --commit-sha $commit_sha $common_setup_arguments"
-# Get the tools section from the global.json.
-# This grabs the LKG version number of dotnet and passes it to our scripts
-dotnet_version=`cat global.json | python3 -c 'import json,sys;obj=json.load(sys.stdin);print(obj["tools"]["dotnet"])'`
-setup_arguments="--dotnet-versions $dotnet_version $setup_arguments"
-
+if [[ "$use_latest_dotnet" = false ]]; then
+ # Get the tools section from the global.json.
+ # This grabs the LKG version number of dotnet and passes it to our scripts
+ dotnet_version=`cat global.json | python3 -c 'import json,sys;obj=json.load(sys.stdin);print(obj["tools"]["dotnet"])'`
+ setup_arguments="--dotnet-versions $dotnet_version $setup_arguments"
+fi
if [[ "$run_from_perf_repo" = true ]]; then
payload_directory=
@@ -217,6 +238,13 @@ else
mv $docs_directory $workitem_directory
fi
+if [[ "$wasm_runtime_loc" != "" ]]; then
+ using_wasm=true
+ wasm_dotnet_path=$payload_directory/dotnet-wasm
+ mv $wasm_runtime_loc $wasm_dotnet_path
+ extra_benchmark_dotnet_arguments="$extra_benchmark_dotnet_arguments --wasmMainJS \$HELIX_CORRELATION_PAYLOAD/dotnet-wasm/runtime-test.js --wasmEngine /home/helixbot/.jsvu/v8 --customRuntimePack \$HELIX_CORRELATION_PAYLOAD/dotnet-wasm"
+fi
+
if [[ "$mono_dotnet" != "" ]]; then
using_mono=true
mono_dotnet_path=$payload_directory/dotnet-mono
@@ -247,7 +275,7 @@ Write-PipelineSetVariable -name "PerformanceDirectory" -value "$performance_dire
Write-PipelineSetVariable -name "WorkItemDirectory" -value "$workitem_directory" -is_multi_job_variable false
Write-PipelineSetVariable -name "Queue" -value "$queue" -is_multi_job_variable false
Write-PipelineSetVariable -name "SetupArguments" -value "$setup_arguments" -is_multi_job_variable false
-Write-PipelineSetVariable -name "Python" -value "$python3" -is_multi_job_variable false
+Write-PipelineSetVariable -name "Python" -value "python3" -is_multi_job_variable false
Write-PipelineSetVariable -name "PerfLabArguments" -value "$perflab_arguments" -is_multi_job_variable false
Write-PipelineSetVariable -name "ExtraBenchmarkDotNetArguments" -value "$extra_benchmark_dotnet_arguments" -is_multi_job_variable false
Write-PipelineSetVariable -name "BDNCategories" -value "$run_categories" -is_multi_job_variable false
@@ -259,3 +287,4 @@ Write-PipelineSetVariable -name "Kind" -value "$kind" -is_multi_job_variable fal
Write-PipelineSetVariable -name "_BuildConfig" -value "$architecture.$kind.$framework" -is_multi_job_variable false
Write-PipelineSetVariable -name "Compare" -value "$compare" -is_multi_job_variable false
Write-PipelineSetVariable -name "MonoDotnet" -value "$using_mono" -is_multi_job_variable false
+Write-PipelineSetVariable -name "WasmDotnet" -value "$using_wasm" -is_multi_job_variable false
diff --git a/eng/common/post-build/publish-using-darc.ps1 b/eng/common/post-build/publish-using-darc.ps1
index d22eb439c486..650b13b089b2 100644
--- a/eng/common/post-build/publish-using-darc.ps1
+++ b/eng/common/post-build/publish-using-darc.ps1
@@ -1,20 +1,22 @@
param(
[Parameter(Mandatory=$true)][int] $BuildId,
+ [Parameter(Mandatory=$true)][int] $PublishingInfraVersion,
[Parameter(Mandatory=$true)][string] $AzdoToken,
[Parameter(Mandatory=$true)][string] $MaestroToken,
[Parameter(Mandatory=$false)][string] $MaestroApiEndPoint = 'https://maestro-prod.westus2.cloudapp.azure.com',
[Parameter(Mandatory=$true)][string] $WaitPublishingFinish,
- [Parameter(Mandatory=$true)][string] $EnableSourceLinkValidation,
- [Parameter(Mandatory=$true)][string] $EnableSigningValidation,
- [Parameter(Mandatory=$true)][string] $EnableNugetValidation,
- [Parameter(Mandatory=$true)][string] $PublishInstallersAndChecksums,
+ [Parameter(Mandatory=$false)][string] $EnableSourceLinkValidation,
+ [Parameter(Mandatory=$false)][string] $EnableSigningValidation,
+ [Parameter(Mandatory=$false)][string] $EnableNugetValidation,
+ [Parameter(Mandatory=$false)][string] $PublishInstallersAndChecksums,
[Parameter(Mandatory=$false)][string] $ArtifactsPublishingAdditionalParameters,
[Parameter(Mandatory=$false)][string] $SigningValidationAdditionalParameters
)
try {
. $PSScriptRoot\post-build-utils.ps1
- . $PSScriptRoot\..\darc-init.ps1
+ # Hard coding darc version till the next arcade-services roll out, cos this version has required API changes for darc add-build-to-channel
+ $darc = Get-Darc "1.1.0-beta.20418.1"
$optionalParams = [System.Collections.ArrayList]::new()
@@ -27,7 +29,7 @@ try {
$optionalParams.Add("--no-wait") | Out-Null
}
- if ("true" -eq $PublishInstallersAndChecksums) {
+ if ("false" -ne $PublishInstallersAndChecksums) {
$optionalParams.Add("--publish-installers-and-checksums") | Out-Null
}
@@ -48,13 +50,14 @@ try {
}
}
- & darc add-build-to-channel `
- --id $buildId `
- --default-channels `
- --source-branch master `
- --azdev-pat $AzdoToken `
- --bar-uri $MaestroApiEndPoint `
- --password $MaestroToken `
+ & $darc add-build-to-channel `
+ --id $buildId `
+ --publishing-infra-version $PublishingInfraVersion `
+ --default-channels `
+ --source-branch master `
+ --azdev-pat $AzdoToken `
+ --bar-uri $MaestroApiEndPoint `
+ --password $MaestroToken `
@optionalParams
if ($LastExitCode -ne 0) {
diff --git a/eng/common/post-build/sourcelink-validation.ps1 b/eng/common/post-build/sourcelink-validation.ps1
index cdd1bba4f2d6..1728b742b3b7 100644
--- a/eng/common/post-build/sourcelink-validation.ps1
+++ b/eng/common/post-build/sourcelink-validation.ps1
@@ -144,11 +144,30 @@ $ValidatePackage = {
if ($FailedFiles -eq 0) {
Write-Host 'Passed.'
- return 0
+ return [pscustomobject]@{
+ result = 0
+ packagePath = $PackagePath
+ }
}
else {
Write-PipelineTelemetryError -Category 'SourceLink' -Message "$PackagePath has broken SourceLink links."
- return 1
+ return [pscustomobject]@{
+ result = 1
+ packagePath = $PackagePath
+ }
+ }
+}
+
+function CheckJobResult(
+ $result,
+ $packagePath,
+ [ref]$ValidationFailures,
+ [switch]$logErrors) {
+ if ($result -ne '0') {
+ if ($logError) {
+ Write-PipelineTelemetryError -Category 'SourceLink' -Message "$packagePath has broken SourceLink links."
+ }
+ $ValidationFailures.Value++
}
}
@@ -211,19 +230,15 @@ function ValidateSourceLinkLinks {
}
foreach ($Job in @(Get-Job -State 'Completed')) {
- $jobResult = Receive-Job -Id $Job.Id
- if ($jobResult -ne '0') {
- $ValidationFailures++
- }
+ $jobResult = Wait-Job -Id $Job.Id | Receive-Job
+ CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$ValidationFailures) -LogErrors
Remove-Job -Id $Job.Id
}
}
foreach ($Job in @(Get-Job)) {
$jobResult = Wait-Job -Id $Job.Id | Receive-Job
- if ($jobResult -ne '0') {
- $ValidationFailures++
- }
+ CheckJobResult $jobResult.result $jobResult.packagePath ([ref]$ValidationFailures)
Remove-Job -Id $Job.Id
}
if ($ValidationFailures -gt 0) {
diff --git a/eng/common/post-build/symbols-validation.ps1 b/eng/common/post-build/symbols-validation.ps1
index a36fa6f26bcd..99bf28cd5c1b 100644
--- a/eng/common/post-build/symbols-validation.ps1
+++ b/eng/common/post-build/symbols-validation.ps1
@@ -9,9 +9,16 @@ param(
# Maximum number of jobs to run in parallel
$MaxParallelJobs = 6
+# Max number of retries
+$MaxRetry = 5
+
# Wait time between check for system load
$SecondsBetweenLoadChecks = 10
+# Set error codes
+Set-Variable -Name "ERROR_BADEXTRACT" -Option Constant -Value -1
+Set-Variable -Name "ERROR_FILEDOESNOTEXIST" -Option Constant -Value -2
+
$CountMissingSymbols = {
param(
[string] $PackagePath # Path to a NuGet package
@@ -21,10 +28,15 @@ $CountMissingSymbols = {
Add-Type -AssemblyName System.IO.Compression.FileSystem
+ Write-Host "Validating $PackagePath "
+
# Ensure input file exist
if (!(Test-Path $PackagePath)) {
Write-PipelineTaskError "Input file does not exist: $PackagePath"
- return -2
+ return [pscustomobject]@{
+ result = $using:ERROR_FILEDOESNOTEXIST
+ packagePath = $PackagePath
+ }
}
# Extensions for which we'll look for symbols
@@ -45,7 +57,7 @@ $CountMissingSymbols = {
Write-Host "Something went wrong extracting $PackagePath"
Write-Host $_
return [pscustomobject]@{
- result = -1
+ result = $using:ERROR_BADEXTRACT
packagePath = $PackagePath
}
}
@@ -91,26 +103,37 @@ $CountMissingSymbols = {
$dotnetSymbolExe = "$env:USERPROFILE\.dotnet\tools"
$dotnetSymbolExe = Resolve-Path "$dotnetSymbolExe\dotnet-symbol.exe"
- & $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath | Out-Null
+ $totalRetries = 0
- if (Test-Path $PdbPath) {
- return 'PDB'
- }
- elseif (Test-Path $NGenPdb) {
- return 'NGen PDB'
- }
- elseif (Test-Path $SODbg) {
- return 'DBG for SO'
- }
- elseif (Test-Path $DylibDwarf) {
- return 'Dwarf for Dylib'
- }
- elseif (Test-Path $SymbolPath) {
- return 'Module'
- }
- else {
- return $null
+ while ($totalRetries -lt $using:MaxRetry) {
+ # Save the output and get diagnostic output
+ $output = & $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath --diagnostics | Out-String
+
+ if (Test-Path $PdbPath) {
+ return 'PDB'
+ }
+ elseif (Test-Path $NGenPdb) {
+ return 'NGen PDB'
+ }
+ elseif (Test-Path $SODbg) {
+ return 'DBG for SO'
+ }
+ elseif (Test-Path $DylibDwarf) {
+ return 'Dwarf for Dylib'
+ }
+ elseif (Test-Path $SymbolPath) {
+ return 'Module'
+ }
+ elseif ($output.Contains("503 Service Unavailable")) {
+ # If we got a 503 error, we should retry.
+ $totalRetries++
+ }
+ else {
+ return $null
+ }
}
+
+ return $null
}
$SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--microsoft-symbol-server' $SymbolsPath
@@ -141,11 +164,6 @@ $CountMissingSymbols = {
if ($using:Clean) {
Remove-Item $ExtractPath -Recurse -Force
}
-
- if ($MissingSymbols -ne 0)
- {
- Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $MissingSymbols modules in the package $PackagePath"
- }
Pop-Location
@@ -160,13 +178,21 @@ function CheckJobResult(
$packagePath,
[ref]$DupedSymbols,
[ref]$TotalFailures) {
- if ($result -eq '-1') {
+ if ($result -eq $ERROR_BADEXTRACT) {
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath has duplicated symbol files"
$DupedSymbols.Value++
}
- elseif ($jobResult.result -ne '0') {
+ elseif ($result -eq $ERROR_FILEDOESNOTEXIST) {
+ Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath does not exist"
+ $TotalFailures.Value++
+ }
+ elseif ($result -gt '0') {
+ Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $result modules in the package $packagePath"
$TotalFailures.Value++
}
+ else {
+ Write-Host "All symbols verified for package $packagePath"
+ }
}
function CheckSymbolsAvailable {
@@ -196,12 +222,9 @@ function CheckSymbolsAvailable {
return
}
- Write-Host "Validating $FileName "
-
Start-Job -ScriptBlock $CountMissingSymbols -ArgumentList $FullName | Out-Null
$NumJobs = @(Get-Job -State 'Running').Count
- Write-Host $NumJobs
while ($NumJobs -ge $MaxParallelJobs) {
Write-Host "There are $NumJobs validation jobs running right now. Waiting $SecondsBetweenLoadChecks seconds to check again."
diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1
index 32ad5c7e91cb..f55c43c6f478 100644
--- a/eng/common/sdk-task.ps1
+++ b/eng/common/sdk-task.ps1
@@ -42,6 +42,7 @@ function Build([string]$target) {
/p:Configuration=$configuration `
/p:RepoRoot=$RepoRoot `
/p:BaseIntermediateOutputPath=$outputPath `
+ /v:$verbosity `
@properties
}
@@ -63,7 +64,7 @@ try {
$GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty
}
if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) {
- $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "16.5.0-alpha" -MemberType NoteProperty
+ $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "16.8.0-preview3" -MemberType NoteProperty
}
if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") {
$xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true
diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml
index e78ed9a1c6ec..06048c27907b 100644
--- a/eng/common/templates/job/job.yml
+++ b/eng/common/templates/job/job.yml
@@ -27,6 +27,7 @@ parameters:
useBuildManifest: false
mergeTestResults: false
testRunTitle: ''
+ testResultsFormat: ''
name: ''
preSteps: []
runAsPublic: false
@@ -131,8 +132,8 @@ jobs:
- task: RichCodeNavIndexer@0
displayName: RichCodeNav Upload
inputs:
- languages: 'csharp'
- environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'prod') }}
+ languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }}
+ environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'production') }}
richNavLogOutputDirectory: $(Build.SourcesDirectory)/artifacts/bin
continueOnError: true
@@ -202,9 +203,9 @@ jobs:
continueOnError: true
condition: always()
- - ${{ if eq(parameters.enablePublishTestResults, 'true') }}:
+ - ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'xunit')) }}:
- task: PublishTestResults@2
- displayName: Publish Test Results
+ displayName: Publish XUnit Test Results
inputs:
testResultsFormat: 'xUnit'
testResultsFiles: '*.xml'
@@ -213,6 +214,17 @@ jobs:
mergeTestResults: ${{ parameters.mergeTestResults }}
continueOnError: true
condition: always()
+ - ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'vstest')) }}:
+ - task: PublishTestResults@2
+ displayName: Publish TRX Test Results
+ inputs:
+ testResultsFormat: 'VSTest'
+ testResultsFiles: '*.trx'
+ searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-trx
+ mergeTestResults: ${{ parameters.mergeTestResults }}
+ continueOnError: true
+ condition: always()
- ${{ if and(eq(parameters.enablePublishBuildAssets, true), ne(parameters.enablePublishUsingPipelines, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- task: CopyFiles@2
diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml
index 055304ad89bf..d0c3cc2b3ba5 100644
--- a/eng/common/templates/job/publish-build-assets.yml
+++ b/eng/common/templates/job/publish-build-assets.yml
@@ -67,6 +67,7 @@ jobs:
/p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com
/p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }}
/p:Configuration=$(_BuildConfig)
+ /p:OfficialBuildId=$(Build.BuildNumber)
condition: ${{ parameters.condition }}
continueOnError: ${{ parameters.continueOnError }}
@@ -87,11 +88,6 @@ jobs:
ArtifactName: ReleaseConfigs
- ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}:
- - task: PublishBuildArtifacts@1
- displayName: Publish Logs to VSTS
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)'
- PublishLocation: Container
- ArtifactName: $(Agent.Os)_PublishBuildAssets
- continueOnError: true
- condition: always()
+ - template: /eng/common/templates/steps/publish-logs.yml
+ parameters:
+ JobLabel: 'Publish_Artifacts_Logs'
diff --git a/eng/common/templates/job/source-build.yml b/eng/common/templates/job/source-build.yml
new file mode 100644
index 000000000000..9332f5ecc38a
--- /dev/null
+++ b/eng/common/templates/job/source-build.yml
@@ -0,0 +1,49 @@
+parameters:
+ # This template adds arcade-powered source-build to CI. The template produces a server job with a
+ # default ID 'Source_Build_Complete' to put in a dependency list if necessary.
+
+ # Specifies the prefix for source-build jobs added to pipeline. Use this if disambiguation needed.
+ jobNamePrefix: 'Source_Build'
+
+ # Defines the platform on which to run the job. By default, a linux-x64 machine, suitable for
+ # managed-only repositories. This is an object with these properties:
+ #
+ # name: ''
+ # The name of the job. This is included in the job ID.
+ # targetRID: ''
+ # The name of the target RID to use, instead of the one auto-detected by Arcade.
+ # nonPortable: false
+ # Enables non-portable mode. This means a more specific RID (e.g. fedora.32-x64 rather than
+ # linux-x64), and compiling against distro-provided packages rather than portable ones.
+ # container: ''
+ # A container to use. Runs in docker.
+ # pool: {}
+ # A pool to use. Runs directly on an agent.
+ # buildScript: ''
+ # Specifies the build script to invoke to perform the build in the repo. The default
+ # './build.sh' should work for typical Arcade repositories, but this is customizable for
+ # difficult situations.
+ # jobProperties: {}
+ # A list of job properties to inject at the top level, for potential extensibility beyond
+ # container and pool.
+ platform: {}
+
+jobs:
+- job: ${{ parameters.jobNamePrefix }}_${{ parameters.platform.name }}
+ displayName: Source-Build (${{ parameters.platform.name }})
+
+ ${{ each property in parameters.platform.jobProperties }}:
+ ${{ property.key }}: ${{ property.value }}
+
+ ${{ if ne(parameters.platform.container, '') }}:
+ container: ${{ parameters.platform.container }}
+ ${{ if ne(parameters.platform.pool, '') }}:
+ pool: ${{ parameters.platform.pool }}
+
+ workspace:
+ clean: all
+
+ steps:
+ - template: /eng/common/templates/steps/source-build.yml
+ parameters:
+ platform: ${{ parameters.platform }}
diff --git a/eng/common/templates/jobs/jobs.yml b/eng/common/templates/jobs/jobs.yml
index c08225a9a975..08845950f441 100644
--- a/eng/common/templates/jobs/jobs.yml
+++ b/eng/common/templates/jobs/jobs.yml
@@ -24,6 +24,13 @@ parameters:
# if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects.
runAsPublic: false
+ # Optional: Enable running the source-build jobs to build repo from source
+ runSourceBuild: false
+
+ # Optional: Parameters for source-build template.
+ # See /eng/common/templates/jobs/source-build.yml for options
+ sourceBuildParameters: []
+
# Internal resources (telemetry, microbuild) can only be accessed from non-public projects,
# and some (Microbuild) should only be applied to non-PR cases for internal builds.
@@ -43,6 +50,13 @@ jobs:
name: ${{ job.job }}
+- ${{ if eq(parameters.runSourceBuild, true) }}:
+ - template: /eng/common/templates/jobs/source-build.yml
+ parameters:
+ allCompletedJobId: Source_Build_Complete
+ ${{ each parameter in parameters.sourceBuildParameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
+
- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- ${{ if or(eq(parameters.enablePublishBuildAssets, true), eq(parameters.artifacts.publish.manifests, 'true'), ne(parameters.artifacts.publish.manifests, '')) }}:
- template: ../job/publish-build-assets.yml
@@ -55,6 +69,8 @@ jobs:
- ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}:
- ${{ each job in parameters.jobs }}:
- ${{ job.job }}
+ - ${{ if eq(parameters.runSourceBuild, true) }}:
+ - Source_Build_Complete
pool:
vmImage: vs2017-win2016
runAsPublic: ${{ parameters.runAsPublic }}
diff --git a/eng/common/templates/jobs/source-build.yml b/eng/common/templates/jobs/source-build.yml
new file mode 100644
index 000000000000..f463011e7931
--- /dev/null
+++ b/eng/common/templates/jobs/source-build.yml
@@ -0,0 +1,48 @@
+parameters:
+ # This template adds arcade-powered source-build to CI. A job is created for each platform, as
+ # well as an optional server job that completes when all platform jobs complete.
+
+ # The name of the "join" job for all source-build platforms. If set to empty string, the job is
+ # not included. Existing repo pipelines can use this job depend on all source-build jobs
+ # completing without maintaining a separate list of every single job ID: just depend on this one
+ # server job. By default, not included. Recommended name if used: 'Source_Build_Complete'.
+ allCompletedJobId: ''
+
+ # See /eng/common/templates/job/source-build.yml
+ jobNamePrefix: 'Source_Build'
+
+ # If changed to true, causes this template to include the default platform for a managed-only
+ # repo. The exact Docker image used for this build will be provided by Arcade. This has some risk,
+ # but since the repo is supposed to be managed-only, the risk should be very low.
+ includeDefaultManagedPlatform: false
+ defaultManagedPlatform:
+ name: 'Managed'
+ container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-3e800f1-20190501005343'
+
+ # Defines the platforms on which to run build jobs. One job is created for each platform, and the
+ # object in this array is sent to the job template as 'platform'.
+ platforms: []
+
+jobs:
+
+- ${{ if ne(parameters.allCompletedJobId, '') }}:
+ - job: ${{ parameters.allCompletedJobId }}
+ displayName: Source-Build Complete
+ pool: server
+ dependsOn:
+ - ${{ each platform in parameters.platforms }}:
+ - ${{ parameters.jobNamePrefix }}_${{ platform.name }}
+ - ${{ if eq(parameters.includeDefaultManagedPlatform, true) }}:
+ - ${{ parameters.jobNamePrefix }}_${{ parameters.defaultManagedPlatform.name }}
+
+- ${{ each platform in parameters.platforms }}:
+ - template: /eng/common/templates/job/source-build.yml
+ parameters:
+ jobNamePrefix: ${{ parameters.jobNamePrefix }}
+ platform: ${{ platform }}
+
+- ${{ if eq(parameters.includeDefaultManagedPlatform, true) }}:
+ - template: /eng/common/templates/job/source-build.yml
+ parameters:
+ jobNamePrefix: ${{ parameters.jobNamePrefix }}
+ platform: ${{ parameters.defaultManagedPlatform }}
diff --git a/eng/common/templates/post-build/channels/generic-internal-channel.yml b/eng/common/templates/post-build/channels/generic-internal-channel.yml
index 12db36ebe74f..7ae5255921aa 100644
--- a/eng/common/templates/post-build/channels/generic-internal-channel.yml
+++ b/eng/common/templates/post-build/channels/generic-internal-channel.yml
@@ -1,8 +1,10 @@
parameters:
+ BARBuildId: ''
+ PromoteToChannelIds: ''
artifactsPublishingAdditionalParameters: ''
dependsOn:
- Validate
- publishInstallersAndChecksums: false
+ publishInstallersAndChecksums: true
symbolPublishingAdditionalParameters: ''
stageName: ''
channelName: ''
@@ -19,6 +21,9 @@ stages:
displayName: ${{ parameters.channelName }} Publishing
jobs:
- template: ../setup-maestro-vars.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
- job: publish_symbols
displayName: Symbol Publishing
@@ -138,6 +143,7 @@ stages:
inputs:
filePath: eng\common\sdk-task.ps1
arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet
+ /p:PublishingInfraVersion=2
/p:IsStableBuild=$(IsStableBuild)
/p:IsInternalBuild=$(IsInternalBuild)
/p:RepositoryName=$(Build.Repository.Name)
@@ -152,7 +158,7 @@ stages:
/p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/'
/p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts/'
/p:Configuration=Release
- /p:PublishInstallersAndChecksums=true
+ /p:PublishInstallersAndChecksums=${{ parameters.publishInstallersAndChecksums }}
/p:ChecksumsTargetStaticFeed=$(InternalChecksumsBlobFeedUrl)
/p:ChecksumsAzureAccountKey=$(InternalChecksumsBlobFeedKey)
/p:InstallersTargetStaticFeed=$(InternalInstallersBlobFeedUrl)
diff --git a/eng/common/templates/post-build/channels/generic-public-channel.yml b/eng/common/templates/post-build/channels/generic-public-channel.yml
index bf98d990e88e..6cf39dbb2907 100644
--- a/eng/common/templates/post-build/channels/generic-public-channel.yml
+++ b/eng/common/templates/post-build/channels/generic-public-channel.yml
@@ -1,8 +1,10 @@
parameters:
+ BARBuildId: ''
+ PromoteToChannelIds: ''
artifactsPublishingAdditionalParameters: ''
dependsOn:
- Validate
- publishInstallersAndChecksums: false
+ publishInstallersAndChecksums: true
symbolPublishingAdditionalParameters: ''
stageName: ''
channelName: ''
@@ -21,6 +23,9 @@ stages:
displayName: ${{ parameters.channelName }} Publishing
jobs:
- template: ../setup-maestro-vars.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
- job: publish_symbols
displayName: Symbol Publishing
@@ -137,6 +142,7 @@ stages:
inputs:
filePath: eng\common\sdk-task.ps1
arguments: -task PublishArtifactsInManifest -restore -msbuildEngine dotnet
+ /p:PublishingInfraVersion=2
/p:ArtifactsCategory=$(ArtifactsCategory)
/p:IsStableBuild=$(IsStableBuild)
/p:IsInternalBuild=$(IsInternalBuild)
diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml
index 0e79a546b553..761fb1a29c35 100644
--- a/eng/common/templates/post-build/post-build.yml
+++ b/eng/common/templates/post-build/post-build.yml
@@ -1,18 +1,25 @@
parameters:
+ # Which publishing infra should be used. THIS SHOULD MATCH THE VERSION ON THE BUILD MANIFEST.
+ # Publishing V2 accepts optionally outlining the publishing stages - default is inline.
+ # Publishing V3 DOES NOT accept inlining the publishing stages.
+ publishingInfraVersion: 2
# When set to true the publishing templates from the repo will be used
# otherwise Darc add-build-to-channel will be used to trigger the promotion pipeline
inline: true
# Only used if inline==false. When set to true will stall the current build until
- # the Promotion Pipeline build finishes. Otherwise, the current build continue
+ # the Promotion Pipeline build finishes. Otherwise, the current build will continue
# execution concurrently with the promotion build.
waitPublishingFinish: true
+ BARBuildId: ''
+ PromoteToChannelIds: ''
+
enableSourceLinkValidation: false
enableSigningValidation: true
enableSymbolValidation: false
enableNugetValidation: true
- publishInstallersAndChecksums: false
+ publishInstallersAndChecksums: true
SDLValidationParameters:
enable: false
continueOnError: false
@@ -39,6 +46,7 @@ parameters:
NetEngLatestChannelId: 2
NetEngValidationChannelId: 9
NetDev5ChannelId: 131
+ NetDev6ChannelId: 1296
GeneralTestingChannelId: 529
NETCoreToolingDevChannelId: 548
NETCoreToolingReleaseChannelId: 549
@@ -46,9 +54,9 @@ parameters:
NETCoreExperimentalChannelId: 562
NetEngServicesIntChannelId: 678
NetEngServicesProdChannelId: 679
- Net5Preview7ChannelId: 1065
Net5Preview8ChannelId: 1155
Net5RC1ChannelId: 1157
+ Net5RC2ChannelId: 1329
NetCoreSDK313xxChannelId: 759
NetCoreSDK313xxInternalChannelId: 760
NetCoreSDK314xxChannelId: 921
@@ -59,40 +67,7 @@ parameters:
VSMasterChannelId: 1012
stages:
-- ${{ if ne(parameters.inline, 'true') }}:
- - stage: publish_using_darc
- dependsOn: ${{ parameters.validateDependsOn }}
- displayName: Publish using Darc
- variables:
- - template: common-variables.yml
- jobs:
- - template: setup-maestro-vars.yml
-
- - job:
- displayName: Publish Using Darc
- dependsOn: setupMaestroVars
- variables:
- - name: BARBuildId
- value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]
- pool:
- vmImage: 'windows-2019'
- steps:
- - task: PowerShell@2
- displayName: Publish Using Darc
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/publish-using-darc.ps1
- arguments: -BuildId $(BARBuildId)
- -AzdoToken '$(publishing-dnceng-devdiv-code-r-build-re)'
- -MaestroToken '$(MaestroApiAccessToken)'
- -WaitPublishingFinish ${{ parameters.waitPublishingFinish }}
- -EnableSourceLinkValidation ${{ parameters.enableSourceLinkValidation }}
- -EnableSigningValidation ${{ parameters.enableSourceLinkValidation }}
- -EnableNugetValidation ${{ parameters.enableSourceLinkValidation }}
- -PublishInstallersAndChecksums ${{ parameters.publishInstallersAndChecksums }}
- -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}'
- -SigningValidationAdditionalParameters '${{ parameters.signingValidationAdditionalParameters }}'
-
-- ${{ if eq(parameters.inline, 'true') }}:
+- ${{ if or(and(le(parameters.publishingInfraVersion, 2), eq(parameters.inline, 'true')), eq( parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true'), eq(parameters.SDLValidationParameters.enable, 'true')) }}:
- stage: Validate
dependsOn: ${{ parameters.validateDependsOn }}
displayName: Validate Build Assets
@@ -100,22 +75,26 @@ stages:
- template: common-variables.yml
jobs:
- template: setup-maestro-vars.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
- - job:
- displayName: Post-build Checks
- dependsOn: setupMaestroVars
- variables:
- - name: TargetChannels
- value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.TargetChannels'] ]
- pool:
- vmImage: 'windows-2019'
- steps:
- - task: PowerShell@2
- displayName: Maestro Channels Consistency
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/check-channel-consistency.ps1
- arguments: -PromoteToChannels "$(TargetChannels)"
- -AvailableChannelIds ${{parameters.NetEngLatestChannelId}},${{parameters.NetEngValidationChannelId}},${{parameters.NetDev5ChannelId}},${{parameters.GeneralTestingChannelId}},${{parameters.NETCoreToolingDevChannelId}},${{parameters.NETCoreToolingReleaseChannelId}},${{parameters.NETInternalToolingChannelId}},${{parameters.NETCoreExperimentalChannelId}},${{parameters.NetEngServicesIntChannelId}},${{parameters.NetEngServicesProdChannelId}},${{parameters.Net5Preview7ChannelId}},${{parameters.Net5Preview8ChannelId}},${{parameters.Net5RC1ChannelId}},${{parameters.NetCoreSDK313xxChannelId}},${{parameters.NetCoreSDK313xxInternalChannelId}},${{parameters.NetCoreSDK314xxChannelId}},${{parameters.NetCoreSDK314xxInternalChannelId}},${{parameters.VS166ChannelId}},${{parameters.VS167ChannelId}},${{parameters.VS168ChannelId}},${{parameters.VSMasterChannelId}}
+ - ${{ if and(le(parameters.publishingInfraVersion, 2), eq(parameters.inline, 'true')) }}:
+ - job:
+ displayName: Post-build Checks
+ dependsOn: setupMaestroVars
+ variables:
+ - name: TargetChannels
+ value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.TargetChannels'] ]
+ pool:
+ vmImage: 'windows-2019'
+ steps:
+ - task: PowerShell@2
+ displayName: Maestro Channels Consistency
+ inputs:
+ filePath: $(Build.SourcesDirectory)/eng/common/post-build/check-channel-consistency.ps1
+ arguments: -PromoteToChannels "$(TargetChannels)"
+ -AvailableChannelIds ${{parameters.NetEngLatestChannelId}},${{parameters.NetEngValidationChannelId}},${{parameters.NetDev5ChannelId}},${{parameters.NetDev6ChannelId}},${{parameters.GeneralTestingChannelId}},${{parameters.NETCoreToolingDevChannelId}},${{parameters.NETCoreToolingReleaseChannelId}},${{parameters.NETInternalToolingChannelId}},${{parameters.NETCoreExperimentalChannelId}},${{parameters.NetEngServicesIntChannelId}},${{parameters.NetEngServicesProdChannelId}},${{parameters.Net5Preview8ChannelId}},${{parameters.Net5RC1ChannelId}},${{parameters.Net5RC2ChannelId}},${{parameters.NetCoreSDK313xxChannelId}},${{parameters.NetCoreSDK313xxInternalChannelId}},${{parameters.NetCoreSDK314xxChannelId}},${{parameters.NetCoreSDK314xxInternalChannelId}},${{parameters.VS166ChannelId}},${{parameters.VS167ChannelId}},${{parameters.VS168ChannelId}},${{parameters.VSMasterChannelId}}
- job:
displayName: NuGet Validation
@@ -256,8 +235,46 @@ stages:
artifactNames: ${{ parameters.SDLValidationParameters.artifactNames }}
downloadArtifacts: ${{ parameters.SDLValidationParameters.downloadArtifacts }}
+- ${{ if or(ge(parameters.publishingInfraVersion, 3), eq(parameters.inline, 'false')) }}:
+ - stage: publish_using_darc
+ ${{ if or(eq(parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true'), eq(parameters.SDLValidationParameters.enable, 'true')) }}:
+ dependsOn: Validate
+ ${{ if and(ne(parameters.enableNugetValidation, 'true'), ne(parameters.enableSigningValidation, 'true'), ne(parameters.enableSourceLinkValidation, 'true'), ne(parameters.SDLValidationParameters.enable, 'true')) }}:
+ dependsOn: ${{ parameters.validateDependsOn }}
+ displayName: Publish using Darc
+ variables:
+ - template: common-variables.yml
+ jobs:
+ - template: setup-maestro-vars.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
+
+ - job:
+ displayName: Publish Using Darc
+ dependsOn: setupMaestroVars
+ variables:
+ - name: BARBuildId
+ value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]
+ pool:
+ vmImage: 'windows-2019'
+ steps:
+ - task: PowerShell@2
+ displayName: Publish Using Darc
+ inputs:
+ filePath: $(Build.SourcesDirectory)/eng/common/post-build/publish-using-darc.ps1
+ arguments: -BuildId $(BARBuildId)
+ -PublishingInfraVersion ${{ parameters.PublishingInfraVersion }}
+ -AzdoToken '$(publishing-dnceng-devdiv-code-r-build-re)'
+ -MaestroToken '$(MaestroApiAccessToken)'
+ -WaitPublishingFinish ${{ parameters.waitPublishingFinish }}
+ -PublishInstallersAndChecksums ${{ parameters.publishInstallersAndChecksums }}
+
+- ${{ if and(le(parameters.publishingInfraVersion, 2), eq(parameters.inline, 'true')) }}:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -272,20 +289,24 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }}
- stageName: 'Net5_Preview7_Publish'
- channelName: '.NET 5 Preview 7'
- akaMSChannelName: 'net5/preview7'
- channelId: ${{ parameters.Net5Preview7ChannelId }}
- transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json'
- shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json'
- symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json'
+ stageName: 'NetCore_Dev6_Publish'
+ channelName: '.NET 6 Dev'
+ akaMSChannelName: 'net6/dev'
+ channelId: ${{ parameters.NetDev6ChannelId }}
+ transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-transport/nuget/v3/index.json'
+ shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json'
+ symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6-symbols/nuget/v3/index.json'
- template: \eng\common\templates\post-build\channels\generic-internal-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -298,8 +319,10 @@ stages:
shippingFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v3/index.json'
symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-symbols/nuget/v3/index.json'
- - template: \eng\common\templates\post-build\channels\generic-internal-channel.yml
+ - template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -308,12 +331,30 @@ stages:
channelName: '.NET 5 RC 1'
akaMSChannelName: 'net5/rc1'
channelId: ${{ parameters.Net5RC1ChannelId }}
- transportFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v3/index.json'
- shippingFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v3/index.json'
- symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-symbols/nuget/v3/index.json'
+ transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json'
+ shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json'
+ symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json'
+
+ - template: \eng\common\templates\post-build\channels\generic-public-channel.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
+ artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
+ dependsOn: ${{ parameters.publishDependsOn }}
+ publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
+ symbolPublishingAdditionalParameters: ${{ parameters.symbolPublishingAdditionalParameters }}
+ stageName: 'Net5_RC2_Publish'
+ channelName: '.NET 5 RC 2'
+ akaMSChannelName: 'net5/rc2'
+ channelId: ${{ parameters.Net5RC2ChannelId }}
+ transportFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-transport/nuget/v3/index.json'
+ shippingFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json'
+ symbolsFeed: 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5-symbols/nuget/v3/index.json'
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -328,6 +369,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -342,6 +385,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -356,6 +401,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -369,6 +416,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -382,6 +431,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-internal-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -395,6 +446,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -408,6 +461,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -421,6 +476,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -434,6 +491,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -447,6 +506,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-internal-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -460,6 +521,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -473,6 +536,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-internal-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -486,6 +551,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -499,6 +566,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -512,6 +581,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
@@ -525,6 +596,8 @@ stages:
- template: \eng\common\templates\post-build\channels\generic-public-channel.yml
parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
dependsOn: ${{ parameters.publishDependsOn }}
publishInstallersAndChecksums: ${{ parameters.publishInstallersAndChecksums }}
diff --git a/eng/common/templates/post-build/setup-maestro-vars.yml b/eng/common/templates/post-build/setup-maestro-vars.yml
index b3d29d4498e3..d0cbfb6c6ffd 100644
--- a/eng/common/templates/post-build/setup-maestro-vars.yml
+++ b/eng/common/templates/post-build/setup-maestro-vars.yml
@@ -1,25 +1,23 @@
+parameters:
+ BARBuildId: ''
+ PromoteToChannelIds: ''
+
jobs:
- job: setupMaestroVars
displayName: Setup Maestro Vars
variables:
- template: common-variables.yml
- - name: BuildId
- value: $[ coalesce(variables.BARBuildId, 0) ]
- - name: PromoteToMaestroChannels
- value: $[ coalesce(variables.PromoteToChannelIds, 0) ]
- - name: PromoteToMaestroChannel
- value: $[ coalesce(variables.PromoteToMaestroChannelId, 0) ]
pool:
vmImage: 'windows-2019'
steps:
- checkout: none
- - task: DownloadBuildArtifacts@0
- displayName: Download Release Configs
- condition: and(eq(variables.PromoteToMaestroChannels, 0), eq(variables.PromoteToMaestroChannel, 0))
- inputs:
- buildType: current
- artifactName: ReleaseConfigs
+ - ${{ if eq(coalesce(parameters.PromoteToChannelIds, 0), 0) }}:
+ - task: DownloadBuildArtifacts@0
+ displayName: Download Release Configs
+ inputs:
+ buildType: current
+ artifactName: ReleaseConfigs
- task: PowerShell@2
name: setReleaseVars
@@ -28,7 +26,7 @@ jobs:
targetType: inline
script: |
try {
- if ($Env:PromoteToMaestroChannels -eq 0 -and $Env:PromoteToMaestroChannel -eq 0) {
+ if (!$Env:PromoteToMaestroChannels -or $Env:PromoteToMaestroChannels.Trim() -eq '') {
$Content = Get-Content $(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt
$BarId = $Content | Select -Index 0
@@ -51,7 +49,7 @@ jobs:
$BarId = $Env:BARBuildId
$Channels = $Env:PromoteToMaestroChannels -split ","
$Channels = $Channels -join "]["
- $Channels = "[$Channels][$Env:PromoteToMaestroChannel]"
+ $Channels = "[$Channels]"
$IsStableBuild = $buildInfo.stable
$AzureDevOpsProject = $buildInfo.azureDevOpsProject
@@ -75,3 +73,5 @@ jobs:
}
env:
MAESTRO_API_TOKEN: $(MaestroApiAccessToken)
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToMaestroChannels: ${{ parameters.PromoteToChannelIds }}
diff --git a/eng/common/templates/steps/perf-send-to-helix.yml b/eng/common/templates/steps/perf-send-to-helix.yml
index b3ea9acf1f16..a468e92ce44d 100644
--- a/eng/common/templates/steps/perf-send-to-helix.yml
+++ b/eng/common/templates/steps/perf-send-to-helix.yml
@@ -1,5 +1,6 @@
# Please remember to update the documentation if you make changes to these parameters!
parameters:
+ ProjectFile: '' # required -- project file that specifies the helix workitems
HelixSource: 'pr/default' # required -- sources must start with pr/, official/, prodcon/, or agent/
HelixType: 'tests/default/' # required -- Helix telemetry which identifies what type of data this is; should include "test" for clarity and must end in '/'
HelixBuild: $(Build.BuildNumber) # required -- the build number Helix will use to identify this -- automatically set to the AzDO build number
@@ -10,7 +11,7 @@ parameters:
WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects
CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload
IncludeDotNetCli: false # optional -- true will download a version of the .NET CLI onto the Helix machine as a correlation payload; requires DotNetCliPackageType and DotNetCliVersion
- DotNetCliPackageType: '' # optional -- either 'sdk' or 'runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json
+ DotNetCliPackageType: '' # optional -- either 'sdk', 'runtime' or 'aspnetcore-runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json
DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json
EnableXUnitReporter: false # optional -- true enables XUnit result reporting to Mission Control
WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget."
@@ -18,33 +19,18 @@ parameters:
DisplayNamePrefix: 'Send job to Helix' # optional -- rename the beginning of the displayName of the steps in AzDO
condition: succeeded() # optional -- condition for step to execute; defaults to succeeded()
continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false
+ osGroup: '' # required -- operating system for the job
+
steps:
- - powershell: $(Build.SourcesDirectory)\eng\common\msbuild.ps1 $(Build.SourcesDirectory)\eng\common\performance\perfhelixpublish.proj /restore /t:Test /bl:$(Build.SourcesDirectory)\artifacts\log\$env:BuildConfig\SendToHelix.binlog
- displayName: ${{ parameters.DisplayNamePrefix }} (Windows)
- env:
- BuildConfig: $(_BuildConfig)
- HelixSource: ${{ parameters.HelixSource }}
- HelixType: ${{ parameters.HelixType }}
- HelixBuild: ${{ parameters.HelixBuild }}
- HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
- HelixAccessToken: ${{ parameters.HelixAccessToken }}
- HelixPreCommands: ${{ parameters.HelixPreCommands }}
- HelixPostCommands: ${{ parameters.HelixPostCommands }}
- WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
- CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
- IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
- DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
- DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
- EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }}
- WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
- Creator: ${{ parameters.Creator }}
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT'))
+- template: /eng/pipelines/common/templates/runtimes/send-to-helix-inner-step.yml
+ parameters:
+ osGroup: ${{ parameters.osGroup }}
+ sendParams: $(Build.SourcesDirectory)/eng/common/performance/${{ parameters.ProjectFile }} /restore /t:Test /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog
+ displayName: ${{ parameters.DisplayNamePrefix }}
+ condition: ${{ parameters.condition }}
continueOnError: ${{ parameters.continueOnError }}
- - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/performance/perfhelixpublish.proj /restore /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog
- displayName: ${{ parameters.DisplayNamePrefix }} (Unix)
- env:
+ environment:
BuildConfig: $(_BuildConfig)
HelixSource: ${{ parameters.HelixSource }}
HelixType: ${{ parameters.HelixType }}
@@ -62,5 +48,3 @@ steps:
WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
Creator: ${{ parameters.Creator }}
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT'))
- continueOnError: ${{ parameters.continueOnError }}
diff --git a/eng/common/templates/steps/publish-logs.yml b/eng/common/templates/steps/publish-logs.yml
index f91751fe78e1..88f238f36bfd 100644
--- a/eng/common/templates/steps/publish-logs.yml
+++ b/eng/common/templates/steps/publish-logs.yml
@@ -12,7 +12,7 @@ steps:
Move-Item -Path $(Build.SourcesDirectory)/artifacts/log/Debug/* $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/
continueOnError: true
condition: always()
-
+
- task: PublishBuildArtifacts@1
displayName: Publish Logs
inputs:
diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml
index 5eceb48725dc..bb5f1a929389 100644
--- a/eng/common/templates/steps/send-to-helix.yml
+++ b/eng/common/templates/steps/send-to-helix.yml
@@ -18,7 +18,7 @@ parameters:
XUnitRuntimeTargetFramework: '' # optional -- framework to use for the xUnit console runner
XUnitRunnerVersion: '' # optional -- version of the xUnit nuget package you wish to use on Helix; required for XUnitProjects
IncludeDotNetCli: false # optional -- true will download a version of the .NET CLI onto the Helix machine as a correlation payload; requires DotNetCliPackageType and DotNetCliVersion
- DotNetCliPackageType: '' # optional -- either 'sdk' or 'runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases-index.json
+ DotNetCliPackageType: '' # optional -- either 'sdk', 'runtime' or 'aspnetcore-runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases-index.json
DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases-index.json
EnableXUnitReporter: false # optional -- true enables XUnit result reporting to Mission Control
WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget."
diff --git a/eng/common/templates/steps/source-build.yml b/eng/common/templates/steps/source-build.yml
new file mode 100644
index 000000000000..8e336b7d16b3
--- /dev/null
+++ b/eng/common/templates/steps/source-build.yml
@@ -0,0 +1,66 @@
+parameters:
+ # This template adds arcade-powered source-build to CI.
+
+ # This is a 'steps' template, and is intended for advanced scenarios where the existing build
+ # infra has a careful build methodology that must be followed. For example, a repo
+ # (dotnet/runtime) might choose to clone the GitHub repo only once and store it as a pipeline
+ # artifact for all subsequent jobs to use, to reduce dependence on a strong network connection to
+ # GitHub. Using this steps template leaves room for that infra to be included.
+
+ # Defines the platform on which to run the steps. See 'eng/common/templates/job/source-build.yml'
+ # for details. The entire object is described in the 'job' template for simplicity, even though
+ # the usage of the properties on this object is split between the 'job' and 'steps' templates.
+ platform: {}
+
+steps:
+# Build. Keep it self-contained for simple reusability. (No source-build-specific job variables.)
+- script: |
+ set -x
+ df -h
+
+ buildConfig=Release
+ # Check if AzDO substitutes in a build config from a variable, and use it if so.
+ if [ '$(_BuildConfig)' != '$''(_BuildConfig)' ]; then
+ buildConfig='$(_BuildConfig)'
+ fi
+
+ officialBuildArgs=
+ if [ '${{ and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}' = 'True' ]; then
+ officialBuildArgs='/p:DotNetPublishUsingPipelines=true /p:OfficialBuildId=$(BUILD.BUILDNUMBER)'
+ fi
+
+ targetRidArgs=
+ if [ '${{ parameters.platform.targetRID }}' != '' ]; then
+ targetRidArgs='/p:TargetRid=${{ parameters.platform.targetRID }}'
+ fi
+
+ ${{ coalesce(parameters.platform.buildScript, './build.sh') }} --ci \
+ --configuration $buildConfig \
+ --restore --build --pack --publish \
+ $officialBuildArgs \
+ $targetRidArgs \
+ /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \
+ /p:ArcadeBuildFromSource=true
+ displayName: Build
+
+# Upload build logs for diagnosis.
+- task: CopyFiles@2
+ displayName: Prepare BuildLogs staging directory
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)'
+ Contents: |
+ **/*.log
+ **/*.binlog
+ artifacts/source-build/self/prebuilt-report/**
+ TargetFolder: '$(Build.StagingDirectory)/BuildLogs'
+ CleanTargetFolder: true
+ continueOnError: true
+ condition: succeededOrFailed()
+
+- task: PublishPipelineArtifact@1
+ displayName: Publish BuildLogs
+ inputs:
+ targetPath: '$(Build.StagingDirectory)/BuildLogs'
+ artifactName: BuildLogs_SourceBuild_${{ parameters.platform.name }}_Attempt$(System.JobAttempt)
+ continueOnError: true
+ condition: succeededOrFailed()
diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1
index 6f8bc41116b7..fc09059ffe43 100644
--- a/eng/common/tools.ps1
+++ b/eng/common/tools.ps1
@@ -57,6 +57,11 @@ set-strictmode -version 2.0
$ErrorActionPreference = 'Stop'
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+# If specifies, provides an alternate path for getting .NET Core SDKs and Runtimes. This script will still try public sources first.
+[string]$runtimeSourceFeed = if (Test-Path variable:runtimeSourceFeed) { $runtimeSourceFeed } else { $null }
+# Base-64 encoded SAS token that has permission to storage container described by $runtimeSourceFeed
+[string]$runtimeSourceFeedKey = if (Test-Path variable:runtimeSourceFeedKey) { $runtimeSourceFeedKey } else { $null }
+
function Create-Directory ([string[]] $path) {
New-Item -Path $path -Force -ItemType 'Directory' | Out-Null
}
@@ -222,8 +227,8 @@ function GetDotNetInstallScript([string] $dotnetRoot) {
return $installScript
}
-function InstallDotNetSdk([string] $dotnetRoot, [string] $version, [string] $architecture = '') {
- InstallDotNet $dotnetRoot $version $architecture
+function InstallDotNetSdk([string] $dotnetRoot, [string] $version, [string] $architecture = '', [switch] $noPath) {
+ InstallDotNet $dotnetRoot $version $architecture '' $false $runtimeSourceFeed $runtimeSourceFeedKey -noPath:$noPath
}
function InstallDotNet([string] $dotnetRoot,
@@ -232,7 +237,8 @@ function InstallDotNet([string] $dotnetRoot,
[string] $runtime = '',
[bool] $skipNonVersionedFiles = $false,
[string] $runtimeSourceFeed = '',
- [string] $runtimeSourceFeedKey = '') {
+ [string] $runtimeSourceFeedKey = '',
+ [switch] $noPath) {
$installScript = GetDotNetInstallScript $dotnetRoot
$installParameters = @{
@@ -243,15 +249,14 @@ function InstallDotNet([string] $dotnetRoot,
if ($architecture) { $installParameters.Architecture = $architecture }
if ($runtime) { $installParameters.Runtime = $runtime }
if ($skipNonVersionedFiles) { $installParameters.SkipNonVersionedFiles = $skipNonVersionedFiles }
+ if ($noPath) { $installParameters.NoPath = $True }
try {
& $installScript @installParameters
}
catch {
- Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install dotnet runtime '$runtime' from public location."
-
- # Only the runtime can be installed from a custom [private] location.
- if ($runtime -and ($runtimeSourceFeed -or $runtimeSourceFeedKey)) {
+ if ($runtimeSourceFeed -or $runtimeSourceFeedKey) {
+ Write-Host "Failed to install dotnet from public location. Trying from '$runtimeSourceFeed'"
if ($runtimeSourceFeed) { $installParameters.AzureFeed = $runtimeSourceFeed }
if ($runtimeSourceFeedKey) {
@@ -264,10 +269,11 @@ function InstallDotNet([string] $dotnetRoot,
& $installScript @installParameters
}
catch {
- Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install dotnet runtime '$runtime' from custom location '$runtimeSourceFeed'."
+ Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install dotnet from custom location '$runtimeSourceFeed'."
ExitWithExitCode 1
}
} else {
+ Write-PipelineTelemetryError -Category 'InitializeToolset' -Message "Failed to install dotnet from public location."
ExitWithExitCode 1
}
}
@@ -293,9 +299,15 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements =
return $global:_MSBuildExe
}
- $vsMinVersionReqdStr = '16.5'
+ # Minimum VS version to require.
+ $vsMinVersionReqdStr = '16.8'
$vsMinVersionReqd = [Version]::new($vsMinVersionReqdStr)
+ # If the version of msbuild is going to be xcopied,
+ # use this version. Version matches a package here:
+ # https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=16.8.0-preview3&view=overview
+ $defaultXCopyMSBuildVersion = '16.8.0-preview3'
+
if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs }
$vsMinVersionStr = if ($vsRequirements.version) { $vsRequirements.version } else { $vsMinVersionReqdStr }
$vsMinVersion = [Version]::new($vsMinVersionStr)
@@ -330,23 +342,28 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements =
$xcopyMSBuildVersion = $GlobalJson.tools.'xcopy-msbuild'
$vsMajorVersion = $xcopyMSBuildVersion.Split('.')[0]
} else {
- #if vs version provided in global.json is incompatible then use the default version for xcopy msbuild download
+ #if vs version provided in global.json is incompatible (too low) then use the default version for xcopy msbuild download
if($vsMinVersion -lt $vsMinVersionReqd){
- Write-Host "Using xcopy-msbuild version of $vsMinVersionReqdStr.0-alpha since VS version $vsMinVersionStr provided in global.json is not compatible"
- $vsMajorVersion = $vsMinVersionReqd.Major
- $vsMinorVersion = $vsMinVersionReqd.Minor
+ Write-Host "Using xcopy-msbuild version of $defaultXCopyMSBuildVersion since VS version $vsMinVersionStr provided in global.json is not compatible"
+ $xcopyMSBuildVersion = $defaultXCopyMSBuildVersion
}
else{
+ # If the VS version IS compatible, look for an xcopy msbuild package
+ # with a version matching VS.
+ # Note: If this version does not exist, then an explicit version of xcopy msbuild
+ # can be specified in global.json. This will be required for pre-release versions of msbuild.
$vsMajorVersion = $vsMinVersion.Major
$vsMinorVersion = $vsMinVersion.Minor
+ $xcopyMSBuildVersion = "$vsMajorVersion.$vsMinorVersion.0"
}
-
- $xcopyMSBuildVersion = "$vsMajorVersion.$vsMinorVersion.0-alpha"
}
$vsInstallDir = $null
if ($xcopyMSBuildVersion.Trim() -ine "none") {
$vsInstallDir = InitializeXCopyMSBuild $xcopyMSBuildVersion $install
+ if ($vsInstallDir -eq $null) {
+ throw "Could not xcopy msbuild. Please check that package 'RoslynTools.MSBuild @ $xcopyMSBuildVersion' exists on feed 'dotnet-eng'."
+ }
}
if ($vsInstallDir -eq $null) {
throw 'Unable to find Visual Studio that has required version and components installed'
@@ -510,13 +527,15 @@ function GetDefaultMSBuildEngine() {
function GetNuGetPackageCachePath() {
if ($env:NUGET_PACKAGES -eq $null) {
- # Use local cache on CI to ensure deterministic build,
+ # Use local cache on CI to ensure deterministic build.
+ # Avoid using the http cache as workaround for https://github.com/NuGet/Home/issues/3116
# use global cache in dev builds to avoid cost of downloading packages.
# For directory normalization, see also: https://github.com/NuGet/Home/issues/7968
if ($useGlobalNuGetCache) {
$env:NUGET_PACKAGES = Join-Path $env:UserProfile '.nuget\packages\'
} else {
$env:NUGET_PACKAGES = Join-Path $RepoRoot '.packages\'
+ $env:RESTORENOCACHE = $true
}
}
@@ -602,11 +621,7 @@ function MSBuild() {
if ($pipelinesLog) {
$buildTool = InitializeBuildTool
- # Work around issues with Azure Artifacts credential provider
- # https://github.com/dotnet/arcade/issues/3932
if ($ci -and $buildTool.Tool -eq 'dotnet') {
- dotnet nuget locals http-cache -c
-
$env:NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS = 20
$env:NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS = 20
Write-PipelineSetVariable -Name 'NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS' -Value '20'
@@ -703,6 +718,16 @@ function IsWindowsPlatform() {
return [environment]::OSVersion.Platform -eq [PlatformID]::Win32NT
}
+function Get-Darc($version) {
+ $darcPath = "$TempDir\darc\$(New-Guid)"
+ if ($version -ne $null) {
+ & $PSScriptRoot\darc-init.ps1 -toolpath $darcPath -darcVersion $version | Out-Host
+ } else {
+ & $PSScriptRoot\darc-init.ps1 -toolpath $darcPath | Out-Host
+ }
+ return "$darcPath\darc.exe"
+}
+
. $PSScriptRoot\pipeline-logging-functions.ps1
$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot '..\..')
diff --git a/eng/common/tools.sh b/eng/common/tools.sh
index e94fce22ec37..98186e784965 100755
--- a/eng/common/tools.sh
+++ b/eng/common/tools.sh
@@ -64,6 +64,10 @@ else
use_global_nuget_cache=${use_global_nuget_cache:-true}
fi
+# Used when restoring .NET SDK from alternative feeds
+runtime_source_feed=${runtime_source_feed:-''}
+runtime_source_feed_key=${runtime_source_feed_key:-''}
+
# Resolve any symlinks in the given path.
function ResolvePath {
local path=$1
@@ -170,11 +174,11 @@ function InitializeDotNetCli {
function InstallDotNetSdk {
local root=$1
local version=$2
- local architecture=""
- if [[ $# == 3 ]]; then
+ local architecture="unset"
+ if [[ $# -ge 3 ]]; then
architecture=$3
fi
- InstallDotNet "$root" "$version" $architecture
+ InstallDotNet "$root" "$version" $architecture 'sdk' 'false' $runtime_source_feed $runtime_source_feed_key
}
function InstallDotNet {
@@ -185,50 +189,50 @@ function InstallDotNet {
local install_script=$_GetDotNetInstallScript
local archArg=''
- if [[ -n "${3:-}" ]]; then
+ if [[ -n "${3:-}" ]] && [ "$3" != 'unset' ]; then
archArg="--architecture $3"
fi
local runtimeArg=''
- if [[ -n "${4:-}" ]]; then
+ if [[ -n "${4:-}" ]] && [ "$4" != 'sdk' ]; then
runtimeArg="--runtime $4"
fi
-
local skipNonVersionedFilesArg=""
- if [[ "$#" -ge "5" ]]; then
+ if [[ "$#" -ge "5" ]] && [[ "$5" != 'false' ]]; then
skipNonVersionedFilesArg="--skip-non-versioned-files"
fi
bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg || {
local exit_code=$?
- Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from public location (exit code '$exit_code')."
+ echo "Failed to install dotnet SDK from public location (exit code '$exit_code')."
- if [[ -n "$runtimeArg" ]]; then
- local runtimeSourceFeed=''
- if [[ -n "${6:-}" ]]; then
- runtimeSourceFeed="--azure-feed $6"
- fi
+ local runtimeSourceFeed=''
+ if [[ -n "${6:-}" ]]; then
+ runtimeSourceFeed="--azure-feed $6"
+ fi
- local runtimeSourceFeedKey=''
- if [[ -n "${7:-}" ]]; then
- # The 'base64' binary on alpine uses '-d' and doesn't support '--decode'
- # '-d'. To work around this, do a simple detection and switch the parameter
- # accordingly.
- decodeArg="--decode"
- if base64 --help 2>&1 | grep -q "BusyBox"; then
- decodeArg="-d"
- fi
- decodedFeedKey=`echo $7 | base64 $decodeArg`
- runtimeSourceFeedKey="--feed-credential $decodedFeedKey"
+ local runtimeSourceFeedKey=''
+ if [[ -n "${7:-}" ]]; then
+ # The 'base64' binary on alpine uses '-d' and doesn't support '--decode'
+ # '-d'. To work around this, do a simple detection and switch the parameter
+ # accordingly.
+ decodeArg="--decode"
+ if base64 --help 2>&1 | grep -q "BusyBox"; then
+ decodeArg="-d"
fi
+ decodedFeedKey=`echo $7 | base64 $decodeArg`
+ runtimeSourceFeedKey="--feed-credential $decodedFeedKey"
+ fi
- if [[ -n "$runtimeSourceFeed" || -n "$runtimeSourceFeedKey" ]]; then
- bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg $runtimeSourceFeed $runtimeSourceFeedKey || {
- local exit_code=$?
- Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from custom location '$runtimeSourceFeed' (exit code '$exit_code')."
- ExitWithExitCode $exit_code
- }
- else
+ if [[ -n "$runtimeSourceFeed" || -n "$runtimeSourceFeedKey" ]]; then
+ bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg $runtimeSourceFeed $runtimeSourceFeedKey || {
+ local exit_code=$?
+ Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from custom location '$runtimeSourceFeed' (exit code '$exit_code')."
ExitWithExitCode $exit_code
+ }
+ else
+ if [[ $exit_code != 0 ]]; then
+ Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK from public location (exit code '$exit_code')."
fi
+ ExitWithExitCode $exit_code
fi
}
}
@@ -297,12 +301,14 @@ function InitializeBuildTool {
_InitializeBuildToolFramework="netcoreapp2.1"
}
+# Set RestoreNoCache as a workaround for https://github.com/NuGet/Home/issues/3116
function GetNuGetPackageCachePath {
if [[ -z ${NUGET_PACKAGES:-} ]]; then
if [[ "$use_global_nuget_cache" == true ]]; then
export NUGET_PACKAGES="$HOME/.nuget/packages"
else
export NUGET_PACKAGES="$repo_root/.packages"
+ export RESTORENOCACHE=true
fi
fi
@@ -391,11 +397,7 @@ function MSBuild {
InitializeBuildTool
InitializeToolset
- # Work around issues with Azure Artifacts credential provider
- # https://github.com/dotnet/arcade/issues/3932
if [[ "$ci" == true ]]; then
- "$_InitializeBuildTool" nuget locals http-cache -c
-
export NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS=20
export NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS=20
Write-PipelineSetVariable -name "NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS" -value "20"
diff --git a/eng/depProj.common.targets b/eng/depProj.common.targets
deleted file mode 100644
index b6d73606c388..000000000000
--- a/eng/depProj.common.targets
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
diff --git a/eng/depProj.targets b/eng/depProj.targets
deleted file mode 100644
index 7cb63b0fca25..000000000000
--- a/eng/depProj.targets
+++ /dev/null
@@ -1,156 +0,0 @@
-
-
-
-
-
-
-
- true
-
- false
-
- false
- false
-
-
-
- ReferenceCopyLocalPaths
-
-
- false
-
-
- None
-
-
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PreserveNewest
- %(NuGetDeploy.SubFolder)%(FileName)%(Extension)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <_nuGetDeploy Include="@($(NuGetDeploySourceItem))"/>
- <_nuGetDeployByFileName Include="@(_nuGetDeploy->'%(FileName)')">
- %(Identity)
-
-
- <_nuGetDeployByFileNameToRemove Include="@(_nuGetDeployByFileName)" Exclude="@(FileToInclude)" Condition="'@(FileToInclude)' != ''" />
- <_filteredNuGetDeployByFileName Include="@(_nuGetDeployByFileName)" Exclude="@(_nuGetDeployByFileNameToRemove);@(FileToExclude)" />
-
- <_nuGetDeployByPackageId Include="@(_filteredNuGetDeployByFileName->'%(NuGetPackageId)')" />
-
- <_nuGetDeployByPackageIdToRemove Include="@(_nuGetDeployByPackageId)" Exclude="@(PackageToInclude)" Condition="'@(PackageToInclude)' != ''" />
- <_filteredNuGetDeployByPackageId Include="@(_nuGetDeployByPackageId)" Exclude="@(_nuGetDeployByPackageIdToRemove);@(PackageToExclude)" />
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/eng/docker/Readme.md b/eng/docker/Readme.md
index 0f73be1740e7..d2482bb08bf0 100644
--- a/eng/docker/Readme.md
+++ b/eng/docker/Readme.md
@@ -5,7 +5,7 @@ Provides reusable docker build infrastructure for the dotnet/runtime repo.
## libraries-sdk Dockerfiles
The `libraries-sdk` Dockerfiles can be used to build dotnet sdk docker images
-that contain the current libraries built from source.
+that contain the current libraries built from source.
These images can be used to build dockerized dotnet services that target the current libraries.
Currently, debian and windows nanoserver sdk's are supported.
diff --git a/eng/docker/libraries-sdk-aspnetcore.linux.Dockerfile b/eng/docker/libraries-sdk-aspnetcore.linux.Dockerfile
index 04974370ebac..08adb4359e05 100644
--- a/eng/docker/libraries-sdk-aspnetcore.linux.Dockerfile
+++ b/eng/docker/libraries-sdk-aspnetcore.linux.Dockerfile
@@ -14,16 +14,16 @@ RUN ./src/coreclr/build.sh -release -skiptests -clang9 && \
FROM $SDK_BASE_IMAGE as target
ARG TESTHOST_LOCATION=/repo/artifacts/bin/testhost
-ARG TFM=net5.0
+ARG TFM=net6.0
ARG OS=Linux
ARG ARCH=x64
ARG CONFIGURATION=Release
ARG COREFX_SHARED_FRAMEWORK_NAME=Microsoft.NETCore.App
ARG ASPNETCORE_SHARED_NAME=Microsoft.AspNetCore.App
-ARG SOURCE_COREFX_VERSION=5.0.0
+ARG SOURCE_COREFX_VERSION=6.0.0
ARG TARGET_SHARED_FRAMEWORK=/usr/share/dotnet/shared
-ARG TARGET_COREFX_VERSION=3.0.0
+ARG TARGET_COREFX_VERSION=$DOTNET_VERSION
COPY --from=corefxbuild \
$TESTHOST_LOCATION/$TFM-$OS-$CONFIGURATION-$ARCH/shared/$COREFX_SHARED_FRAMEWORK_NAME/$SOURCE_COREFX_VERSION/* \
diff --git a/eng/docker/libraries-sdk-aspnetcore.windows.Dockerfile b/eng/docker/libraries-sdk-aspnetcore.windows.Dockerfile
index 32f91f5d8595..584c1e838e66 100644
--- a/eng/docker/libraries-sdk-aspnetcore.windows.Dockerfile
+++ b/eng/docker/libraries-sdk-aspnetcore.windows.Dockerfile
@@ -4,16 +4,16 @@ ARG SDK_BASE_IMAGE=mcr.microsoft.com/dotnet/nightly/sdk:5.0-nanoserver-1809
FROM $SDK_BASE_IMAGE as target
ARG TESTHOST_LOCATION=".\\artifacts\\bin\\testhost"
-ARG TFM=net5.0
+ARG TFM=net6.0
ARG OS=Windows_NT
ARG ARCH=x64
ARG CONFIGURATION=Release
ARG COREFX_SHARED_FRAMEWORK_NAME=Microsoft.NETCore.App
ARG ASPNETCORE_SHARED_NAME=Microsoft.AspNetCore.App
-ARG SOURCE_COREFX_VERSION=5.0.0
+ARG SOURCE_COREFX_VERSION=6.0.0
ARG TARGET_SHARED_FRAMEWORK="C:\\Program Files\\dotnet\\shared"
-ARG TARGET_COREFX_VERSION=3.0.0
+ARG TARGET_COREFX_VERSION=$DOTNET_VERSION
COPY `
$TESTHOST_LOCATION\$TFM-$OS-$CONFIGURATION-$ARCH\shared\$COREFX_SHARED_FRAMEWORK_NAME\$SOURCE_COREFX_VERSION\ `
diff --git a/eng/docker/libraries-sdk.linux.Dockerfile b/eng/docker/libraries-sdk.linux.Dockerfile
index 2cc979dba6a0..1d704ecbc42b 100644
--- a/eng/docker/libraries-sdk.linux.Dockerfile
+++ b/eng/docker/libraries-sdk.linux.Dockerfile
@@ -13,15 +13,15 @@ RUN ./build.sh -ci -subset clr+libs -runtimeconfiguration release -c $CONFIGURAT
FROM $SDK_BASE_IMAGE as target
ARG TESTHOST_LOCATION=/repo/artifacts/bin/testhost
-ARG TFM=net5.0
+ARG TFM=net6.0
ARG OS=Linux
ARG ARCH=x64
ARG CONFIGURATION=Release
ARG COREFX_SHARED_FRAMEWORK_NAME=Microsoft.NETCore.App
-ARG SOURCE_COREFX_VERSION=5.0.0
+ARG SOURCE_COREFX_VERSION=6.0.0
ARG TARGET_SHARED_FRAMEWORK=/usr/share/dotnet/shared
-ARG TARGET_COREFX_VERSION=3.0.0
+ARG TARGET_COREFX_VERSION=$DOTNET_VERSION
COPY --from=corefxbuild \
$TESTHOST_LOCATION/$TFM-$OS-$CONFIGURATION-$ARCH/shared/$COREFX_SHARED_FRAMEWORK_NAME/$SOURCE_COREFX_VERSION/* \
diff --git a/eng/docker/libraries-sdk.windows.Dockerfile b/eng/docker/libraries-sdk.windows.Dockerfile
index 50c3f357c9b7..adbf17302fef 100644
--- a/eng/docker/libraries-sdk.windows.Dockerfile
+++ b/eng/docker/libraries-sdk.windows.Dockerfile
@@ -4,15 +4,15 @@ ARG SDK_BASE_IMAGE=mcr.microsoft.com/dotnet/nightly/sdk:5.0-nanoserver-1809
FROM $SDK_BASE_IMAGE as target
ARG TESTHOST_LOCATION=".\\artifacts\\bin\\testhost"
-ARG TFM=net5.0
+ARG TFM=net6.0
ARG OS=Windows_NT
ARG ARCH=x64
ARG CONFIGURATION=Release
ARG COREFX_SHARED_FRAMEWORK_NAME=Microsoft.NETCore.App
-ARG SOURCE_COREFX_VERSION=5.0.0
+ARG SOURCE_COREFX_VERSION=6.0.0
ARG TARGET_SHARED_FRAMEWORK="C:\\Program Files\\dotnet\\shared"
-ARG TARGET_COREFX_VERSION=3.0.0
+ARG TARGET_COREFX_VERSION=$DOTNET_VERSION
COPY `
$TESTHOST_LOCATION\$TFM-$OS-$CONFIGURATION-$ARCH\shared\$COREFX_SHARED_FRAMEWORK_NAME\$SOURCE_COREFX_VERSION\ `
diff --git a/eng/illink.targets b/eng/illink.targets
index 601b0b798fbc..e5814573953d 100644
--- a/eng/illink.targets
+++ b/eng/illink.targets
@@ -25,9 +25,10 @@
+ $(MSBuildProjectDirectory)\ILLink\$([MSBuild]::NormalizeDirectory('$(PkgMicrosoft_NET_ILLink_Tasks)', 'tools'))
- $(ILLinkTasksDir)netcoreapp3.0/ILLink.Tasks.dll
- $(ILLinkTasksDir)$(NetFrameworkCurrent)/ILLink.Tasks.dll
+ $(ILLinkTasksDir)net5.0/ILLink.Tasks.dll
+ $(ILLinkTasksDir)net472/ILLink.Tasks.dll$(IntermediateOutputPath)$(TargetName)$(TargetExt)$(IntermediateOutputPath)$(TargetName).pdb$(IntermediateOutputPath)PreTrim/
@@ -35,14 +36,20 @@
$(ILLinkTrimInputPath)$(TargetName).pdb$(IntermediateOutputPath)
- $(MSBuildProjectDirectory)/ILLinkTrim.xml
+ $(ILLinkDirectory)ILLinkTrim.xml
- $(MSBuildProjectDirectory)/ILLinkTrim_LibraryBuild.xml
+ $(ILLinkDirectory)ILLinkTrim_LibraryBuild.xml$(IntermediateOutputPath)ILLink.Descriptors.xml$(IntermediateOutputPath)ILLink.Substitutions.xml$(IntermediateOutputPath)ILLink.LinkAttributes.xml
+ $(ILLinkDirectory)ILLink.Suppressions
+ $(ILLinkSuppressionsXmlFilePrefix).xml
+ $(ILLinkSuppressionsXmlFilePrefix).$(Configuration).xml
+ $(ILLinkSuppressionsXmlFilePrefix).$(TargetOS).xml
+ $(ILLinkSuppressionsXmlFilePrefix).NonWindows.xml
+
true
@@ -52,24 +59,52 @@
+
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'ILLinkTrimAssembly', '$(BuildSettings)'))
+ $(ILLinkTrimAssemblyArtifactsRootDir)suppressions-xmls\
+
+
- $(ArtifactsBinDir)ILLinkTrimAssembly/$(BuildSettings)/trimmed
+ $(ILLinkTrimAssemblyArtifactsRootDir)trimmedTrimmedItem
- $(ArtifactsBinDir)ILLinkTrimAssembly/$(BuildSettings)/reports
+ $(ILLinkTrimAssemblyArtifactsRootDir)reportsTrimmingReport
- $(ArtifactsBinDir)ILLinkTrimAssembly/$(BuildSettings)/pretrimmed
+ $(ILLinkTrimAssemblyArtifactsRootDir)pretrimmedPreTrimmedItem
+
+
+
+
+
+
+
+
+
+
+ $(ILLinkTrimAssemblySuppressionsXmlsDir)
+ ILLinkSuppressionsXmls
+
+
+ $(ILLinkTrimAssemblySuppressionsXmlsDir)
+ ILLinkSuppressionsXmls
+
+
+
@@ -184,22 +219,37 @@
+
+
+
+
+ $(ILLinkArgs) -t
+
+
+ $(ILLinkArgs) --strip-link-attributes false --ignore-link-attributes true
+
+ $(ILLinkArgs) --skip-unresolved true
+
+ $(ILLinkArgs) --disable-opt unusedinterfaces
+
+
+
-
+
- $(ILLinkArgs)-r $(TargetName)
+ $(ILLinkArgs) -r $(TargetName)$(ILLinkArgs) -c skip$(ILLinkArgs) -u skip$(ILLinkArgs) -p link $(TargetName)
-
- $(ILLinkArgs) -t$(ILLinkArgs) -b true$(ILLinkArgs) --strip-descriptors false
@@ -207,15 +257,26 @@
$(ILLinkArgs) -x "$(ILLinkTrimXmlLibraryBuild)"$(ILLinkArgs) --strip-substitutions false
-
-
- $(ILLinkArgs) --strip-link-attributes false --ignore-link-attributes true
-
- $(ILLinkArgs) --skip-unresolved true
-
- $(ILLinkArgs) --disable-opt unusedinterfaces$(ILLinkArgs) --keep-dep-attributes true
+
+ IL2008;IL2009;IL2012;IL2025;IL2026;IL2035;IL2050
+
+ $(LinkerNoWarn);IL2032;IL2055;IL2057;IL2058;IL2059;IL2060;IL2061
+
+ $(LinkerNoWarn);IL2062;IL2063;IL2064;IL2065;IL2066
+
+ $(LinkerNoWarn);IL2067;IL2068;IL2069;IL2070;IL2071;IL2072;IL2073;IL2074;IL2075;IL2076;IL2077;IL2078;IL2079;IL2080;IL2081;IL2082;IL2083;IL2084;IL2085;IL2086;IL2087;IL2088;IL2089;IL2090;IL2091
+ $(ILLinkArgs) --nowarn $(LinkerNoWarn)
@@ -255,9 +316,9 @@
+
<_DotNetHostDirectory>$(NetCoreRoot)
- <_DotNetHostFileName>dotnet
- <_DotNetHostFileName Condition=" '$(OS)' == 'Windows_NT' ">dotnet.exe
+ <_DotNetHostFileName>$([System.IO.Path]::GetFileName('$(DotNetTool)'))
azDO
+#
+# For developer use it is not recommended to include the azDO final argument as that
+# makes installation and configuration setting only required for azDO
+#
+# So simple developer usage would currently be
+#
+# ./install-native-dependencies.sh
+
+if [ "$1" = "OSX" ] && [ "$2" = "arm64" ] && [ "$3" = "azDO" ]; then
+ # On AzDO macOS-10.15 build agents the Xcode currently defaults to Xcode 11.7
+ # Cross compilation for osx-arm64 requires xcode 12.2 or greater
+ sudo xcode-select -s /Applications/Xcode_12.2.app/Contents/Developer
+fi
+
if [ "$1" = "Linux" ]; then
sudo apt update
if [ "$?" != "0" ]; then
@@ -11,12 +30,24 @@ if [ "$1" = "Linux" ]; then
fi
elif [ "$1" = "OSX" ] || [ "$1" = "tvOS" ] || [ "$1" = "iOS" ]; then
engdir=$(dirname "${BASH_SOURCE[0]}")
- brew bundle --no-lock --file "${engdir}/Brewfile"
+ brew update --preinstall
+ brew bundle --no-upgrade --no-lock --file "${engdir}/Brewfile"
if [ "$?" != "0" ]; then
exit 1;
fi
+elif [ "$1" = "Android" ]; then
+ if [ -z "${ANDROID_OPENSSL_AAR}" ]; then
+ echo "The ANDROID_OPENSSL_AAR variable must be set!"
+ exit 1;
+ fi
+ if [ -d "${ANDROID_OPENSSL_AAR}" ]; then
+ exit 0;
+ fi
+ OPENSSL_VER=1.1.1g-alpha-1
+ curl https://maven.google.com/com/android/ndk/thirdparty/openssl/${OPENSSL_VER}/openssl-${OPENSSL_VER}.aar -L --output /tmp/openssl.zip
+ unzip /tmp/openssl.zip -d "${ANDROID_OPENSSL_AAR}" && rm -rf /tmp/openssl.zip
else
- echo "Must pass \"Linux\", \"tvOS\", \"iOS\" or \"OSX\" as first argument."
+ echo "Must pass \"Linux\", \"Android\", \"tvOS\", \"iOS\" or \"OSX\" as first argument."
exit 1
fi
diff --git a/eng/liveBuilds.targets b/eng/liveBuilds.targets
index e7cd12b6a4ea..5135de072544 100644
--- a/eng/liveBuilds.targets
+++ b/eng/liveBuilds.targets
@@ -86,11 +86,13 @@
$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)'))
+ $([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','PDB'))$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','sharedFramework'))
+ $([MSBuild]::NormalizeDirectory('$(CoreCLRSharedFrameworkDir)','PDB'))$([MSBuild]::NormalizeDirectory('$(CoreCLRArtifactsPath)','$(CoreCLRCrossTargetComponentDirName)','sharedFramework'))
@@ -112,18 +114,19 @@
+ $(CoreCLRSharedFrameworkPdbDir)*.pdb;
+ $(CoreCLRSharedFrameworkPdbDir)*.dbg;
+ $(CoreCLRSharedFrameworkPdbDir)*.dwarf" />
-
+ Include="$(CoreCLRArtifactsPdbDir)System.Private.CoreLib.pdb" />
+
+
+ $(CoreCLRSharedFrameworkPdbDir)*.pdb;
+ $(CoreCLRSharedFrameworkPdbDir)*.dbg;
+ $(CoreCLRSharedFrameworkPdbDir)*.dwarf" />
runtime/$(CoreCLRCrossTargetComponentDirName)_$(TargetArchitecture)/native
@@ -192,7 +195,7 @@
$(LibrariesNativeArtifactsPath)dotnet.js;
$(LibrariesNativeArtifactsPath)dotnet.wasm;
$(LibrariesNativeArtifactsPath)dotnet.timezones.blat;
- $(LibrariesNativeArtifactsPath)icudt.dat;"
+ $(LibrariesNativeArtifactsPath)*.dat;"
IsNative="true" />
diff --git a/eng/native/build-commons.sh b/eng/native/build-commons.sh
index b976f5fdc6cf..bf2863e15c1d 100755
--- a/eng/native/build-commons.sh
+++ b/eng/native/build-commons.sh
@@ -6,8 +6,8 @@ initTargetDistroRid()
local passedRootfsDir=""
- # Only pass ROOTFS_DIR if cross is specified.
- if [[ "$__CrossBuild" == 1 ]]; then
+ # Only pass ROOTFS_DIR if cross is specified and the target platform is not Darwin that doesn't use rootfs
+ if [[ "$__CrossBuild" == 1 && "$platform" != "Darwin" ]]; then
passedRootfsDir="$ROOTFS_DIR"
fi
@@ -48,11 +48,6 @@ check_prereqs()
{
echo "Checking prerequisites..."
- if ! cmake --help 2>&1 | grep -q \\-B; then
- echo "Please install cmake v3.14.5 or newer from https://www.cmake.org/download/."
- exit 1
- fi
-
if [[ "$__HostOS" == "OSX" ]]; then
# Check presence of pkg-config on the path
command -v pkg-config 2>/dev/null || { echo >&2 "Please install pkg-config before running this script, see https://github.com/dotnet/runtime/blob/master/docs/workflow/requirements/macos-requirements.md"; exit 1; }
@@ -60,7 +55,7 @@ check_prereqs()
if ! pkg-config openssl ; then
# We export the proper PKG_CONFIG_PATH where openssl was installed by Homebrew
# It's important to _export_ it since build-commons.sh is sourced by other scripts such as build-native.sh
- export PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig
+ export PKG_CONFIG_PATH=/usr/local/opt/openssl@1.1/lib/pkgconfig:/usr/local/opt/openssl/lib/pkgconfig
# We try again with the PKG_CONFIG_PATH in place, if pkg-config still can't find OpenSSL, exit with an error, cmake won't find OpenSSL either
pkg-config openssl || { echo >&2 "Please install openssl before running this script, see https://github.com/dotnet/runtime/blob/master/docs/workflow/requirements/macos-requirements.md"; exit 1; }
fi
@@ -73,15 +68,28 @@ check_prereqs()
build_native()
{
- platformArch="$1"
- cmakeDir="$2"
- tryrunDir="$3"
- intermediatesDir="$4"
- message="$5"
+ targetOS="$1"
+ platformArch="$2"
+ cmakeDir="$3"
+ tryrunDir="$4"
+ intermediatesDir="$5"
+ cmakeArgs="$6"
+ message="$7"
# All set to commence the build
echo "Commencing build of \"$message\" for $__TargetOS.$__BuildArch.$__BuildType in $intermediatesDir"
+ if [[ "$targetOS" == OSX ]]; then
+ if [[ "$platformArch" == x64 ]]; then
+ cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"x86_64\" $cmakeArgs"
+ elif [[ "$platformArch" == arm64 ]]; then
+ cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"arm64\" $cmakeArgs"
+ else
+ echo "Error: Unknown OSX architecture $platformArch."
+ exit 1
+ fi
+ fi
+
if [[ "$__UseNinja" == 1 ]]; then
generator="ninja"
buildTool="$(command -v ninja || command -v ninja-build)"
@@ -139,8 +147,8 @@ EOF
fi
engNativeDir="$__RepoRootDir/eng/native"
- __CMakeArgs="-DCLR_ENG_NATIVE_DIR=\"$engNativeDir\" $__CMakeArgs"
- nextCommand="\"$engNativeDir/gen-buildsys.sh\" \"$cmakeDir\" \"$tryrunDir\" \"$intermediatesDir\" $platformArch $__Compiler \"$__CompilerMajorVersion\" \"$__CompilerMinorVersion\" $__BuildType \"$generator\" $scan_build $__CMakeArgs"
+ cmakeArgs="-DCLR_ENG_NATIVE_DIR=\"$engNativeDir\" $cmakeArgs"
+ nextCommand="\"$engNativeDir/gen-buildsys.sh\" \"$cmakeDir\" \"$tryrunDir\" \"$intermediatesDir\" $platformArch $__Compiler \"$__CompilerMajorVersion\" \"$__CompilerMinorVersion\" $__BuildType \"$generator\" $scan_build $cmakeArgs"
echo "Invoking $nextCommand"
eval $nextCommand
@@ -163,12 +171,25 @@ EOF
return
fi
+ SAVED_CFLAGS="${CFLAGS}"
+ SAVED_CXXFLAGS="${CXXFLAGS}"
+ SAVED_LDFLAGS="${LDFLAGS}"
+
+ # Let users provide additional compiler/linker flags via EXTRA_CFLAGS/EXTRA_CXXFLAGS/EXTRA_LDFLAGS.
+ # If users directly override CFLAG/CXXFLAGS/LDFLAGS, that may lead to some configure tests working incorrectly.
+ # See https://github.com/dotnet/runtime/issues/35727 for more information.
+ export CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}"
+ export CXXFLAGS="${CXXFLAGS} ${EXTRA_CXXFLAGS}"
+ export LDFLAGS="${LDFLAGS} ${EXTRA_LDFLAGS}"
+
+ local exit_code
if [[ "$__StaticAnalyzer" == 1 ]]; then
pushd "$intermediatesDir"
buildTool="$SCAN_BUILD_COMMAND -o $__BinDir/scan-build-log $buildTool"
echo "Executing $buildTool install -j $__NumProc"
"$buildTool" install -j "$__NumProc"
+ exit_code="$?"
popd
else
@@ -177,11 +198,15 @@ EOF
cmake_command="emcmake $cmake_command"
fi
- echo "Executing $cmake_command --build \"$intermediatesDir\" --target install -j $__NumProc"
- $cmake_command --build "$intermediatesDir" --target install -j "$__NumProc"
+ echo "Executing $cmake_command --build \"$intermediatesDir\" --target install -- -j $__NumProc"
+ $cmake_command --build "$intermediatesDir" --target install -- -j "$__NumProc"
+ exit_code="$?"
fi
- local exit_code="$?"
+ CFLAGS="${SAVED_CFLAGS}"
+ CXXFLAGS="${SAVED_CXXFLAGS}"
+ LDFLAGS="${SAVED_LDFLAGS}"
+
if [[ "$exit_code" != 0 ]]; then
echo "${__ErrMsgPrefix}Failed to build \"$message\"."
exit "$exit_code"
@@ -213,6 +238,7 @@ usage()
echo "-portablebuild: pass -portablebuild=false to force a non-portable build."
echo "-skipconfigure: skip build configuration."
echo "-skipgenerateversion: disable version generation even if MSBuild is supported."
+ echo "-keepnativesymbols: keep native/unmanaged debug symbols."
echo "-verbose: optional argument to enable verbose build output."
echo ""
echo "Additional Options:"
@@ -234,6 +260,20 @@ __BuildOS=$os
__msbuildonunsupportedplatform=0
+# Get the number of processors available to the scheduler
+# Other techniques such as `nproc` only get the number of
+# processors available to a single process.
+platform="$(uname)"
+if [[ "$platform" == "FreeBSD" ]]; then
+ __NumProc=$(sysctl hw.ncpu | awk '{ print $2+1 }')
+elif [[ "$platform" == "NetBSD" || "$platform" == "SunOS" ]]; then
+ __NumProc=$(($(getconf NPROCESSORS_ONLN)+1))
+elif [[ "$platform" == "Darwin" ]]; then
+ __NumProc=$(($(getconf _NPROCESSORS_ONLN)+1))
+else
+ __NumProc=$(nproc --all)
+fi
+
while :; do
if [[ "$#" -le 0 ]]; then
break
@@ -328,6 +368,10 @@ while :; do
__CompilerMinorVersion="${parts[1]}"
;;
+ keepnativesymbols|-keepnativesymbols)
+ __CMakeArgs="$__CMakeArgs -DCLR_CMAKE_KEEP_NATIVE_SYMBOLS=true"
+ ;;
+
msbuildonunsupportedplatform|-msbuildonunsupportedplatform)
__msbuildonunsupportedplatform=1
;;
@@ -400,20 +444,6 @@ while :; do
shift
done
-# Get the number of processors available to the scheduler
-# Other techniques such as `nproc` only get the number of
-# processors available to a single process.
-platform="$(uname)"
-if [[ "$platform" == "FreeBSD" ]]; then
- __NumProc=$(sysctl hw.ncpu | awk '{ print $2+1 }')
-elif [[ "$platform" == "NetBSD" || "$platform" == "SunOS" ]]; then
- __NumProc=$(($(getconf NPROCESSORS_ONLN)+1))
-elif [[ "$platform" == "Darwin" ]]; then
- __NumProc=$(($(getconf _NPROCESSORS_ONLN)+1))
-else
- __NumProc=$(nproc --all)
-fi
-
__CommonMSBuildArgs="/p:TargetArchitecture=$__BuildArch /p:Configuration=$__BuildType /p:TargetOS=$__TargetOS /nodeReuse:false $__OfficialBuildIdArg $__SignTypeArg $__SkipRestoreArg"
# Configure environment if we are doing a verbose build
@@ -431,7 +461,8 @@ fi
if [[ "$__CrossBuild" == 1 ]]; then
CROSSCOMPILE=1
export CROSSCOMPILE
- if [[ ! -n "$ROOTFS_DIR" ]]; then
+ # Darwin that doesn't use rootfs
+ if [[ ! -n "$ROOTFS_DIR" && "$platform" != "Darwin" ]]; then
ROOTFS_DIR="$__RepoRootDir/.tools/rootfs/$__BuildArch"
export ROOTFS_DIR
fi
diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake
index 9d1b88f08011..7adc24d6acb6 100644
--- a/eng/native/configurecompiler.cmake
+++ b/eng/native/configurecompiler.cmake
@@ -8,8 +8,6 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
-cmake_policy(SET CMP0083 NEW)
-
include(CheckCXXCompilerFlag)
# "configureoptimization.cmake" must be included after CLR_CMAKE_HOST_UNIX has been set.
@@ -19,9 +17,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/configureoptimization.cmake)
# Initialize Cmake compiler flags and other variables
#-----------------------------------------------------
-if(MSVC)
- add_compile_options(/Zi /FC /Zc:strictStrings)
-elseif (CLR_CMAKE_HOST_UNIX)
+if (CLR_CMAKE_HOST_UNIX)
add_compile_options(-g)
add_compile_options(-Wall)
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
@@ -40,11 +36,18 @@ set(CMAKE_CXX_FLAGS_CHECKED "")
set(CMAKE_EXE_LINKER_FLAGS_CHECKED "")
set(CMAKE_SHARED_LINKER_FLAGS_CHECKED "")
+set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "")
+set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "")
+set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "")
+set(CMAKE_EXE_LINKER_FLAGS_DEBUG "")
+set(CMAKE_EXE_LINKER_FLAGS_DEBUG "")
+set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "")
+
add_compile_definitions("$<$,$>:DEBUG;_DEBUG;_DBG;URTBLDENV_FRIENDLY=Checked;BUILDENV_CHECKED=1>")
add_compile_definitions("$<$,$>:NDEBUG;URTBLDENV_FRIENDLY=Retail>")
if (MSVC)
- add_link_options(/GUARD:CF)
+ add_linker_flag(/GUARD:CF)
# Linker flags
#
@@ -57,48 +60,51 @@ if (MSVC)
endif ()
#Do not create Side-by-Side Assembly Manifest
- add_link_options($<$,SHARED_LIBRARY>:/MANIFEST:NO>)
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /MANIFEST:NO")
# can handle addresses larger than 2 gigabytes
- add_link_options($<$,SHARED_LIBRARY>:/LARGEADDRESSAWARE>)
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LARGEADDRESSAWARE")
#Compatible with Data Execution Prevention
- add_link_options($<$,SHARED_LIBRARY>:/NXCOMPAT>)
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NXCOMPAT")
#Use address space layout randomization
- add_link_options($<$,SHARED_LIBRARY>:/DYNAMICBASE>)
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DYNAMICBASE")
#shrink pdb size
- add_link_options($<$,SHARED_LIBRARY>:/PDBCOMPRESS>)
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /PDBCOMPRESS")
- add_link_options($<$,SHARED_LIBRARY>:/DEBUG>)
- add_link_options($<$,SHARED_LIBRARY>:/IGNORE:4197,4013,4254,4070,4221>)
- add_link_options($<$,SHARED_LIBRARY>:/SUBSYSTEM:WINDOWS,${WINDOWS_SUBSYSTEM_VERSION}>)
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /IGNORE:4197,4013,4254,4070,4221")
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,${WINDOWS_SUBSYSTEM_VERSION}")
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221")
- add_link_options($<$,EXECUTABLE>:/DEBUG>)
- add_link_options($<$,EXECUTABLE>:/PDBCOMPRESS>)
- add_link_options($<$,EXECUTABLE>:/STACK:1572864>)
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /PDBCOMPRESS")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:1572864")
# Debug build specific flags
- add_link_options($<$,$>,$,SHARED_LIBRARY>>:/NOVCFEATURE>)
+ set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /NOVCFEATURE")
+ set(CMAKE_SHARED_LINKER_FLAGS_CHECKED "${CMAKE_SHARED_LINKER_FLAGS_CHECKED} /NOVCFEATURE")
# Checked build specific flags
- add_link_options($<$:/INCREMENTAL:NO>) # prevent "warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification"
- add_link_options($<$:/OPT:REF>)
- add_link_options($<$:/OPT:NOICF>)
+ add_linker_flag(/INCREMENTAL:NO CHECKED) # prevent "warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification"
+ add_linker_flag(/OPT:REF CHECKED)
+ add_linker_flag(/OPT:NOICF CHECKED)
# Release build specific flags
- add_link_options($<$:/LTCG>)
- add_link_options($<$:/OPT:REF>)
- add_link_options($<$:/OPT:ICF>)
+ add_linker_flag(/LTCG RELEASE)
+ add_linker_flag(/OPT:REF RELEASE)
+ add_linker_flag(/OPT:ICF RELEASE)
+ add_linker_flag(/INCREMENTAL:NO RELEASE)
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG")
# ReleaseWithDebugInfo build specific flags
- add_link_options($<$:/LTCG>)
- add_link_options($<$:/OPT:REF>)
- add_link_options($<$:/OPT:ICF>)
+ add_linker_flag(/LTCG RELWITHDEBINFO)
+ add_linker_flag(/OPT:REF RELWITHDEBINFO)
+ add_linker_flag(/OPT:ICF RELWITHDEBINFO)
set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} /LTCG")
# Force uCRT to be dynamically linked for Release build
- add_link_options("$<$:/NODEFAULTLIB:libucrt.lib;/DEFAULTLIB:ucrt.lib>")
+ add_linker_flag(/NODEFAULTLIB:libucrt.lib RELEASE)
+ add_linker_flag(/DEFAULTLIB:ucrt.lib RELEASE)
elseif (CLR_CMAKE_HOST_UNIX)
# Set the values to display when interactively configuring CMAKE_BUILD_TYPE
@@ -157,11 +163,10 @@ elseif (CLR_CMAKE_HOST_UNIX)
# -fdata-sections -ffunction-sections: each function has own section instead of one per .o file (needed for --gc-sections)
# -O1: optimization level used instead of -O0 to avoid compile error "invalid operand for inline asm constraint"
- add_compile_definitions("$<$,$>:${CLR_SANITIZE_CXX_OPTIONS};-fdata-sections;--ffunction-sections;-O1>")
- add_link_options($<$,$>,$,EXECUTABLE>>:${CLR_SANITIZE_LINK_OPTIONS}>)
-
+ add_compile_options("$<$,$>:${CLR_SANITIZE_CXX_OPTIONS};-fdata-sections;--ffunction-sections;-O1>")
+ add_linker_flag("${CLR_SANITIZE_LINK_OPTIONS}" DEBUG CHECKED)
# -Wl and --gc-sections: drop unused sections\functions (similar to Windows /Gy function-level-linking)
- add_link_options("$<$,$>,$,SHARED_LIBRARY>>:${CLR_SANITIZE_LINK_OPTIONS};-Wl,--gc-sections>")
+ add_linker_flag("-Wl,--gc-sections" DEBUG CHECKED)
endif ()
endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED)
endif(MSVC)
@@ -173,15 +178,18 @@ endif(MSVC)
# ./build-native.sh cmakeargs "-DCLR_ADDITIONAL_COMPILER_OPTIONS=<...>" cmakeargs "-DCLR_ADDITIONAL_LINKER_FLAGS=<...>"
#
if(CLR_CMAKE_HOST_UNIX)
- add_link_options(${CLR_ADDITIONAL_LINKER_FLAGS})
+ foreach(ADDTL_LINKER_FLAG ${CLR_ADDITIONAL_LINKER_FLAGS})
+ add_linker_flag(${ADDTL_LINKER_FLAG})
+ endforeach()
endif(CLR_CMAKE_HOST_UNIX)
if(CLR_CMAKE_HOST_LINUX)
add_compile_options($<$:-Wa,--noexecstack>)
- add_link_options(-Wl,--build-id=sha1 -Wl,-z,relro,-z,now)
+ add_linker_flag(-Wl,--build-id=sha1)
+ add_linker_flag(-Wl,-z,relro,-z,now)
elseif(CLR_CMAKE_HOST_FREEBSD)
add_compile_options($<$:-Wa,--noexecstack>)
- add_link_options(LINKER:--build-id=sha1)
+ add_linker_flag("-Wl,--build-id=sha1")
elseif(CLR_CMAKE_HOST_SUNOS)
add_compile_options($<$:-Wa,--noexecstack>)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector")
@@ -193,13 +201,21 @@ endif()
# Definitions (for platform)
#-----------------------------------
if (CLR_CMAKE_HOST_ARCH_AMD64)
+ set(ARCH_HOST_NAME x64)
add_definitions(-DHOST_AMD64)
add_definitions(-DHOST_64BIT)
elseif (CLR_CMAKE_HOST_ARCH_I386)
+ set(ARCH_HOST_NAME x86)
add_definitions(-DHOST_X86)
elseif (CLR_CMAKE_HOST_ARCH_ARM)
+ if (ARM_SOFTFP)
+ set(ARCH_HOST_NAME armel)
+ else ()
+ set(ARCH_HOST_NAME arm)
+ endif ()
add_definitions(-DHOST_ARM)
elseif (CLR_CMAKE_HOST_ARCH_ARM64)
+ set(ARCH_HOST_NAME arm64)
add_definitions(-DHOST_ARM64)
add_definitions(-DHOST_64BIT)
else ()
@@ -226,6 +242,7 @@ if (CLR_CMAKE_HOST_UNIX)
add_definitions(-DHOST_UNIX)
if(CLR_CMAKE_HOST_OSX)
+ add_definitions(-DHOST_OSX)
if(CLR_CMAKE_HOST_UNIX_AMD64)
message("Detected OSX x86_64")
elseif(CLR_CMAKE_HOST_UNIX_ARM64)
@@ -254,18 +271,22 @@ endif(CLR_CMAKE_HOST_WIN32)
# Architecture specific files folder name
if (CLR_CMAKE_TARGET_ARCH_AMD64)
set(ARCH_SOURCES_DIR amd64)
- add_definitions(-DTARGET_AMD64)
- add_definitions(-DTARGET_64BIT)
+ set(ARCH_TARGET_NAME x64)
+ add_compile_definitions($<$>>:TARGET_AMD64>)
+ add_compile_definitions($<$>>:TARGET_64BIT>)
elseif (CLR_CMAKE_TARGET_ARCH_ARM64)
set(ARCH_SOURCES_DIR arm64)
- add_definitions(-DTARGET_ARM64)
- add_definitions(-DTARGET_64BIT)
+ set(ARCH_TARGET_NAME arm64)
+ add_compile_definitions($<$>>:TARGET_ARM64>)
+ add_compile_definitions($<$>>:TARGET_64BIT>)
elseif (CLR_CMAKE_TARGET_ARCH_ARM)
set(ARCH_SOURCES_DIR arm)
- add_definitions(-DTARGET_ARM)
+ set(ARCH_TARGET_NAME arm)
+ add_compile_definitions($<$>>:TARGET_ARM>)
elseif (CLR_CMAKE_TARGET_ARCH_I386)
+ set(ARCH_TARGET_NAME x86)
set(ARCH_SOURCES_DIR i386)
- add_definitions(-DTARGET_X86)
+ add_compile_definitions($<$>>:TARGET_X86>)
else ()
clr_unknown_arch()
endif ()
@@ -305,6 +326,12 @@ if (CLR_CMAKE_HOST_UNIX)
add_compile_options(-Wno-unused-variable)
add_compile_options(-Wno-unused-value)
add_compile_options(-Wno-unused-function)
+ add_compile_options(-Wno-tautological-compare)
+
+ check_cxx_compiler_flag(-Wimplicit-fallthrough COMPILER_SUPPORTS_W_IMPLICIT_FALLTHROUGH)
+ if (COMPILER_SUPPORTS_W_IMPLICIT_FALLTHROUGH)
+ add_compile_options(-Wimplicit-fallthrough)
+ endif()
#These seem to indicate real issues
add_compile_options($<$:-Wno-invalid-offsetof>)
@@ -318,8 +345,6 @@ if (CLR_CMAKE_HOST_UNIX)
add_compile_options(-Wno-unused-private-field)
# Explicit constructor calls are not supported by clang (this->ClassName::ClassName())
add_compile_options(-Wno-microsoft)
- # This warning is caused by comparing 'this' to NULL
- add_compile_options(-Wno-tautological-compare)
# There are constants of type BOOL used in a condition. But BOOL is defined as int
# and so the compiler thinks that there is a mistake.
add_compile_options(-Wno-constant-logical-operand)
@@ -351,7 +376,7 @@ if (CLR_CMAKE_HOST_UNIX)
endif()
# Some architectures (e.g., ARM) assume char type is unsigned while CoreCLR assumes char is signed
- # as x64 does. It has been causing issues in ARM (https://github.com/dotnet/coreclr/issues/4746)
+ # as x64 does. It has been causing issues in ARM (https://github.com/dotnet/runtime/issues/5778)
add_compile_options(-fsigned-char)
# We mark the function which needs exporting with DLLEXPORT
@@ -359,31 +384,40 @@ if (CLR_CMAKE_HOST_UNIX)
# Specify the minimum supported version of macOS
if(CLR_CMAKE_HOST_OSX)
- set(MACOS_VERSION_MIN_FLAGS -mmacosx-version-min=10.12)
+ if(CLR_CMAKE_HOST_ARCH_ARM64)
+ # 'pthread_jit_write_protect_np' is only available on macOS 11.0 or newer
+ set(MACOS_VERSION_MIN_FLAGS -mmacosx-version-min=11.0)
+ add_compile_options(-arch arm64)
+ elseif(CLR_CMAKE_HOST_ARCH_AMD64)
+ set(MACOS_VERSION_MIN_FLAGS -mmacosx-version-min=10.13)
+ add_compile_options(-arch x86_64)
+ else()
+ clr_unknown_arch()
+ endif()
add_compile_options(${MACOS_VERSION_MIN_FLAGS})
- add_link_options(${MACOS_VERSION_MIN_FLAGS})
+ add_linker_flag(${MACOS_VERSION_MIN_FLAGS})
endif(CLR_CMAKE_HOST_OSX)
endif(CLR_CMAKE_HOST_UNIX)
if(CLR_CMAKE_TARGET_UNIX)
- add_definitions(-DTARGET_UNIX)
+ add_compile_definitions($<$>>:TARGET_UNIX>)
# Contracts are disabled on UNIX.
add_definitions(-DDISABLE_CONTRACTS)
if(CLR_CMAKE_TARGET_OSX)
- add_definitions(-DTARGET_OSX)
+ add_compile_definitions($<$>>:TARGET_OSX>)
elseif(CLR_CMAKE_TARGET_FREEBSD)
- add_definitions(-DTARGET_FREEBSD)
+ add_compile_definitions($<$>>:TARGET_FREEBSD>)
elseif(CLR_CMAKE_TARGET_LINUX)
- add_definitions(-DTARGET_LINUX)
+ add_compile_definitions($<$>>:TARGET_LINUX>)
elseif(CLR_CMAKE_TARGET_NETBSD)
- add_definitions(-DTARGET_NETBSD)
+ add_compile_definitions($<$>>:TARGET_NETBSD>)
elseif(CLR_CMAKE_TARGET_SUNOS)
- add_definitions(-DTARGET_SUNOS)
+ add_compile_definitions($<$>>:TARGET_SUNOS>)
elseif(CLR_CMAKE_TARGET_ANDROID)
- add_definitions(-DTARGET_ANDROID)
+ add_compile_definitions($<$>>:TARGET_ANDROID>)
endif()
else(CLR_CMAKE_TARGET_UNIX)
- add_definitions(-DTARGET_WINDOWS)
+ add_compile_definitions($<$>>:TARGET_WINDOWS>)
endif(CLR_CMAKE_TARGET_UNIX)
if(CLR_CMAKE_HOST_UNIX_ARM)
@@ -417,31 +451,48 @@ endif(CLR_CMAKE_HOST_UNIX)
if (MSVC)
# Compile options for targeting windows
- # The following options are set by the razzle build
- add_compile_options(/TP) # compile all files as C++
- add_compile_options(/nologo) # Suppress Startup Banner
- add_compile_options(/W3) # set warning level to 3
- add_compile_options(/WX) # treat warnings as errors
- add_compile_options(/Oi) # enable intrinsics
- add_compile_options(/Oy-) # disable suppressing of the creation of frame pointers on the call stack for quicker function calls
- add_compile_options(/U_MT) # undefine the predefined _MT macro
- add_compile_options(/GF) # enable read-only string pooling
- add_compile_options(/Gm-) # disable minimal rebuild
- add_compile_options(/Zp8) # pack structs on 8-byte boundary
- add_compile_options(/Gy) # separate functions for linker
- add_compile_options(/Zc:wchar_t-) # C++ language conformance: wchar_t is NOT the native type, but a typedef
- add_compile_options(/Zc:forScope) # C++ language conformance: enforce Standard C++ for scoping rules
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-") # disable C++ RTTI
- add_compile_options(/FC) # use full pathnames in diagnostics
- add_compile_options(/MP) # Build with Multiple Processes (number of processes equal to the number of processors)
- add_compile_options(/GS) # Buffer Security Check
- add_compile_options(/Zm200) # Specify Precompiled Header Memory Allocation Limit of 150MB
-
- add_compile_options(/wd4960 /wd4961 /wd4603 /wd4627 /wd4838 /wd4456 /wd4457 /wd4458 /wd4459 /wd4091 /we4640)
+ add_compile_options($<$:/TP>) # compile all files as C++
+ add_compile_options($<$:/nologo>) # Suppress Startup Banner
+ add_compile_options($<$:/W3>) # set warning level to 3
+ add_compile_options($<$:/WX>) # treat warnings as errors
+ add_compile_options($<$:/Oi>) # enable intrinsics
+ add_compile_options($<$:/Oy->) # disable suppressing of the creation of frame pointers on the call stack for quicker function calls
+ add_compile_options($<$:/Gm->) # disable minimal rebuild
+ add_compile_options($<$:/Zp8>) # pack structs on 8-byte boundary
+ add_compile_options($<$:/Gy>) # separate functions for linker
+ add_compile_options($<$:/GS>) # Explicitly enable the buffer security checks
+ add_compile_options($<$:/fp:precise>) # Enable precise floating point
+
+ # disable C++ RTTI
+ # /GR is added by default by CMake, so remove it manually.
+ string(REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-")
+
+ add_compile_options($<$:/FC>) # use full pathnames in diagnostics
+ add_compile_options($<$:/MP>) # Build with Multiple Processes (number of processes equal to the number of processors)
+ add_compile_options($<$:/Zm200>) # Specify Precompiled Header Memory Allocation Limit of 150MB
+ add_compile_options($<$:/Zc:strictStrings>) # Disable string-literal to char* or wchar_t* conversion
+ add_compile_options($<$:/Zc:wchar_t>) # wchar_t is a built-in type.
+ add_compile_options($<$:/Zc:inline>) # All inline functions must have their definition available in the current translation unit.
+ add_compile_options($<$:/Zc:forScope>) # Enforce standards-compliant for scope.
+
+ add_compile_options($<$:/wd4960>)
+ add_compile_options($<$:/wd4961>)
+ add_compile_options($<$:/wd4603>)
+ add_compile_options($<$:/wd4627>)
+ add_compile_options($<$:/wd4838>)
+ add_compile_options($<$:/wd4456>)
+ add_compile_options($<$:/wd4457>)
+ add_compile_options($<$:/wd4458>)
+ add_compile_options($<$:/wd4459>)
+ add_compile_options($<$:/wd4091>)
+ add_compile_options($<$:/we4640>)
# Disable Warnings:
# 4291: Delete not defined for new, c++ exception may cause leak.
- add_compile_options(/wd4291)
+ # 5105: Windows SDK headers use 'defined' operator in some macros
+ add_compile_options($<$:/wd4291>)
+ add_compile_options($<$:/wd5105>)
# Treat Warnings as Errors:
# 4007: 'main' : must be __cdecl.
@@ -450,7 +501,12 @@ if (MSVC)
# 4551: Function call missing argument list.
# 4700: Local used w/o being initialized.
# 4806: Unsafe operation involving type 'bool'.
- add_compile_options(/we4007 /we4013 /we4102 /we4551 /we4700 /we4806)
+ add_compile_options($<$:/we4007>)
+ add_compile_options($<$:/we4013>)
+ add_compile_options($<$:/we4102>)
+ add_compile_options($<$:/we4551>)
+ add_compile_options($<$:/we4700>)
+ add_compile_options($<$:/we4806>)
# Set Warning Level 3:
# 4092: Sizeof returns 'unsigned long'.
@@ -461,26 +517,32 @@ if (MSVC)
# 4212: Function declaration used ellipsis.
# 4530: C++ exception handler used, but unwind semantics are not enabled. Specify -GX.
# 35038: data member 'member1' will be initialized after data member 'member2'.
- add_compile_options(/w34092 /w34121 /w34125 /w34130 /w34132 /w34212 /w34530 /w35038)
+ add_compile_options($<$:/w34092>)
+ add_compile_options($<$:/w34121>)
+ add_compile_options($<$:/w34125>)
+ add_compile_options($<$:/w34130>)
+ add_compile_options($<$:/w34132>)
+ add_compile_options($<$:/w34212>)
+ add_compile_options($<$:/w34530>)
+ add_compile_options($<$:/w35038>)
# Set Warning Level 4:
# 4177: Pragma data_seg s/b at global scope.
- add_compile_options(/w44177)
+ add_compile_options($<$:/w44177>)
- add_compile_options(/Zi) # enable debugging information
- add_compile_options(/ZH:SHA_256) # use SHA256 for generating hashes of compiler processed source files.
- add_compile_options(/source-charset:utf-8) # Force MSVC to compile source as UTF-8.
+ add_compile_options($<$:/Zi>) # enable debugging information
+ add_compile_options($<$:/ZH:SHA_256>) # use SHA256 for generating hashes of compiler processed source files.
+ add_compile_options($<$:/source-charset:utf-8>) # Force MSVC to compile source as UTF-8.
if (CLR_CMAKE_HOST_ARCH_I386)
- add_compile_options(/Gz)
+ add_compile_options($<$:/Gz>)
endif (CLR_CMAKE_HOST_ARCH_I386)
- add_compile_options($<$,$>:/GL>)
- add_compile_options($<$,$>,$>:/O1>)
+ add_compile_options($<$,$,$>>:/GL>)
if (CLR_CMAKE_HOST_ARCH_AMD64)
- # The generator expression in the following command means that the /homeparams option is added only for debug builds
- add_compile_options($<$:/homeparams>) # Force parameters passed in registers to be written to the stack
+ # The generator expression in the following command means that the /homeparams option is added only for debug builds for C and C++ source files
+ add_compile_options($<$,$>:/homeparams>) # Force parameters passed in registers to be written to the stack
endif (CLR_CMAKE_HOST_ARCH_AMD64)
# enable control-flow-guard support for native components for non-Arm64 builds
@@ -494,9 +556,7 @@ if (MSVC)
# For Release builds, we shall dynamically link into uCRT [ucrtbase.dll] (which is pushed down as a Windows Update on downlevel OS) but
# wont do the same for debug/checked builds since ucrtbased.dll is not redistributable and Debug/Checked builds are not
# production-time scenarios.
-
- add_compile_options($<$,$>,$>>:/MT>)
- add_compile_options($<$,$>,$>>>:/MTd>)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$,$>,$>>>:Debug>)
add_compile_options($<$:/ZH:SHA_256>)
@@ -505,6 +565,8 @@ if (MSVC)
add_definitions(-DDISABLE_CONTRACTS)
endif (CLR_CMAKE_TARGET_ARCH_ARM OR CLR_CMAKE_TARGET_ARCH_ARM64)
+ # Don't display the output header when building RC files.
+ add_compile_options($<$:/nologo>)
endif (MSVC)
if(CLR_CMAKE_ENABLE_CODE_COVERAGE)
@@ -517,28 +579,21 @@ if(CLR_CMAKE_ENABLE_CODE_COVERAGE)
add_compile_options(-fprofile-arcs)
add_compile_options(-ftest-coverage)
- add_link_options(--coverage)
+ add_linker_flag(--coverage)
else()
message(FATAL_ERROR "Code coverage builds not supported on current platform")
endif(CLR_CMAKE_HOST_UNIX)
endif(CLR_CMAKE_ENABLE_CODE_COVERAGE)
-if (CMAKE_BUILD_TOOL STREQUAL nmake)
+if (CMAKE_GENERATOR MATCHES "(Makefile|Ninja)")
set(CMAKE_RC_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")
-endif(CMAKE_BUILD_TOOL STREQUAL nmake)
+endif()
# Ensure other tools are present
if (CLR_CMAKE_HOST_WIN32)
if(CLR_CMAKE_HOST_ARCH_ARM)
- # Confirm that Windows SDK is present
- if(NOT DEFINED CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION OR CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION STREQUAL "" )
- message(FATAL_ERROR "Windows SDK is required for the Arm32 build.")
- else()
- message("Using Windows SDK version ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION}")
- endif()
-
# Explicitly specify the assembler to be used for Arm32 compile
file(TO_CMAKE_PATH "$ENV{VCToolsInstallDir}\\bin\\HostX86\\arm\\armasm.exe" CMAKE_ASM_COMPILER)
@@ -548,14 +603,13 @@ if (CLR_CMAKE_HOST_WIN32)
# Enable generic assembly compilation to avoid CMake generate VS proj files that explicitly
# use ml[64].exe as the assembler.
enable_language(ASM)
- elseif(CLR_CMAKE_HOST_ARCH_ARM64)
+ set(CMAKE_ASM_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded "")
+ set(CMAKE_ASM_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDLL "")
+ set(CMAKE_ASM_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebug "")
+ set(CMAKE_ASM_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebugDLL "")
+ set(CMAKE_ASM_COMPILE_OBJECT " -g -o
+ BeforeTargets="PrepareForILLink">
link
+
+
+
+
+
+
+
+
+
diff --git a/eng/testing/linker/project.csproj.template b/eng/testing/linker/project.csproj.template
index ef63096e8019..d335783fc44f 100644
--- a/eng/testing/linker/project.csproj.template
+++ b/eng/testing/linker/project.csproj.template
@@ -6,15 +6,31 @@
{RuntimeIdentifier}{RuntimePackDir}{TargetingPackDir}
- <_ExtraTrimmerArgs>{ExtraTrimmerArgs} $(_ExtraTrimmerArgs)
+ {NetCoreAppMaximumVersion}
+
+
+ IL2026
+
+ $(LinkerNoWarn);IL2032;IL2055;IL2057;IL2058;IL2059;IL2060;IL2061
+
+ $(LinkerNoWarn);IL2062;IL2063;IL2064;IL2065;IL2066
+
+ $(LinkerNoWarn);IL2067;IL2068;IL2069;IL2070;IL2071;IL2072;IL2073;IL2074;IL2075;IL2076;IL2077;IL2078;IL2079;IL2080;IL2081;IL2082;IL2083;IL2084;IL2085;IL2086;IL2087;IL2088;IL2089;IL2090;IL2091
+
+ $(LinkerNoWarn);IL2008;IL2009;IL2037
+ <_ExtraTrimmerArgs>{ExtraTrimmerArgs} $(_ExtraTrimmerArgs) --nowarn $(LinkerNoWarn)
+
+ {AdditionalProjectReferences}
+
+
<_ILLinkTasksDirectoryRoot>$(PkgMicrosoft_NET_ILLink_Tasks)\tools\
- <_ILLinkTasksTFM>netcoreapp3.0
+ <_ILLinkTasksTFM>net5.0
<_ILLinkTasksDirectory>$(_ILLinkTasksDirectoryRoot)$(_ILLinkTasksTFM)\
$(_ILLinkTasksDirectory)ILLink.Tasks.dll
@@ -28,4 +44,4 @@
GeneratePathProperty="true" />
-
\ No newline at end of file
+
diff --git a/eng/testing/linker/trimmingTests.targets b/eng/testing/linker/trimmingTests.targets
index 3729bd306bca..4a9152fbd5f9 100644
--- a/eng/testing/linker/trimmingTests.targets
+++ b/eng/testing/linker/trimmingTests.targets
@@ -57,6 +57,15 @@
<_projectSourceFile>%(TestConsoleApps.ProjectCompileItems)
+
+ <_additionalProjectReferenceTemp Include="$(AdditionalProjectReferences)" />
+ <_additionalProjectReference Include="<ProjectReference Include="$(LibrariesProjectRoot)%(_additionalProjectReferenceTemp.Identity)\src\%(_additionalProjectReferenceTemp.Identity).csproj" SkipUseReferenceAssembly="true" />" />
+
+
+
+ <_additionalProjectReferencesString>@(_additionalProjectReference, '%0a')
+
+
<_additionalProjectSourceFiles Include="%(TestConsoleApps.AdditionalSourceFiles)" />
@@ -65,11 +74,13 @@
diff --git a/eng/testing/netfx.exe.config b/eng/testing/netfx.exe.config
index ed7d7d082438..e131497fc761 100644
--- a/eng/testing/netfx.exe.config
+++ b/eng/testing/netfx.exe.config
@@ -1,7 +1,6 @@
-
\ No newline at end of file
diff --git a/eng/testing/outerBuild.targets b/eng/testing/outerBuild.targets
index 4623b0e54d25..c071944c21d9 100644
--- a/eng/testing/outerBuild.targets
+++ b/eng/testing/outerBuild.targets
@@ -1,8 +1,12 @@
+ Targets="Test">
+
+
+
+
\ No newline at end of file
diff --git a/eng/testing/runsettings.targets b/eng/testing/runsettings.targets
index 10496127b8a9..2fa1901e0489 100644
--- a/eng/testing/runsettings.targets
+++ b/eng/testing/runsettings.targets
@@ -28,15 +28,16 @@
$([System.IO.File]::ReadAllText('$(RunSettingsInputFilePath)'))$(RunSettingsFileContent.Replace('$$MAXCPUCOUNT$$', '1'))$(RunSettingsFileContent.Replace('$$MAXCPUCOUNT$$', '0'))
+
+ $(RunSettingsFileContent.Replace('$$TARGETPLATFORM$$', '$(TargetArchitecture)'))
+ $(RunSettingsFileContent.Replace('$$TARGETPLATFORM$$', ''))$(RunSettingsFileContent.Replace('$$COVERAGE_INCLUDE$$', '$(CoverageIncludeFilter)')
.Replace('$$COVERAGE_EXCLUDEBYFILE$$', '$(CoverageExcludeByFileFilter)')
.Replace('$$COVERAGE_INCLUDEDIRECTORY$$', '$(CoverageIncludeDirectoryFilter)')
.Replace('$$COVERAGE_ENABLED$$', '$([MSBuild]::ValueOrDefault('$(Coverage)', 'false'))')
- .Replace('$$TARGETPLATFORM$$', '$(TargetArchitecture)')
.Replace('$$DISABLEPARALLELIZATION$$', '$([MSBuild]::ValueOrDefault('$(TestDisableParallelization)', 'false'))')
.Replace('$$DISABLEAPPDOMAIN$$', '$([MSBuild]::ValueOrDefault('$(TestDisableAppDomain)', 'false'))')
.Replace('$$TESTCASEFILTER$$', '$(_testFilter)')
- .Replace('$$DEVPATH$$', '$(TestHostRootPath)')
.Replace('$$DOTNETHOSTPATH$$', '$(TestHostRootPath)$([System.IO.Path]::GetFileName('$(DotNetTool)'))'))
diff --git a/eng/testing/runtimeConfiguration.targets b/eng/testing/runtimeConfiguration.targets
index f687adfad40f..d69182992c7b 100644
--- a/eng/testing/runtimeConfiguration.targets
+++ b/eng/testing/runtimeConfiguration.targets
@@ -1,45 +1,31 @@
-
- $(MSBuildThisFileDirectory)netfx.exe.config
-
- true
+ true
+ true
+ true
+ $(MSBuildThisFileDirectory)netfx.exe.config
+
+ $(TargetPath).config
-
-
+
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/eng/testing/tests.mobile.targets b/eng/testing/tests.mobile.targets
index 5622b19e249b..97096ea948ae 100644
--- a/eng/testing/tests.mobile.targets
+++ b/eng/testing/tests.mobile.targets
@@ -8,21 +8,28 @@
$(JSEngineArgs) --engine-arg=--stack-trace-limit=1000
-
-
-
-
- $HARNESS_RUNNER wasm test --engine=$(JSEngine) $(JSEngineArgs) --js-file=runtime.js -v --output-directory=$XHARNESS_OUT -- --run WasmTestRunner.dll $(AssemblyName).dll
+ $HARNESS_RUNNER wasm $XHARNESS_COMMAND --app=. --engine=$(JSEngine) $(JSEngineArgs) --js-file=runtime.js --output-directory=$XHARNESS_OUT -- $(RunTestsJSArguments) --run WasmTestRunner.dll $(AssemblyName).dll
+
+ $HARNESS_RUNNER android test --instrumentation="net.dot.MonoRunner" --package-name="net.dot.$(AssemblyName)" --app=$EXECUTION_DIR/bin/$(TestProjectName).apk --output-directory=$XHARNESS_OUT -v --
+
+
+
+
+
+
+
+
+
arm64-v8aarmeabi-v7a
@@ -30,9 +37,6 @@
x86
-
-
-
@@ -44,7 +48,7 @@
+
+
+
@@ -72,6 +82,7 @@
+
@@ -114,7 +125,16 @@
-
+
+
+ <_appFiles Include="$(AppBundlePath)/../**/*" />
+
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ AssemblySearchPaths="@(AssemblySearchPaths)" />
-
-
-
-
-
-
-
-
-
-
-
-
+ DependsOnTargets="Publish;BundleTestAppleApp;BundleTestAndroidApp;BundleTestWasmApp;ArchiveTests" />
diff --git a/eng/testing/tests.props b/eng/testing/tests.props
index bf2f93fcceb3..65664f7f7499 100644
--- a/eng/testing/tests.props
+++ b/eng/testing/tests.props
@@ -29,8 +29,6 @@
$(PackageRID)true
- false
-
diff --git a/eng/testing/tests.targets b/eng/testing/tests.targets
index 1534c3aa0dad..2fe669a10ba0 100644
--- a/eng/testing/tests.targets
+++ b/eng/testing/tests.targets
@@ -19,11 +19,6 @@
$(RunScriptHostDir)dotnet
-
-
-
-
-
PrepareForRun
@@ -41,7 +36,6 @@
- $([MSBuild]::NormalizeDirectory('$(OutDir)', 'AppBundle'))
<_ZipSourceDirectory>$(OutDir)
<_ZipSourceDirectory Condition="'$(TargetOS)' == 'Browser'">$(BundleDir)
@@ -50,6 +44,8 @@
+
+
@@ -95,7 +91,10 @@
- "$(RunScriptOutputPath)" --runtime-path "$(TestHostRootPath.TrimEnd('\/'))"
+ "$(RunScriptOutputPath)"
+
+ $(RunTestsCommand) --runtime-path "$(TestHostRootPath.TrimEnd('\/'))"$(RunTestsCommand) --rsp-file "$(TestRspFile)""$(RunScriptOutputPath)" $(AssemblyName) $(TargetArchitecture)"$(RunScriptOutputPath)" $(JSEngine) $(AssemblyName).dll $(_withoutCategories.Replace(';', ' -notrait category='))
diff --git a/eng/testing/xunit/xunit.console.targets b/eng/testing/xunit/xunit.console.targets
index 837b432a99eb..5b71327e9645 100644
--- a/eng/testing/xunit/xunit.console.targets
+++ b/eng/testing/xunit/xunit.console.targets
@@ -37,24 +37,23 @@
Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp'" />
-
- <_testRunnerConfigSourceFile Include="$(TargetDir)$(TargetName).exe.config" />
<_testRunnerConfigDestFile Include="$(TargetDir)xunit.console.exe.config" />
-
-
@@ -62,7 +61,9 @@
@@ -74,5 +75,13 @@
CopyToOutputDirectory="PreserveNewest"
Visible="false" />
+
+
+
+
+
+
+
+
diff --git a/eng/testing/xunit/xunit.props b/eng/testing/xunit/xunit.props
index 8b21cecac618..69355a452a48 100644
--- a/eng/testing/xunit/xunit.props
+++ b/eng/testing/xunit/xunit.props
@@ -16,7 +16,7 @@
-
+
+
+
+
$(OutDir)
diff --git a/eng/versioning.targets b/eng/versioning.targets
index 1eba158bb6be..61789747403d 100644
--- a/eng/versioning.targets
+++ b/eng/versioning.targets
@@ -22,13 +22,25 @@
-
-
-
- <_Parameter1>$(MinimiumSupportedWindowsPlatform)
+
+
+
+ <_Parameter1>windows
+
+ <_unsupportedOSPlatforms Include="$(UnsupportedOSPlatforms)" />
+
+
+
+
+
+ <_Parameter1>%(_unsupportedOSPlatforms.Identity)
+
+
+
+
diff --git a/global.json b/global.json
index 64916dd7429c..712486f620a0 100644
--- a/global.json
+++ b/global.json
@@ -1,24 +1,24 @@
{
"sdk": {
- "version": "5.0.100-preview.8.20362.3",
+ "version": "5.0.100-preview.8.20417.9",
"allowPrerelease": true,
"rollForward": "major"
},
"tools": {
- "dotnet": "5.0.100-preview.8.20362.3"
+ "dotnet": "5.0.100-rc.2.20479.15"
},
"native-tools": {
- "cmake": "3.14.5",
+ "cmake": "3.16.4",
"python3": "3.7.1"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk": "5.0.0-beta.20364.3",
- "Microsoft.DotNet.Arcade.Sdk": "5.0.0-beta.20364.3",
- "Microsoft.DotNet.Build.Tasks.SharedFramework.Sdk": "5.0.0-beta.20364.3",
- "Microsoft.DotNet.Helix.Sdk": "5.0.0-beta.20364.3",
+ "Microsoft.DotNet.Build.Tasks.TargetFramework.Sdk": "6.0.0-beta.20529.1",
+ "Microsoft.DotNet.Arcade.Sdk": "6.0.0-beta.20529.1",
+ "Microsoft.DotNet.Build.Tasks.SharedFramework.Sdk": "6.0.0-beta.20529.1",
+ "Microsoft.DotNet.Helix.Sdk": "6.0.0-beta.20529.1",
"Microsoft.FIX-85B6-MERGE-9C38-CONFLICT": "1.0.0",
"Microsoft.NET.Sdk.IL": "5.0.0-preview.8.20359.4",
- "Microsoft.Build.NoTargets": "1.0.53",
- "Microsoft.Build.Traversal": "2.0.52"
+ "Microsoft.Build.NoTargets": "2.0.1",
+ "Microsoft.Build.Traversal": "2.1.1"
}
}
diff --git a/src/coreclr/CMakeLists.txt b/src/coreclr/CMakeLists.txt
index 0d60cf16fc10..e6495e025087 100644
--- a/src/coreclr/CMakeLists.txt
+++ b/src/coreclr/CMakeLists.txt
@@ -1,19 +1,18 @@
-cmake_minimum_required(VERSION 3.14.5)
+cmake_minimum_required(VERSION 3.6.2)
cmake_policy(SET CMP0042 NEW)
+if (CMAKE_VERSION VERSION_GREATER 3.15 OR CMAKE_VERSION VERSION_EQUAL 3.15)
+ cmake_policy(SET CMP0091 NEW)
+endif()
# Set the project name
project(CoreCLR)
include(${CLR_ENG_NATIVE_DIR}/configurecompiler.cmake)
-if (CLR_CMAKE_HOST_WIN32)
- message(STATUS "VS_PLATFORM_TOOLSET is ${CMAKE_VS_PLATFORM_TOOLSET}")
- message(STATUS "VS_PLATFORM_NAME is ${CMAKE_VS_PLATFORM_NAME}")
-endif (CLR_CMAKE_HOST_WIN32)
-
if(MSVC)
- add_compile_options(/EHa) # enable C++ EH (w/ SEH exceptions)
+ string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+ add_compile_options($<$:/EHa>) # enable C++ EH (w/ SEH exceptions)
set(CMAKE_CXX_STANDARD_LIBRARIES "") # do not link against standard win32 libs i.e. kernel32, uuid, user32, etc.
endif (MSVC)
@@ -51,9 +50,9 @@ include(pgosupport.cmake)
#-------------------------------
# Include libraries native shims
#-------------------------------
-if(NOT CLR_CROSS_COMPONENTS_BUILD)
+if(NOT CLR_CROSS_COMPONENTS_BUILD AND CLR_CMAKE_BUILD_SUBSET_RUNTIME)
add_subdirectory(src/libraries-native)
-endif(NOT CLR_CROSS_COMPONENTS_BUILD)
+endif(NOT CLR_CROSS_COMPONENTS_BUILD AND CLR_CMAKE_BUILD_SUBSET_RUNTIME)
#-----------------------------------------
# Add Projects
@@ -86,7 +85,7 @@ add_subdirectory(src/pal/prebuilt/inc)
add_subdirectory(src/debug/debug-pal)
-if(CLR_CMAKE_TARGET_WIN32)
+if(CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_BUILD_SUBSET_RUNTIME)
add_subdirectory(src/gc/sample)
endif()
@@ -96,7 +95,7 @@ add_subdirectory(src/tools/aot/jitinterface)
# All of the compiler options are specified in file compileoptions.cmake
# Do not add any new options here. They should be added in compileoptions.cmake
if(CLR_CMAKE_HOST_WIN32)
- add_compile_options(/Zl) # omit default library name in .OBJ
+ add_compile_options($<$:/Zl>) # omit default library name in .OBJ
endif(CLR_CMAKE_HOST_WIN32)
#--------------------------------
@@ -115,7 +114,9 @@ include_directories("../../artifacts/obj/coreclr")
if(FEATURE_STANDALONE_GC)
add_definitions(-DFEATURE_STANDALONE_GC)
- add_subdirectory(src/gc)
+ if (CLR_CMAKE_BUILD_SUBSET_RUNTIME)
+ add_subdirectory(src/gc)
+ endif (CLR_CMAKE_BUILD_SUBSET_RUNTIME)
endif(FEATURE_STANDALONE_GC)
if (CLR_CMAKE_HOST_UNIX)
diff --git a/src/coreclr/build-runtime.cmd b/src/coreclr/build-runtime.cmd
index aa9573d790cb..730e8d0f94fa 100644
--- a/src/coreclr/build-runtime.cmd
+++ b/src/coreclr/build-runtime.cmd
@@ -10,7 +10,7 @@ echo %__MsgPrefix%Starting Build at %TIME%
set __ThisScriptFull="%~f0"
set __ThisScriptDir="%~dp0"
-call "%__ThisScriptDir%"\setup_vs_tools.cmd
+call %__ThisScriptDir%\setup_vs_tools.cmd
if NOT '%ERRORLEVEL%' == '0' goto ExitWithError
if defined VS160COMNTOOLS (
@@ -67,6 +67,7 @@ set __PgoInstrument=0
set __PgoOptimize=1
set __EnforcePgo=0
set __IbcTuning=
+set __ConsoleLoggingParameters=/clp:ForceNoAlign;Summary
REM __PassThroughArgs is a set of things that will be passed through to nested calls to build.cmd
REM when using "all".
@@ -83,9 +84,16 @@ set __BuildCrossArchNative=0
set __SkipCrossArchNative=0
set __SkipGenerateVersion=0
set __RestoreOptData=1
+set __BuildJit=1
+set __BuildPALTests=0
+set __BuildAllJits=1
+set __BuildRuntime=1
set __CrossArch=
+set __CrossArch2=
+set __CrossOS=0
set __PgoOptDataPath=
set __CMakeArgs=
+set __Ninja=0
@REM CMD has a nasty habit of eating "=" on the argument list, so passing:
@REM -priority=1
@@ -149,8 +157,8 @@ if [!__PassThroughArgs!]==[] (
set __PassThroughArgs=%__PassThroughArgs% %1
)
-if /i "%1" == "-alpinedac" (set __BuildNative=0&set __BuildCrossArchNative=1&set __CrossArch=x64&set __TargetOS=alpine&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "-linuxdac" (set __BuildNative=0&set __BuildCrossArchNative=1&set __CrossArch=x64&set __TargetOS=Linux&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+if /i "%1" == "-alpinedac" (set __BuildNative=0&set __BuildCrossArchNative=1&set __CrossArch=x64&set __CrossOS=1&set __TargetOS=alpine&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+if /i "%1" == "-linuxdac" (set __BuildNative=0&set __BuildCrossArchNative=1&set __CrossArch=x64&set __CrossOS=1&set __TargetOS=Linux&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-cmakeargs" (set __CMakeArgs=%2 %__CMakeArgs%&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
if /i "%1" == "-configureonly" (set __ConfigureOnly=1&set __BuildNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
@@ -159,10 +167,13 @@ if /i "%1" == "-skipnative" (set __BuildNative=0&set processedArgs=!pro
if /i "%1" == "-skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-skipgenerateversion" (set __SkipGenerateVersion=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "-usenmakemakefiles" (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+if /i "%1" == "-ninja" (set __Ninja=1&set __BuildNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "-nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+if /i "%1" == "-skipjit" (set __BuildJit=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+if /i "%1" == "-skipalljits" (set __BuildAllJits=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+if /i "%1" == "-skipruntime" (set __BuildRuntime=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
REM TODO these are deprecated remove them eventually
REM don't add more, use the - syntax instead
@@ -172,7 +183,8 @@ if /i "%1" == "skipnative" (set __BuildNative=0&set processedArgs=!proc
if /i "%1" == "skipcrossarchnative" (set __SkipCrossArchNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "skipgenerateversion" (set __SkipGenerateVersion=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "skiprestoreoptdata" (set __RestoreOptData=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "usenmakemakefiles" (set __NMakeMakefiles=1&set __ConfigureOnly=1&set __BuildNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
+REM Keep around usenmakemakefiles for usage by the jit-format tool
+if /i "%1" == "usenmakemakefiles" (set __Ninja=1&set __BuildNative=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "pgoinstrument" (set __PgoInstrument=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "nopgooptimize" (set __PgoOptimize=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
if /i "%1" == "enforcepgo" (set __EnforcePgo=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
@@ -208,10 +220,14 @@ if %__TotalSpecifiedBuildArch% GTR 1 (
)
if %__BuildArchX64%==1 set __BuildArch=x64
-if %__BuildArchX86%==1 set __BuildArch=x86
+if %__BuildArchX86%==1 (
+ set __BuildArch=x86
+ if /i "%__CrossOS%" NEQ "1" set __CrossArch=x64
+)
if %__BuildArchArm%==1 (
set __BuildArch=arm
set __CrossArch=x86
+ if /i "%__CrossOS%" NEQ "1" set __CrossArch2=x64
)
if %__BuildArchArm64%==1 (
set __BuildArch=arm64
@@ -251,6 +267,9 @@ if %__SkipCrossArchNative% EQU 0 (
if /i "%__BuildArch%"=="arm" (
set __BuildCrossArchNative=1
)
+ if /i "%__BuildArch%"=="x86" (
+ set __BuildCrossArchNative=1
+ )
)
)
@@ -265,13 +284,15 @@ set "__IntermediatesDir=%__RootBinDir%\obj\coreclr\%__TargetOS%.%__BuildArch%.%_
set "__LogsDir=%__RootBinDir%\log\!__BuildType!"
set "__MsbuildDebugLogsDir=%__LogsDir%\MsbuildDebugLogs"
set "__ArtifactsIntermediatesDir=%__RepoRootDir%\artifacts\obj\coreclr\"
-if "%__NMakeMakefiles%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__TargetOS%.%__BuildArch%.%__BuildType%")
+if "%__Ninja%"=="1" (set "__IntermediatesDir=%__RootBinDir%\nmakeobj\%__TargetOS%.%__BuildArch%.%__BuildType%")
set "__PackagesBinDir=%__BinDir%\.nuget"
set "__CrossComponentBinDir=%__BinDir%"
set "__CrossCompIntermediatesDir=%__IntermediatesDir%\crossgen"
+set "__CrossComp2IntermediatesDir=%__IntermediatesDir%\crossgen_2"
if NOT "%__CrossArch%" == "" set __CrossComponentBinDir=%__CrossComponentBinDir%\%__CrossArch%
+if NOT "%__CrossArch2%" == "" set __CrossComponent2BinDir=%__BinDir%\%__CrossArch2%
REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
set "__CMakeBinDir=%__BinDir%"
@@ -282,8 +303,8 @@ if not exist "%__IntermediatesDir%" md "%__IntermediatesDir%"
if not exist "%__LogsDir%" md "%__LogsDir%"
if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"
-if not exist "%__RootBinDir%\Directory.Build.props" copy %__ProjectDir%\EmptyProps.props %__RootBinDir%\Directory.Build.props
-if not exist "%__RootBinDir%\Directory.Build.targets" copy %__ProjectDir%\EmptyProps.props %__RootBinDir%\Directory.Build.targets
+if not exist "%__RootBinDir%\Directory.Build.props" copy "%__ProjectDir%\EmptyProps.props" "%__RootBinDir%\Directory.Build.props"
+if not exist "%__RootBinDir%\Directory.Build.targets" copy "%__ProjectDir%\EmptyProps.props" "%__RootBinDir%\Directory.Build.targets"
REM Set up the directory for MSBuild debug logs.
set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%
@@ -298,7 +319,7 @@ set __CMakeNeeded=1
if %__BuildNative%==0 if %__BuildCrossArchNative%==0 set __CMakeNeeded=0
if %__CMakeNeeded%==1 (
REM Eval the output from set-cmake-path.ps1
- for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
+ for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__RepoRootDir%\eng\native\set-cmake-path.ps1"""') do %%a
echo %__MsgPrefix%Using CMake from !CMakePath!
)
@@ -324,9 +345,9 @@ REM ============================================================================
if %__SkipGenerateVersion% EQU 0 (
echo %__MsgPrefix%Generating native version headers
- set "__BinLog=%__LogsDir%\GenerateVersionHeaders_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog"
+ set "__BinLog=\"%__LogsDir%\GenerateVersionHeaders_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog\""
powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__RepoRootDir%\eng\common\msbuild.ps1" /clp:nosummary %__ArcadeScriptArgs%^
- %__RepoRootDir%\eng\empty.csproj /t:GenerateRuntimeVersionFile /restore^
+ "%__RepoRootDir%\eng\empty.csproj" /t:GenerateRuntimeVersionFile /restore^
/p:NativeVersionFile="%__RootBinDir%\obj\coreclr\_version.h"^
/p:RuntimeVersionFile="%__RootBinDir%\obj\coreclr\runtime_version.h"^
%__CommonMSBuildArgs% %__UnprocessedBuildArgs% /bl:!__BinLog!
@@ -346,9 +367,9 @@ REM ============================================================================
set OptDataProjectFilePath=%__ProjectDir%\src\.nuget\optdata\optdata.csproj
if %__RestoreOptData% EQU 1 (
echo %__MsgPrefix%Restoring the OptimizationData Package
- set "__BinLog=%__LogsDir%\OptRestore_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog"
+ set "__BinLog=\"%__LogsDir%\OptRestore_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog\""
powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__RepoRootDir%\eng\common\msbuild.ps1" /clp:nosummary %__ArcadeScriptArgs%^
- %OptDataProjectFilePath% /t:Restore^
+ "%OptDataProjectFilePath%" /t:Restore^
%__CommonMSBuildArgs% %__UnprocessedBuildArgs%^
/nodereuse:false /bl:!__BinLog!
if not !errorlevel! == 0 (
@@ -359,8 +380,8 @@ if %__RestoreOptData% EQU 1 (
)
set __PgoOptDataPath=
if %__PgoOptimize% EQU 1 (
- set PgoDataPackagePathOutputFile="%__IntermediatesDir%\optdatapath.txt"
- set "__BinLog=%__LogsDir%\PgoVersionRead_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog"
+ set PgoDataPackagePathOutputFile=%__IntermediatesDir%\optdatapath.txt
+ set "__BinLog=\"%__LogsDir%\PgoVersionRead_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog\""
REM Parse the optdata package versions out of msbuild so that we can pass them on to CMake
powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__RepoRootDir%\eng\common\msbuild.ps1" /clp:nosummary %__ArcadeScriptArgs%^
@@ -396,10 +417,12 @@ set _C=
set /p PYTHON=<%TEMP%\pythonlocation.txt
if NOT DEFINED PYTHON (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: Could not find a python installation
+ echo %__ErrMsgPrefix%%__MsgPrefix%Error: Could not find a Python installation.
goto ExitWithError
)
+set __CMakeClrBuildSubsetArgs="-DCLR_CMAKE_BUILD_SUBSET_JIT=%__BuildJit%" "-DCLR_CMAKE_BUILD_SUBSET_ALLJITS=%__BuildAllJits%" "-DCLR_CMAKE_BUILD_SUBSET_RUNTIME=%__BuildRuntime%"
+
REM =========================================================================================
REM ===
REM === Build Cross-Architecture Native Components (if applicable)
@@ -425,36 +448,49 @@ if %__BuildCrossArchNative% EQU 1 (
set __CMakeBinDir=%__CrossComponentBinDir%
set "__CMakeBinDir=!__CMakeBinDir:\=/!"
- set __ExtraCmakeArgs="-DCLR_CROSS_COMPONENTS_BUILD=1" "-DCLR_CMAKE_TARGET_ARCH=%__BuildArch%" "-DCLR_CMAKE_TARGET_OS=%__TargetOS%" "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_PATH=%__PgoOptDataPath%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%" "-DCMAKE_SYSTEM_VERSION=10.0" "-DCLR_ENG_NATIVE_DIR=%__RepoRootDir%/eng/native" "-DCLR_REPO_ROOT_DIR=%__RepoRootDir%" %__CMakeArgs%
- call "%__SourceDir%\pal\tools\gen-buildsys.cmd" "%__ProjectDir%" "%__CrossCompIntermediatesDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
+
+ if %__Ninja% EQU 1 (
+ set __ExtraCmakeArgs="-DCMAKE_BUILD_TYPE=!__BuildType!"
+ )
+
+ set __ExtraCmakeArgs=!__ExtraCmakeArgs! %__CMakeClrBuildSubsetArgs% "-DCLR_CROSS_COMPONENTS_BUILD=1" "-DCLR_CMAKE_TARGET_ARCH=%__BuildArch%" "-DCLR_CMAKE_TARGET_OS=%__TargetOS%" "-DCLR_CMAKE_PGO_INSTRUMENT=0" "-DCLR_CMAKE_OPTDATA_PATH=%__PgoOptDataPath%" "-DCLR_CMAKE_PGO_OPTIMIZE=0" "-DCLR_ENG_NATIVE_DIR=%__RepoRootDir%/eng/native" "-DCLR_REPO_ROOT_DIR=%__RepoRootDir%" %__CMakeArgs%
+ call "%__RepoRootDir%\eng\native\gen-buildsys.cmd" "%__ProjectDir%" "%__CrossCompIntermediatesDir%" %__VSVersion% %__CrossArch% !__ExtraCmakeArgs!
if not !errorlevel! == 0 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: failed to generate cross architecture native component build project!
+ echo %__ErrMsgPrefix%%__MsgPrefix%Error: failed to generate cross architecture native component build project %__CrossArch%!
goto ExitWithError
)
@if defined _echo @echo on
:SkipConfigureCrossBuild
if not exist "%__CrossCompIntermediatesDir%\CMakeCache.txt" (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: unable to find generated cross architecture native component build project!
+ echo %__ErrMsgPrefix%%__MsgPrefix%Error: unable to find generated cross architecture native component build project %__CrossArch%!
goto ExitWithError
)
if defined __ConfigureOnly goto SkipCrossCompBuild
set __BuildLogRootName=Cross
- set "__BuildLog=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.log"
- set "__BuildWrn=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn"
- set "__BuildErr=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.err"
- set "__BinLog=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog"
+ set "__BuildLog="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.log""
+ set "__BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn""
+ set "__BuildErr="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.err""
+ set "__BinLog="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog""
set "__MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!"
set "__MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!"
set "__MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!"
set "__MsbuildBinLog=/bl:!__BinLog!"
- set "__Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr! !__MsbuildBinLog!"
+ set "__Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr! !__MsbuildBinLog! !__ConsoleLoggingParameters!"
+
+ set __CmakeBuildToolArgs=
- REM We pass the /m flag directly to MSBuild so that we can get both MSBuild and CL parallelism, which is fastest for our builds.
- "%CMakePath%" --build %__CrossCompIntermediatesDir% --target install --config %__BuildType% -- /nologo /m !__Logging!
+ if %__Ninja% EQU 1 (
+ set __CmakeBuildToolArgs=
+ ) else (
+ REM We pass the /m flag directly to MSBuild so that we can get both MSBuild and CL parallelism, which is fastest for our builds.
+ set __CmakeBuildToolArgs=/nologo /m !__Logging!
+ )
+
+ "%CMakePath%" --build %__CrossCompIntermediatesDir% --target install --config %__BuildType% -- !__CmakeBuildToolArgs!
if not !errorlevel! == 0 (
set __exitCode=!errorlevel!
@@ -464,10 +500,85 @@ if %__BuildCrossArchNative% EQU 1 (
echo !__BuildErr!
goto ExitWithCode
)
-
:SkipCrossCompBuild
REM } Scope environment changes end
endlocal
+
+ if NOT "%__CrossArch2%" == "" (
+ REM Scope environment changes start {
+ setlocal
+
+ echo %__MsgPrefix%Commencing build of cross architecture native components for %__TargetOS%.%__BuildArch%.%__BuildType% hosted on %__CrossArch2%
+
+ if /i "%__CrossArch2%" == "x86" ( set __VCBuildArch=x86 )
+ if /i "%__CrossArch2%" == "x64" ( set __VCBuildArch=x86_amd64 )
+
+ echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
+ call "%__VCToolsRoot%\vcvarsall.bat" !__VCBuildArch!
+ @if defined _echo @echo on
+
+ if not exist "%__CrossComp2IntermediatesDir%" md "%__CrossComp2IntermediatesDir%"
+ if defined __SkipConfigure goto SkipConfigureCrossBuild2
+
+ set __CMakeBinDir="%__CrossComponent2BinDir%"
+ set "__CMakeBinDir=!__CMakeBinDir:\=/!"
+
+ if %__Ninja% EQU 1 (
+ set __ExtraCmakeArgs="-DCMAKE_BUILD_TYPE=!__BuildType!"
+ )
+
+ set __ExtraCmakeArgs=!__ExtraCmakeArgs! %__CMakeClrBuildSubsetArgs% "-DCLR_CROSS_COMPONENTS_BUILD=1" "-DCLR_CMAKE_TARGET_ARCH=%__BuildArch%" "-DCLR_CMAKE_TARGET_OS=%__TargetOS%" "-DCLR_CMAKE_PGO_INSTRUMENT=0" "-DCLR_CMAKE_OPTDATA_PATH=%__PgoOptDataPath%" "-DCLR_CMAKE_PGO_OPTIMIZE=0" "-DCMAKE_SYSTEM_VERSION=10.0" "-DCLR_ENG_NATIVE_DIR=%__RepoRootDir%/eng/native" "-DCLR_REPO_ROOT_DIR=%__RepoRootDir%" %__CMakeArgs%
+ call "%__RepoRootDir%\eng\native\gen-buildsys.cmd" "%__ProjectDir%" "%__CrossComp2IntermediatesDir%" %__VSVersion% %__CrossArch2% !__ExtraCmakeArgs!
+
+ if not !errorlevel! == 0 (
+ echo %__ErrMsgPrefix%%__MsgPrefix%Error: failed to generate cross architecture native component build project %__CrossArch2%!
+ goto ExitWithError
+ )
+
+ set __VCBuildArch=x86_amd64
+ if /i "%__CrossArch%" == "x86" ( set __VCBuildArch=x86 )
+ @if defined _echo @echo on
+
+ if not exist "%__CrossComp2IntermediatesDir%\CMakeCache.txt" (
+ echo %__ErrMsgPrefix%%__MsgPrefix%Error: unable to find generated cross architecture native component build project %__CrossArch2%!
+ goto ExitWithError
+ )
+
+:SkipConfigureCrossBuild2
+ set __BuildLogRootName=Cross2
+ set "__BuildLog=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.log"
+ set "__BuildWrn=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn"
+ set "__BuildErr=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.err"
+ set "__BinLog=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog"
+ set "__MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!"
+ set "__MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!"
+ set "__MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!"
+ set "__MsbuildBinLog=/bl:!__BinLog!"
+ set "__Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr! !__MsbuildBinLog! !__ConsoleLoggingParameters!"
+
+ set __CmakeBuildToolArgs=
+
+ if %__Ninja% EQU 1 (
+ set __CmakeBuildToolArgs=
+ ) else (
+ REM We pass the /m flag directly to MSBuild so that we can get both MSBuild and CL parallelism, which is fastest for our builds.
+ set __CmakeBuildToolArgs=/nologo /m !__Logging!
+ )
+
+ "%CMakePath%" --build %__CrossComp2IntermediatesDir% --target install --config %__BuildType% -- !__CmakeBuildToolArgs!
+
+ if not !errorlevel! == 0 (
+ set __exitCode=!errorlevel!
+ echo %__ErrMsgPrefix%%__MsgPrefix%Error: cross-arch components build failed. Refer to the build log files for details.
+ echo !__BuildLog!
+ echo !__BuildWrn!
+ echo !__BuildErr!
+ goto ExitWithCode
+ )
+:SkipCrossCompBuild2
+ REM } Scope environment changes end
+ endlocal
+ )
)
REM =========================================================================================
@@ -508,8 +619,12 @@ if %__BuildNative% EQU 1 (
echo %__MsgPrefix%Regenerating the Visual Studio solution
- set __ExtraCmakeArgs="-DCMAKE_SYSTEM_VERSION=10.0" !___CrossBuildDefine! "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_PATH=%__PgoOptDataPath%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%" "-DCLR_ENG_NATIVE_DIR=%__RepoRootDir%/eng/native" "-DCLR_REPO_ROOT_DIR=%__RepoRootDir%" %__CMakeArgs%
- call "%__SourceDir%\pal\tools\gen-buildsys.cmd" "%__ProjectDir%" "%__IntermediatesDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
+ if %__Ninja% EQU 1 (
+ set __ExtraCmakeArgs="-DCMAKE_BUILD_TYPE=!__BuildType!"
+ )
+
+ set __ExtraCmakeArgs=!__ExtraCmakeArgs! !___CrossBuildDefine! %__CMakeClrBuildSubsetArgs% "-DCLR_CMAKE_PGO_INSTRUMENT=%__PgoInstrument%" "-DCLR_CMAKE_OPTDATA_PATH=%__PgoOptDataPath%" "-DCLR_CMAKE_PGO_OPTIMIZE=%__PgoOptimize%" "-DCLR_ENG_NATIVE_DIR=%__RepoRootDir%/eng/native" "-DCLR_REPO_ROOT_DIR=%__RepoRootDir%" %__CMakeArgs%
+ call "%__RepoRootDir%\eng\native\gen-buildsys.cmd" "%__ProjectDir%" "%__IntermediatesDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
if not !errorlevel! == 0 (
echo %__ErrMsgPrefix%%__MsgPrefix%Error: failed to generate native component build project!
goto ExitWithError
@@ -526,18 +641,25 @@ if %__BuildNative% EQU 1 (
if defined __ConfigureOnly goto SkipNativeBuild
set __BuildLogRootName=CoreCLR
- set "__BuildLog=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.log"
- set "__BuildWrn=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn"
- set "__BuildErr=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.err"
- set "__BinLog=%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog"
+ set "__BuildLog="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.log""
+ set "__BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn""
+ set "__BuildErr="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.err""
+ set "__BinLog="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.binlog""
set "__MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!"
set "__MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!"
set "__MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!"
set "__MsbuildBinLog=/bl:!__BinLog!"
- set "__Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr! !__MsbuildBinLog!"
+ set "__Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr! !__MsbuildBinLog! !__ConsoleLoggingParameters!"
- REM We pass the /m flag directly to MSBuild so that we can get both MSBuild and CL parallelism, which is fastest for our builds.
- "%CMakePath%" --build %__IntermediatesDir% --target install --config %__BuildType% -- /nologo /m !__Logging!
+ set __CmakeBuildToolArgs=
+ if %__Ninja% EQU 1 (
+ set __CmakeBuildToolArgs=
+ ) else (
+ REM We pass the /m flag directly to MSBuild so that we can get both MSBuild and CL parallelism, which is fastest for our builds.
+ set __CmakeBuildToolArgs=/nologo /m !__Logging!
+ )
+
+ "%CMakePath%" --build %__IntermediatesDir% --target install --config %__BuildType% -- !__CmakeBuildToolArgs!
if not !errorlevel! == 0 (
set __exitCode=!errorlevel!
@@ -550,17 +672,17 @@ if %__BuildNative% EQU 1 (
if /i "%__BuildArch%" == "arm64" goto SkipCopyUcrt
- set "__UCRTDir=%UniversalCRTSDKDIR%Redist\ucrxxxt\DLLs\%__BuildArch%\"
- if not exist "!__UCRTDir!" set "__UCRTDir=%UniversalCRTSDKDIR%Redist\%UCRTVersion%\ucrt\DLLs\%__BuildArch%\"
- if not exist "!__UCRTDir!" (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: Please install the Redistributable Universal C Runtime.
+ if not defined UCRTVersion (
+ echo %__ErrMsgPrefix%%__MsgPrefix%Error: Please install Windows 10 SDK.
goto ExitWithError
)
+ set "__UCRTDir=%UniversalCRTSdkDir%Redist\%UCRTVersion%\ucrt\DLLs\%__BuildArch%\"
+
xcopy /Y/I/E/D/F "!__UCRTDir!*.dll" "%__BinDir%\Redist\ucrt\DLLs\%__BuildArch%"
if not !errorlevel! == 0 (
set __exitCode=!errorlevel!
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: Failed to copy the CRT to the output.
+ echo %__ErrMsgPrefix%%__MsgPrefix%Error: Failed to copy the Universal CRT to the artifacts directory.
goto ExitWithCode
)
diff --git a/src/coreclr/build-runtime.sh b/src/coreclr/build-runtime.sh
index 24bb0067380b..a2e7313f4f3d 100755
--- a/src/coreclr/build-runtime.sh
+++ b/src/coreclr/build-runtime.sh
@@ -22,6 +22,10 @@ usage_list+=("-nopgooptimize: do not use profile guided optimizations.")
usage_list+=("-pgoinstrument: generate instrumented code for profile guided optimization enabled binaries.")
usage_list+=("-skipcrossarchnative: Skip building cross-architecture native binaries.")
usage_list+=("-staticanalyzer: skip native image generation.")
+usage_list+=("-skipjit: skip building jit.")
+usage_list+=("-skipalljits: skip building crosstargetting jits.")
+usage_list+=("-skipruntime: skip building runtime.")
+usage_list+=("-paltests: build the pal tests.")
setup_dirs_local()
{
@@ -95,7 +99,7 @@ build_cross_architecture_components()
export __CMakeBinDir CROSSCOMPILE
__CMakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__BuildArch -DCLR_CROSS_COMPONENTS_BUILD=1 $__CMakeArgs"
- build_native "$__CrossArch" "$__ProjectRoot" "$__ProjectRoot" "$intermediatesForBuild" "cross-architecture components"
+ build_native "$__TargetOS" "$__CrossArch" "$__ProjectRoot" "$__ProjectRoot" "$intermediatesForBuild" "$__CMakeArgs" "cross-architecture components"
CROSSCOMPILE=1
export CROSSCOMPILE
@@ -121,6 +125,21 @@ handle_arguments_local() {
__StaticAnalyzer=1
;;
+ skipjit|-skipjit)
+ __BuildJit=0
+ ;;
+
+ skipalljits|-skipalljits)
+ __BuildAllJits=0
+ ;;
+
+ skipruntime|-skipruntime)
+ __BuildRuntime=0
+ ;;
+
+ paltests|-paltests)
+ __BuildPALTests=1
+ ;;
*)
__UnprocessedBuildArgs="$__UnprocessedBuildArgs $1"
;;
@@ -173,13 +192,12 @@ __UseNinja=0
__VerboseBuild=0
__ValidateCrossArg=1
__CMakeArgs=""
+__BuildPALTests=0
+__BuildAllJits=1
+__BuildRuntime=1
source "$__ProjectRoot"/_build-commons.sh
-if [[ "${__BuildArch}" != "${__HostArch}" ]]; then
- __CrossBuild=1
-fi
-
# Set dependent variables
# Set the remaining variables based upon the determined build configuration
@@ -229,6 +247,8 @@ restore_optdata
# Build the coreclr (native) components.
__CMakeArgs="-DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument -DCLR_CMAKE_OPTDATA_PATH=$__PgoOptDataPath -DCLR_CMAKE_PGO_OPTIMIZE=$__PgoOptimize -DCLR_REPO_ROOT_DIR=\"$__RepoRootDir\" $__CMakeArgs"
+__CMakeArgs="-DCLR_CMAKE_BUILD_SUBSET_JIT=$__BuildJit -DCLR_CMAKE_BUILD_SUBSET_ALLJITS=$__BuildAllJits -DCLR_CMAKE_BUILD_SUBSET_RUNTIME=$__BuildRuntime $__CMakeArgs"
+__CMakeArgs="-DCLR_CMAKE_BUILD_TESTS=$__BuildPALTests $__CMakeArgs"
if [[ "$__SkipConfigure" == 0 && "$__CodeCoverage" == 1 ]]; then
__CMakeArgs="-DCLR_CMAKE_ENABLE_CODE_COVERAGE=1 $__CMakeArgs"
@@ -237,7 +257,7 @@ fi
if [[ "$__SkipNative" == 1 ]]; then
echo "Skipping CoreCLR component build."
else
- build_native "$__BuildArch" "$__ProjectRoot" "$__ProjectRoot" "$__IntermediatesDir" "CoreCLR component"
+ build_native "$__TargetOS" "$__BuildArch" "$__ProjectRoot" "$__ProjectRoot" "$__IntermediatesDir" "$__CMakeArgs" "CoreCLR component"
# Build cross-architecture components
if [[ "$__SkipCrossArchNative" != 1 ]]; then
diff --git a/src/coreclr/build-test.cmd b/src/coreclr/build-test.cmd
deleted file mode 100644
index d0d1a3331967..000000000000
--- a/src/coreclr/build-test.cmd
+++ /dev/null
@@ -1,746 +0,0 @@
-@if not defined _echo @echo off
-setlocal EnableDelayedExpansion EnableExtensions
-
-:: Define a prefix for most output progress messages that come from this script. That makes
-:: it easier to see where these are coming from. Note that there is a trailing space here.
-set "__MsgPrefix=BUILDTEST: "
-
-echo %__MsgPrefix%Starting Build at %TIME%
-
-
-set __ThisScriptDir="%~dp0"
-
-call "%__ThisScriptDir%"\setup_vs_tools.cmd
-if NOT '%ERRORLEVEL%' == '0' exit /b 1
-
-if defined VS160COMNTOOLS (
- set "__VSToolsRoot=%VS160COMNTOOLS%"
- set "__VCToolsRoot=%VS160COMNTOOLS%\..\..\VC\Auxiliary\Build"
- set __VSVersion=vs2019
-) else if defined VS150COMNTOOLS (
- set "__VSToolsRoot=%VS150COMNTOOLS%"
- set "__VCToolsRoot=%VS150COMNTOOLS%\..\..\VC\Auxiliary\Build"
- set __VSVersion=vs2017
-)
-
-:: Set the default arguments for build
-set __BuildArch=x64
-set __BuildType=Debug
-set __TargetOS=Windows_NT
-
-set "__ProjectDir=%~dp0"
-:: remove trailing slash
-if %__ProjectDir:~-1%==\ set "__ProjectDir=%__ProjectDir:~0,-1%"
-set "__RepoRootDir=%__ProjectDir%\..\.."
-for %%i in ("%__RepoRootDir%") do SET "__RepoRootDir=%%~fi"
-
-set "__TestDir=%__RepoRootDir%\src\tests"
-set "__ProjectFilesDir=%__TestDir%"
-set "__SourceDir=%__ProjectDir%\src"
-set "__RootBinDir=%__RepoRootDir%\artifacts"
-set "__LogsDir=%__RootBinDir%\log"
-set "__MsbuildDebugLogsDir=%__LogsDir%\MsbuildDebugLogs"
-
-:: Default __Exclude to issues.targets
-set __Exclude=%__ProjectDir%\tests\issues.targets
-
-REM __UnprocessedBuildArgs are args that we pass to msbuild (e.g. /p:TargetArchitecture=x64)
-set "__args= %*"
-set processedArgs=
-set __UnprocessedBuildArgs=
-set __CommonMSBuildArgs=
-
-set __SkipRestorePackages=
-set __SkipStressDependencies=
-set __SkipManaged=
-set __SkipTestWrappers=
-set __BuildTestWrappersOnly=
-set __SkipNative=
-set __RuntimeId=
-set __TargetsWindows=1
-set __DoCrossgen=
-set __DoCrossgen2=
-set __CompositeBuildMode=
-set __CopyNativeTestBinaries=0
-set __CopyNativeProjectsAfterCombinedTestBuild=true
-set __SkipGenerateLayout=0
-set __LocalCoreFXConfig=%__BuildType%
-set __SkipFXRestoreArg=
-set __GenerateLayoutOnly=0
-
-@REM CMD has a nasty habit of eating "=" on the argument list, so passing:
-@REM -priority=1
-@REM appears to CMD parsing as "-priority 1". Handle -priority specially to avoid problems,
-@REM and allow the "-priority=1" syntax.
-set __Priority=0
-set __PriorityArg=
-
-set __BuildNeedTargetArg=
-
-:Arg_Loop
-if "%1" == "" goto ArgsDone
-
-if /i "%1" == "/?" goto Usage
-if /i "%1" == "-?" goto Usage
-if /i "%1" == "/h" goto Usage
-if /i "%1" == "-h" goto Usage
-if /i "%1" == "/help" goto Usage
-if /i "%1" == "-help" goto Usage
-if /i "%1" == "--help" goto Usage
-
-if /i "%1" == "x64" (set __BuildArch=x64&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "x86" (set __BuildArch=x86&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "arm" (set __BuildArch=arm&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "arm64" (set __BuildArch=arm64&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-
-if /i "%1" == "debug" (set __BuildType=Debug&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "release" (set __BuildType=Release&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "checked" (set __BuildType=Checked&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-
-if /i "%1" == "ci" (set __ArcadeScriptArgs="-ci"&set __ErrMsgPrefix=##vso[task.logissue type=error]&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-
-if /i "%1" == "skipstressdependencies" (set __SkipStressDependencies=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "skiprestorepackages" (set __SkipRestorePackages=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "skipmanaged" (set __SkipManaged=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "skipnative" (set __SkipNative=1&set __CopyNativeProjectsAfterCombinedTestBuild=false&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "skiptestwrappers" (set __SkipTestWrappers=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "skipgeneratelayout" (set __SkipGenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-
-if /i "%1" == "copynativeonly" (set __CopyNativeTestBinaries=1&set __SkipStressDependencies=1&set __SkipNative=1&set __CopyNativeProjectsAfterCombinedTestBuild=false&set __SkipGenerateLayout=1&set __SkipCrossgenFramework=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "generatelayoutonly" (set __SkipManaged=1&set __SkipNative=1&set __CopyNativeProjectsAfterCombinedTestBuild=false&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "buildtestwrappersonly" (set __SkipNative=1&set __SkipManaged=1&set __BuildTestWrappersOnly=1&set __SkipGenerateLayout=1&set __SkipStressDependencies=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "crossgenframeworkonly" (set __SkipRestorePackages=1&set __SkipStressDependencies=1&set __SkipNative=1&set __SkipManaged=1&set __SkipGenerateLayout=1&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-
-if /i "%1" == "buildagainstpackages" (echo error: Remove /BuildAgainstPackages switch&&exit /b1)
-if /i "%1" == "crossgen" (set __DoCrossgen=1&set __TestBuildMode=crossgen&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "crossgen2" (set __DoCrossgen2=1&set __TestBuildMode=crossgen2&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "composite" (set __CompositeBuildMode=1&set __DoCrossgen2=1&set __TestBuildMode=crossgen2&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "runtimeid" (set __RuntimeId=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
-if /i "%1" == "targetsNonWindows" (set __TargetsWindows=0&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "Exclude" (set __Exclude=%2&set processedArgs=!processedArgs! %1 %2&shift&shift&goto Arg_Loop)
-if /i "%1" == "-priority" (set __Priority=%2&shift&set processedArgs=!processedArgs! %1=%2&shift&goto Arg_Loop)
-if /i "%1" == "allTargets" (set "__BuildNeedTargetArg=/p:CLRTestBuildAllTargets=%1"&set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-if /i "%1" == "-excludemonofailures" (set __Mono=1&set processedArgs=!processedArgs!&shift&goto Arg_Loop)
-if /i "%1" == "--" (set processedArgs=!processedArgs! %1&shift&goto Arg_Loop)
-
-if [!processedArgs!]==[] (
- set __UnprocessedBuildArgs=%__args%
-) else (
- set __UnprocessedBuildArgs=%__args%
- for %%t in (!processedArgs!) do (
- set __UnprocessedBuildArgs=!__UnprocessedBuildArgs:*%%t=!
- )
-)
-
-:ArgsDone
-
-@REM Special handling for -priority=N argument.
-if %__Priority% GTR 0 (
- set "__PriorityArg=/p:CLRTestPriorityToBuild=%__Priority%"
-)
-
-set TargetsWindowsArg=
-set TargetsWindowsMsbuildArg=
-if "%__TargetsWindows%"=="1" (
- set TargetsWindowsArg=-TargetsWindows=true
- set TargetsWindowsMsbuildArg=/p:TargetsWindows=true
-) else if "%__TargetsWindows%"=="0" (
- set TargetsWindowsArg=-TargetsWindows=false
- set TargetsWindowsMsbuildArg=/p:TargetsWindows=false
-)
-
-@if defined _echo @echo on
-
-set __CommonMSBuildArgs=/p:TargetOS=%__TargetOS% /p:Configuration=%__BuildType% /p:TargetArchitecture=%__BuildArch%
-set __msbuildArgs=/p:TargetOS=%__TargetOS% /p:Configuration=%__BuildType% /p:TargetArchitecture=%__BuildArch% /nologo /verbosity:minimal /clp:Summary /maxcpucount
-
-echo %__MsgPrefix%Commencing CoreCLR test build
-
-set "__BinDir=%__RootBinDir%\bin\coreclr\%__TargetOS%.%__BuildArch%.%__BuildType%"
-set "__TestRootDir=%__RootBinDir%\tests\coreclr"
-set "__TestBinDir=%__TestRootDir%\%__TargetOS%.%__BuildArch%.%__BuildType%"
-
-if not defined XunitTestBinBase set XunitTestBinBase=%__TestBinDir%\
-set "CORE_ROOT=%XunitTestBinBase%\Tests\Core_Root"
-
-REM We have different managed and native intermediate dirs because the managed bits will include
-REM the configuration information deeper in the intermediates path.
-REM These variables are used by the msbuild project files.
-
-if not defined __TestIntermediateDir (
- set "__TestIntermediateDir=tests\coreclr\obj\%__TargetOS%.%__BuildArch%.%__BuildType%"
-)
-set "__NativeTestIntermediatesDir=%__RootBinDir%\%__TestIntermediateDir%\Native"
-set "__ManagedTestIntermediatesDir=%__RootBinDir%\%__TestIntermediateDir%\Managed"
-
-REM Generate path to be set for CMAKE_INSTALL_PREFIX to contain forward slash
-set "__CMakeBinDir=%__TestBinDir%"
-set "__CMakeBinDir=%__CMakeBinDir:\=/%"
-
-if not exist "%__TestBinDir%" md "%__TestBinDir%"
-if not exist "%__NativeTestIntermediatesDir%" md "%__NativeTestIntermediatesDir%"
-if not exist "%__ManagedTestIntermediatesDir%" md "%__ManagedTestIntermediatesDir%"
-if not exist "%__LogsDir%" md "%__LogsDir%"
-if not exist "%__MsbuildDebugLogsDir%" md "%__MsbuildDebugLogsDir%"
-
-REM Set up the directory for MSBuild debug logs.
-set MSBUILDDEBUGPATH=%__MsbuildDebugLogsDir%
-
-REM =========================================================================================
-REM ===
-REM === Restore Build Tools
-REM ===
-REM =========================================================================================
-
-@if defined _echo @echo on
-
-set "__ToolsDir=%__ProjectDir%\Tools"
-
-REM =========================================================================================
-REM ===
-REM === Resolve runtime dependences
-REM ===
-REM =========================================================================================
-
-if defined __SkipStressDependencies goto skipstressdependencies
-
-call "%__ProjectDir%\tests\setup-stress-dependencies.cmd" /arch %__BuildArch% /outputdir %__BinDir%
-if errorlevel 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: setup-stress-dependencies failed.
- goto :Exit_Failure
-)
-
-:skipstressdependencies
-@if defined _echo @echo on
-
-REM =========================================================================================
-REM ===
-REM === Native test build section
-REM ===
-REM =========================================================================================
-
-if defined __SkipNative goto skipnative
-
-echo %__MsgPrefix%Commencing build of native test components for %__BuildArch%/%__BuildType%
-
-REM Set the environment for the native build
-
-REM Eval the output from set-cmake-path.ps1
-for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy ByPass "& ""%__SourceDir%\pal\tools\set-cmake-path.ps1"""') do %%a
-echo %__MsgPrefix%Using CMake from !CMakePath!
-
-REM NumberOfCores is an WMI property providing number of physical cores on machine
-REM processor(s). It is used to set optimal level of CL parallelism during native build step
-if not defined NumberOfCores (
- REM Determine number of physical processor cores available on machine
- set TotalNumberOfCores=0
- for /f "tokens=*" %%I in (
- 'wmic cpu get NumberOfCores /value ^| find "=" 2^>NUL'
- ) do set %%I & set /a TotalNumberOfCores=TotalNumberOfCores+NumberOfCores
- set NumberOfCores=!TotalNumberOfCores!
-)
-echo %__MsgPrefix%Number of processor cores %NumberOfCores%
-
-set __VCBuildArch=x86_amd64
-if /i "%__BuildArch%" == "x86" ( set __VCBuildArch=x86 )
-if /i "%__BuildArch%" == "arm" ( set __VCBuildArch=x86_arm )
-if /i "%__BuildArch%" == "arm64" ( set __VCBuildArch=x86_arm64 )
-
-echo %__MsgPrefix%Using environment: "%__VCToolsRoot%\vcvarsall.bat" %__VCBuildArch%
-call "%__VCToolsRoot%\vcvarsall.bat" %__VCBuildArch%
-@if defined _echo @echo on
-
-if not defined VSINSTALLDIR (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: VSINSTALLDIR variable not defined.
- exit /b 1
-)
-if not exist "%VSINSTALLDIR%DIA SDK" goto NoDIA
-
-set __ExtraCmakeArgs="-DCMAKE_SYSTEM_VERSION=10.0" "-DCLR_ENG_NATIVE_DIR=%__RepoRootDir%/eng/native"
-call "%__SourceDir%\pal\tools\gen-buildsys.cmd" "%__ProjectFilesDir%" "%__NativeTestIntermediatesDir%" %__VSVersion% %__BuildArch% !__ExtraCmakeArgs!
-
-if not !errorlevel! == 0 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: failed to generate native component build project!
- exit /b 1
-)
-
-@if defined _echo @echo on
-
-if not exist "%__NativeTestIntermediatesDir%\CMakeCache.txt" (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: unable to find generated native component build project!
- exit /b 1
-)
-
-echo Environment setup
-
-set __BuildLogRootName=Tests_Native
-set __BuildLog="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.log"
-set __BuildWrn="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn"
-set __BuildErr="%__LogsDir%\!__BuildLogRootName!_%__TargetOS%__%__BuildArch%__%__BuildType%.err"
-set __MsbuildLog=/flp:Verbosity=normal;LogFile=!__BuildLog!
-set __MsbuildWrn=/flp1:WarningsOnly;LogFile=!__BuildWrn!
-set __MsbuildErr=/flp2:ErrorsOnly;LogFile=!__BuildErr!
-set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
-
-REM We pass the /m flag directly to MSBuild so that we can get both MSBuild and CL parallelism, which is fastest for our builds.
-"%CMakePath%" --build %__NativeTestIntermediatesDir% --target install --config %__BuildType% -- /nologo /m !__Logging!
-
-if errorlevel 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: native test build failed.
- exit /b 1
-)
-
-:skipnative
-
-REM =========================================================================================
-REM ===
-REM === Restore product binaries from packages
-REM ===
-REM =========================================================================================
-
-if "%__SkipRestorePackages%" == "1" goto SkipRestoreProduct
-
-echo %__MsgPrefix%Restoring CoreCLR product from packages
-
-set __BuildLogRootName=Restore_Product
-set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.log
-set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn
-set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.err
-set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
-set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
-set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
-set __Logging='!__MsbuildLog!' '!__MsbuildWrn!' '!__MsbuildErr!'
-
-powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -Command "%__RepoRootDir%\eng\common\msbuild.ps1" %__ArcadeScriptArgs%^
- %__ProjectDir%\tests\build.proj -warnAsError:0 /t:BatchRestorePackages /nodeReuse:false^
- /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
- /p:UsePartialNGENOptimization=false /maxcpucount^
- %__SkipFXRestoreArg%^
- !__Logging! %__CommonMSBuildArgs% %__PriorityArg% %__BuildNeedTargetArg% %__UnprocessedBuildArgs%
-
-if errorlevel 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: Package restoration failed. Refer to the build log files for details:
- echo %__BuildLog%
- echo %__BuildWrn%
- echo %__BuildErr%
- exit /b 1
-)
-
-:SkipRestoreProduct
-
-REM =========================================================================================
-REM ===
-REM === Managed test build section
-REM ===
-REM =========================================================================================
-
-if defined __SkipManaged goto SkipManagedBuild
-
-echo %__MsgPrefix%Starting the Managed Tests Build
-
-if not defined VSINSTALLDIR (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: build-test.cmd should be run from a Visual Studio Command Prompt. Please see https://github.com/dotnet/runtime/tree/master/docs/workflow for build instructions.
- exit /b 1
-)
-set __AppendToLog=false
-set __BuildLogRootName=Tests_Managed
-set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.log
-set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn
-set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.err
-
-REM Execute msbuild test build in stages - workaround for excessive data retention in MSBuild ConfigCache
-REM See https://github.com/Microsoft/msbuild/issues/2993
-
-set __SkipPackageRestore=false
-set __SkipTargetingPackBuild=false
-set __NumberOfTestGroups=3
-
-if %__Priority% GTR 0 (set __NumberOfTestGroups=10)
-echo %__MsgPrefix%Building tests divided into %__NumberOfTestGroups% test groups
-
-set __CommonMSBuildCmdPrefix=powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -Command "!__RepoRootDir!\eng\common\msbuild.ps1" !__ArcadeScriptArgs!
-
-for /l %%G in (1, 1, %__NumberOfTestGroups%) do (
-
- set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%";Append=!__AppendToLog!
- set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%";Append=!__AppendToLog!
- set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%";Append=!__AppendToLog!
- set __Logging='!__MsbuildLog!' '!__MsbuildWrn!' '!__MsbuildErr!'
-
- set __TestGroupToBuild=%%G
-
- if not "%__CopyNativeTestBinaries%" == "1" (
- set __MSBuildBuildArgs=!__ProjectDir!\tests\build.proj
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! -warnAsError:0
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! /nodeReuse:false
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! !__Logging!
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! !TargetsWindowsMsbuildArg!
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! !__msbuildArgs!
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! !__PriorityArg! !__BuildNeedTargetArg!
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! !__UnprocessedBuildArgs!
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! /p:CopyNativeProjectBinaries=!__CopyNativeProjectsAfterCombinedTestBuild!
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! /p:__SkipPackageRestore=true
- set __MSBuildBuildArgs=!__MSBuildBuildArgs! !__SkipFXRestoreArg!
- echo Running: msbuild !__MSBuildBuildArgs!
- !__CommonMSBuildCmdPrefix! !__MSBuildBuildArgs!
-
- if errorlevel 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: managed test build failed. Refer to the build log files for details:
- echo %__BuildLog%
- echo %__BuildWrn%
- echo %__BuildErr%
- REM This is necessary because of a(n apparent) bug in the FOR /L command. Under certain circumstances,
- REM such as when this script is invoke with CMD /C "build-test.cmd", a non-zero exit directly from
- REM within the loop body will not propagate to the caller. For some reason, goto works around it.
- goto :Exit_Failure
- )
- ) else (
- set __MSBuildBuildArgs=!__ProjectDir!\tests\build.proj -warnAsError:0 /nodeReuse:false !__Logging! !TargetsWindowsMsbuildArg! !__msbuildArgs! !__PriorityArg! !__BuildNeedTargetArg! !__SkipFXRestoreArg! !__UnprocessedBuildArgs! "/t:CopyAllNativeProjectReferenceBinaries"
- echo Running: msbuild !__MSBuildBuildArgs!
- !__CommonMSBuildCmdPrefix! !__MSBuildBuildArgs!
-
- if errorlevel 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: copying native test binaries failed. Refer to the build log files for details:
- echo %__BuildLog%
- echo %__BuildWrn%
- echo %__BuildErr%
- REM This is necessary because of a(n apparent) bug in the FOR /L command. Under certain circumstances,
- REM such as when this script is invoke with CMD /C "build-test.cmd", a non-zero exit directly from
- REM within the loop body will not propagate to the caller. For some reason, goto works around it.
- goto :Exit_Failure
- )
- )
-
- set __SkipPackageRestore=true
- set __SkipTargetingPackBuild=true
- set __AppendToLog=true
-)
-
-if "%__CopyNativeTestBinaries%" == "1" goto :SkipManagedBuild
-
-REM Check that we've built about as many tests as we expect. This is primarily intended to prevent accidental changes that cause us to build
-REM drastically fewer Pri-1 tests than expected.
-echo %__MsgPrefix%Check the managed tests build
-echo Running: dotnet msbuild %__ProjectDir%\tests\src\runtest.proj /t:CheckTestBuild /nodeReuse:false /p:CLRTestPriorityToBuild=%__Priority% %__SkipFXRestoreArg% %__msbuildArgs% %__unprocessedBuildArgs%
-powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__RepoRootDir%\eng\common\msbuild.ps1" %__ArcadeScriptArgs%^
- %__ProjectDir%\tests\src\runtest.proj /t:CheckTestBuild /nodeReuse:false /p:CLRTestPriorityToBuild=%__Priority% %__msbuildArgs% %__unprocessedBuildArgs%
-if errorlevel 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: Check Test Build failed.
- exit /b 1
-)
-
-:SkipManagedBuild
-
-if "%__SkipGenerateLayout%" == "1" goto SkipGenerateLayout
-
-REM =========================================================================================
-REM ===
-REM === Prepare the test drop
-REM ===
-REM =========================================================================================
-
-echo %__MsgPrefix%Removing 'ni' files and 'lock' folders from %__TestBinDir%
-REM Remove any NI from previous runs.
-powershell -NoProfile "Get-ChildItem -path %__TestBinDir% -Include '*.ni.*' -Recurse -Force | Remove-Item -force"
-REM Remove any lock folder used for synchronization from previous runs.
-powershell -NoProfile "Get-ChildItem -path %__TestBinDir% -Include 'lock' -Recurse -Force | where {$_.Attributes -eq 'Directory'}| Remove-Item -force -Recurse"
-
-set CORE_ROOT=%__TestBinDir%\Tests\Core_Root
-if exist "%CORE_ROOT%" rd /s /q "%CORE_ROOT%"
-md "%CORE_ROOT%"
-
-REM =========================================================================================
-REM ===
-REM === Create the test overlay
-REM ===
-REM =========================================================================================
-
-echo %__MsgPrefix%Creating test overlay
-
-set RuntimeIdArg=
-if defined __RuntimeId (
- set RuntimeIdArg=/p:RuntimeId="%__RuntimeId%"
-)
-
-set __BuildLogRootName=Tests_Overlay_Managed
-set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.log
-set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn
-set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.err
-set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
-set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
-set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
-set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
-
-powershell -NoProfile -ExecutionPolicy ByPass -NoLogo -File "%__RepoRootDir%\eng\common\msbuild.ps1" %__ArcadeScriptArgs%^
- %__ProjectDir%\tests\src\runtest.proj /t:CreateTestOverlay /nodeReuse:false^
- /p:RestoreDefaultOptimizationDataPackage=false /p:PortableBuild=true^
- /p:UsePartialNGENOptimization=false /maxcpucount^
- %__SkipFXRestoreArg%^
- !__Logging! %__CommonMSBuildArgs% %RuntimeIdArg% %__PriorityArg% %__BuildNeedTargetArg% %__UnprocessedBuildArgs%
-if errorlevel 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: Create Test Overlay failed. Refer to the build log files for details:
- echo %__BuildLog%
- echo %__BuildWrn%
- echo %__BuildErr%
- exit /b 1
-)
-
-:SkipGenerateLayout
-
-REM =========================================================================================
-REM ===
-REM === Create test wrappers.
-REM ===
-REM =========================================================================================
-
-if defined __BuildTestWrappersOnly goto BuildTestWrappers
-
-if defined __SkipManaged goto SkipBuildingWrappers
-if defined __SkipTestWrappers goto SkipBuildingWrappers
-
-:BuildTestWrappers
-echo %__MsgPrefix%Creating test wrappers
-
-set __BuildLogRootName=Tests_XunitWrapper
-set __BuildLog=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.log
-set __BuildWrn=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.wrn
-set __BuildErr=%__LogsDir%\%__BuildLogRootName%_%__TargetOS%__%__BuildArch%__%__BuildType%.err
-set __MsbuildLog=/flp:Verbosity=normal;LogFile="%__BuildLog%"
-set __MsbuildWrn=/flp1:WarningsOnly;LogFile="%__BuildWrn%"
-set __MsbuildErr=/flp2:ErrorsOnly;LogFile="%__BuildErr%"
-set __Logging=!__MsbuildLog! !__MsbuildWrn! !__MsbuildErr!
-
-if %%__Mono%%==1 (
- set RuntimeFlavor="mono"
-) else (
- set RuntimeFlavor="coreclr"
-)
-
-REM Build wrappers using the local SDK's msbuild. As we move to arcade, the other builds should be moved away from run.exe as well.
-call "%__RepoRootDir%\dotnet.cmd" msbuild %__ProjectDir%\tests\src\runtest.proj /nodereuse:false /p:BuildWrappers=true /p:TestBuildMode=%__TestBuildMode% !__Logging! %__msbuildArgs% %TargetsWindowsMsbuildArg% %__SkipFXRestoreArg% %__UnprocessedBuildArgs% /p:RuntimeFlavor=%RuntimeFlavor%
-if errorlevel 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: XUnit wrapper build failed. Refer to the build log files for details:
- echo %__BuildLog%
- echo %__BuildWrn%
- echo %__BuildErr%
- exit /b 1
-)
-
-echo { "build_os": "%__TargetOS%", "build_arch": "%__BuildArch%", "build_type": "%__BuildType%" } > "%__TestBinDir%/build_info.json"
-
-:SkipBuildingWrappers
-
-REM =========================================================================================
-REM ===
-REM === Crossgen assemblies if needed.
-REM ===
-REM =========================================================================================
-
-if defined __SkipCrossgenFramework goto SkipCrossgen
-if defined __BuildTestWrappersOnly goto SkipCrossgen
-
-set __CrossgenArg = ""
-if defined __DoCrossgen (
- set __CrossgenArg="/p:Crossgen=true"
- if "%__TargetsWindows%" == "1" (
- echo %__MsgPrefix%Running crossgen on framework assemblies in CORE_ROOT: %CORE_ROOT%
- call :PrecompileFX
- if ERRORLEVEL 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: crossgen precompilation of framework assemblies failed
- exit /b 1
- )
- ) else (
- echo "%__MsgPrefix%Crossgen only supported on Windows, for now"
- )
-)
-
-if defined __DoCrossgen2 (
- set __CrossgenArg="/p:Crossgen2=true"
- echo %__MsgPrefix%Running crossgen2 on framework assemblies in CORE_ROOT: %CORE_ROOT%
- call :PrecompileFX
- if ERRORLEVEL 1 (
- echo %__ErrMsgPrefix%%__MsgPrefix%Error: crossgen2 precompilation of framework assemblies failed
- exit /b 1
- )
-)
-
-:SkipCrossgen
-
-REM =========================================================================================
-REM ===
-REM === All builds complete!
-REM ===
-REM =========================================================================================
-:TestBuildDone
-
-echo %__MsgPrefix%Test build succeeded. Finished at %TIME%
-echo %__MsgPrefix%Test binaries are available at !__TestBinDir!
-exit /b 0
-
-:Usage
-echo.
-echo Build the CoreCLR tests.
-echo.
-echo Usage:
-echo %0 [option1] [option2] ...
-echo All arguments are optional. Options are case-insensitive. The options are:
-echo.
-echo.-? -h -help --help: view this message.
-echo Build architecture: one of x64, x86, arm, arm64 ^(default: x64^).
-echo Build type: one of Debug, Checked, Release ^(default: Debug^).
-echo skipmanaged: skip the managed tests build
-echo skipnative: skip the native tests build
-echo skiprestorepackages: skip package restore
-echo runtimeid ^: Builds a test overlay for the specified OS ^(Only supported when building against packages^). Supported IDs are:
-echo alpine.3.4.3-x64: Builds overlay for Alpine 3.4.3
-echo debian.8-x64: Builds overlay for Debian 8
-echo fedora.24-x64: Builds overlay for Fedora 24
-echo linux-x64: Builds overlay for portable linux
-echo opensuse.42.1-x64: Builds overlay for OpenSUSE 42.1
-echo osx.10.12-x64: Builds overlay for OSX 10.12
-echo osx-x64: Builds overlay for portable OSX
-echo rhel.7-x64: Builds overlay for RHEL 7 or CentOS
-echo ubuntu.14.04-x64: Builds overlay for Ubuntu 14.04
-echo ubuntu.16.04-x64: Builds overlay for Ubuntu 16.04
-echo ubuntu.16.10-x64: Builds overlay for Ubuntu 16.10
-echo win-x64: Builds overlay for portable Windows
-echo win7-x64: Builds overlay for Windows 7
-echo crossgen: Precompiles the framework managed assemblies
-echo copynativeonly: Only copy the native test binaries to the managed output. Do not build the native or managed tests.
-echo skipgeneratelayout: Do not generate the Core_Root layout
-echo generatelayoutonly: Generate the Core_Root layout without building managed or native test components
-echo targetsNonWindows:
-echo Exclude- Optional parameter - specify location of default exclusion file ^(defaults to tests\issues.targets if not specified^)
-echo Set to "" to disable default exclusion file.
-echo -- ... : all arguments following this tag will be passed directly to msbuild.
-echo -priority=^ : specify a set of tests that will be built and run, with priority N.
-echo 0: Build only priority 0 cases as essential testcases (default)
-echo 1: Build all tests with priority 0 and 1
-echo 666: Build all tests with priority 0, 1 ... 666
-echo allTargets: Build managed tests for all target platforms.
-echo -verbose: enables detailed file logging for the msbuild tasks into the msbuild log file.
-exit /b 1
-
-:NoDIA
-echo Error: DIA SDK is missing at "%VSINSTALLDIR%DIA SDK". ^
-Did you install all the requirements for building on Windows, including the "Desktop Development with C++" workload? ^
-Please see https://github.com/dotnet/runtime/blob/master/docs/workflow/requirements/windows-requirements.md ^
-Another possibility is that you have a parallel installation of Visual Studio and the DIA SDK is there. In this case it ^
-may help to copy its "DIA SDK" folder into "%VSINSTALLDIR%" manually, then try again.
-exit /b 1
-
-:PrecompileFX
-set __TotalPrecompiled=0
-set __FailedToPrecompile=0
-set __FailedAssemblies=
-set __CompositeOutputDir=%CORE_ROOT%\composite.out
-set __CompositeResponseFile=%__CompositeOutputDir%\framework-r2r.dll.rsp
-
-set __CrossgenDir=%__BinDir%
-if /i "%__BuildArch%" == "arm" (set __CrossgenDir=!__CrossgenDir!\x86)
-if /i "%__BuildArch%" == "arm64" (set __CrossgenDir=!__CrossgenDir!\x64)
-
-set __CrossgenExe="%__CrossgenDir%\crossgen.exe"
-set __Crossgen2Dll="%__RepoRootDir%\dotnet.cmd" "%__CrossgenDir%\crossgen2\crossgen2.dll"
-
-if defined __CompositeBuildMode (
- mkdir !__CompositeOutputDir!
- del /Q !__CompositeResponseFile!
- echo --composite>>!__CompositeResponseFile!
- echo -O>>!__CompositeResponseFile!
- echo --targetarch:%__BuildArch%>>!__CompositeResponseFile!
- echo --out^:%__CompositeOutputDir%\framework-r2r.dll>>!__CompositeResponseFile!
-)
-
-for %%F in ("%CORE_ROOT%\System.*.dll";"%CORE_ROOT%\Microsoft.*.dll";%CORE_ROOT%\netstandard.dll;%CORE_ROOT%\mscorlib.dll) do (
- if not "%%~nxF"=="System.Runtime.WindowsRuntime.dll" (
- if defined __CompositeBuildMode (
- echo %%F>>!__CompositeResponseFile!
- ) else (
- call :PrecompileAssembly %%F %%~nxF __TotalPrecompiled __FailedToPrecompile __FailedAssemblies
- echo Processed: !__TotalPrecompiled!, failed !__FailedToPrecompile!
- )
- ))
-)
-
-if defined __CompositeBuildMode (
- echo Composite response line^: %__CompositeResponseFile%
- type "%__CompositeResponseFile%"
-)
-
-if defined __CompositeBuildMode (
- set __CompositeCommandLine=%__Crossgen2Dll%
- set __CompositeCommandLine=!__CompositeCommandLine! "@%__CompositeResponseFile%"
- echo Building composite R2R framework^: !__CompositeCommandLine!
- call !__CompositeCommandLine!
- set __FailedToPrecompile=!ERRORLEVEL!
- copy /Y "!__CompositeOutputDir!\*.*" "!CORE_ROOT!\"
-)
-
-if !__FailedToPrecompile! NEQ 0 (
- @echo Failed assemblies:
- FOR %%G IN (!__FailedAssemblies!) do echo %%G
-)
-
-exit /b !__FailedToPrecompile!
-
-REM Compile the managed assemblies in Core_ROOT before running the tests
-:PrecompileAssembly
-
-set AssemblyPath=%1
-set AssemblyName=%2
-
-REM Intentionally avoid using the .dll extension to prevent
-REM subsequent compilations from picking it up as a reference
-set __CrossgenOutputFile=%CORE_ROOT%\temp.ni._dll
-set __CrossgenResponseFile="%CORE_ROOT%\%AssemblyName%.rsp
-set __CrossgenCmd=
-
-del /Q %__CrossgenResponseFile%
-
-if defined __DoCrossgen (
- set __CrossgenCmd=!__CrossgenExe! @!__CrossgenResponseFile!
- echo /Platform_Assemblies_Paths "!CORE_ROOT!">>!__CrossgenResponseFile!
- echo /in !AssemblyPath!>>!__CrossgenResponseFile!
- echo /out !__CrossgenOutputFile!>>!__CrossgenResponseFile!
-) else (
- set __CrossgenCmd=!__Crossgen2Dll! @!__CrossgenResponseFile!
- echo -r:!CORE_ROOT!\System.*.dll>>!__CrossgenResponseFile!
- echo -r:!CORE_ROOT!\Microsoft.*.dll>>!__CrossgenResponseFile!
- echo -r:!CORE_ROOT!\mscorlib.dll>>!__CrossgenResponseFile!
- echo -r:!CORE_ROOT!\netstandard.dll>>!__CrossgenResponseFile!
- echo -O>>!__CrossgenResponseFile!
- echo --inputbubble>>!__CrossgenResponseFile!
- echo --out:!__CrossgenOutputFile!>>!__CrossgenResponseFile!
- echo !AssemblyPath!>>!__CrossgenResponseFile!
- echo --targetarch:!__BuildArch!>>!__CrossgenResponseFile!
-)
-
-echo !__CrossgenCmd!
-call !__CrossgenCmd!
-
-set /a __exitCode = !errorlevel!
-
-set /a "%~3+=1"
-
-if "%__exitCode%" == "-2146230517" (
- echo %AssemblyPath% is not a managed assembly.
- exit /b 0
-)
-
-if %__exitCode% neq 0 (
- echo Unable to precompile %AssemblyPath%, exit code is %__exitCode%
- set /a "%~4+=1"
- set "%~5=!%~5!,!AssemblyName!"
- exit /b 0
-)
-
-REM Delete original .dll & replace it with the Crossgened .dll
-del %AssemblyPath%
-ren "%__CrossgenOutputFile%" %AssemblyName%
-
-echo Successfully precompiled %AssemblyPath%
-exit /b 0
-
-:Exit_Failure
-exit /b 1
diff --git a/src/coreclr/build-test.sh b/src/coreclr/build-test.sh
deleted file mode 100755
index b67fbef45f92..000000000000
--- a/src/coreclr/build-test.sh
+++ /dev/null
@@ -1,779 +0,0 @@
-#!/usr/bin/env bash
-
-build_test_wrappers()
-{
- if [[ "$__BuildTestWrappers" -ne -0 ]]; then
- echo "${__MsgPrefix}Creating test wrappers..."
-
- if [[ $__Mono -eq 1 ]]; then
- __RuntimeFlavor="mono"
- else
- __RuntimeFlavor="coreclr"
- fi
-
- __Exclude="${__ProjectDir}/tests/issues.targets"
- __BuildLogRootName="Tests_XunitWrapper"
-
- export __Exclude __BuildLogRootName
-
- buildVerbosity="Summary"
-
- if [[ "$__VerboseBuild" == 1 ]]; then
- buildVerbosity="Diag"
- fi
-
- # Set up directories and file names
- __BuildLogRootName="$subDirectoryName"
- __BuildLog="$__LogsDir/${__BuildLogRootName}.${__TargetOS}.${__BuildArch}.${__BuildType}.log"
- __BuildWrn="$__LogsDir/${__BuildLogRootName}.${__TargetOS}.${__BuildArch}.${__BuildType}.wrn"
- __BuildErr="$__LogsDir/${__BuildLogRootName}.${__TargetOS}.${__BuildArch}.${__BuildType}.err"
- __MsbuildLog="/fileloggerparameters:\"Verbosity=normal;LogFile=${__BuildLog}\""
- __MsbuildWrn="/fileloggerparameters1:\"WarningsOnly;LogFile=${__BuildWrn}\""
- __MsbuildErr="/fileloggerparameters2:\"ErrorsOnly;LogFile=${__BuildErr}\""
- __Logging="$__MsbuildLog $__MsbuildWrn $__MsbuildErr /consoleloggerparameters:$buildVerbosity"
-
- nextCommand="\"${__DotNetCli}\" msbuild \"${__ProjectDir}/tests/src/runtest.proj\" /nodereuse:false /p:BuildWrappers=true /p:TestBuildMode=$__TestBuildMode /p:TargetsWindows=false $__Logging /p:TargetOS=$__TargetOS /p:Configuration=$__BuildType /p:TargetArchitecture=$__BuildArch /p:RuntimeFlavor=$__RuntimeFlavor \"/bl:${__RepoRootDir}/artifacts/log/${__BuildType}/build_test_wrappers_${__RuntimeFlavor}.binlog\" ${__UnprocessedBuildArgs[@]}"
- eval $nextCommand
-
- local exitCode="$?"
- if [[ "$exitCode" -ne 0 ]]; then
- echo "${__ErrMsgPrefix}${__MsgPrefix}Error: XUnit wrapper build failed. Refer to the build log files for details (above)"
- exit "$exitCode"
- else
- echo "XUnit Wrappers have been built."
- echo { "\"build_os\"": "\"${__TargetOS}\"", "\"build_arch\"": "\"${__BuildArch}\"", "\"build_type\"": "\"${__BuildType}\"" } > "${__TestWorkingDir}/build_info.json"
-
- fi
- fi
-}
-
-build_mono_aot()
-{
- __RuntimeFlavor="mono"
- __MonoBinDir="$__RootBinDir/bin/mono/$__TargetOS.$__BuildArch.$__BuildType"
- __Exclude="${__ProjectDir}/tests/issues.targets"
- __TestBinDir="$__TestWorkingDir"
- CORE_ROOT="$__TestBinDir"/Tests/Core_Root
- export __Exclude
- export CORE_ROOT
- build_MSBuild_projects "Tests_MonoAot" "$__ProjectDir/tests/src/runtest.proj" "Mono AOT compile tests" "/t:MonoAotCompileTests" "/p:RuntimeFlavor=$__RuntimeFlavor" "/p:MonoLlvmPath=$__MonoBinDir"
-}
-
-generate_layout()
-{
- echo "${__MsgPrefix}Creating test overlay..."
-
- __ProjectFilesDir="$__TestDir"
- __TestBinDir="$__TestWorkingDir"
-
- if [[ "$__RebuildTests" -ne 0 ]]; then
- if [[ -d "${__TestBinDir}" ]]; then
- echo "Removing tests build dir: ${__TestBinDir}"
- rm -rf "$__TestBinDir"
- fi
- fi
-
- __CMakeBinDir="${__TestBinDir}"
-
- if [[ -z "$__TestIntermediateDir" ]]; then
- __TestIntermediateDir="tests/obj/${__TargetOS}.${__BuildArch}.${__BuildType}"
- fi
-
- echo "__TargetOS: ${__TargetOS}"
- echo "__BuildArch: ${__BuildArch}"
- echo "__BuildType: ${__BuildType}"
- echo "__TestIntermediateDir: ${__TestIntermediateDir}"
-
- if [[ ! -f "$__TestBinDir" ]]; then
- echo "Creating TestBinDir: ${__TestBinDir}"
- mkdir -p "$__TestBinDir"
- fi
- if [[ ! -f "$__LogsDir" ]]; then
- echo "Creating LogsDir: ${__LogsDir}"
- mkdir -p "$__LogsDir"
- fi
- if [[ ! -f "$__MsbuildDebugLogsDir" ]]; then
- echo "Creating MsbuildDebugLogsDir: ${__MsbuildDebugLogsDir}"
- mkdir -p "$__MsbuildDebugLogsDir"
- fi
-
- # Set up the directory for MSBuild debug logs.
- MSBUILDDEBUGPATH="${__MsbuildDebugLogsDir}"
- export MSBUILDDEBUGPATH
-
- __BuildProperties="-p:TargetOS=${__TargetOS} -p:TargetArchitecture=${__BuildArch} -p:Configuration=${__BuildType}"
-
- # =========================================================================================
- # ===
- # === Restore product binaries from packages
- # ===
- # =========================================================================================
-
- build_MSBuild_projects "Restore_Packages" "${__ProjectDir}/tests/build.proj" "Restore product binaries (build tests)" "/t:BatchRestorePackages"
-
- if [[ -n "$__UpdateInvalidPackagesArg" ]]; then
- __up="/t:UpdateInvalidPackageVersions"
- fi
-
- echo "${__MsgPrefix}Creating test overlay..."
-
- if [[ -z "$xUnitTestBinBase" ]]; then
- xUnitTestBinBase="$__TestWorkingDir"
- fi
-
- CORE_ROOT="$xUnitTestBinBase"/Tests/Core_Root
- export CORE_ROOT
-
- if [[ -d "${CORE_ROOT}" ]]; then
- rm -rf "$CORE_ROOT"
- fi
-
- mkdir -p "$CORE_ROOT"
-
- chmod +x "$__BinDir"/corerun
-
- build_MSBuild_projects "Tests_Overlay_Managed" "${__ProjectDir}/tests/src/runtest.proj" "Creating test overlay" "/t:CreateTestOverlay"
-
- if [[ "$__TargetOS" != "OSX" && "$__SkipStressDependencies" == 0 ]]; then
- nextCommand="\"${__RepoRootDir}/src/coreclr/tests/setup-stress-dependencies.sh\" --arch=$__BuildArch --outputDir=$CORE_ROOT"
- echo "Resolve runtime dependences via $nextCommand"
- eval $nextCommand
-
- local exitCode="$?"
- if [[ "$exitCode" != 0 ]]; then
- echo "${__ErrMsgPrefix}${__MsgPrefix}Error: setup-stress-dependencies failed."
- exit "$exitCode"
- fi
- fi
-
- # Precompile framework assemblies with crossgen if required
- if [[ "$__DoCrossgen" != 0 || "$__DoCrossgen2" != 0 ]]; then
- chmod +x "$__CrossgenExe"
- if [[ "$__SkipCrossgenFramework" == 0 ]]; then
- precompile_coreroot_fx
- fi
- fi
-}
-
-precompile_coreroot_fx()
-{
- local overlayDir="$CORE_ROOT"
- local compilerName=Crossgen
-
- # Read the exclusion file for this platform
- skipCrossGenFiles=($(grep -v '^#' "$(dirname "$0")/tests/skipCrossGenFiles.${__BuildArch}.txt" 2> /dev/null))
- skipCrossGenFiles+=('System.Runtime.WindowsRuntime.dll')
-
- # Temporary output folder for Crossgen2-compiled assemblies
- local outputDir="$overlayDir"/out
-
- # Delete previously crossgened assemblies
- rm "$overlayDir"/*.ni.dll 2>/dev/null
-
- if [[ "$__DoCrossgen2" != 0 ]]; then
- compilerName=Crossgen2
-
- mkdir "$outputDir"
- fi
-
- echo "${__MsgPrefix}Running ${compilerName} on framework assemblies in CORE_ROOT: '${CORE_ROOT}'"
-
- local totalPrecompiled=0
- local failedToPrecompile=0
- local compositeOutputFile=$outputDir/framework-r2r.dll
- local compositeResponseFile=$compositeOutputFile.rsp
- local compositeCommandLine="${__DotNetCli} $__Crossgen2Dll @$compositeResponseFile"
-
- if [[ "$__CompositeBuildMode" != 0 ]]; then
- rm $compositeResponseFile 2>/dev/null
- echo --composite>>$compositeResponseFile
- echo -O>>$compositeResponseFile
- echo --out:$compositeOutputFile>>$compositeResponseFile
- echo --targetarch:${__BuildArch}>>$compositeResponseFile
- fi
-
- declare -a failedAssemblies
-
- filesToPrecompile=$(find -L "$overlayDir" -maxdepth 1 -iname Microsoft.\*.dll -o -iname System.\*.dll -o -iname netstandard.dll -o -iname mscorlib.dll -type f)
- for fileToPrecompile in ${filesToPrecompile}; do
- local filename="$fileToPrecompile"
- if is_skip_crossgen_test "$(basename $filename)"; then
- continue
- fi
-
- if [[ "$__CompositeBuildMode" != 0 ]]; then
- echo $filename>>$compositeResponseFile
- continue
- fi
-
- local commandLine=""
- local responseFile="$overlayDir/$(basename $filename).rsp"
-
- rm $responseFile 2>/dev/null
-
- if [[ "$__DoCrossgen" != 0 ]]; then
- commandLine="$__CrossgenExe @$responseFile"
- echo /Platform_Assemblies_Paths>>$responseFile
- echo $overlayDir>>$responseFile
- echo $filename>>$responseFile
- fi
-
- if [[ "$__DoCrossgen2" != 0 ]]; then
- commandLine="${__DotNetCli} $__Crossgen2Dll @$responseFile"
- echo -O>>$responseFile
- echo --inputbubble>>$responseFile
- echo --out:$outputDir/$(basename $filename)>>$responseFile
- echo --targetarch:${__BuildArch}>>$responseFile
- echo $filename>>$responseFile
- for reference in $overlayDir/*.dll; do
- echo -r:$reference>>$responseFile
- done
- fi
-
- echo Precompiling "$filename"
- $commandLine 1> "$filename".stdout 2> "$filename".stderr
- local exitCode="$?"
- if [[ "$exitCode" != 0 ]]; then
- if grep -q -e '0x80131018' "$filename".stderr; then
- printf "\n\t$filename is not a managed assembly.\n\n"
- else
- echo Unable to precompile "$filename", exit code is "$exitCode".
- echo Command-line: "$commandLine"
- cat "$filename".stdout
- cat "$filename".stderr
- failedAssemblies+=($(basename -- "$filename"))
- failedToPrecompile=$((failedToPrecompile+1))
- fi
- else
- rm "$filename".{stdout,stderr}
- fi
-
- totalPrecompiled=$((totalPrecompiled+1))
- echo "Processed: $totalPrecompiled, failed $failedToPrecompile"
- done
-
- if [[ "$__CompositeBuildMode" != 0 ]]; then
- # Compile the entire framework in composite build mode
- echo "Response file: $compositeResponseFile"
- cat $compositeResponseFile
- echo "Compiling composite R2R framework: $compositeCommandLine"
- $compositeCommandLine
- local exitCode="$?"
- if [[ "$exitCode" != 0 ]]; then
- echo Unable to precompile composite framework, exit code is "$exitCode".
- exit 1
- fi
- fi
-
- if [[ "$__DoCrossgen2" != 0 ]]; then
- # Copy the Crossgen-compiled assemblies back to CORE_ROOT
- mv -f "$outputDir"/* "$overlayDir"/
- rm -r "$outputDir"
- fi
-
- if [[ "$failedToPrecompile" != 0 ]]; then
- echo Failed assemblies:
- for assembly in "${failedAssemblies[@]}"; do
- echo " $assembly"
- done
-
- exit 1
- fi
-}
-
-declare -a skipCrossGenFiles
-
-function is_skip_crossgen_test {
- for skip in "${skipCrossGenFiles[@]}"; do
- if [[ "$1" == "$skip" ]]; then
- return 0
- fi
- done
- return 1
-}
-
-build_Tests()
-{
- echo "${__MsgPrefix}Building Tests..."
-
- __ProjectFilesDir="$__TestDir"
- __TestBinDir="$__TestWorkingDir"
-
- if [[ -f "${__TestWorkingDir}/build_info.json" ]]; then
- rm "${__TestWorkingDir}/build_info.json"
- fi
-
- if [[ "$__RebuildTests" -ne 0 ]]; then
- if [[ -d "$__TestBinDir" ]]; then
- echo "Removing tests build dir: ${__TestBinDir}"
- rm -rf "$__TestBinDir"
- fi
- fi
-
- __CMakeBinDir="$__TestBinDir"
- export __CMakeBinDir
-
- if [[ ! -d "$__TestIntermediatesDir" ]]; then
- mkdir -p "$__TestIntermediatesDir"
- fi
-
- __NativeTestIntermediatesDir="${__TestIntermediatesDir}/Native"
- if [[ ! -d "${__NativeTestIntermediatesDir}" ]]; then
- mkdir -p "${__NativeTestIntermediatesDir}"
- fi
-
- __ManagedTestIntermediatesDir="${__TestIntermediatesDir}/Managed"
- if [[ ! -d "${__ManagedTestIntermediatesDir}" ]]; then
- mkdir -p "${__ManagedTestIntermediatesDir}"
- fi
-
- echo "__TargetOS: ${__TargetOS}"
- echo "__BuildArch: ${__BuildArch}"
- echo "__BuildType: ${__BuildType}"
- echo "__TestIntermediatesDir: ${__TestIntermediatesDir}"
- echo "__NativeTestIntermediatesDir: ${__NativeTestIntermediatesDir}"
- echo "__ManagedTestIntermediatesDir: ${__ManagedTestIntermediatesDir}"
-
- if [[ ! -f "$__TestBinDir" ]]; then
- echo "Creating TestBinDir: ${__TestBinDir}"
- mkdir -p "$__TestBinDir"
- fi
- if [[ ! -f "$__LogsDir" ]]; then
- echo "Creating LogsDir: ${__LogsDir}"
- mkdir -p "$__LogsDir"
- fi
- if [[ ! -f "$__MsbuildDebugLogsDir" ]]; then
- echo "Creating MsbuildDebugLogsDir: ${__MsbuildDebugLogsDir}"
- mkdir -p "$__MsbuildDebugLogsDir"
- fi
-
- # Set up the directory for MSBuild debug logs.
- MSBUILDDEBUGPATH="${__MsbuildDebugLogsDir}"
- export MSBUILDDEBUGPATH
-
- __BuildProperties="-p:TargetOS=${__TargetOS} -p:TargetArchitecture=${__BuildArch} -p:Configuration=${__BuildType}"
-
- # =========================================================================================
- # ===
- # === Restore product binaries from packages
- # ===
- # =========================================================================================
-
- if [[ "${__SkipRestorePackages}" != 1 ]]; then
- build_MSBuild_projects "Restore_Product" "${__ProjectDir}/tests/build.proj" "Restore product binaries (build tests)" "/t:BatchRestorePackages"
-
- if [[ "$?" -ne 0 ]]; then
- echo "${__ErrMsgPrefix}${__MsgPrefix}Error: package restoration failed. Refer to the build log files for details (above)"
- exit 1
- fi
- fi
-
- if [[ "$__SkipNative" != 1 ]]; then
- build_native "$__BuildArch" "$__TestDir" "$__ProjectRoot" "$__NativeTestIntermediatesDir" "CoreCLR test component"
-
- if [[ "$?" -ne 0 ]]; then
- echo "${__ErrMsgPrefix}${__MsgPrefix}Error: native test build failed. Refer to the build log files for details (above)"
- exit 1
- fi
- fi
-
- if [[ "$__SkipManaged" != 1 ]]; then
- echo "Starting the Managed Tests Build..."
-
- build_MSBuild_projects "Tests_Managed" "$__ProjectDir/tests/build.proj" "Managed tests build (build tests)" "$__up"
-
- if [[ "$?" -ne 0 ]]; then
- echo "${__ErrMsgPrefix}${__MsgPrefix}Error: managed test build failed. Refer to the build log files for details (above)"
- exit 1
- else
- echo "Checking the Managed Tests Build..."
-
- build_MSBuild_projects "Check_Test_Build" "${__ProjectDir}/tests/src/runtest.proj" "Check Test Build" "/t:CheckTestBuild"
-
- if [[ "$?" -ne 0 ]]; then
- echo "${__ErrMsgPrefix}${__MsgPrefix}Error: Check Test Build failed."
- exit 1
- fi
- fi
-
- echo "Managed tests build success!"
-
- build_test_wrappers
- fi
-
- if [[ "$__CopyNativeTestBinaries" == 1 ]]; then
- echo "Copying native test binaries to output..."
-
- build_MSBuild_projects "Tests_Managed" "$__ProjectDir/tests/build.proj" "Managed tests build (build tests)" "/t:CopyAllNativeProjectReferenceBinaries"
-
- if [[ "$?" -ne 0 ]]; then
- echo "${__ErrMsgPrefix}${__MsgPrefix}Error: copying native test binaries failed. Refer to the build log files for details (above)"
- exit 1
- fi
- fi
-
- if [[ -n "$__UpdateInvalidPackagesArg" ]]; then
- __up="/t:UpdateInvalidPackageVersions"
- fi
-
- if [[ "$__SkipGenerateLayout" != 1 ]]; then
- generate_layout
- fi
-}
-
-build_MSBuild_projects()
-{
- subDirectoryName="$1"
- shift
- projectName="$1"
- shift
- stepName="$1"
- shift
- extraBuildParameters=("$@")
-
- # Set up directories and file names
- __BuildLogRootName="$subDirectoryName"
- __BuildLog="$__LogsDir/${__BuildLogRootName}.${__TargetOS}.${__BuildArch}.${__BuildType}.log"
- __BuildWrn="$__LogsDir/${__BuildLogRootName}.${__TargetOS}.${__BuildArch}.${__BuildType}.wrn"
- __BuildErr="$__LogsDir/${__BuildLogRootName}.${__TargetOS}.${__BuildArch}.${__BuildType}.err"
-
- if [[ "$subDirectoryName" == "Tests_Managed" ]]; then
- # Execute msbuild managed test build in stages - workaround for excessive data retention in MSBuild ConfigCache
- # See https://github.com/Microsoft/msbuild/issues/2993
-
- # __SkipPackageRestore and __SkipTargetingPackBuild used to control build by tests/src/dirs.proj
- __SkipPackageRestore=false
- __SkipTargetingPackBuild=false
- __NumberOfTestGroups=3
-
- __AppendToLog=false
-
- if [[ -n "$__priority1" ]]; then
- __NumberOfTestGroups=10
- fi
-
- export __SkipPackageRestore __SkipTargetingPackBuild __NumberOfTestGroups
-
- for (( testGroupToBuild=1 ; testGroupToBuild <= __NumberOfTestGroups; testGroupToBuild = testGroupToBuild + 1 ))
- do
- __msbuildLog="\"/flp:Verbosity=normal;LogFile=${__BuildLog};Append=${__AppendToLog}\""
- __msbuildWrn="\"/flp1:WarningsOnly;LogFile=${__BuildWrn};Append=${__AppendToLog}\""
- __msbuildErr="\"/flp2:ErrorsOnly;LogFile=${__BuildErr};Append=${__AppendToLog}\""
-
- __TestGroupToBuild="$testGroupToBuild"
- export __TestGroupToBuild
-
- # Generate build command
- buildArgs=("$projectName")
- buildArgs+=("/p:RestoreDefaultOptimizationDataPackage=false" "/p:PortableBuild=true")
- buildArgs+=("/p:UsePartialNGENOptimization=false" "/maxcpucount")
-
- buildArgs+=("${__msbuildLog}" "${__msbuildWrn}" "${__msbuildErr}")
- buildArgs+=("${extraBuildParameters[@]}")
- buildArgs+=("${__CommonMSBuildArgs}")
- buildArgs+=("${__UnprocessedBuildArgs[@]}")
- buildArgs+=("\"/p:CopyNativeProjectBinaries=${__CopyNativeProjectsAfterCombinedTestBuild}\"");
- buildArgs+=("/p:__SkipPackageRestore=true");
-
- # Disable warnAsError - coreclr issue 19922
- nextCommand="\"$__RepoRootDir/eng/common/msbuild.sh\" $__ArcadeScriptArgs --warnAsError false ${buildArgs[@]}"
- echo "Building step '$stepName' testGroupToBuild=$testGroupToBuild via $nextCommand"
- eval $nextCommand
-
- # Make sure everything is OK
- if [[ "$?" -ne 0 ]]; then
- echo "${__ErrMsgPrefix}${__MsgPrefix}Failed to build $stepName. See the build logs:"
- echo " $__BuildLog"
- echo " $__BuildWrn"
- echo " $__BuildErr"
- exit 1
- fi
-
- __SkipPackageRestore=true
- __SkipTargetingPackBuild=true
- export __SkipPackageRestore __SkipTargetingPackBuild
-
- __AppendToLog=true
- done
- else
- __msbuildLog="\"/flp:Verbosity=normal;LogFile=${__BuildLog}\""
- __msbuildWrn="\"/flp1:WarningsOnly;LogFile=${__BuildWrn}\""
- __msbuildErr="\"/flp2:ErrorsOnly;LogFile=${__BuildErr}\""
-
- # Generate build command
- buildArgs=("$projectName")
- buildArgs+=("/p:RestoreDefaultOptimizationDataPackage=false" "/p:PortableBuild=true")
- buildArgs+=("/p:UsePartialNGENOptimization=false" "/maxcpucount")
-
- buildArgs+=("${__msbuildLog}" "${__msbuildWrn}" "${__msbuildErr}")
- buildArgs+=("${extraBuildParameters[@]}")
- buildArgs+=("${__CommonMSBuildArgs}")
- buildArgs+=("${__UnprocessedBuildArgs[@]}")
-
- # Disable warnAsError - coreclr issue 19922
- nextCommand="\"$__RepoRootDir/eng/common/msbuild.sh\" $__ArcadeScriptArgs --warnAsError false ${buildArgs[@]}"
- echo "Building step '$stepName' via $nextCommand"
- eval $nextCommand
-
- # Make sure everything is OK
- if [[ "$?" -ne 0 ]]; then
- echo "${__ErrMsgPrefix}${__MsgPrefix}Failed to build $stepName. See the build logs:"
- echo " $__BuildLog"
- echo " $__BuildWrn"
- echo " $__BuildErr"
- exit 1
- fi
- fi
-}
-
-usage_list=()
-
-usage_list+=("-skiprestorepackages: skip package restore.")
-usage_list+=("-skipstressdependencies: Don't install stress dependencies.")
-usage_list+=("-skipgeneratelayout: Do not generate the Core_Root layout.")
-usage_list+=("-skiptestwrappers: Don't generate test wrappers.")
-
-usage_list+=("-buildtestwrappersonly: only build the test wrappers.")
-usage_list+=("-copynativeonly: Only copy the native test binaries to the managed output. Do not build the native or managed tests.")
-usage_list+=("-generatelayoutonly: only pull down dependencies and build coreroot.")
-usage_list+=("-crossgenframeworkonly: only compile the framework in CORE_ROOT with Crossgen / Crossgen2.")
-
-usage_list+=("-crossgen: Precompiles the framework managed assemblies in coreroot.")
-usage_list+=("-crossgen2: Precompiles the framework managed assemblies in coreroot using the Crossgen2 compiler.")
-usage_list+=("-priority1: include priority=1 tests in the build.")
-usage_list+=("-allTargets: Build managed tests for all target platforms.")
-
-usage_list+=("-rebuild: if tests have already been built - rebuild them.")
-usage_list+=("-runtests: run tests after building them.")
-usage_list+=("-excludemonofailures: Mark the build as running on Mono runtime so that mono-specific issues are honored.")
-
-# Obtain the location of the bash script to figure out where the root of the repo is.
-__ProjectRoot="$(cd "$(dirname "$0")"; pwd -P)"
-__RepoRootDir="$(cd "$__ProjectRoot"/../..; pwd -P)"
-__BuildArch=
-
-handle_arguments_local() {
- case "$1" in
- buildtestwrappersonly|-buildtestwrappersonly)
- __BuildTestWrappersOnly=1
- ;;
-
- skiptestwrappers|-skiptestwrappers)
- __BuildTestWrappers=0
- ;;
-
- copynativeonly|-copynativeonly)
- __SkipStressDependencies=1
- __SkipNative=1
- __SkipManaged=1
- __CopyNativeTestBinaries=1
- __CopyNativeProjectsAfterCombinedTestBuild=true
- __SkipGenerateLayout=1
- __SkipCrossgenFramework=1
- ;;
-
- crossgenframeworkonly|-crossgenframeworkonly)
- __SkipStressDependencies=1
- __SkipNative=1
- __SkipManaged=1
- __SkipGenerateLayout=1
- ;;
-
- crossgen|-crossgen)
- __DoCrossgen=1
- __TestBuildMode=crossgen
- ;;
-
- crossgen2|-crossgen2)
- __DoCrossgen2=1
- __TestBuildMode=crossgen2
- ;;
-
- composite|-composite)
- __CompositeBuildMode=1
- __DoCrossgen2=1
- __TestBuildMode=crossgen2
- ;;
-
- generatelayoutonly|-generatelayoutonly)
- __GenerateLayoutOnly=1
- ;;
-
- priority1|-priority1)
- __priority1=1
- __UnprocessedBuildArgs+=("/p:CLRTestPriorityToBuild=1")
- ;;
-
- allTargets|-allTargets)
- __UnprocessedBuildArgs+=("/p:CLRTestBuildAllTargets=allTargets")
- ;;
-
- rebuild|-rebuild)
- __RebuildTests=1
- ;;
-
- runtests|-runtests)
- __RunTests=1
- ;;
-
- skiprestorepackages|-skiprestorepackages)
- __SkipRestorePackages=1
- ;;
-
- skipstressdependencies|-skipstressdependencies)
- __SkipStressDependencies=1
- ;;
-
- skipgeneratelayout|-skipgeneratelayout)
- __SkipGenerateLayout=1
- ;;
-
- excludemonofailures|-excludemonofailures)
- __Mono=1
- ;;
-
- mono_aot|-mono_aot)
- __Mono=1
- __MonoAot=1
- ;;
-
- *)
- __UnprocessedBuildArgs+=("$1")
- ;;
- esac
-}
-
-__BuildType=Debug
-__CodeCoverage=
-__IncludeTests=INCLUDE_TESTS
-
-# Set the various build properties here so that CMake and MSBuild can pick them up
-__ProjectDir="$__ProjectRoot"
-export __ProjectDir
-
-__BuildTestWrappers=1
-__BuildTestWrappersOnly=
-__Compiler=clang
-__CompilerMajorVersion=
-__CompilerMinorVersion=
-__CommonMSBuildArgs=
-__ConfigureOnly=0
-__CopyNativeProjectsAfterCombinedTestBuild=true
-__CopyNativeTestBinaries=0
-__CrossBuild=0
-__DistroRid=""
-__DoCrossgen=0
-__DoCrossgen2=0
-__CompositeBuildMode=0
-__DotNetCli="$__RepoRootDir/dotnet.sh"
-__GenerateLayoutOnly=
-__IsMSBuildOnNETCoreSupported=0
-__MSBCleanBuildArgs=
-__NativeTestIntermediatesDir=
-__PortableBuild=1
-__RebuildTests=0
-__RootBinDir="$__RepoRootDir/artifacts"
-__RunTests=0
-__SkipConfigure=0
-__SkipGenerateLayout=0
-__SkipGenerateVersion=0
-__SkipManaged=0
-__SkipNative=0
-__SkipRestore=""
-__SkipRestorePackages=0
-__SkipStressDependencies=0
-__SkipCrossgenFramework=0
-__SourceDir="$__ProjectDir/src"
-__UnprocessedBuildArgs=
-__LocalCoreFXConfig=${__BuildType}
-__UseNinja=0
-__VerboseBuild=0
-__CMakeArgs=""
-__priority1=
-__Mono=0
-__MonoAot=0
-CORE_ROOT=
-
-source "$__ProjectRoot"/_build-commons.sh
-
-if [[ "${__BuildArch}" != "${__HostArch}" ]]; then
- __CrossBuild=1
-fi
-
-# Set dependent variables
-__LogsDir="$__RootBinDir/log"
-__MsbuildDebugLogsDir="$__LogsDir/MsbuildDebugLogs"
-
-# Set the remaining variables based upon the determined build configuration
-__BinDir="$__RootBinDir/bin/coreclr/$__TargetOS.$__BuildArch.$__BuildType"
-__PackagesBinDir="$__BinDir/.nuget"
-__TestDir="${__RepoRootDir}/src/tests"
-__TestWorkingDir="$__RootBinDir/tests/coreclr/$__TargetOS.$__BuildArch.$__BuildType"
-__IntermediatesDir="$__RootBinDir/obj/coreclr/$__TargetOS.$__BuildArch.$__BuildType"
-__TestIntermediatesDir="$__RootBinDir/tests/coreclr/obj/$__TargetOS.$__BuildArch.$__BuildType"
-__CrossComponentBinDir="$__BinDir"
-__CrossCompIntermediatesDir="$__IntermediatesDir/crossgen"
-
-__CrossArch="$__HostArch"
-if [[ "$__CrossBuild" == 1 ]]; then
- __CrossComponentBinDir="$__CrossComponentBinDir/$__CrossArch"
-fi
-__CrossgenCoreLibLog="$__LogsDir/CrossgenCoreLib_$__TargetOS.$BuildArch.$__BuildType.log"
-__CrossgenExe="$__CrossComponentBinDir/crossgen"
-__Crossgen2Dll="$__CrossComponentBinDir/crossgen2/crossgen2.dll"
-
-# CI_SPECIFIC - On CI machines, $HOME may not be set. In such a case, create a subfolder and set the variable to it.
-# This is needed by CLI to function.
-if [[ -z "$HOME" ]]; then
- if [[ ! -d "$__ProjectDir/temp_home" ]]; then
- mkdir temp_home
- fi
-
- HOME="$__ProjectDir"/temp_home
- export HOME
- echo "HOME not defined; setting it to $HOME"
-fi
-
-if [[ (-z "$__GenerateLayoutOnly") && (-z "$__BuildTestWrappersOnly") && ("$__MonoAot" -eq 0) ]]; then
- build_Tests
-elif [[ ! -z "$__BuildTestWrappersOnly" ]]; then
- build_test_wrappers
-elif [[ "$__MonoAot" -eq 1 ]]; then
- build_mono_aot
-else
- generate_layout
-fi
-
-if [[ "$?" -ne 0 ]]; then
- echo "Failed to build tests"
- exit 1
-fi
-
-echo "${__MsgPrefix}Test build successful."
-echo "${__MsgPrefix}Test binaries are available at ${__TestBinDir}"
-
-__testNativeBinDir="$__IntermediatesDir"/tests
-
-if [[ "$__RunTests" -ne 0 ]]; then
-
- echo "Run Tests..."
-
- nextCommand="$__TestDir/runtest.sh --testRootDir=$__TestBinDir --coreClrBinDir=$__BinDir --coreFxBinDir=$CORE_ROOT --testNativeBinDir=$__testNativeBinDir"
- echo "$nextCommand"
- eval $nextCommand
-
- echo "Tests run successful."
-else
- echo "To run all tests use 'tests/runtests.sh' where:"
- echo " testRootDir = $__TestBinDir"
- echo " coreClrBinDir = $__BinDir"
- echo " coreFxBinDir = $CORE_ROOT"
- echo " testNativeBinDir = $__testNativeBinDir"
- echo " -------------------------------------------------- "
- echo " Example runtest.sh command"
- echo ""
- echo " ./tests/runtest.sh --coreOverlayDir=$CORE_ROOT --testNativeBinDir=$__testNativeBinDir --testRootDir=$__TestBinDir --copyNativeTestBin $__BuildType"
- echo " -------------------------------------------------- "
- echo "To run single test use the following command:"
- echo " bash ${__TestBinDir}/__TEST_PATH__/__TEST_NAME__.sh -coreroot=${CORE_ROOT}"
-fi
diff --git a/src/coreclr/clr.featuredefines.props b/src/coreclr/clr.featuredefines.props
index b5979c8d2390..6c4c13243e12 100644
--- a/src/coreclr/clr.featuredefines.props
+++ b/src/coreclr/clr.featuredefines.props
@@ -9,7 +9,6 @@
truetruetrue
- truetrue
@@ -58,7 +57,6 @@
$(DefineConstants);FEATURE_PERFTRACING$(DefineConstants);FEATURE_EVENTSOURCE_XPLAT$(DefineConstants);FEATURE_WIN32_REGISTRY
- $(DefineConstants);FEATURE_DEFAULT_INTERFACES$(DefineConstants);FEATURE_TYPEEQUIVALENCE$(DefineConstants);FEATURE_BASICFREEZE$(DefineConstants);FEATURE_PORTABLE_SHUFFLE_THUNKS
@@ -66,9 +64,5 @@
$(DefineConstants);PROFILING_SUPPORTED$(DefineConstants);FEATURE_PROFAPI_ATTACH_DETACH
-
- $(DefineConstants);TARGET_UNIX
- $(DefineConstants);TARGET_WINDOWS
- $(DefineConstants);TARGET_OSX
diff --git a/src/coreclr/clrdefinitions.cmake b/src/coreclr/clrdefinitions.cmake
index 7be0a6915051..eafe212786d8 100644
--- a/src/coreclr/clrdefinitions.cmake
+++ b/src/coreclr/clrdefinitions.cmake
@@ -16,7 +16,7 @@ if (CLR_CMAKE_TARGET_ARCH_ARM64)
if (CLR_CMAKE_TARGET_UNIX)
add_definitions(-DFEATURE_EMULATE_SINGLESTEP)
endif()
- add_definitions(-DFEATURE_MULTIREG_RETURN)
+ add_compile_definitions($<$>>:FEATURE_MULTIREG_RETURN>)
elseif (CLR_CMAKE_TARGET_ARCH_ARM)
if (CLR_CMAKE_HOST_WIN32 AND NOT DEFINED CLR_CROSS_COMPONENTS_BUILD)
# Set this to ensure we can use Arm SDK for Desktop binary linkage when doing native (Arm32) build
@@ -30,15 +30,15 @@ if (CLR_CMAKE_TARGET_UNIX)
if(CLR_CMAKE_TARGET_OSX)
add_definitions(-D_XOPEN_SOURCE)
- add_definitions(-DFEATURE_DATATARGET4)
endif(CLR_CMAKE_TARGET_OSX)
if (CLR_CMAKE_TARGET_ARCH_AMD64)
- add_definitions(-DUNIX_AMD64_ABI)
+ add_compile_definitions($<$>>:UNIX_AMD64_ABI>)
+ add_compile_definitions($<$>>:FEATURE_MULTIREG_RETURN>)
elseif (CLR_CMAKE_TARGET_ARCH_ARM)
- add_definitions(-DUNIX_ARM_ABI)
+ add_compile_definitions($<$>>:UNIX_ARM_ABI>)
elseif (CLR_CMAKE_TARGET_ARCH_I386)
- add_definitions(-DUNIX_X86_ABI)
+ add_compile_definitions($<$>>:UNIX_X86_ABI>)
endif()
endif(CLR_CMAKE_TARGET_UNIX)
@@ -146,7 +146,7 @@ endif(CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_WIN32)
add_definitions(-DFEATURE_MANAGED_ETW_CHANNELS)
if(FEATURE_MERGE_JIT_AND_ENGINE)
- add_definitions(-DFEATURE_MERGE_JIT_AND_ENGINE)
+ add_compile_definitions($<$>>:FEATURE_MERGE_JIT_AND_ENGINE>)
endif(FEATURE_MERGE_JIT_AND_ENGINE)
add_compile_definitions($<$>>:FEATURE_MULTICOREJIT>)
if(CLR_CMAKE_TARGET_UNIX)
@@ -173,9 +173,9 @@ set(FEATURE_READYTORUN 1)
add_compile_definitions($<$>>:FEATURE_REJIT>)
-if (CLR_CMAKE_HOST_UNIX AND CLR_CMAKE_TARGET_UNIX AND NOT CLR_CMAKE_TARGET_OSX)
+if (CLR_CMAKE_HOST_UNIX AND CLR_CMAKE_TARGET_UNIX)
add_definitions(-DFEATURE_REMOTE_PROC_MEM)
-endif (CLR_CMAKE_HOST_UNIX AND CLR_CMAKE_TARGET_UNIX AND NOT CLR_CMAKE_TARGET_OSX)
+endif (CLR_CMAKE_HOST_UNIX AND CLR_CMAKE_TARGET_UNIX)
if (CLR_CMAKE_TARGET_UNIX OR CLR_CMAKE_TARGET_ARCH_ARM64)
add_definitions(-DFEATURE_STUBS_AS_IL)
@@ -200,12 +200,6 @@ if (CLR_CMAKE_TARGET_ARCH_AMD64)
# Enable the AMD64 Unix struct passing JIT-EE interface for all AMD64 platforms, to enable altjit.
add_definitions(-DUNIX_AMD64_ABI_ITF)
endif (CLR_CMAKE_TARGET_ARCH_AMD64)
-if(CLR_CMAKE_TARGET_UNIX_AMD64)
- add_definitions(-DFEATURE_MULTIREG_RETURN)
-endif (CLR_CMAKE_TARGET_UNIX_AMD64)
-if(CLR_CMAKE_TARGET_UNIX AND CLR_CMAKE_TARGET_ARCH_AMD64)
- add_definitions(-DUNIX_AMD64_ABI)
-endif(CLR_CMAKE_TARGET_UNIX AND CLR_CMAKE_TARGET_ARCH_AMD64)
add_definitions(-DFEATURE_USE_ASM_GC_WRITE_BARRIERS)
if(CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64)
add_definitions(-DFEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP)
@@ -232,5 +226,49 @@ if(CLR_CMAKE_TARGET_OSX)
endif(CLR_CMAKE_TARGET_OSX)
if (NOT CLR_CMAKE_TARGET_ARCH_I386 OR NOT CLR_CMAKE_TARGET_WIN32)
- add_definitions(-DFEATURE_EH_FUNCLETS)
+ add_compile_definitions($<$>>:FEATURE_EH_FUNCLETS>)
endif (NOT CLR_CMAKE_TARGET_ARCH_I386 OR NOT CLR_CMAKE_TARGET_WIN32)
+
+
+# Use this function to enable building with a specific target OS and architecture set of defines
+# This is known to work for the set of defines used by the JIT and gcinfo, it is not likely correct for
+# other components of the runtime
+function(set_target_definitions_to_custom_os_and_arch)
+ set(oneValueArgs TARGET OS ARCH)
+ cmake_parse_arguments(TARGETDETAILS "" "${oneValueArgs}" "" ${ARGN})
+
+ set_target_properties(${TARGETDETAILS_TARGET} PROPERTIES IGNORE_DEFAULT_TARGET_ARCH TRUE)
+ set_target_properties(${TARGETDETAILS_TARGET} PROPERTIES IGNORE_DEFAULT_TARGET_OS TRUE)
+
+ if ((TARGETDETAILS_OS STREQUAL "unix"))
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE TARGET_UNIX)
+ if (TARGETDETAILS_ARCH STREQUAL "x64")
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE UNIX_AMD64_ABI)
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE FEATURE_MULTIREG_RETURN)
+ elseif (TARGETDETAILS_ARCH STREQUAL "arm")
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE UNIX_ARM_ABI)
+ elseif (TARGETDETAILS_ARCH STREQUAL "x86")
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE UNIX_X86_ABI)
+ elseif (TARGETDETAILS_ARCH STREQUAL "arm64")
+ endif()
+ else()
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE TARGET_WINDOWS)
+ endif((TARGETDETAILS_OS STREQUAL "unix"))
+
+ if (TARGETDETAILS_ARCH STREQUAL "x86")
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE TARGET_X86)
+ elseif(TARGETDETAILS_ARCH STREQUAL "x64")
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE TARGET_64BIT)
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE TARGET_AMD64)
+ elseif(TARGETDETAILS_ARCH STREQUAL "arm64")
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE TARGET_64BIT)
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE TARGET_ARM64)
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE FEATURE_MULTIREG_RETURN)
+ elseif(TARGETDETAILS_ARCH STREQUAL "arm")
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE TARGET_ARM)
+ endif()
+
+ if (NOT (TARGETDETAILS_ARCH STREQUAL "x86") OR (TARGETDETAILS_OS STREQUAL "unix"))
+ target_compile_definitions(${TARGETDETAILS_TARGET} PRIVATE FEATURE_EH_FUNCLETS)
+ endif (NOT (TARGETDETAILS_ARCH STREQUAL "x86") OR (TARGETDETAILS_OS STREQUAL "unix"))
+endfunction()
diff --git a/src/coreclr/crosscomponents.cmake b/src/coreclr/crosscomponents.cmake
index 5bb0b5bef5c7..c66531887daa 100644
--- a/src/coreclr/crosscomponents.cmake
+++ b/src/coreclr/crosscomponents.cmake
@@ -1,18 +1,29 @@
add_definitions(-DCROSS_COMPILE)
-if(CLR_CMAKE_HOST_ARCH_AMD64 AND CLR_CMAKE_TARGET_ARCH_ARM)
+if(CLR_CMAKE_HOST_ARCH_AMD64 AND (CLR_CMAKE_TARGET_ARCH_ARM OR CLR_CMAKE_TARGET_ARCH_I386))
set(FEATURE_CROSSBITNESS 1)
-endif(CLR_CMAKE_HOST_ARCH_AMD64 AND CLR_CMAKE_TARGET_ARCH_ARM)
+endif(CLR_CMAKE_HOST_ARCH_AMD64 AND (CLR_CMAKE_TARGET_ARCH_ARM OR CLR_CMAKE_TARGET_ARCH_I386))
if (CLR_CMAKE_HOST_OS STREQUAL CLR_CMAKE_TARGET_OS)
set (CLR_CROSS_COMPONENTS_LIST
- crossgen
clrjit
- jitinterface
+ jitinterface_${ARCH_HOST_NAME}
)
+
+ if(CLR_CMAKE_HOST_LINUX OR NOT FEATURE_CROSSBITNESS)
+ list (APPEND CLR_CROSS_COMPONENTS_LIST
+ crossgen
+ )
+ endif()
+
+ if (CLR_CMAKE_TARGET_UNIX)
+ list (APPEND CLR_CROSS_COMPONENTS_LIST
+ clrjit_unix_${ARCH_TARGET_NAME}_${ARCH_HOST_NAME}
+ )
+ endif(CLR_CMAKE_TARGET_UNIX)
endif()
-if(NOT CLR_CMAKE_HOST_LINUX AND NOT FEATURE_CROSSBITNESS)
+if(NOT CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_OSX AND NOT FEATURE_CROSSBITNESS)
list (APPEND CLR_CROSS_COMPONENTS_LIST
mscordaccore
mscordbi
diff --git a/src/coreclr/crossgen-corelib.cmd b/src/coreclr/crossgen-corelib.cmd
index f47aa1799093..c153745ea91c 100644
--- a/src/coreclr/crossgen-corelib.cmd
+++ b/src/coreclr/crossgen-corelib.cmd
@@ -8,7 +8,7 @@ set "__MsgPrefix=CROSSGEN-CORELIB: "
echo %__MsgPrefix%Starting Build at %TIME%
set __ThisScriptFull="%~f0"
-set __ThisScriptDir="%~dp0"
+set __ThisScriptDir=%~dp0
:: Note that the msbuild project files (specifically, dir.proj) will use the following variables, if set:
:: __BuildArch -- default: x64
@@ -182,7 +182,7 @@ if %__PgoInstrument% EQU 1 (
goto ExitWithError
)
- REM HACK: Workaround for [dotnet/coreclr#13970](https://github.com/dotnet/coreclr/issues/13970)
+ REM HACK: Workaround for [dotnet/runtime#8929](https://github.com/dotnet/runtime/issues/8929)
set __PgoRtPath=
for /f "tokens=*" %%f in ('where pgort*.dll') do (
if not defined __PgoRtPath set "__PgoRtPath=%%~f"
diff --git a/src/coreclr/dir.common.props b/src/coreclr/dir.common.props
index f45eb84e8f27..b4494a50ac17 100644
--- a/src/coreclr/dir.common.props
+++ b/src/coreclr/dir.common.props
@@ -33,17 +33,17 @@
$(RepoRoot)artifacts\obj\coreclr\$(MSBuildProjectName)\$(ProjectDir)src\
- $(ArtifactsDir)bin\coreclr\$(PlatformConfigPathPart)\
+ $(ArtifactsDir)bin\coreclr\$(PlatformConfigPathPart)\
- $(BinDir).nuget\
+ $(RuntimeBinDir).nuget\
- 5.0.0
+ 6.0.0false
@@ -64,11 +64,6 @@
$(__DistroRid)
-
-
- x64
- x86
- x64
diff --git a/src/coreclr/pgosupport.cmake b/src/coreclr/pgosupport.cmake
index 4b1198090171..1e2be5dadb0e 100644
--- a/src/coreclr/pgosupport.cmake
+++ b/src/coreclr/pgosupport.cmake
@@ -1,5 +1,18 @@
-include(CheckIPOSupported)
-check_ipo_supported(RESULT HAVE_LTO)
+include(CheckCXXSourceCompiles)
+include(CheckCXXCompilerFlag)
+
+# VC++ guarantees support for LTCG (LTO's equivalent)
+if(NOT WIN32)
+ # Function required to give CMAKE_REQUIRED_* local scope
+ function(check_have_lto)
+ set(CMAKE_REQUIRED_FLAGS -flto)
+ set(CMAKE_REQUIRED_LIBRARIES -flto -fuse-ld=gold)
+ check_cxx_source_compiles("int main() { return 0; }" HAVE_LTO)
+ endfunction(check_have_lto)
+ check_have_lto()
+
+ check_cxx_compiler_flag(-faligned-new COMPILER_SUPPORTS_F_ALIGNED_NEW)
+endif(NOT WIN32)
# Adds Profile Guided Optimization (PGO) flags to the current target
function(add_pgo TargetName)
@@ -34,16 +47,16 @@ function(add_pgo TargetName)
set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO " /LTCG /USEPROFILE:PGD=\"${ProfilePath}\"")
else(CLR_CMAKE_HOST_WIN32)
if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO)
- if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6)
+ if((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6))
if(HAVE_LTO)
target_compile_options(${TargetName} PRIVATE -flto -fprofile-instr-use=${ProfilePath} -Wno-profile-instr-out-of-date -Wno-profile-instr-unprofiled)
set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -flto -fuse-ld=gold -fprofile-instr-use=${ProfilePath}")
else(HAVE_LTO)
message(WARNING "LTO is not supported, skipping profile guided optimizations")
endif(HAVE_LTO)
- else(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6)
+ else((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6))
message(WARNING "PGO is not supported; Clang 3.6 or later is required for profile guided optimizations")
- endif(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6)
+ endif((CMAKE_CXX_COMPILER_ID MATCHES "Clang") AND (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.6))
endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO)
endif(CLR_CMAKE_HOST_WIN32)
endif(NOT EXISTS ${ProfilePath})
diff --git a/src/coreclr/runtime.proj b/src/coreclr/runtime.proj
index f0da8c09cd0d..fcd408b6cba4 100644
--- a/src/coreclr/runtime.proj
+++ b/src/coreclr/runtime.proj
@@ -11,6 +11,7 @@
<_CoreClrBuildArg Condition="'$(ContinuousIntegrationBuild)' == 'true'" Include="-ci" />
<_CoreClrBuildArg Condition="'$(CrossBuild)' == 'true'" Include="-cross" />
<_CoreClrBuildArg Condition="'$(PortableBuild)' != 'true'" Include="-portablebuild=false" />
+ <_CoreClrBuildArg Condition="'$(KeepNativeSymbols)' != 'false'" Include="-keepnativesymbols" />
<_CoreClrBuildArg Condition="!$([MSBuild]::IsOsPlatform(Windows))" Include="-os $(TargetOS)" />
<_CoreClrBuildArg Condition="$([MSBuild]::IsOsPlatform(Windows)) and
@@ -19,8 +20,13 @@
'$(NoPgoOptimize)' != 'true'"
Include="-enforcepgo" />
<_CoreClrBuildArg Condition="$([MSBuild]::IsOsPlatform(Windows)) and '$(CrossDac)' != ''" Include="-$(CrossDac)dac" />
- <_CoreClrBuildArg Condition="'$(OfficialBuildId)' != ''" Include="/p:OfficialBuildId=$(OfficialBuildId)" />
+ <_CoreClrBuildArg Condition="'$(Ninja)' == 'true'" Include="-ninja" />
+ <_CoreClrBuildArg Condition="'$(ClrRuntimeSubset)' != 'true'" Include="-skipruntime" />
+ <_CoreClrBuildArg Condition="'$(ClrJitSubset)' != 'true'" Include="-skipjit" />
+ <_CoreClrBuildArg Condition="'$(ClrPalTestsSubset)' == 'true'" Include="-paltests" />
+ <_CoreClrBuildArg Condition="'$(ClrAllJitsSubset)' != 'true'" Include="-skipalljits" />
<_CoreClrBuildArg Condition="'$(NoPgoOptimize)' == 'true'" Include="-nopgooptimize" />
+ <_CoreClrBuildArg Condition="'$(OfficialBuildId)' != ''" Include="/p:OfficialBuildId=$(OfficialBuildId)" />
diff --git a/src/coreclr/scripts/.pylintrc b/src/coreclr/scripts/.pylintrc
new file mode 100644
index 000000000000..a4b28930a18f
--- /dev/null
+++ b/src/coreclr/scripts/.pylintrc
@@ -0,0 +1,31 @@
+# Settings for pylint
+
+[MESSAGES CONTROL]
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once). You can also use "--disable=all" to
+# disable everything first and then reenable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use "--disable=all --enable=classes
+# --disable=W".
+disable=invalid-name,
+ no-member,
+ bare-except,
+ missing-module-docstring,
+ broad-except,
+ wildcard-import,
+ unused-wildcard-import,
+ raise-missing-from,
+ import-outside-toplevel,
+ redefined-outer-name
+
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=300
+
+# Maximum number of lines in a module.
+max-module-lines=5000
\ No newline at end of file
diff --git a/src/coreclr/scripts/coreclr_arguments.py b/src/coreclr/scripts/coreclr_arguments.py
index 6806446128c9..441c44790302 100644
--- a/src/coreclr/scripts/coreclr_arguments.py
+++ b/src/coreclr/scripts/coreclr_arguments.py
@@ -15,26 +15,18 @@
################################################################################
import argparse
-import datetime
-import json
import os
import platform
-import shutil
import subprocess
import sys
-import tempfile
-import time
-import re
-import string
-
-import xml.etree.ElementTree
-
-from collections import defaultdict
################################################################################
################################################################################
+
class CoreclrArguments:
+ """ Class to process arguments for CoreCLR specific Python code.
+ """
############################################################################
# ctor
@@ -71,9 +63,9 @@ def __init__(self,
self.require_built_core_root = require_built_core_root
self.require_built_test_dir = require_built_test_dir
- self.valid_arches = ["x64", "x86", "arm", "arm64"]
+ self.valid_arches = ["x64", "x86", "arm", "arm64", "wasm"]
self.valid_build_types = ["Debug", "Checked", "Release"]
- self.valid_host_os = ["Windows_NT", "OSX", "Linux", "illumos", "Solaris"]
+ self.valid_host_os = ["Windows_NT", "OSX", "Linux", "illumos", "Solaris", "Browser", "Android"]
self.__initialize__(args)
@@ -82,9 +74,14 @@ def __init__(self,
############################################################################
def check_build_type(self, build_type):
- if build_type == None:
+ """ Process the `build_type` argument.
+
+ If unset, provide a default. Otherwise, check that it is valid.
+ """
+
+ if build_type is None:
build_type = self.default_build_type
- assert(build_type in self.valid_build_types)
+ assert build_type in self.valid_build_types
return build_type
if len(build_type) > 0:
@@ -146,7 +143,7 @@ def verify(self,
else:
arg_value = args
- if modify_arg != None and not modify_after_validation:
+ if modify_arg is not None and not modify_after_validation:
arg_value = modify_arg(arg_value)
try:
@@ -154,17 +151,17 @@ def verify(self,
except:
pass
- if verified == False and isinstance(failure_str, str):
+ if verified is False and isinstance(failure_str, str):
print(failure_str)
sys.exit(1)
- elif verified == False:
+ elif verified is False:
print(failure_str(arg_value))
sys.exit(1)
- if modify_arg != None and modify_after_validation:
+ if modify_arg is not None and modify_after_validation:
arg_value = modify_arg(arg_value)
- if verified != True and arg_value is None:
+ if verified is not True and arg_value is None:
arg_value = verified
# Add a new member variable based on the verified arg
@@ -176,6 +173,11 @@ def verify(self,
@staticmethod
def provide_default_host_os():
+ """ Return a string representing the current host operating system.
+
+ Returns one of: Linux, OSX, Windows_NT, illumos, Solaris
+ """
+
if sys.platform == "linux" or sys.platform == "linux2":
return "Linux"
elif sys.platform == "darwin":
@@ -191,6 +193,11 @@ def provide_default_host_os():
@staticmethod
def provide_default_arch():
+ """ Return a string representing the current processor architecture.
+
+ Returns one of: x64, x86, arm, armel, arm64.
+ """
+
platform_machine = platform.machine().lower()
if platform_machine == "x86_64" or platform_machine == "amd64":
return "x64"
diff --git a/src/coreclr/scripts/jitrollingbuild.py b/src/coreclr/scripts/jitrollingbuild.py
new file mode 100644
index 000000000000..d947c7a5d2fd
--- /dev/null
+++ b/src/coreclr/scripts/jitrollingbuild.py
@@ -0,0 +1,606 @@
+#!/usr/bin/env python3
+#
+## Licensed to the .NET Foundation under one or more agreements.
+## The .NET Foundation licenses this file to you under the MIT license.
+#
+##
+# Title : jitrollingbuild.py
+#
+# Notes:
+#
+# Script to upload and manage rolling build clrjit and the rolling build storage location
+#
+################################################################################
+################################################################################
+
+import argparse
+import locale
+import os
+import shutil
+import sys
+import tempfile
+import urllib.request
+import zipfile
+import re
+
+from coreclr_arguments import *
+
+locale.setlocale(locale.LC_ALL, '') # Use '' for auto, or force e.g. to 'en_US.UTF-8'
+
+################################################################################
+# Azure Storage information
+################################################################################
+
+az_account_name = "clrjit2"
+az_container_name = "jitrollingbuild"
+az_builds_root_folder = "builds"
+az_blob_storage_account_uri = "https://" + az_account_name + ".blob.core.windows.net/"
+az_blob_storage_container_uri = az_blob_storage_account_uri + az_container_name
+
+################################################################################
+# Argument Parser
+################################################################################
+
+description = """\
+Script to upload and manage rolling build clrjit
+"""
+
+upload_description = """\
+Upload clrjit to SuperPMI Azure storage.
+"""
+
+download_description = """\
+Download clrjit from SuperPMI Azure storage.
+"""
+
+list_description = """\
+List clrjit in SuperPMI Azure storage.
+"""
+
+host_os_help = "OS (Windows_NT, OSX, Linux). Default: current OS."
+
+arch_help = "Architecture (x64, x86, arm, arm64). Default: current architecture."
+
+build_type_help = "Build type (Debug, Checked, Release). Default: Checked."
+
+git_hash_help = "git hash"
+
+target_dir_help = "Directory to put the downloaded JIT."
+
+skip_cleanup_help = "Skip intermediate file removal."
+
+# Start of parser object creation.
+
+parser = argparse.ArgumentParser(description=description)
+
+subparsers = parser.add_subparsers(dest='mode', help="Command to invoke")
+
+# Common parser for git_hash/arch/build_type/host_os arguments
+
+common_parser = argparse.ArgumentParser(add_help=False)
+
+common_parser.add_argument("-arch", help=arch_help)
+common_parser.add_argument("-build_type", default="Checked", help=build_type_help)
+common_parser.add_argument("-host_os", help=host_os_help)
+
+# subparser for upload
+upload_parser = subparsers.add_parser("upload", description=upload_description, parents=[common_parser])
+
+upload_parser.add_argument("-git_hash", required=True, help=git_hash_help)
+upload_parser.add_argument("-az_storage_key", help="Key for the clrjit Azure Storage location. Default: use the value of the CLRJIT_AZ_KEY environment variable.")
+upload_parser.add_argument("--skip_cleanup", action="store_true", help=skip_cleanup_help)
+
+# subparser for download
+download_parser = subparsers.add_parser("download", description=download_description, parents=[common_parser])
+
+download_parser.add_argument("-git_hash", required=True, help=git_hash_help)
+download_parser.add_argument("-target_dir", required=True, help=target_dir_help)
+download_parser.add_argument("--skip_cleanup", action="store_true", help=skip_cleanup_help)
+
+# subparser for list
+list_parser = subparsers.add_parser("list", description=list_description, parents=[common_parser])
+
+list_parser.add_argument("-git_hash", help=git_hash_help)
+list_parser.add_argument("--all", action="store_true", help="Show all JITs, not just those for the specified (or default) git hash, OS, architecture, and flavor")
+
+################################################################################
+# Helper classes
+################################################################################
+
+
+class TempDir:
+ """ Class to create a temporary working directory, or use one that is passed as an argument.
+
+ Use with: "with TempDir() as temp_dir" to change to that directory and then automatically
+ change back to the original working directory afterwards and remove the temporary
+ directory and its contents (if args.skip_cleanup is False).
+ """
+
+ def __init__(self, path=None):
+ self.mydir = tempfile.mkdtemp() if path is None else path
+ self.cwd = None
+
+ def __enter__(self):
+ self.cwd = os.getcwd()
+ os.chdir(self.mydir)
+ return self.mydir
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ os.chdir(self.cwd)
+ # Note: we are using the global `args`, not coreclr_args. This works because
+ # the `skip_cleanup` argument is not processed by CoreclrArguments, but is
+ # just copied there.
+ if not args.skip_cleanup:
+ shutil.rmtree(self.mydir)
+
+
+class ChangeDir:
+ """ Class to temporarily change to a given directory. Use with "with".
+ """
+
+ def __init__(self, mydir):
+ self.mydir = mydir
+ self.cwd = None
+
+ def __enter__(self):
+ self.cwd = os.getcwd()
+ os.chdir(self.mydir)
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ os.chdir(self.cwd)
+
+
+def determine_jit_name(coreclr_args):
+ """ Determine the jit based on the OS. If "-altjit" is specified, then use the specified altjit,
+ or an appropriate altjit based on target.
+
+ Args:
+ coreclr_args (CoreclrArguments): parsed args
+
+ Return:
+ jit_name(str) : name of the jit for this os
+ """
+
+ jit_base_name = "clrjit"
+ if coreclr_args.host_os == "OSX":
+ return "lib" + jit_base_name + ".dylib"
+ elif coreclr_args.host_os == "Linux":
+ return "lib" + jit_base_name + ".so"
+ elif coreclr_args.host_os == "Windows_NT":
+ return jit_base_name + ".dll"
+ else:
+ raise RuntimeError("Unknown OS.")
+
+
+def list_az_jits(filter_func=lambda unused: True):
+ """ List the JITs in Azure Storage using REST api
+
+ Args:
+ filter_func (lambda: string -> bool): filter to apply to the list. The filter takes a URL and returns True if this URL is acceptable.
+
+ Returns:
+ urls (list): set of URLs in Azure Storage that match the filter.
+
+ Notes:
+ This method does not require installing the Azure Storage python package.
+ """
+
+ # This URI will return *all* the blobs, for all git_hash/OS/architecture/build_type combinations.
+ # pass "prefix=foo/bar/..." to only show a subset. Or, we can filter later using string search.
+ list_az_container_uri = az_blob_storage_container_uri + "?restype=container&comp=list&prefix=" + az_builds_root_folder + "/"
+
+ try:
+ contents = urllib.request.urlopen(list_az_container_uri).read().decode('utf-8')
+ except Exception as exception:
+ print("Didn't find any collections using {}".format(list_az_container_uri))
+ print(" Error: {}".format(exception))
+ return None
+
+ # Contents is an XML file with contents like:
+ #
+ # builds/
+ #
+ #
+ # builds/755f01659f03196487ec41225de8956911f8049b/Linux/x64/Checked/libclrjit.so
+ # https://clrjit2.blob.core.windows.net/jitrollingbuild/builds/755f01659f03196487ec41225de8956911f8049b/Linux/x64/Checked/libclrjit.so
+ #
+ # ...
+ #
+ #
+ #
+ # builds/755f01659f03196487ec41225de8956911f8049b/OSX/x64/Checked/libclrjit.dylib
+ # https://clrjit2.blob.core.windows.net/jitrollingbuild/builds/755f01659f03196487ec41225de8956911f8049b/OSX/x64/Checked/libclrjit.dylib
+ #
+ # ...
+ #
+ #
+ # ... etc. ...
+ #
+ #
+ #
+ # We just want to extract the entries. We could probably use an XML parsing package, but we just
+ # use regular expressions.
+
+ urls_split = contents.split("")[1:]
+ urls = []
+ for item in urls_split:
+ url = item.split("")[0].strip()
+ if filter_func(url):
+ urls.append(url)
+
+ return urls
+
+
+def upload_command(coreclr_args):
+ """ Upload the JIT
+
+ Args:
+ coreclr_args (CoreclrArguments): parsed args
+ """
+
+ print("JIT upload")
+
+ def upload_blob(file, blob_name):
+ blob_client = blob_service_client.get_blob_client(container=az_container_name, blob=blob_name)
+
+ # Check if the blob already exists, and delete it if it does, before uploading / replacing it.
+ try:
+ blob_client.get_blob_properties()
+ # If no exception, then the blob already exists. Delete it!
+ print("Warning: replacing existing blob!")
+ blob_client.delete_blob()
+ except Exception:
+ # Blob doesn't exist already; that's good
+ pass
+
+ with open(file, "rb") as data:
+ blob_client.upload_blob(data)
+
+ # 1. Find all the JIT builds in the product directory
+ # 2. Upload them
+ #
+ # We could also upload debug info, but it's not clear it's needed for most purposes, and it is very big:
+ # it increases the upload size from about 190MB to over 900MB for each roll.
+ #
+ # For reference, the JIT debug info is found:
+ # a. For Windows, in the PDB subdirectory, e.g. PDB\clrjit.pdb
+ # b. For Linux .dbg files, and Mac .dwarf files, in the same directory as the jit, e.g., libcoreclr.so.dbg
+
+ # Target directory: /git-hash/OS/architecture/build-flavor/
+ # Note that build-flavor will probably always be Checked.
+
+ files = []
+
+ # First, find the primary JIT that we expect to find.
+ jit_name = determine_jit_name(coreclr_args)
+ jit_path = os.path.join(coreclr_args.product_location, jit_name)
+ if not os.path.isfile(jit_path):
+ print("Error: Couldn't find JIT at {}".format(jit_path))
+ raise RuntimeError("Missing JIT")
+
+ files.append(jit_path)
+
+ # Next, look for any and all cross-compilation JITs. These are named, e.g.:
+ # clrjit_unix_x64_x64.dll
+ # clrjit_win_arm_x64.dll
+ # clrjit_win_arm64_x64.dll
+ # and so on, and live in the same product directory as the primary JIT.
+ #
+ # Note that the expression below explicitly filters out the primary JIT since we added that above.
+ # We handle the primary JIT specially so we can error if it is missing. For the cross-compilation
+ # JITs, we don't bother trying to ensure that all the ones we might expect are actually there.
+ #
+ # We don't do a recursive walk because the JIT is also copied to the "sharedFramework" subdirectory,
+ # so we don't want to pick that up.
+
+ if coreclr_args.host_os == "OSX":
+ allowed_extensions = [ ".dylib" ]
+ # Add .dwarf for debug info
+ elif coreclr_args.host_os == "Linux":
+ allowed_extensions = [ ".so" ]
+ # Add .dbg for debug info
+ elif coreclr_args.host_os == "Windows_NT":
+ allowed_extensions = [ ".dll" ]
+ else:
+ raise RuntimeError("Unknown OS.")
+
+ cross_jit_paths = [os.path.join(coreclr_args.product_location, item)
+ for item in os.listdir(coreclr_args.product_location)
+ if re.match(r'.*clrjit.*', item) and item != jit_name and any(item.endswith(extension) for extension in allowed_extensions)]
+ files += cross_jit_paths
+
+ # On Windows, grab the PDB files from a sub-directory.
+ # if coreclr_args.host_os == "Windows_NT":
+ # pdb_dir = os.path.join(coreclr_args.product_location, "PDB")
+ # if os.path.isdir(pdb_dir):
+ # pdb_paths = [os.path.join(pdb_dir, item) for item in os.listdir(pdb_dir) if re.match(r'.*clrjit.*', item)]
+ # files += pdb_paths
+
+ print("Uploading:")
+ for item in files:
+ print(" {}".format(item))
+
+ try:
+ from azure.storage.blob import BlobServiceClient
+
+ except:
+ print("Please install:")
+ print(" pip install azure-storage-blob")
+ print("See also https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-python")
+ raise RuntimeError("Missing azure storage package.")
+
+ blob_service_client = BlobServiceClient(account_url=az_blob_storage_account_uri, credential=coreclr_args.az_storage_key)
+ blob_folder_name = "{}/{}/{}/{}/{}".format(az_builds_root_folder, coreclr_args.git_hash, coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type)
+
+ total_bytes_uploaded = 0
+
+ # Should we compress the JIT on upload? It would save space, but it makes it slightly more complicated to use
+ # because you can't just "wget" or otherwise download the file and use it immediately -- you need to unzip first.
+ # So for now, don't compress it.
+ compress_jit = False
+
+ with TempDir() as temp_location:
+ for file in files:
+ if compress_jit:
+ # Zip compress the file we will upload
+ zip_name = os.path.basename(file) + ".zip"
+ zip_path = os.path.join(temp_location, zip_name)
+ print("Compress {} -> {}".format(file, zip_path))
+ with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zip_file:
+ zip_file.write(file, os.path.basename(file))
+
+ file_stat_result = os.stat(file)
+ zip_stat_result = os.stat(zip_path)
+ print("Compressed {:n} to {:n} bytes".format(file_stat_result.st_size, zip_stat_result.st_size))
+ total_bytes_uploaded += zip_stat_result.st_size
+
+ blob_name = "{}/{}".format(blob_folder_name, zip_name)
+ print("Uploading: {} ({}) -> {}".format(file, zip_path, az_blob_storage_container_uri + "/" + blob_name))
+ upload_blob(zip_path, blob_name)
+ else:
+ file_stat_result = os.stat(file)
+ total_bytes_uploaded += file_stat_result.st_size
+ file_name = os.path.basename(file)
+ blob_name = "{}/{}".format(blob_folder_name, file_name)
+ print("Uploading: {} -> {}".format(file, az_blob_storage_container_uri + "/" + blob_name))
+ upload_blob(file, blob_name)
+
+ print("Uploaded {:n} bytes".format(total_bytes_uploaded))
+ print("Finished JIT upload")
+
+
+def download_urls(urls, target_dir):
+ """ Download a set of files, specified as URLs, to a target directory.
+ If the URLs are to .ZIP files, then uncompress them and copy all contents
+ to the target directory.
+
+ Args:
+ urls (list): the URLs to download
+ target_dir (str): target directory where files are copied. Directory must exist
+
+ Returns:
+ list of local filenames of downloaded files
+ """
+
+ print("Downloading:")
+ for url in urls:
+ print(" {}".format(url))
+
+ local_files = []
+
+ # In case we'll need a temp directory for ZIP file processing, create it first.
+ with TempDir() as temp_location:
+ for url in urls:
+ item_name = url.split("/")[-1]
+
+ if url.lower().endswith(".zip"):
+ # Delete everything in the temp_location (from previous iterations of this loop, so previous URL downloads).
+ temp_location_items = [os.path.join(temp_location, item) for item in os.listdir(temp_location)]
+ for item in temp_location_items:
+ if os.path.isdir(item):
+ shutil.rmtree(item)
+ else:
+ os.remove(item)
+
+ download_path = os.path.join(temp_location, item_name)
+
+ print("Download: {} -> {}".format(url, download_path))
+ urllib.request.urlretrieve(url, download_path)
+
+ print("Uncompress {}".format(download_path))
+ with zipfile.ZipFile(download_path, "r") as file_handle:
+ file_handle.extractall(temp_location)
+
+ # Copy everything that was extracted to the target directory.
+ items = [ os.path.join(temp_location, item) for item in os.listdir(temp_location) if not item.endswith(".zip") ]
+ for item in items:
+ target_path = os.path.join(target_dir, os.path.basename(item))
+ print("Copy {} -> {}".format(item, target_path))
+ shutil.copy2(item, target_dir)
+ local_files.append(target_path)
+ else:
+ # Not a zip file; download directory to target directory
+ download_path = os.path.join(target_dir, item_name)
+
+ print("Download: {} -> {}".format(url, download_path))
+ urllib.request.urlretrieve(url, download_path)
+
+ local_files.append(download_path)
+
+ return local_files
+
+
+def get_jit_urls(coreclr_args, find_all=False):
+ """ Helper method: collect a list of URLs for all the JIT files to download or list.
+
+ Args:
+ coreclr_args (CoreclrArguments): parsed args
+ find_all (bool): True to show all, or False to filter based on coreclr_args
+ """
+
+ blob_filter_string = "{}/{}/{}/{}".format(coreclr_args.git_hash, coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type)
+ blob_prefix_filter = "{}/{}/{}".format(az_blob_storage_container_uri, az_builds_root_folder, blob_filter_string).lower()
+
+ # Determine if a URL in Azure Storage should be allowed. The URL looks like:
+ # https://clrjit.blob.core.windows.net/jitrollingbuild/builds/git_hash/Linux/x64/Checked/clrjit.dll
+ # Filter to just the current git_hash, OS, architecture, and build_flavor.
+ # If "find_all" is True, then no filtering happens: everything is returned.
+ def filter_jits(url):
+ url = url.lower()
+ return find_all or url.startswith(blob_prefix_filter)
+
+ return list_az_jits(filter_jits)
+
+
+def download_command(coreclr_args):
+ """ Download the JIT
+
+ Args:
+ coreclr_args (CoreclrArguments): parsed args
+ """
+
+ urls = get_jit_urls(coreclr_args, find_all=False)
+ if urls is None:
+ return
+
+ download_urls(urls, coreclr_args.target_dir)
+
+
+def list_command(coreclr_args):
+ """ List the JITs in Azure Storage
+
+ Args:
+ coreclr_args (CoreclrArguments) : parsed args
+ """
+
+ urls = get_jit_urls(coreclr_args, find_all=coreclr_args.all)
+ if urls is None:
+ return
+
+ count = len(urls)
+
+ if coreclr_args.all:
+ print("{} JIT files".format(count))
+ else:
+ blob_filter_string = "{}/{}/{}/{}".format(coreclr_args.git_hash, coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type)
+ print("{} JIT files for {}".format(count, blob_filter_string))
+ print("")
+
+ for url in urls:
+ print("{}".format(url))
+
+ print("")
+
+
+def setup_args(args):
+ """ Setup the args for SuperPMI to use.
+
+ Args:
+ args (ArgParse): args parsed by arg parser
+
+ Returns:
+ args (CoreclrArguments)
+
+ """
+ coreclr_args = CoreclrArguments(args, require_built_core_root=False, require_built_product_dir=False, require_built_test_dir=False, default_build_type="Checked")
+
+ coreclr_args.verify(args,
+ "mode", # "mode" is from the `parser.add_subparsers(dest='mode')` call
+ lambda unused: True,
+ "Unable to set mode")
+
+ if coreclr_args.mode == "upload":
+
+ coreclr_args.verify(args,
+ "git_hash",
+ lambda unused: True,
+ "Unable to set git_hash")
+
+ coreclr_args.verify(args,
+ "az_storage_key",
+ lambda item: item is not None,
+ "Specify az_storage_key or set environment variable CLRJIT_AZ_KEY to the key to use.",
+ modify_arg=lambda arg: os.environ["CLRJIT_AZ_KEY"] if arg is None and "CLRJIT_AZ_KEY" in os.environ else arg)
+
+ coreclr_args.verify(args,
+ "skip_cleanup",
+ lambda unused: True,
+ "Unable to set skip_cleanup")
+
+ if not os.path.isdir(coreclr_args.product_location):
+ print("Built product location could not be determined")
+ raise RuntimeError("Error")
+
+ elif coreclr_args.mode == "download":
+
+ coreclr_args.verify(args,
+ "git_hash",
+ lambda unused: True,
+ "Unable to set git_hash")
+
+ coreclr_args.verify(args,
+ "target_dir",
+ lambda unused: True,
+ "Unable to set target_dir")
+
+ coreclr_args.verify(args,
+ "skip_cleanup",
+ lambda unused: True,
+ "Unable to set skip_cleanup")
+
+ if not os.path.isdir(coreclr_args.target_dir):
+ print("--target_dir directory does not exist")
+ raise RuntimeError("Error")
+
+ elif coreclr_args.mode == "list":
+
+ coreclr_args.verify(args,
+ "git_hash",
+ lambda unused: True,
+ "Unable to set git_hash")
+
+ coreclr_args.verify(args,
+ "all",
+ lambda unused: True,
+ "Unable to set all")
+
+ return coreclr_args
+
+################################################################################
+# main
+################################################################################
+
+
+def main(args):
+ """ Main method
+ """
+
+ if sys.version_info.major < 3:
+ print("Please install python 3 or greater")
+ return 1
+
+ coreclr_args = setup_args(args)
+ success = True
+
+ if coreclr_args.mode == "upload":
+ upload_command(coreclr_args)
+
+ elif coreclr_args.mode == "download":
+ download_command(coreclr_args)
+
+ elif coreclr_args.mode == "list":
+ list_command(coreclr_args)
+
+ else:
+ raise NotImplementedError(coreclr_args.mode)
+
+ return 0 if success else 1
+
+################################################################################
+# __main__
+################################################################################
+
+
+if __name__ == "__main__":
+ args = parser.parse_args()
+ sys.exit(main(args))
diff --git a/src/coreclr/scripts/setup.cfg b/src/coreclr/scripts/setup.cfg
new file mode 100644
index 000000000000..ac255d84052e
--- /dev/null
+++ b/src/coreclr/scripts/setup.cfg
@@ -0,0 +1,10 @@
+# Configuration options for pycodestyle
+
+[pycodestyle]
+count = False
+# E722: do not use bare 'except'
+# E127: continuation line over-indented for visual indent
+# W503: line break before binary operator
+ignore = E127,E201,E202,E266,E501,E722,W503
+max-line-length = 160
+statistics = False
diff --git a/src/coreclr/scripts/superpmi-setup.py b/src/coreclr/scripts/superpmi-setup.py
new file mode 100644
index 000000000000..48e72d5de774
--- /dev/null
+++ b/src/coreclr/scripts/superpmi-setup.py
@@ -0,0 +1,408 @@
+#!/usr/bin/env python3
+#
+## Licensed to the .NET Foundation under one or more agreements.
+## The .NET Foundation licenses this file to you under the MIT license.
+#
+##
+# Title : superpmi-setup.py
+#
+# Notes:
+#
+# Script to setup directory structure required to perform SuperPMI collection in CI.
+# It does the following steps:
+# 1. It creates `correlation_payload_directory` that contains files from CORE_ROOT, src\coreclr\scripts.
+# This directory is the one that is sent to all the helix machines that performs SPMI collection.
+# 2. It clones dotnet/jitutils, builds it and then copies the `pmi.dll` to `correlation_payload_directory` folder.
+# This file is needed to do pmi SPMI runs.
+# 3. The script takes `input_artifacts` parameter which contains managed .dlls and .exes on
+# which SPMI needs to be run. This script will partition these folders into equal buckets of approximately `max_size`
+# bytes and stores them under `payload` directory. Each sub-folder inside `payload` directory is sent to individual
+# helix machine to do SPMI collection on. E.g. for `input_artifacts` to be run on libraries, the parameter would be path to
+# `CORE_ROOT` folder and this script will copy `max_size` bytes of those files under `payload/libraries/0/binaries`,
+# `payload/libraries/1/binaries` and so forth.
+# 4. Lastly, it sets the pipeline variables.
+
+# Below are the helix queues it sets depending on the OS/architecture:
+# | Arch | Windows_NT | Linux |
+# |-------|------------------|--------------------------------------------------------------------------------------------------------------------------------------|
+# | x86 | Windows.10.Amd64 | - |
+# | x64 | Windows.10.Amd64 | Ubuntu.1804.Amd64 |
+# | arm | - | (Ubuntu.1804.Arm32)Ubuntu.1804.Armarch@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm32v7-bfcd90a-20200121150440 |
+# | arm64 | Windows.10.Arm64 | (Ubuntu.1804.Arm64)Ubuntu.1804.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm64v8-a45aeeb-20190620155855 |
+################################################################################
+################################################################################
+
+
+import argparse
+import shutil
+import subprocess
+import tempfile
+
+from os import listdir, path, walk
+from os.path import isfile, join, getsize
+from coreclr_arguments import *
+
+# Start of parser object creation.
+
+parser = argparse.ArgumentParser(description="description")
+
+parser.add_argument("-source_directory", help="path to source directory")
+parser.add_argument("-core_root_directory", help="path to core_root directory")
+parser.add_argument("-arch", help="Architecture")
+parser.add_argument("-mch_file_tag", help="Tag to be used to mch files")
+parser.add_argument("-collection_name", help="Name of the SPMI collection to be done")
+parser.add_argument("-input_directory", help="directory containing assemblies for which superpmi collection to "
+ "be done")
+parser.add_argument("-max_size", help="Max size of each partition in MB")
+is_windows = platform.system() == "Windows"
+native_binaries_to_ignore = [
+ "clrcompression.dll",
+ "clretwrc.dll",
+ "clrgc.dll",
+ "clrjit.dll",
+ "clrjit_unix_arm_x64.dll",
+ "clrjit_unix_arm64_x64.dll",
+ "clrjit_unix_x64_x64.dll",
+ "clrjit_win_arm_x64.dll",
+ "clrjit_win_arm64_x64.dll",
+ "clrjit_win_x64_x64.dll",
+ "clrjit_win_x86_x64.dll",
+ "coreclr.dll",
+ "CoreConsole.exe",
+ "coredistools.dll",
+ "CoreRun.exe",
+ "CoreShim.dll",
+ "createdump.exe",
+ "crossgen.exe",
+ "dbgshim.dll",
+ "ilasm.exe",
+ "ildasm.exe",
+ "jitinterface_x64.dll",
+ "linuxnonjit.dll",
+ "mcs.exe",
+ "mscordaccore.dll",
+ "mscordbi.dll",
+ "mscorrc.dll",
+ "protononjit.dll",
+ "superpmi.exe",
+ "superpmi-shim-collector.dll",
+ "superpmi-shim-counter.dll",
+ "superpmi-shim-simple.dll",
+]
+
+
+def setup_args(args):
+ """ Setup the args for SuperPMI to use.
+
+ Args:
+ args (ArgParse): args parsed by arg parser
+
+ Returns:
+ args (CoreclrArguments)
+
+ """
+ coreclr_args = CoreclrArguments(args, require_built_core_root=False, require_built_product_dir=False,
+ require_built_test_dir=False, default_build_type="Checked")
+
+ coreclr_args.verify(args,
+ "source_directory",
+ lambda source_directory: os.path.isdir(source_directory),
+ "source_directory doesn't exist")
+
+ coreclr_args.verify(args,
+ "core_root_directory",
+ lambda core_root_directory: os.path.isdir(core_root_directory),
+ "core_root_directory doesn't exist")
+
+ coreclr_args.verify(args,
+ "arch",
+ lambda unused: True,
+ "Unable to set arch")
+
+ coreclr_args.verify(args,
+ "mch_file_tag",
+ lambda unused: True,
+ "Unable to set mch_file_tag")
+
+ coreclr_args.verify(args,
+ "collection_name",
+ lambda unused: True,
+ "Unable to set collection_name")
+
+ coreclr_args.verify(args,
+ "input_directory",
+ lambda input_directory: os.path.isdir(input_directory),
+ "input_directory doesn't exist")
+
+ coreclr_args.verify(args,
+ "max_size",
+ lambda max_size: max_size > 0,
+ "Please enter valid positive numeric max_size",
+ modify_arg=lambda max_size: int(
+ max_size) * 1000 * 1000 if max_size is not None and max_size.isnumeric() else 0
+ # Convert to MB
+ )
+ return coreclr_args
+
+
+def get_files_sorted_by_size(src_directory, exclude_directories, exclude_files):
+ """ For a given src_directory, returns all the .dll files sorted by size.
+
+ Args:
+ src_directory (string): Path of directory to enumerate.
+ exclude_directories ([string]): Directory names to exclude.
+ exclude_files ([string]): File names to exclude.
+ """
+
+ def sorter_by_size(pair):
+ """ Sorts the pair (file_name, file_size) tuple in descending order of file_size
+
+ Args:
+ pair ([(string, int)]): List of tuple of file_name, file_size
+ """
+ pair.sort(key=lambda x: x[1], reverse=True)
+ return pair
+
+ filename_with_size = []
+
+ for file_path, dirs, files in walk(src_directory, topdown=True):
+ # Credit: https://stackoverflow.com/a/19859907
+ dirs[:] = [d for d in dirs if d not in exclude_directories]
+ for name in files:
+ if name in exclude_files:
+ continue
+ curr_file_path = path.join(file_path, name)
+
+ if not isfile(curr_file_path):
+ continue
+ if not name.endswith(".dll") and not name.endswith(".exe"):
+ continue
+
+ size = getsize(curr_file_path)
+ filename_with_size.append((curr_file_path, size))
+
+ return sorter_by_size(filename_with_size)
+
+
+def first_fit(sorted_by_size, max_size):
+ """ Given a list of file names along with size in descending order, divides the files
+ in number of buckets such that each bucket doesn't exceed max_size. Since this is a first-fit
+ approach, it doesn't guarantee to find the bucket with tighest spot available.
+
+ Args:
+ sorted_by_size ((string, int)): (file_name, file_size) tuple
+ max_size (int): Maximum size (in bytes) of each bucket.
+
+ Returns:
+ [{int, [string]}]: Returns a dictionary of partition-index to list of file names following in that bucket.
+ """
+ partitions = {}
+ for curr_file in sorted_by_size:
+ _, file_size = curr_file
+
+ # Find the right bucket
+ found_bucket = False
+
+ if file_size < max_size:
+ for p_index in partitions:
+ total_in_curr_par = sum(n for _, n in partitions[p_index])
+ if (total_in_curr_par + file_size) < max_size:
+ partitions[p_index].append(curr_file)
+ found_bucket = True
+ break
+
+ if not found_bucket:
+ partitions[len(partitions)] = [curr_file]
+
+ total_size = 0
+ for p_index in partitions:
+ partition_size = sum(n for _, n in partitions[p_index])
+ print("Partition {0}: {1} bytes.".format(p_index, partition_size))
+ total_size += partition_size
+ print("Total {0} partitions with {1} bytes.".format(str(len(partitions)), total_size))
+
+ return partitions
+
+
+def run_command(command_to_run, _cwd=None):
+ """ Runs the command.
+
+ Args:
+ command_to_run ([string]): Command to run along with arguments.
+ _cmd (string): Current working directory.
+ """
+ print("Running: " + " ".join(command_to_run))
+ with subprocess.Popen(command_to_run, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=_cwd) as proc:
+ stdout, stderr = proc.communicate()
+ if len(stdout) > 0:
+ print(stdout.decode("utf-8"))
+ if len(stderr) > 0:
+ print(stderr.decode("utf-8"))
+
+
+def copy_directory(src_path, dst_path):
+ """Copies directory in 'src_path' to 'dst_path' maintaining the directory
+ structure. https://docs.python.org/3.5/library/shutil.html#shutil.copytree can't
+ be used in this case because it expects the destination directory should not
+ exist, however we do call copy_directory() to copy files to same destination directory.
+
+ It only copied *.dll, *.exe and *.py files.
+
+ Args:
+ src_path (string): Path of source directory that need to be copied.
+ dst_path (string): Path where directory should be copied.
+ """
+ if not os.path.exists(dst_path):
+ os.makedirs(dst_path)
+ for item in os.listdir(src_path):
+ src_item = os.path.join(src_path, item)
+ dst_item = os.path.join(dst_path, item)
+ if os.path.isdir(src_item):
+ copy_directory(src_item, dst_item)
+ else:
+ should_copy_file = dst_item.endswith('.dll') or dst_item.endswith('.py')
+ if is_windows:
+ should_copy_file = should_copy_file or dst_item.endswith('.exe')
+ else:
+ should_copy_file = should_copy_file or dst_item.endswith('.so') or item.find(".") == -1
+ if not should_copy_file:
+ continue
+ shutil.copy2(src_item, dst_item)
+
+
+def copy_files(src_path, dst_path, file_names):
+ """Copy files from 'file_names' list from 'src_path' to 'dst_path'.
+ It retains the original directory structure of src_path.
+
+ Args:
+ src_path (string): Source directory from where files are copied.
+ dst_path (string): Destination directory where files to be copied.
+ file_names ([string]): List of full path file names to be copied.
+ """
+
+ print('### Copying below files to {0}:'.format(dst_path))
+ print('')
+ print(file_names)
+ for f in file_names:
+ # Create same structure in dst so we don't clobber same files names present in different directories
+ dst_path_of_file = f.replace(src_path, dst_path)
+
+ dst_directory = path.dirname(dst_path_of_file)
+ if not os.path.exists(dst_directory):
+ os.makedirs(dst_directory)
+ shutil.copy2(f, dst_path_of_file)
+
+
+def partition_files(src_directory, dst_directory, max_size, exclude_directories=[], exclude_files=native_binaries_to_ignore):
+ """ Copy bucketized files based on size to destination folder.
+
+ Args:
+ src_directory (string): Source folder containing files to be copied.
+ dst_directory (string): Destination folder where files should be copied.
+ max_size (int): Maximum partition size in bytes
+ exclude_directories ([string]): List of folder names to be excluded.
+ exclude_files ([string]): List of files names to be excluded.
+ """
+
+ sorted_by_size = get_files_sorted_by_size(src_directory, exclude_directories, exclude_files)
+ partitions = first_fit(sorted_by_size, max_size)
+
+ index = 0
+ for p_index in partitions:
+ file_names = [curr_file[0] for curr_file in partitions[p_index]]
+ curr_dst_path = path.join(dst_directory, str(index), "binaries")
+ copy_files(src_directory, curr_dst_path, file_names)
+ index += 1
+
+
+def set_pipeline_variable(name, value):
+ """ This method sets pipeline variable.
+
+ Args:
+ name (string): Name of the variable.
+ value (string): Value of the variable.
+ """
+ define_variable_format = "##vso[task.setvariable variable={0}]{1}"
+ print("{0} -> {1}".format(name, value)) # logging
+ print(define_variable_format.format(name, value)) # set variable
+
+
+def main(main_args):
+ """ Main entrypoint
+
+ Args:
+ main_args ([type]): Arguments to the script
+ """
+ coreclr_args = setup_args(main_args)
+ source_directory = coreclr_args.source_directory
+
+ # CorrelationPayload directories
+ correlation_payload_directory = path.join(coreclr_args.source_directory, "payload")
+ superpmi_src_directory = path.join(source_directory, 'src', 'coreclr', 'scripts')
+ superpmi_dst_directory = path.join(correlation_payload_directory, "superpmi")
+ arch = coreclr_args.arch
+ helix_source_prefix = "official"
+ creator = ""
+ ci = True
+ if is_windows:
+ helix_queue = "Windows.10.Arm64" if arch == "arm64" else "Windows.10.Amd64"
+ else:
+ if arch == "arm":
+ helix_queue = "(Ubuntu.1804.Arm32)Ubuntu.1804.Armarch@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm32v7-bfcd90a-20200121150440"
+ elif arch == "arm64":
+ helix_queue = "(Ubuntu.1804.Arm64)Ubuntu.1804.ArmArch@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-helix-arm64v8-a45aeeb-20190620155855"
+ else:
+ helix_queue = "Ubuntu.1804.Amd64"
+
+ # create superpmi directory
+ print('Copying {} -> {}'.format(superpmi_src_directory, superpmi_dst_directory))
+ copy_directory(superpmi_src_directory, superpmi_dst_directory)
+ print('Copying {} -> {}'.format(coreclr_args.core_root_directory, superpmi_dst_directory))
+ copy_directory(coreclr_args.core_root_directory, superpmi_dst_directory)
+
+ # Clone and build jitutils
+ try:
+ with tempfile.TemporaryDirectory() as jitutils_directory:
+ run_command(
+ ["git", "clone", "--quiet", "--depth", "1", "https://github.com/dotnet/jitutils", jitutils_directory])
+ # Set dotnet path to run bootstrap
+ os.environ["PATH"] = path.join(source_directory, ".dotnet") + os.pathsep + os.environ["PATH"]
+ bootstrap_file = "bootstrap.cmd" if is_windows else "bootstrap.sh"
+ run_command([path.join(jitutils_directory, bootstrap_file)], jitutils_directory)
+
+ copy_files(path.join(jitutils_directory, "bin"), superpmi_dst_directory, [path.join(jitutils_directory, "bin", "pmi.dll")])
+ except PermissionError as pe_error:
+ # Details: https://bugs.python.org/issue26660
+ print('Ignoring PermissionError: {0}'.format(pe_error))
+
+ # Workitem directories
+ workitem_directory = path.join(source_directory, "workitem")
+ pmiassemblies_directory = path.join(workitem_directory, "pmiAssembliesDirectory")
+
+ # payload
+ input_artifacts = path.join(pmiassemblies_directory, coreclr_args.collection_name)
+ partition_files(coreclr_args.input_directory, input_artifacts, coreclr_args.max_size)
+
+ # Set variables
+ print('Setting pipeline variables:')
+ set_pipeline_variable("CorrelationPayloadDirectory", correlation_payload_directory)
+ set_pipeline_variable("WorkItemDirectory", workitem_directory)
+ set_pipeline_variable("InputArtifacts", input_artifacts)
+ if is_windows:
+ set_pipeline_variable("Python", "py -3")
+ else:
+ set_pipeline_variable("Python", "python3")
+ set_pipeline_variable("Architecture", arch)
+ set_pipeline_variable("Creator", creator)
+ set_pipeline_variable("Queue", helix_queue)
+ set_pipeline_variable("HelixSourcePrefix", helix_source_prefix)
+ set_pipeline_variable("MchFileTag", coreclr_args.mch_file_tag)
+
+
+################################################################################
+# __main__
+################################################################################
+
+if __name__ == "__main__":
+ args = parser.parse_args()
+ sys.exit(main(args))
diff --git a/src/coreclr/scripts/superpmi.md b/src/coreclr/scripts/superpmi.md
index 397df71099a6..a72ee2f06a95 100644
--- a/src/coreclr/scripts/superpmi.md
+++ b/src/coreclr/scripts/superpmi.md
@@ -1,34 +1,40 @@
-# An overview of using superpmi.py
+# Documentation for the superpmi.py tool
+SuperPMI is a tool for developing and testing the JIT compiler.
General information on SuperPMI can be found [here](../src/ToolBox/superpmi/readme.md)
## Overview
-Although SuperPMI has many uses, setup and use of SuperPMI is not always trivial.
-superpmi.py is a tool to help automate the use of SuperPMI, augmenting its usefulness.
+superpmi.py is a tool to simplify the use of SuperPMI.
The tool has three primary modes: collect, replay, and asmdiffs.
Below you will find more specific information on each of the different modes.
+superpmi.py lives in the dotnet/runtime GitHub repo, src\coreclr\scripts directory.
+
## General usage
From the usage message:
```
-usage: superpmi.py [-h] {collect,replay,asmdiffs,upload,list-collections} ...
+usage: superpmi.py [-h]
+ {collect,replay,asmdiffs,upload,download,list-collections}
+ ...
Script to run SuperPMI replay, ASM diffs, and collections. The script also
-manages the Azure store of precreated SuperPMI collection files. Help for each
-individual command can be shown by asking for help on the individual command,
-for example `superpmi.py collect --help`.
+manages the Azure store of pre-created SuperPMI collection files. Help for
+each individual command can be shown by asking for help on the individual
+command, for example `superpmi.py collect --help`.
positional arguments:
- {collect,replay,asmdiffs,upload,list-collections}
+ {collect,replay,asmdiffs,upload,download,list-collections}
Command to invoke
optional arguments:
-h, --help show this help message and exit
```
+## Replay
+
The simplest usage is to replay using:
```
@@ -41,92 +47,74 @@ In this case, everything needed is found using defaults:
- The build type is assumed to be Checked.
- Core_Root is found by assuming superpmi.py is in the normal location in the
clone of the repo, and using the processor architecture, build type, and current
-OS, to find it.
+OS, to find it in the default `artifacts` directory location. Note that you must
+have performed a product build for this platform / build type combination, and
+created the appropriate Core_Root directory as well.
- The SuperPMI tool and JIT to use for replay is found in Core_Root.
-- The collection to use for replay is the default that is found in the
-precomputed collections that are stored in Azure.
+- The SuperPMI collections to use for replay are found in the Azure store of
+precomputed collections for this JIT-EE interface GUID, OS, and processor architecture.
-If you want to use a specific MCH file collection, use:
+If you want to use a specific MCH file collection, use the `-mch_files` argument to specify
+one or more MCH files on your machine:
```
-python f:\gh\runtime\src\coreclr\scripts\superpmi.py replay -mch_file f:\spmi\collections\tests.pmi.Windows_NT.x64.Release.mch
+python f:\gh\runtime\src\coreclr\scripts\superpmi.py replay -mch_files f:\spmi\collections\tests.pmi.Windows_NT.x64.Release.mch
```
-To generate ASM diffs, use the `asmdiffs` command. In this case, you must specify
-the path to a baseline JIT compiler, e.g.:
+The `-mch_files` argument takes a list of one or more directories or files to use. For
+each directory, all the MCH files in that directory are used.
+
+If you want to use just a subset of the collections, either default collections or collections
+specified by `-mch_files`, use the `-filter` argument to restrict the MCH files used, e.g.:
```
-python f:\gh\runtime\src\coreclr\scripts\superpmi.py asmdiffs f:\jits\baseline_clrjit.dll
+python f:\gh\runtime\src\coreclr\scripts\superpmi.py replay -filter tests
```
-ASM diffs requires the coredistools library. The script attempts to either find
-or download an appropriate version that can be used.
+## ASM diffs
-## Collections
+To generate ASM diffs, use the `asmdiffs` command. In this case, you must specify
+the path to a baseline JIT compiler using the `-base_jit_path` argument, e.g.:
-SuperPMI requires a collection to enable replay. You can do a collection
-yourself, but it is more convenient to use existing precomputed collections.
-Superpmi.py can automatically download existing collections
+```
+python f:\gh\runtime\src\coreclr\scripts\superpmi.py asmdiffs -base_jit_path f:\jits\baseline_clrjit.dll
+```
-Note that SuperPMI collections are sensitive to JIT/EE interface changes. If
-there has been an interface change, the new JIT will not load and SuperPMI
-will fail.
+ASM diffs requires the coredistools library. The script attempts to find
+or download an appropriate version that can be used.
-**At the time of writing, collections are done manually. See below for a
-full list of supported platforms and where the .mch collection exists.**
+As for the "replay" case, the set of collections used defaults to the set available
+in Azure, or can be specified using the `mch_files` argument. In either case, the
+`-filter` argument can restrict the set used.
-## Supported Platforms
+## Collections
-| OS | Arch | Replay | AsmDiffs | MCH location |
-| --- | --- | --- | --- | --- |
-| OSX | x64 |
- [x]
|
- [x]
| |
-| Windows | x64 |
- [x]
|
- [x]
| |
-| Windows | x86 |
- [x]
|
- [x]
| |
-| Windows | arm |
- [ ]
|
- [ ]
| N/A |
-| Windows | arm64 |
- [ ]
|
- [ ]
| N/A |
-| Ubuntu | x64 |
- [x]
|
- [x]
| |
-| Ubuntu | arm32 |
- [ ]
|
- [ ]
| N/A |
-| Ubuntu | arm64 |
- [ ]
|
- [ ]
| N/A |
+SuperPMI requires a collection to enable replay. You can do a collection
+yourself using the superpmi.py `collect` command, but it is more convenient
+to use existing precomputed collections stored in Azure.
-## Default Collections
+You can see which collections are available for your current settings using
+the `list-collections` command. You can also see all the available collections
+using the `list-collections --all` command. Finally, you can see which Azure stored
+collections have been locally cached on your machine in the default cache location
+by using `list-collections --local`.
-See the table above for locations of default collections that exist. If there
-is an MCH file that exists, then SuperPMI will automatically download and
-use the MCH from that location. Please note that it is possible that the
-collection is out of date, or there is a jitinterface change which makes the
-collection invalid. If this is the case, then in order to use the tool a
-collection will have to be done manually. In order to reproduce the default
-collections, please see below for what command the default collections are
-done with.
+(Note that when collections are downloaded, they are cached locally. If there are
+any cached collections, then no download attempt is made. To force re-download,
+use the `--force_download` argument to the `replay`, `asmdiffs`, or `download` command.)
-## Collect
+### Creating a collection
-Example commands to create a collection:
+Example commands to create a collection (on Linux, by running the tests):
```
-/Users/jashoo/runtime/src/coreclr/build.sh x64 checked
-/Users/jashoo/runtime/src/coreclr/build-test.sh x64 checked -priority1
+# First, build the product, possibly the tests, and create a Core_Root directory.
/Users/jashoo/runtime/src/coreclr/scripts/superpmi.py collect bash "/Users/jashoo/runtime/src/coreclr/tests/runtest.sh x64 checked"
```
-Given a specific command, collect over all of the managed code called by the
+The above command collects over all of the managed code called by the
child process. Note that this allows many different invocations of any
-managed code. Although it does specifically require that any managed code run
-by the child process to handle the COMPlus variables set by SuperPMI and
-defer them to the latter. These are below:
-
-```
-SuperPMIShimLogPath=
-SuperPMIShimPath=
-COMPlus_AltJit=*
-COMPlus_AltJitName=superpmi-shim-collector.dll
-```
-
-If these variables are set and a managed exe is run, using for example the
-dotnet CLI, the altjit settings will crash the process.
-
-To avoid this, the easiest way is to unset the variables in the beginning to
-the root process, and then set them right before calling `$CORE_ROOT/corerun`.
+managed code.
You can also collect using PMI instead of running code. Do with with the `--pmi` and `-pmi_assemblies`
arguments. E.g.:
@@ -136,37 +124,15 @@ python f:\gh\runtime\src\coreclr\scripts\superpmi.py collect --pmi -pmi_assembli
```
Note that collection generates gigabytes of data. Most of this data will
-be removed when the collection is finished. That being said, it is worth
-mentioning that this process will use 3x the size of the unclean MCH file,
-which to give an example of the size, a collection of the coreclr
-`priority=1` tests uses roughly `200gb` of disk space. Most of this space
-will be used in a temp directory, which on Windows will default to
-`C:\Users\blah\AppData\Temp\...`. It is recommended to set the temp variable
-to a different location before running collect to avoid running out of disk
-space. This can be done by simply running `set TEMP=D:\TEMP`.
+be removed when the collection is finished. It is recommended to set the TEMP variable
+to a location with adequate space, and preferably on a fast SSD to improve performance,
+before running `collect` to avoid running out of disk space.
-## Replay
+### Azure Storage collections
+
+As stated above, you can use the `list-collections` command to see which collections
+are available in Azure.
-SuperPMI replay supports faster assertion checking over a collection than
-running the tests individually. This is useful if the collection includes a
-larger corpus of data that can reasonably be run against by executing the
-actual code, or if it is difficult to invoke the JIT across all the code in
-the collection. Note that this is similar to the PMI tool, with the same
-limitation, that runtime issues will not be caught by SuperPMI replay only
-assertions.
-
-## Asm Diffs
-
-SuperPMI will take two different JITs, a baseline and diff JIT and run the
-compiler accross all the methods in the MCH file. It uses coredistools to do
-a binary difference of the two different outputs. Note that sometimes the
-binary will differ, and SuperPMI will be run once again dumping the asm that
-was output in text format. Then the text will be diffed, if there are
-differences, you should look for text differences. If there are some then it
-is worth investigating the asm differences.
-
-superpmi.py can also be asked to generate JitDump differences in addition
-to the ASM diff differences generated by default.
-
-It is worth noting as well that SuperPMI gives more stable instructions
-retired counters for the JIT.
+There is also a `download` command to download one or more Azure stored collection
+to the local cache, as well as an `upload` command to populate the Azure collection
+set.
diff --git a/src/coreclr/scripts/superpmi.proj b/src/coreclr/scripts/superpmi.proj
new file mode 100644
index 000000000000..7524245f4c71
--- /dev/null
+++ b/src/coreclr/scripts/superpmi.proj
@@ -0,0 +1,96 @@
+
+
+
+ \
+
+
+ /
+
+
+
+
+ %HELIX_PYTHONPATH%
+ $(WorkItemDirectory)\pmiAssembliesDirectory
+ %HELIX_WORKITEM_PAYLOAD%\binaries
+ %HELIX_CORRELATION_PAYLOAD%\superpmi
+ %HELIX_WORKITEM_UPLOAD_ROOT%
+
+ $(BUILD_SOURCESDIRECTORY)\artifacts\helixresults
+ $(SuperPMIDirectory)\superpmi.py collect --pmi -pmi_location $(SuperPMIDirectory)\pmi.dll
+
+
+ $HELIX_PYTHONPATH
+ $(WorkItemDirectory)/pmiAssembliesDirectory
+ $HELIX_WORKITEM_PAYLOAD/binaries
+ $HELIX_CORRELATION_PAYLOAD/superpmi
+ $HELIX_WORKITEM_UPLOAD_ROOT
+
+ $(BUILD_SOURCESDIRECTORY)/artifacts/helixresults
+ $(SuperPMIDirectory)/superpmi.py collect --pmi -pmi_location $(SuperPMIDirectory)/pmi.dll
+
+
+
+ $(Python) $(WorkItemCommand) -pmi_assemblies $(PmiAssembliesDirectory) -arch $(Architecture) -build_type $(BuildConfig) -core_root $(SuperPMIDirectory)
+
+
+
+ false
+ false
+ 5:00
+
+
+
+
+ %(Identity)
+
+
+
+
+
+
+
+
+
+
+ $(CollectionName).pmi.%(HelixWorkItem.PartitionId).$(MchFileTag)
+ $(PmiAssembliesPayload)$(FileSeparatorChar)$(CollectionName)$(FileSeparatorChar)%(HelixWorkItem.PmiAssemblies)
+ $(WorkItemCommand) -output_mch_path $(OutputMchPath)$(FileSeparatorChar)%(OutputFileName).mch -log_file $(OutputMchPath)$(FileSeparatorChar)%(OutputFileName).log
+ $(WorkItemTimeout)
+ %(OutputFileName).mch;%(OutputFileName).mch.mct;%(OutputFileName).log
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/coreclr/scripts/superpmi.py b/src/coreclr/scripts/superpmi.py
index fa0f3e2f165d..85bdcb974c9a 100755
--- a/src/coreclr/scripts/superpmi.py
+++ b/src/coreclr/scripts/superpmi.py
@@ -8,10 +8,10 @@
#
# Notes:
#
-# Script to handle running SuperPMI Collections, and replays. In addition, this
-# script provides support for SuperPMI ASM diffs. Note that some of the options
-# provided by this script are also provided in our SuperPMI collect test. The
-# test can be found here: https://github.com/dotnet/coreclr/blob/master/tests/src/JIT/superpmi/superpmicollect.cs.
+# Script to orchestrate SuperPMI collections, replays, asm diffs, and SuperPMI
+# data management. Note that some of the options provided by this script are
+# also provided in our SuperPMI collect test. The test can be found here:
+# https://github.com/dotnet/runtime/blob/master/src/tests/JIT/superpmi/superpmicollect.cs.
#
################################################################################
################################################################################
@@ -19,8 +19,8 @@
import argparse
import asyncio
import datetime
-import json
-import math
+import locale
+import logging
import os
import multiprocessing
import platform
@@ -28,19 +28,39 @@
import subprocess
import sys
import tempfile
-import time
+import queue
import re
-import string
import urllib
import urllib.request
import zipfile
-import xml.etree.ElementTree
+from coreclr_arguments import *
-from collections import defaultdict
-from sys import platform as _platform
+locale.setlocale(locale.LC_ALL, '') # Use '' for auto, or force e.g. to 'en_US.UTF-8'
-from coreclr_arguments import *
+################################################################################
+# Azure Storage information
+################################################################################
+
+# We store several things in Azure Blob Storage:
+# 1. SuperPMI collections
+# 2. A copy of PMI.dll, as a fallback in case we need it but can't find it locally,
+# so we don't need to download dotnet/jitutils and build it ourselves.
+# (Note: if PMI is ever published as a package, we could just download that instead.)
+# 3. A copy of coredistools. If, when doing asm diffs, a copy of the coredistools
+# library is not found in the Core_Root directory, we download a cached copy.
+# Note: it would be better to download and use the official coredistools
+# NuGet packages (like the setup-stress-dependencies scripts do).
+
+az_account_name = "clrjit2"
+az_superpmi_container_name = "superpmi"
+az_collections_root_folder = "collections"
+az_blob_storage_account_uri = "https://" + az_account_name + ".blob.core.windows.net/"
+az_blob_storage_superpmi_container_uri = az_blob_storage_account_uri + az_superpmi_container_name
+
+az_jitrollingbuild_container_name = "jitrollingbuild"
+az_builds_root_folder = "builds"
+az_blob_storage_jitrollingbuild_container_uri = az_blob_storage_account_uri + az_jitrollingbuild_container_name
################################################################################
# Argument Parser
@@ -48,7 +68,7 @@
description = """\
Script to run SuperPMI replay, ASM diffs, and collections.
-The script also manages the Azure store of precreated SuperPMI collection files.
+The script also manages the Azure store of pre-created SuperPMI collection files.
Help for each individual command can be shown by asking for help on the individual command, for example
`superpmi.py collect --help`.
"""
@@ -69,13 +89,30 @@
Upload a collection to SuperPMI Azure storage.
"""
+download_description = """\
+Download collections from SuperPMI Azure storage.
+Normally, collections are automatically downloaded to a local cache
+as part of doing a 'replay' operation. This command allows you to
+download without doing a 'replay'.
+"""
+
list_collections_description = """\
List the existing collections in the SuperPMI Azure storage.
"""
-collection_help = "Which collection type to use for replays. Default is to run everything. Use 'superpmi.py list-collections' to find available collections."
+merge_mch_description = """\
+Utility command to merge MCH files. This is a thin wrapper around
+'mcs -merge -recursive -dedup -thin' followed by 'mcs -toc'.
+"""
+
+spmi_log_file_help = "Write SuperPMI tool output to a log file. Requires --sequential."
-log_file_help = "Write output to a log file. Requires --sequential."
+jit_ee_version_help = """\
+JIT/EE interface version (the JITEEVersionIdentifier GUID from corinfo.h in the format
+'a5eec3a4-4176-43a7-8c2b-a05b551d4f49'). Default: if the mcs tool is found, assume it
+was built with the same JIT/EE version as the JIT we are using, and run "mcs -printJITEEVersion"
+to get that version. Otherwise, use "unknown-jit-ee-version".
+"""
host_os_help = "OS (Windows_NT, OSX, Linux). Default: current OS."
@@ -85,10 +122,20 @@
core_root_help = "Core_Root location. Optional; it will be deduced if possible from runtime repo root."
+log_level_help = """\
+Console log level (output verbosity level).
+One of: critical, error, warning, info, debug.
+Output from this level and higher is output to the console.
+All output is always written to the log file.
+Default: warning.
+"""
+
+log_file_help = "Output log file path. If not specified, a default location is chosen."
+
product_location_help = "Built Product directory location. Optional; it will be deduced if possible from runtime repo root."
spmi_location_help = """\
-Directory in which to put SuperPMI files, such as downloaded MCH files, asm diffs, and repro .MC file.
+Directory in which to put SuperPMI files, such as downloaded MCH files, asm diffs, and repro .MC files.
Optional. Default is 'spmi' within the repo 'artifacts' directory.
"""
@@ -97,9 +144,22 @@
invoked inside this command, as they will fail due to the shim altjit being set.
"""
-mch_file_help = """\
-Location of the MCH file to use for replay. Note that this may either be a path on disk or a URI to a MCH file to download.
-Use this MCH file instead of a named collection set from the cloud MCH file store.
+replay_mch_files_help = """\
+MCH files, or directories containing MCH files, to use for replay. For each directory passed,
+all recursively found MCH files in that directory root will be used. Files may either be a path
+on disk or a URI to a MCH file to download. Use these MCH files instead of a collection from
+the Azure Storage MCH file store. UNC paths will be downloaded and cached locally.
+"""
+
+filter_help = """\
+Specify one or more filters to restrict the set of MCH files to download or use from the local cache.
+A filter is a simple case-insensitive substring search against the MCH file path. If multiple filter
+strings are specified, any maching path is accepted (it is "or", not "and").
+"""
+
+upload_mch_files_help = """\
+MCH files, or directories containing MCH files, to upload. For each directory passed,
+all recursively found MCH files in that directory root will be uploaded. MCT files are also uploaded.
"""
skip_cleanup_help = "Skip intermediate file removal."
@@ -108,30 +168,59 @@
break_on_error_help = "Enable break on error during SuperPMI replay."
-force_download_help = "If downloading an MCH file, always download it. Don't use an existing file in the download location."
+force_download_help = """\
+If downloading an MCH file, always download it. Don't use an existing file in the download location.
+Normally, we don't download if the target directory exists. This forces download even if the
+target directory already exists.
+"""
+
+merge_mch_pattern_help = """\
+A pattern to describing files to merge, passed through directly to `mcs -merge`.
+Acceptable patterns include `*.mch`, `file*.mch`, and `c:\\my\\directory\\*.mch`.
+Only the final component can contain a `*` wildcard; the directory path cannot.
+"""
# Start of parser object creation.
parser = argparse.ArgumentParser(description=description)
subparsers = parser.add_subparsers(dest='mode', help="Command to invoke")
+subparsers.required = True
+
+# Create a parser for core_root. It can be specified directly,
+# or computed from the script location and host OS, architecture, and build type:
+#
+# script location implies repo root,
+# implies artifacts location,
+# implies test location from host OS, architecture, build type,
+# implies Core_Root path
+#
+# You normally use the default host OS, but for Azure Storage upload and other
+# operations, it can be useful to allow it to be specified.
+
+core_root_parser = argparse.ArgumentParser(add_help=False)
+
+core_root_parser.add_argument("-arch", help=arch_help)
+core_root_parser.add_argument("-build_type", default="Checked", help=build_type_help)
+core_root_parser.add_argument("-host_os", help=host_os_help)
+core_root_parser.add_argument("-core_root", help=core_root_help)
+core_root_parser.add_argument("-log_level", help=log_level_help)
+core_root_parser.add_argument("-log_file", help=log_file_help)
+core_root_parser.add_argument("-spmi_location", help=spmi_location_help)
# Create a set of argument common to all commands that run SuperPMI.
superpmi_common_parser = argparse.ArgumentParser(add_help=False)
-superpmi_common_parser.add_argument("-arch", default=CoreclrArguments.provide_default_arch(), help=arch_help)
-superpmi_common_parser.add_argument("-build_type", default="Checked", help=build_type_help)
-superpmi_common_parser.add_argument("-core_root", help=core_root_help)
-superpmi_common_parser.add_argument("-spmi_location", help=spmi_location_help)
superpmi_common_parser.add_argument("--break_on_assert", action="store_true", help=break_on_assert_help)
superpmi_common_parser.add_argument("--break_on_error", action="store_true", help=break_on_error_help)
superpmi_common_parser.add_argument("--skip_cleanup", action="store_true", help=skip_cleanup_help)
-superpmi_common_parser.add_argument("--sequential", action="store_true", help="Run SuperPMI in sequential mode.")
-superpmi_common_parser.add_argument("-log_file", help=log_file_help)
+superpmi_common_parser.add_argument("--sequential", action="store_true", help="Run SuperPMI in sequential mode. Default is to run in parallel for faster runs.")
+superpmi_common_parser.add_argument("-spmi_log_file", help=spmi_log_file_help)
+superpmi_common_parser.add_argument("-altjit", help="Replay with an altjit. Specify the filename of the altjit to use, e.g., 'clrjit_win_arm64_x64.dll'.")
# subparser for collect
-collect_parser = subparsers.add_parser("collect", description=collect_description, parents=[superpmi_common_parser])
+collect_parser = subparsers.add_parser("collect", description=collect_description, parents=[core_root_parser, superpmi_common_parser])
# Add required arguments
collect_parser.add_argument("collection_command", nargs='?', help=superpmi_collect_help)
@@ -139,17 +228,17 @@
collect_parser.add_argument("--pmi", action="store_true", help="Run PMI on a set of directories or assemblies.")
collect_parser.add_argument("-pmi_assemblies", dest="pmi_assemblies", nargs="+", default=[], help="Pass a sequence of managed dlls or directories to recursively run PMI over while collecting. Required if --pmi is specified.")
-collect_parser.add_argument("-pmi_location", help="Path to pmi.dll to use during PMI run. Optional; pmi.dll will be downloaded from Azure storage if necessary.")
-collect_parser.add_argument("-output_mch_path", help="Location to place the final MCH file. By default it will be placed at artifacts/mch/$(os).$(arch).$(build_type)/$(os).$(arch).$(build_type).mch")
+collect_parser.add_argument("-pmi_location", help="Path to pmi.dll to use during PMI run. Optional; pmi.dll will be downloaded from Azure Storage if necessary.")
+collect_parser.add_argument("-output_mch_path", help="Location to place the final MCH file.")
collect_parser.add_argument("--merge_mch_files", action="store_true", help="Merge multiple MCH files. Use the -mch_files flag to pass a list of MCH files to merge.")
-collect_parser.add_argument("-mch_files", nargs='+', help="Pass a sequence of MCH files which will be merged. Required by --merge_mch_files.")
-collect_parser.add_argument("--use_zapdisable", action="store_true", help="Sets COMPlus_ZapDisable=1 when doing collection to cause NGEN/ReadyToRun images to not be used, and thus causes JIT compilation and SuperPMI collection of these methods.")
+collect_parser.add_argument("-mch_files", metavar="MCH_FILE", nargs='+', help="Pass a sequence of MCH files which will be merged. Required by --merge_mch_files.")
+collect_parser.add_argument("--use_zapdisable", action="store_true", help="Sets COMPlus_ZapDisable=1 and COMPlus_ReadyToRun=0 when doing collection to cause NGEN/ReadyToRun images to not be used, and thus causes JIT compilation and SuperPMI collection of these methods.")
# Allow for continuing a collection in progress
-collect_parser.add_argument("-existing_temp_dir", help="Specify an existing temporary directory to use. Useful if continuing an ongoing collection process, or forcing a temporary directory to a particular hard drive. Optional; default is to create a temporary directory in the usual TEMP location.")
-collect_parser.add_argument("--has_run_collection_command", action="store_true", help="Do not run the collection step.")
-collect_parser.add_argument("--has_merged_mch", action="store_true", help="Do not run the merge step.")
-collect_parser.add_argument("--has_verified_clean_mch", action="store_true", help="Do not run the collection cleaning step.")
+collect_parser.add_argument("-temp_dir", help="Specify an existing temporary directory to use. Useful if continuing an ongoing collection process, or forcing a temporary directory to a particular hard drive. Optional; default is to create a temporary directory in the usual TEMP location.")
+collect_parser.add_argument("--skip_collection_step", action="store_true", help="Do not run the collection step.")
+collect_parser.add_argument("--skip_merge_step", action="store_true", help="Do not run the merge step.")
+collect_parser.add_argument("--skip_clean_and_verify_step", action="store_true", help="Do not run the collection cleaning, TOC creation, and verifying step.")
collect_parser.add_argument("--skip_collect_mc_files", action="store_true", help="Do not collect .MC files")
# Create a set of argument common to all SuperPMI replay commands, namely basic replay and ASM diffs.
@@ -158,53 +247,70 @@
replay_common_parser = argparse.ArgumentParser(add_help=False)
-replay_common_parser.add_argument("-mch_file", help=mch_file_help)
+replay_common_parser.add_argument("-mch_files", metavar="MCH_FILE", nargs='+', help=replay_mch_files_help)
+replay_common_parser.add_argument("-filter", nargs='+', help=filter_help)
replay_common_parser.add_argument("-product_location", help=product_location_help)
replay_common_parser.add_argument("--force_download", action="store_true", help=force_download_help)
-replay_common_parser.add_argument("-altjit", nargs='?', const=True, help="Replay with an altjit. If an argument is specified, it is used as the name of the altjit (e.g., 'protojit.dll'). Otherwise, the default altjit name is used.")
+replay_common_parser.add_argument("-jit_ee_version", help=jit_ee_version_help)
# subparser for replay
-replay_parser = subparsers.add_parser("replay", description=replay_description, parents=[superpmi_common_parser, replay_common_parser])
+replay_parser = subparsers.add_parser("replay", description=replay_description, parents=[core_root_parser, superpmi_common_parser, replay_common_parser])
# Add required arguments
-replay_parser.add_argument("collection", nargs='?', default="default", help=collection_help)
-
replay_parser.add_argument("-jit_path", help="Path to clrjit. Defaults to Core_Root JIT.")
# subparser for asmDiffs
-asm_diff_parser = subparsers.add_parser("asmdiffs", description=asm_diff_description, parents=[superpmi_common_parser, replay_common_parser])
+asm_diff_parser = subparsers.add_parser("asmdiffs", description=asm_diff_description, parents=[core_root_parser, superpmi_common_parser, replay_common_parser])
# Add required arguments
-asm_diff_parser.add_argument("base_jit_path", help="Path to baseline clrjit.")
-asm_diff_parser.add_argument("diff_jit_path", nargs='?', help="Path to diff clrjit. Defaults to Core_Root JIT.")
+asm_diff_parser.add_argument("-base_jit_path", help="Path to baseline clrjit. Defaults to baseline JIT from rolling build, by computing baseline git hash.")
+asm_diff_parser.add_argument("-diff_jit_path", help="Path to diff clrjit. Defaults to Core_Root JIT.")
+asm_diff_parser.add_argument("-git_hash", help="Use this git hash as the current to use to find a baseline JIT. Defaults to current git hash of source tree.")
+asm_diff_parser.add_argument("-base_git_hash", help="Use this git hash as the baseline JIT hash. Default: search for the baseline hash.")
-asm_diff_parser.add_argument("collection", nargs='?', default="default", help=collection_help)
asm_diff_parser.add_argument("--diff_with_code", action="store_true", help="Invoke Visual Studio Code to view any diffs.")
asm_diff_parser.add_argument("--diff_with_code_only", action="store_true", help="Invoke Visual Studio Code to view any diffs. Only run the diff command, do not run SuperPMI to regenerate diffs.")
asm_diff_parser.add_argument("--diff_jit_dump", action="store_true", help="Generate JitDump output for diffs. Default: only generate asm, not JitDump.")
asm_diff_parser.add_argument("--diff_jit_dump_only", action="store_true", help="Only diff JitDump output, not asm.")
-asm_diff_parser.add_argument("-previous_temp_location", help="Specify a temporary directory used for a previous ASM diffs run (for which --skip_cleanup was used) to view the results.")
+asm_diff_parser.add_argument("-temp_dir", help="Specify a temporary directory used for a previous ASM diffs run (for which --skip_cleanup was used) to view the results. The replay command is skipped.")
# subparser for upload
-upload_parser = subparsers.add_parser("upload", description=upload_description)
-upload_parser.add_argument("az_storage_key", nargs='?', help="Key for the clrjit Azure Storage location. Default: use the value of the CLRJIT_AZ_KEY environment variable.")
-upload_parser.add_argument("-mch_files", nargs='+', help="MCH files to pass")
+upload_parser = subparsers.add_parser("upload", description=upload_description, parents=[core_root_parser])
+
+upload_parser.add_argument("-mch_files", metavar="MCH_FILE", required=True, nargs='+', help=upload_mch_files_help)
+upload_parser.add_argument("-az_storage_key", help="Key for the clrjit Azure Storage location. Default: use the value of the CLRJIT_AZ_KEY environment variable.")
upload_parser.add_argument("-jit_location", help="Location for the base clrjit. If not passed this will be assumed to be from the Core_Root.")
-upload_parser.add_argument("-arch", default=CoreclrArguments.provide_default_arch(), help=arch_help)
-upload_parser.add_argument("-build_type", default="Checked", help=build_type_help)
+upload_parser.add_argument("-jit_ee_version", help=jit_ee_version_help)
upload_parser.add_argument("--skip_cleanup", action="store_true", help=skip_cleanup_help)
+# subparser for download
+download_parser = subparsers.add_parser("download", description=download_description, parents=[core_root_parser])
+
+download_parser.add_argument("-filter", nargs='+', help=filter_help)
+download_parser.add_argument("-jit_ee_version", help=jit_ee_version_help)
+download_parser.add_argument("--skip_cleanup", action="store_true", help=skip_cleanup_help)
+download_parser.add_argument("--force_download", action="store_true", help=force_download_help)
+download_parser.add_argument("-mch_files", metavar="MCH_FILE", nargs='+', help=replay_mch_files_help)
+
# subparser for list-collections
-list_collections_parser = subparsers.add_parser("list-collections", description=list_collections_description)
+list_collections_parser = subparsers.add_parser("list-collections", description=list_collections_description, parents=[core_root_parser])
+
+list_collections_parser.add_argument("-jit_ee_version", help=jit_ee_version_help)
+list_collections_parser.add_argument("--all", action="store_true", help="Show all MCH files, not just those for the specified (or default) JIT-EE version, OS, and architecture")
+list_collections_parser.add_argument("--local", action="store_true", help="Show the local MCH download cache")
+
+# subparser for merge-mch
+
+merge_mch_parser = subparsers.add_parser("merge-mch", description=merge_mch_description, parents=[core_root_parser])
-list_collections_parser.add_argument("-host_os", default=CoreclrArguments.provide_default_host_os(), help=host_os_help)
-list_collections_parser.add_argument("-arch", default=CoreclrArguments.provide_default_arch(), help=arch_help)
-list_collections_parser.add_argument("-build_type", default="Checked", help=build_type_help)
+merge_mch_parser.add_argument("-output_mch_path", required=True, help="Location to place the final MCH file.")
+merge_mch_parser.add_argument("-pattern", required=True, help=merge_mch_pattern_help)
################################################################################
# Helper functions
################################################################################
+
def is_zero_length_file(fpath):
""" Determine if a file system path refers to an existing file that is zero length
@@ -216,6 +322,7 @@ def is_zero_length_file(fpath):
"""
return os.path.isfile(fpath) and os.stat(fpath).st_size == 0
+
def is_nonzero_length_file(fpath):
""" Determine if a file system path refers to an existing file that is non-zero length
@@ -227,6 +334,7 @@ def is_nonzero_length_file(fpath):
"""
return os.path.isfile(fpath) and os.stat(fpath).st_size != 0
+
def make_safe_filename(s):
""" Turn a string into a string usable as a single file name component; replace illegal characters with underscores.
@@ -243,49 +351,56 @@ def safe_char(c):
return "_"
return "".join(safe_char(c) for c in s)
-def find_in_path(name, pathlist, matchFunc=os.path.isfile):
+
+def find_in_path(name, pathlist, match_func=os.path.isfile):
""" Find a name (e.g., directory name or file name) in the file system by searching the directories
- in a semicolon-separated `pathlist` (e.g., PATH environment variable).
+ in a `pathlist` (e.g., PATH environment variable that has been semi-colon
+ split into a list).
Args:
- name (str) : name to search for
- pathlist (str) : semicolon-separated string of directory names to search
- matchFunc (str -> bool) : determines if the name is a match
+ name (str) : name to search for
+ pathlist (list) : list of directory names to search
+ match_func (str -> bool) : determines if the name is a match
Returns:
(str) The pathname of the object, or None if not found.
"""
for dirname in pathlist:
candidate = os.path.join(dirname, name)
- if matchFunc(candidate):
+ if match_func(candidate):
return candidate
return None
+
def find_file(filename, pathlist):
""" Find a filename in the file system by searching the directories
- in a semicolon-separated `pathlist` (e.g., PATH environment variable).
+ in a `pathlist` (e.g., PATH environment variable that has been semi-colon
+ split into a list).
Args:
filename (str) : name to search for
- pathlist (str) : semicolon-separated string of directory names to search
+ pathlist (list) : list of directory names to search
Returns:
(str) The pathname of the object, or None if not found.
"""
return find_in_path(filename, pathlist)
+
def find_dir(dirname, pathlist):
""" Find a directory name in the file system by searching the directories
- in a semicolon-separated `pathlist` (e.g., PATH environment variable).
+ in a `pathlist` (e.g., PATH environment variable that has been semi-colon
+ split into a list).
Args:
dirname (str) : name to search for
- pathlist (str) : semicolon-separated string of directory names to search
+ pathlist (list) : list of directory names to search
Returns:
(str) The pathname of the object, or None if not found.
"""
- return find_in_path(dirname, pathlist, matchFunc=os.path.isdir)
+ return find_in_path(dirname, pathlist, match_func=os.path.isdir)
+
def create_unique_directory_name(root_directory, base_name):
""" Create a unique directory name by joining `root_directory` and `base_name`.
@@ -312,19 +427,76 @@ def create_unique_directory_name(root_directory, base_name):
os.makedirs(full_path)
return full_path
+
+def get_files_from_path(path, match_func=lambda path: True):
+ """ Return all files in a directory tree matching a criteria.
+
+ Args:
+ path (str) : Either a single file to include, or a directory to traverse looking for matching
+ files.
+ match_func (str -> bool) : Criteria function determining if a file is added to the list
+
+ Returns:
+ Array of absolute paths of matching files
+ """
+
+ if not(os.path.isdir(path) or os.path.isfile(path)):
+ logging.warning("Warning: \"%s\" is not a file or directory", path)
+ return []
+
+ path = os.path.abspath(path)
+
+ files = []
+
+ if os.path.isdir(path):
+ for item in os.listdir(path):
+ files += get_files_from_path(os.path.join(path, item), match_func)
+ else:
+ if match_func(path):
+ files.append(path)
+
+ return files
+
+
+def run_and_log(command, log_level=logging.DEBUG):
+ """ Return a command and log its output to the debug logger
+
+ Args:
+ command (list) : Command to run
+ log_level (int) : log level to use for logging output (but not the "Invoking" text)
+
+ Returns:
+ Process return code
+ """
+
+ logging.debug("Invoking: %s", " ".join(command))
+ proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ stdout_output, _ = proc.communicate()
+ for line in stdout_output.decode('utf-8').splitlines(): # There won't be any stderr output since it was piped to stdout
+ logging.log(log_level, line)
+ return proc.returncode
+
################################################################################
# Helper classes
################################################################################
+
class TempDir:
+ """ Class to create a temporary working directory, or use one that is passed as an argument.
+
+ Use with: "with TempDir() as temp_dir" to change to that directory and then automatically
+ change back to the original working directory afterwards and remove the temporary
+ directory and its contents (if args.skip_cleanup is False).
+ """
+
def __init__(self, path=None):
- self.dir = tempfile.mkdtemp() if path is None else path
+ self.mydir = tempfile.mkdtemp() if path is None else path
self.cwd = None
def __enter__(self):
self.cwd = os.getcwd()
- os.chdir(self.dir)
- return self.dir
+ os.chdir(self.mydir)
+ return self.mydir
def __exit__(self, exc_type, exc_val, exc_tb):
os.chdir(self.cwd)
@@ -332,86 +504,80 @@ def __exit__(self, exc_type, exc_val, exc_tb):
# the `skip_cleanup` argument is not processed by CoreclrArguments, but is
# just copied there.
if not args.skip_cleanup:
- shutil.rmtree(self.dir)
+ shutil.rmtree(self.mydir)
+
class ChangeDir:
- def __init__(self, dir):
- self.dir = dir
+ """ Class to temporarily change to a given directory. Use with "with".
+ """
+
+ def __init__(self, mydir):
+ self.mydir = mydir
self.cwd = None
def __enter__(self):
self.cwd = os.getcwd()
- os.chdir(self.dir)
+ os.chdir(self.mydir)
def __exit__(self, exc_type, exc_val, exc_tb):
os.chdir(self.cwd)
+
class AsyncSubprocessHelper:
- def __init__(self, items, subproc_count=multiprocessing.cpu_count(), verbose=False):
- item_queue = asyncio.Queue()
- for item in items:
- item_queue.put_nowait(item)
+ """ Class to help with async multiprocessing tasks.
+ """
+ def __init__(self, items, subproc_count=multiprocessing.cpu_count(), verbose=False):
self.items = items
self.subproc_count = subproc_count
self.verbose = verbose
+ self.subproc_count_queue = None
if 'win32' in sys.platform:
# Windows specific event-loop policy & cmd
- asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
+ asyncio.set_event_loop(asyncio.ProactorEventLoop())
async def __get_item__(self, item, index, size, async_callback, *extra_args):
""" Wrapper to the async callback which will schedule based on the queue
"""
- # Wait for the queue to become free. Then start
- # running the sub process.
+ # Wait for the subproc_id queue to become free, meaning we have an available
+ # processor to run a task (specifically, we are below our maximum allowed
+ # parallelism). Then start running the sub process.
subproc_id = await self.subproc_count_queue.get()
print_prefix = ""
-
if self.verbose:
print_prefix = "[{}:{}]: ".format(index, size)
await async_callback(print_prefix, item, *extra_args)
- # Add back to the queue, incase another process wants to run.
+ # Add back to the queue, in case another process wants to run.
self.subproc_count_queue.put_nowait(subproc_id)
async def __run_to_completion__(self, async_callback, *extra_args):
""" async wrapper for run_to_completion
"""
+ # Create a queue with one entry for each of the threads we're
+ # going to allow. By default, this will be one entry per cpu.
+ # using subproc_count_queue.get() will block when we're running
+ # a task on every CPU.
chunk_size = self.subproc_count
-
- # Create a queue with a chunk size of the cpu count
- #
- # Each run_pmi invocation will remove an item from the
- # queue before running a potentially long running pmi run.
- #
- # When the queue is drained, we will wait queue.get which
- # will wait for when a run_pmi instance has added back to the
- subproc_count_queue = asyncio.Queue(chunk_size)
- diff_queue = asyncio.Queue()
-
- for item in self.items:
- diff_queue.put_nowait(item)
-
+ self.subproc_count_queue = asyncio.Queue(chunk_size)
for item in range(chunk_size):
- subproc_count_queue.put_nowait(item)
-
- self.subproc_count_queue = subproc_count_queue
- tasks = []
- size = diff_queue.qsize()
+ self.subproc_count_queue.put_nowait(item)
+ # Create a 'tasks' list of async function calls, one for each item.
+ # When all these calls complete, we're done.
+ size = len(self.items)
count = 1
- item = diff_queue.get_nowait() if not diff_queue.empty() else None
- while item is not None:
+ tasks = []
+ for item in self.items:
tasks.append(self.__get_item__(item, count, size, async_callback, *extra_args))
count += 1
- item = diff_queue.get_nowait() if not diff_queue.empty() else None
-
+ # Inovke all the calls to __get_item__ concurrently and wait for them all to finish.
await asyncio.gather(*tasks)
def run_to_completion(self, async_callback, *extra_args):
@@ -428,13 +594,15 @@ def run_to_completion(self, async_callback, *extra_args):
"""
reset_env = os.environ.copy()
- asyncio.run(self.__run_to_completion__(async_callback, *extra_args))
+ loop = asyncio.get_event_loop()
+ loop.run_until_complete(self.__run_to_completion__(async_callback, *extra_args))
os.environ.update(reset_env)
################################################################################
# SuperPMI Collect
################################################################################
+
class SuperPMICollect:
""" SuperPMI Collect class
@@ -453,22 +621,19 @@ def __init__(self, coreclr_args):
if coreclr_args.host_os == "OSX":
self.collection_shim_name = "libsuperpmi-shim-collector.dylib"
- self.mcs_tool_name = "mcs"
self.corerun_tool_name = "corerun"
elif coreclr_args.host_os == "Linux":
self.collection_shim_name = "libsuperpmi-shim-collector.so"
- self.mcs_tool_name = "mcs"
self.corerun_tool_name = "corerun"
elif coreclr_args.host_os == "Windows_NT":
self.collection_shim_name = "superpmi-shim-collector.dll"
- self.mcs_tool_name = "mcs.exe"
self.corerun_tool_name = "corerun.exe"
else:
raise RuntimeError("Unsupported OS.")
self.jit_path = os.path.join(coreclr_args.core_root, determine_jit_name(coreclr_args))
- self.superpmi_path = os.path.join(coreclr_args.core_root, determine_superpmi_tool_name(coreclr_args))
- self.mcs_path = os.path.join(coreclr_args.core_root, self.mcs_tool_name)
+ self.superpmi_path = determine_superpmi_tool_path(coreclr_args)
+ self.mcs_path = determine_mcs_tool_path(coreclr_args)
self.core_root = coreclr_args.core_root
@@ -482,14 +647,6 @@ def __init__(self, coreclr_args):
self.coreclr_args = coreclr_args
- ############################################################################
- # Instance Methods
- ############################################################################
-
- def collect(self):
- """ Do the SuperPMI Collection.
- """
-
# Pathname for a temporary .MCL file used for noticing SuperPMI replay failures against base MCH.
self.base_fail_mcl_file = None
@@ -502,7 +659,15 @@ def collect(self):
# The .TOC file path for the clean thin unique .MCH file
self.toc_file = None
- self.save_the_final_mch_file = False
+ self.temp_location = None
+
+ ############################################################################
+ # Instance Methods
+ ############################################################################
+
+ def collect(self):
+ """ Do the SuperPMI Collection.
+ """
# Do a basic SuperPMI collect and validation:
# 1. Collect MC files by running a set of sample apps.
@@ -519,7 +684,7 @@ def collect(self):
passed = False
try:
- with TempDir(self.coreclr_args.existing_temp_dir) as temp_location:
+ with TempDir(self.coreclr_args.temp_dir) as temp_location:
# Setup all of the temp locations
self.base_fail_mcl_file = os.path.join(temp_location, "basefail.mcl")
self.base_mch_file = os.path.join(temp_location, "base.mch")
@@ -537,26 +702,25 @@ def collect(self):
os.makedirs(default_coreclr_bin_mch_location)
self.final_mch_file = os.path.abspath(os.path.join(default_coreclr_bin_mch_location, "{}.{}.{}.mch".format(self.coreclr_args.host_os, self.coreclr_args.arch, self.coreclr_args.build_type)))
- self.save_the_final_mch_file = True
self.toc_file = "{}.mct".format(self.final_mch_file)
- # If we have passed existing_temp_dir, then we have a few flags we need
+ # If we have passed temp_dir, then we have a few flags we need
# to check to see where we are in the collection process. Note that this
# functionality exists to help not lose progress during a SuperPMI collection.
# It is not unreasonable for the SuperPMI collection to take many hours
# therefore allow re-use of a collection in progress
- if not self.coreclr_args.has_run_collection_command:
+ if not self.coreclr_args.skip_collection_step:
self.__collect_mc_files__()
- if not self.coreclr_args.has_merged_mch:
+ if not self.coreclr_args.skip_merge_step:
if not self.coreclr_args.merge_mch_files:
self.__merge_mc_files__()
else:
self.__merge_mch_files__()
- if not self.coreclr_args.has_verified_clean_mch:
+ if not self.coreclr_args.skip_clean_and_verify_step:
self.__create_clean_mch_file__()
self.__create_toc__()
self.__verify_final_mch__()
@@ -564,7 +728,7 @@ def collect(self):
passed = True
except Exception as exception:
- print(exception)
+ logging.critical(exception)
return passed
@@ -590,88 +754,81 @@ def __collect_mc_files__(self):
env_copy["COMPlus_AltJitNgen"] = "*"
env_copy["COMPlus_AltJitName"] = self.collection_shim_name
env_copy["COMPlus_EnableExtraSuperPmiQueries"] = "1"
+ env_copy["COMPlus_TieredCompilation"] = "0"
if self.coreclr_args.use_zapdisable:
env_copy["COMPlus_ZapDisable"] = "1"
+ env_copy["COMPlus_ReadyToRun"] = "0"
+
+ logging.debug("Starting collection.")
+ logging.debug("")
+ print_platform_specific_environment_vars(logging.DEBUG, self.coreclr_args, "SuperPMIShimLogPath", self.temp_location)
+ print_platform_specific_environment_vars(logging.DEBUG, self.coreclr_args, "SuperPMIShimPath", self.jit_path)
+ print_platform_specific_environment_vars(logging.DEBUG, self.coreclr_args, "COMPlus_AltJit", "*")
+ print_platform_specific_environment_vars(logging.DEBUG, self.coreclr_args, "COMPlus_AltJitNgen", "*")
+ print_platform_specific_environment_vars(logging.DEBUG, self.coreclr_args, "COMPlus_AltJitName", self.collection_shim_name)
+ print_platform_specific_environment_vars(logging.DEBUG, self.coreclr_args, "COMPlus_EnableExtraSuperPmiQueries", "1")
+ print_platform_specific_environment_vars(logging.DEBUG, self.coreclr_args, "COMPlus_TieredCompilation", "0")
+ if self.coreclr_args.use_zapdisable:
+ print_platform_specific_environment_vars(logging.DEBUG, self.coreclr_args, "COMPlus_ZapDisable", "1")
+ print_platform_specific_environment_vars(logging.DEBUG, self.coreclr_args, "COMPlus_ReadyToRun", "0")
+ logging.debug("")
- print("Starting collection.")
- print("")
- print_platform_specific_environment_vars(self.coreclr_args, "SuperPMIShimLogPath", self.temp_location)
- print_platform_specific_environment_vars(self.coreclr_args, "SuperPMIShimPath", self.jit_path)
- print_platform_specific_environment_vars(self.coreclr_args, "COMPlus_AltJit", "*")
- print_platform_specific_environment_vars(self.coreclr_args, "COMPlus_AltJitName", self.collection_shim_name)
- print_platform_specific_environment_vars(self.coreclr_args, "COMPlus_AltJitNgen", "*")
- print("")
-
- if self.collection_command != None:
- print("%s %s" % (self.collection_command, " ".join(self.collection_args)))
+ if self.collection_command is not None:
+ logging.info("Collecting using command:")
+ logging.info(" %s %s", self.collection_command, " ".join(self.collection_args))
assert isinstance(self.collection_command, str)
assert isinstance(self.collection_args, list)
- self.command = [self.collection_command,] + self.collection_args
- proc = subprocess.Popen(self.command, env=env_copy)
- proc.communicate()
- return_code = proc.returncode
+ command = [self.collection_command, ] + self.collection_args
+ proc = subprocess.Popen(command, env=env_copy, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ stdout_output, _ = proc.communicate()
+ for line in stdout_output.decode('utf-8').splitlines(): # There won't be any stderr output since it was piped to stdout
+ logging.debug(line)
if self.coreclr_args.pmi is True:
- def get_all_assemblies(location, root=True):
- """ Return all potential managed assemblies in a directory
- """
-
- assert os.path.isdir(location) or os.path.isfile(location)
-
- valid_extensions = [".dll", ".exe"]
-
- assemblies = []
-
- if os.path.isdir(location):
- for item in os.listdir(location):
- assemblies += get_all_assemblies(os.path.join(location, item), False)
- else:
- for item in valid_extensions:
- if location.endswith(item):
- assemblies.append(location)
-
- return assemblies
-
async def run_pmi(print_prefix, assembly, self):
""" Run pmi over all dlls
"""
command = [self.corerun, self.pmi_location, "DRIVEALL", assembly]
command_string = " ".join(command)
- print("{}{}".format(print_prefix, command_string))
+ logging.debug("%s%s", print_prefix, command_string)
# Save the stdout and stderr to files, so we can see if PMI wrote any interesting messages.
# Use the name of the assembly as the basename of the file. mkstemp() will ensure the file
# is unique.
root_output_filename = make_safe_filename("pmi_" + assembly + "_")
- stdout_file_handle, stdout_filepath = tempfile.mkstemp(suffix=".stdout", prefix=root_output_filename, dir=self.temp_location)
- stderr_file_handle, stderr_filepath = tempfile.mkstemp(suffix=".stderr", prefix=root_output_filename, dir=self.temp_location)
+ try:
+ stdout_file_handle, stdout_filepath = tempfile.mkstemp(suffix=".stdout", prefix=root_output_filename, dir=self.temp_location)
+ stderr_file_handle, stderr_filepath = tempfile.mkstemp(suffix=".stderr", prefix=root_output_filename, dir=self.temp_location)
- proc = await asyncio.create_subprocess_shell(
- command_string,
- stdout=stdout_file_handle,
- stderr=stderr_file_handle)
+ proc = await asyncio.create_subprocess_shell(
+ command_string,
+ stdout=stdout_file_handle,
+ stderr=stderr_file_handle)
- await proc.communicate()
+ await proc.communicate()
- os.close(stdout_file_handle)
- os.close(stderr_file_handle)
+ os.close(stdout_file_handle)
+ os.close(stderr_file_handle)
# No need to keep zero-length files
- if is_zero_length_file(stdout_filepath):
- os.remove(stdout_filepath)
- if is_zero_length_file(stderr_filepath):
- os.remove(stderr_filepath)
+ if is_zero_length_file(stdout_filepath):
+ os.remove(stdout_filepath)
+ if is_zero_length_file(stderr_filepath):
+ os.remove(stderr_filepath)
+ except OSError as ose:
+ if "[WinError 32] The process cannot access the file because it is being used by another " \
+ "process:" in format(ose):
+ logging.warning("Skipping file %s. Got error: %s".format(root_output_filename, format(ose)))
+ else:
+ raise ose
assemblies = []
for item in self.pmi_assemblies:
- if os.path.isdir(item):
- assemblies += get_all_assemblies(item)
- else:
- assemblies.append(item)
+ assemblies += get_files_from_path(item, match_func=lambda file: any(file.endswith(extension) for extension in [".dll", ".exe"]))
# Set environment variables.
old_env = os.environ.copy()
@@ -690,16 +847,16 @@ def __merge_mc_files__(self):
""" Merge the mc files that were generated
Notes:
- mcs -merge \*.mc -recursive -dedup -thin
+ mcs -merge \\*.mc -recursive -dedup -thin
"""
+ logging.info("Merging MC files")
+
pattern = os.path.join(self.temp_location, "*.mc")
command = [self.mcs_path, "-merge", self.base_mch_file, pattern, "-recursive", "-dedup", "-thin"]
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
- proc.communicate()
+ run_and_log(command)
if not os.path.isfile(self.base_mch_file):
raise RuntimeError("MCH file failed to be generated at: %s" % self.base_mch_file)
@@ -712,18 +869,18 @@ def __merge_mc_files__(self):
os.remove(item)
def __merge_mch_files__(self):
- """ Merge the MCH files that were passed
+ """ Merge MCH files in the mch_files list. This is only used with the `--merge_mch_files` argument.
Notes:
mcs -concat [self.coreclr_args.mch_files]
"""
+ logging.info("Merging MCH files")
+
for item in self.coreclr_args.mch_files:
command = [self.mcs_path, "-concat", self.base_mch_file, item]
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
- proc.communicate()
+ run_and_log(command)
if not os.path.isfile(self.base_mch_file):
raise RuntimeError("MCH file failed to be generated at: %s" % self.base_mch_file)
@@ -741,16 +898,14 @@ def __create_clean_mch_file__(self):
del
"""
+ logging.info("Cleaning MCH file")
+
command = [self.superpmi_path, "-p", "-f", self.base_fail_mcl_file, self.base_mch_file, self.jit_path]
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
- proc.communicate()
+ run_and_log(command)
if is_nonzero_length_file(self.base_fail_mcl_file):
command = [self.mcs_path, "-strip", self.base_fail_mcl_file, self.base_mch_file, self.final_mch_file]
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
- proc.communicate()
+ run_and_log(command)
else:
# Ideally we could just rename this file instead of copying it.
shutil.copy2(self.base_mch_file, self.final_mch_file)
@@ -773,10 +928,10 @@ def __create_toc__(self):
-toc
"""
+ logging.info("Creating TOC file")
+
command = [self.mcs_path, "-toc", self.final_mch_file]
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
- proc.communicate()
+ run_and_log(command)
if not os.path.isfile(self.toc_file):
raise RuntimeError("Error, toc file not created correctly at: %s" % self.toc_file)
@@ -788,38 +943,107 @@ def __verify_final_mch__(self):
-p -f
"""
- spmi_replay = SuperPMIReplay(self.coreclr_args, self.final_mch_file, self.jit_path)
+ logging.info("Verifying MCH file")
+
+ mch_files = [ self.final_mch_file ]
+ spmi_replay = SuperPMIReplay(self.coreclr_args, mch_files, self.jit_path)
passed = spmi_replay.replay()
if not passed:
raise RuntimeError("Error, unclean replay.")
+################################################################################
+# SuperPMI Replay helpers
+################################################################################
+
+
+def print_superpmi_failure_code(return_code, coreclr_args):
+ """ Print a description of a superpmi return (error) code. If the return code is
+ zero, meaning success, don't print anything.
+ Note that Python treats process return codes (at least on Windows) as
+ unsigned integers, so compare against both signed and unsigned numbers for
+ those return codes.
+ """
+ if return_code == 0:
+ # Don't print anything if the code is zero, which is success.
+ pass
+ elif return_code == -1 or return_code == 4294967295:
+ logging.error("General fatal error")
+ elif return_code == -2 or return_code == 4294967294:
+ logging.error("JIT failed to initialize")
+ elif return_code == 1:
+ logging.warning("Compilation failures")
+ elif return_code == 2:
+ logging.warning("Asm diffs found")
+ elif return_code == 139 and coreclr_args.host_os != "Windows_NT":
+ logging.error("Fatal error, SuperPMI has returned SIGSEGV (segmentation fault)")
+ else:
+ logging.error("Unknown error code %s", return_code)
+
+
+def print_fail_mcl_file_method_numbers(fail_mcl_file):
+ """ Given a SuperPMI ".mcl" file (containing a list of failure indices), print out the method numbers.
+ """
+ with open(fail_mcl_file) as file_handle:
+ mcl_lines = file_handle.readlines()
+ mcl_lines = [item.strip() for item in mcl_lines]
+ logging.debug("Method numbers with compilation failures:")
+ for line in mcl_lines:
+ logging.debug(line)
+
+
+def save_repro_mc_files(temp_location, coreclr_args, repro_base_command_line):
+ """ For commands that use the superpmi "-r" option to create "repro" .mc files, copy these to a
+ location where they are saved (and not in a "temp" directory) for easy use by the user.
+ """
+ # If there are any .mc files, drop them into artifacts/repro/../*.mc
+ mc_files = [os.path.join(temp_location, item) for item in os.listdir(temp_location) if item.endswith(".mc")]
+ if len(mc_files) > 0:
+ repro_location = create_unique_directory_name(coreclr_args.spmi_location, "repro.{}.{}.{}".format(coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type))
+
+ repro_files = []
+ for item in mc_files:
+ repro_files.append(os.path.join(repro_location, os.path.basename(item)))
+ logging.debug("Copying %s -> %s", item, repro_location)
+ shutil.copy2(item, repro_location)
+
+ logging.info("")
+ logging.info("Repro .mc files created for failures:")
+ for item in repro_files:
+ logging.info(item)
+
+ logging.info("")
+ logging.info("To run a specific failure (replace JIT path and .mc filename as needed):")
+ logging.info("")
+ logging.info("%s %s%sxxxxx.mc", repro_base_command_line, repro_location, os.path.sep)
+ logging.info("")
+
################################################################################
# SuperPMI Replay
################################################################################
+
class SuperPMIReplay:
""" SuperPMI Replay class
Notes:
- The object is responsible for replaying the MCH file given to the
+ The object is responsible for replaying the MCH files given to the
instance of the class
"""
- def __init__(self, coreclr_args, mch_file, jit_path):
+ def __init__(self, coreclr_args, mch_files, jit_path):
""" Constructor
Args:
coreclr_args (CoreclrArguments) : parsed args
- mch_file (str) : MCH file to replay
- jit_path (str) : path to clrjit/libclrjit.
+ mch_files (list) : list of MCH files to replay
+ jit_path (str) : path to clrjit
"""
self.jit_path = jit_path
- self.mch_file = mch_file
- self.superpmi_path = os.path.join(coreclr_args.core_root, determine_superpmi_tool_name(coreclr_args))
-
+ self.mch_files = mch_files
+ self.superpmi_path = determine_superpmi_tool_path(coreclr_args)
self.coreclr_args = coreclr_args
############################################################################
@@ -830,10 +1054,10 @@ def replay(self):
""" Replay the given SuperPMI collection
Returns:
- sucessful_replay (bool)
+ (bool) True on success; False otherwise
"""
- return_code = False
+ result = True # Assume success
# Possible return codes from SuperPMI
#
@@ -844,123 +1068,99 @@ def replay(self):
# 2 : there were assembly diffs
with TempDir() as temp_location:
- print("")
- print("Temp Location: {}".format(temp_location))
- print("")
-
- self.fail_mcl_file = os.path.join(temp_location, "fail.mcl")
+ logging.debug("")
+ logging.debug("Temp Location: %s", temp_location)
+ logging.debug("")
flags = [
- "-f", # Failing mc List
- self.fail_mcl_file,
- "-r", # Repro name, create .mc repro files
- os.path.join(temp_location, "repro")
+ "-v", "ew", # only display errors and warnings
+ "-r", os.path.join(temp_location, "repro") # Repro name, create .mc repro files
]
altjit_string = "*" if self.coreclr_args.altjit else ""
- altjit_flags = [
+ altjit_replay_flags = [
"-jitoption", "force", "AltJit=" + altjit_string,
- "-jitoption", "force", "AltJitNgen=" + altjit_string
+ "-jitoption", "force", "AltJitNgen=" + altjit_string,
+ "-jitoption", "force", "EnableExtraSuperPmiQueries=0"
]
- flags += altjit_flags
+ flags += altjit_replay_flags
if not self.coreclr_args.sequential:
- flags += [
- "-p" # parallel
- ]
+ flags += [ "-p" ]
if self.coreclr_args.break_on_assert:
- flags += [
- "-boa" # break on assert
- ]
+ flags += [ "-boa" ]
if self.coreclr_args.break_on_error:
- flags += [
- "-boe" # break on error
- ]
-
- if self.coreclr_args.log_file != None:
- flags += [
- "-w",
- self.coreclr_args.log_file
- ]
-
- command = [self.superpmi_path] + flags + [self.jit_path, self.mch_file]
-
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
- proc.communicate()
+ flags += [ "-boe" ]
- return_code = proc.returncode
-
- if return_code == 0:
- print("Clean SuperPMI replay")
- return_code = True
-
- if is_nonzero_length_file(self.fail_mcl_file):
- # Unclean replay.
- #
- # Save the contents of the fail.mcl file to dig into failures.
-
- assert(return_code != 0)
-
- if return_code == -1:
- print("General fatal error.")
- elif return_code == -2:
- print("Jit failed to initialize.")
- elif return_code == 1:
- print("Compilation failures.")
- elif return_code == 139 and self.coreclr_args != "Windows_NT":
- print("Fatal error, SuperPMI has returned SIG_SEV (segmentation fault).")
- else:
- print("Unknown error code.")
+ if self.coreclr_args.spmi_log_file is not None:
+ flags += [ "-w", self.coreclr_args.spmi_log_file ]
- self.fail_mcl_contents = None
- mcl_lines = []
- with open(self.fail_mcl_file) as file_handle:
- mcl_lines = file_handle.readlines()
- mcl_lines = [item.strip() for item in mcl_lines]
- self.fail_mcl_contents = os.linesep.join(mcl_lines)
- print("Method numbers with compilation failures:")
- print(self.fail_mcl_contents)
+ if self.coreclr_args.altjit:
+ if self.coreclr_args.arch == "arm":
+ flags += [ "-target", "arm" ]
+ elif self.coreclr_args.arch == "arm64":
+ flags += [ "-target", "arm64" ]
- # If there are any .mc files, drop them into artifacts/repro/../*.mc
- mc_files = [os.path.join(temp_location, item) for item in os.listdir(temp_location) if item.endswith(".mc")]
+ # For each MCH file that we are going to replay, do the replay and replay post-processing.
+ #
+ # Consider: currently, we loop over all the steps for each MCH file, including (1) invoke
+ # SuperPMI, (2) process results. It might be better to do (1) for each MCH file, then
+ # process all the results at once. Currently, the results for some processing can be
+ # obscured by the normal run output for subsequent MCH files.
- if len(mc_files) > 0:
- repro_location = create_unique_directory_name(self.coreclr_args.spmi_location, "repro.{}.{}.{}".format(self.coreclr_args.host_os, self.coreclr_args.arch, self.coreclr_args.build_type))
+ # Keep track of any MCH file replay failures
+ files_with_replay_failures = []
- repro_files = []
- for item in mc_files:
- repro_files.append(os.path.join(repro_location, os.path.basename(item)))
- print("Copying {} -> {}".format(item, repro_location))
- shutil.copy2(item, repro_location)
+ for mch_file in self.mch_files:
- print("")
- print("Repro .mc files:")
- print("")
+ logging.info("Running SuperPMI replay of %s", mch_file)
- for item in repro_files:
- print(item)
-
- print("")
-
- print("To run a specific failure (replace .mc filename as needed):")
- print("")
- print("{} {} {} {}{}xxxxx.mc".format(self.superpmi_path, " ".join(altjit_flags), self.jit_path, os.path.sep, repro_location))
- print("")
+ fail_mcl_file = os.path.join(temp_location, os.path.basename(mch_file) + "_fail.mcl")
+ flags += [
+ "-f", fail_mcl_file, # Failing mc List
+ ]
- if not self.coreclr_args.skip_cleanup:
- if os.path.isfile(self.fail_mcl_file):
- os.remove(self.fail_mcl_file)
- self.fail_mcl_file = None
+ command = [self.superpmi_path] + flags + [self.jit_path, mch_file]
+ return_code = run_and_log(command)
+ print_superpmi_failure_code(return_code, self.coreclr_args)
+ if return_code == 0:
+ logging.info("Clean SuperPMI replay")
+ else:
+ files_with_replay_failures.append(mch_file)
+ result = False
+
+ if is_nonzero_length_file(fail_mcl_file):
+ # Unclean replay. Examine the contents of the fail.mcl file to dig into failures.
+ if return_code == 0:
+ logging.warning("Warning: SuperPMI returned a zero exit code, but generated a non-zero-sized mcl file")
+ print_fail_mcl_file_method_numbers(fail_mcl_file)
+ repro_base_command_line = "{} {} {}".format(self.superpmi_path, " ".join(altjit_replay_flags), self.jit_path)
+ save_repro_mc_files(temp_location, self.coreclr_args, repro_base_command_line)
+
+ if not self.coreclr_args.skip_cleanup:
+ if os.path.isfile(fail_mcl_file):
+ os.remove(fail_mcl_file)
+ fail_mcl_file = None
+ ################################################################################################ end of for mch_file in self.mch_files
+
+ logging.info("Replay summary:")
+
+ if len(files_with_replay_failures) == 0:
+ logging.info(" All replays clean")
+ else:
+ logging.info(" Replay failures in %s MCH files:", len(files_with_replay_failures))
+ for file in files_with_replay_failures:
+ logging.info(" %s", file)
- return return_code
+ return result
################################################################################
# SuperPMI Replay/AsmDiffs
################################################################################
+
class SuperPMIReplayAsmDiffs:
""" SuperPMI Replay AsmDiffs class
@@ -969,36 +1169,36 @@ class SuperPMIReplayAsmDiffs:
instance of the class and doing diffs using the two passed jits.
"""
- def __init__(self, coreclr_args, mch_file, base_jit_path, diff_jit_path):
+ def __init__(self, coreclr_args, mch_files, base_jit_path, diff_jit_path):
""" Constructor
Args:
coreclr_args (CoreclrArguments) : parsed args
- mch_file (str) : MCH file to replay
- base_jit_path (str) : path to baselin clrjit/libclrjit
- diff_jit_path (str) : path to diff clrjit/libclrjit
+ mch_files (list) : list of MCH files to replay
+ base_jit_path (str) : path to baseline clrjit
+ diff_jit_path (str) : path to diff clrjit
"""
self.base_jit_path = base_jit_path
self.diff_jit_path = diff_jit_path
- self.mch_file = mch_file
- self.superpmi_path = os.path.join(coreclr_args.core_root, determine_superpmi_tool_name(coreclr_args))
-
+ self.mch_files = mch_files
+ self.superpmi_path = determine_superpmi_tool_path(coreclr_args)
self.coreclr_args = coreclr_args
+ self.diff_mcl_contents = None
############################################################################
# Instance Methods
############################################################################
def replay_with_asm_diffs(self):
- """ Replay the given SuperPMI collection
+ """ Replay the given SuperPMI collection, generating asm diffs
Returns:
- sucessful_replay (bool)
+ (bool) True on success; False otherwise
"""
- return_code = False
+ result = True # Assume success
# Possible return codes from SuperPMI
#
@@ -1008,504 +1208,414 @@ def replay_with_asm_diffs(self):
# 1 : there were compilation failures
# 2 : there were assembly diffs
- with TempDir(self.coreclr_args.previous_temp_location) as temp_location:
- print("")
- print("Temp Location: {}".format(temp_location))
- print("")
-
- self.fail_mcl_file = os.path.join(temp_location, "fail.mcl")
- self.diff_mcl_file = os.path.join(temp_location, "diff.mcl")
-
- if self.coreclr_args.previous_temp_location is None:
-
- flags = [
- "-a", # Asm diffs
- "-f", # Failing mc List
- self.fail_mcl_file,
- "-diffMCList", # Create all of the diffs in an mcl file
- self.diff_mcl_file,
- "-r", # Repro name, create .mc repro files
- os.path.join(temp_location, "repro")
- ]
-
- altjit_string = "*" if self.coreclr_args.altjit else ""
- altjit_flags = [
- "-jitoption", "force", "AltJit=" + altjit_string,
- "-jitoption", "force", "AltJitNgen=" + altjit_string,
- "-jit2option", "force", "AltJit=" + altjit_string,
- "-jit2option", "force", "AltJitNgen=" + altjit_string
- ]
- flags += altjit_flags
-
- if not self.coreclr_args.sequential:
- flags += [
- "-p" # parallel
- ]
-
- if self.coreclr_args.break_on_assert:
- flags += [
- "-boa" # break on assert
- ]
-
- if self.coreclr_args.break_on_error:
- flags += [
- "-boe" # break on error
- ]
-
- if self.coreclr_args.log_file != None:
- flags += [
- "-w",
- self.coreclr_args.log_file
- ]
-
- if not self.coreclr_args.diff_with_code_only:
- # Change the working directory to the core root we will call SuperPMI from.
- # This is done to allow libcoredistools to be loaded correctly on unix
- # as the loadlibrary path will be relative to the current directory.
- with ChangeDir(self.coreclr_args.core_root) as dir:
- command = [self.superpmi_path] + flags + [self.base_jit_path, self.diff_jit_path, self.mch_file]
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
- proc.communicate()
- return_code = proc.returncode
- if return_code == 0:
- print("Clean SuperPMI replay")
- else:
- return_code = 2
- else:
- return_code = 1;
-
- if is_nonzero_length_file(self.fail_mcl_file):
- # Unclean replay.
- #
- # Save the contents of the fail.mcl file to dig into failures.
-
- assert(return_code != 0)
-
- if return_code == -1:
- print("General fatal error.")
- elif return_code == -2:
- print("Jit failed to initialize.")
- elif return_code == 1:
- print("Compilation failures.")
- elif return_code == 139 and self.coreclr_args != "Windows_NT":
- print("Fatal error, SuperPMI has returned SIG_SEV (segmentation fault).")
- else:
- print("Unknown error code.")
-
- self.fail_mcl_contents = None
- mcl_lines = []
- with open(self.fail_mcl_file) as file_handle:
- mcl_lines = file_handle.readlines()
- mcl_lines = [item.strip() for item in mcl_lines]
- self.fail_mcl_contents = os.linesep.join(mcl_lines)
- print("Method numbers with compilation failures:")
- print(self.fail_mcl_contents)
-
- # If there are any .mc files, drop them into artifacts/repro/../*.mc
- mc_files = [os.path.join(temp_location, item) for item in os.listdir(temp_location) if item.endswith(".mc")]
-
- if len(mc_files) > 0:
- repro_location = create_unique_directory_name(self.coreclr_args.spmi_location, "repro.{}.{}.{}".format(self.coreclr_args.host_os, self.coreclr_args.arch, self.coreclr_args.build_type))
-
- repro_files = []
- for item in mc_files:
- repro_files.append(os.path.join(repro_location, os.path.basename(item)))
- print("Copying {} -> {}".format(item, repro_location))
- shutil.copy2(item, repro_location)
-
- print("")
- print("Repro .mc files:")
- print("")
-
- for item in repro_files:
- print(item)
-
- print("")
-
- print("To run a specific failure (replace JIT path and .mc filename as needed):")
- print("")
- print("{} {} {} {}{}xxxxx.mc".format(self.superpmi_path, " ".join(altjit_flags), self.diff_jit_path, os.path.sep, repro_location))
- print("")
-
- # There were diffs. Go through each method that created diffs and
- # create a base/diff asm file with diffable asm. In addition, create
- # a standalone .mc for easy iteration.
- if is_nonzero_length_file(self.diff_mcl_file) or self.coreclr_args.diff_with_code_only:
- # AsmDiffs.
- #
- # Save the contents of the fail.mcl file to dig into failures.
-
- assert(return_code != 0)
-
- if return_code == -1:
- print("General fatal error.")
- elif return_code == -2:
- print("Jit failed to initialize.")
- elif return_code == 1:
- print("Compilation failures.")
- elif return_code == 139 and self.coreclr_args != "Windows_NT":
- print("Fatal error, SuperPMI has returned SIG_SEV (segmentation fault).")
- elif return_code == 2:
- print("Asm diffs found.")
+ # Set up some settings we'll use below.
+
+ asm_complus_vars = {
+ "COMPlus_JitDisasm": "*",
+ "COMPlus_JitUnwindDump": "*",
+ "COMPlus_JitEHDump": "*",
+ "COMPlus_NgenDisasm": "*",
+ "COMPlus_NgenUnwindDump": "*",
+ "COMPlus_NgenEHDump": "*",
+ "COMPlus_JitDiffableDasm": "1",
+ "COMPlus_JitEnableNoWayAssert": "1",
+ "COMPlus_JitNoForceFallback": "1",
+ "COMPlus_JitRequired": "1",
+ "COMPlus_TieredCompilation": "0" }
+
+ jit_dump_complus_vars = {
+ "COMPlus_JitDisasm": "*",
+ "COMPlus_JitUnwindDump": "*",
+ "COMPlus_JitEHDump": "*",
+ "COMPlus_NgenDisasm": "*",
+ "COMPlus_NgenUnwindDump": "*",
+ "COMPlus_NgenEHDump": "*",
+ "COMPlus_JitDiffableDasm": "1",
+ "COMPlus_JitEnableNoWayAssert": "1",
+ "COMPlus_JitNoForceFallback": "1",
+ "COMPlus_JitRequired": "1",
+ "COMPlus_TieredCompilation": "0",
+ "COMPlus_JitDump": "*",
+ "COMPlus_NgenDump": "*" }
+
+ altjit_string = "*" if self.coreclr_args.altjit else ""
+
+ altjit_asm_diffs_flags = [
+ "-jitoption", "force", "AltJit=" + altjit_string,
+ "-jitoption", "force", "AltJitNgen=" + altjit_string,
+ "-jitoption", "force", "EnableExtraSuperPmiQueries=0",
+ "-jit2option", "force", "AltJit=" + altjit_string,
+ "-jit2option", "force", "AltJitNgen=" + altjit_string,
+ "-jit2option", "force", "EnableExtraSuperPmiQueries=0"
+ ]
+
+ altjit_replay_flags = [
+ "-jitoption", "force", "AltJit=" + altjit_string,
+ "-jitoption", "force", "AltJitNgen=" + altjit_string,
+ "-jitoption", "force", "EnableExtraSuperPmiQueries=0"
+ ]
+
+ # Keep track if any MCH file replay had asm diffs
+ files_with_asm_diffs = []
+ files_with_replay_failures = []
+
+ with TempDir(self.coreclr_args.temp_dir) as temp_location:
+ logging.debug("")
+ logging.debug("Temp Location: %s", temp_location)
+ logging.debug("")
+
+ # For each MCH file that we are going to replay, do the replay and replay post-processing.
+ #
+ # Consider: currently, we loop over all the steps for each MCH file, including (1) invoke
+ # SuperPMI, (2) process results. It might be better to do (1) for each MCH file, then
+ # process all the results at once. Currently, the results for some processing can be
+ # obscured by the normal run output for subsequent MCH files.
+
+ for mch_file in self.mch_files:
+
+ logging.info("Running asm diffs of %s", mch_file)
+
+ fail_mcl_file = os.path.join(temp_location, os.path.basename(mch_file) + "_fail.mcl")
+ diff_mcl_file = os.path.join(temp_location, os.path.basename(mch_file) + "_diff.mcl")
+
+ # If the user passed -temp_dir or --diff_with_code_only, we skip the SuperPMI replay process,
+ # and rely on what we find from a previous run.
+ if self.coreclr_args.temp_dir is not None or self.coreclr_args.diff_with_code_only:
+ return_code = 1
else:
- print("Unknown error code.")
-
- if not self.coreclr_args.diff_with_code_only:
- self.diff_mcl_contents = None
- with open(self.diff_mcl_file) as file_handle:
- mcl_lines = file_handle.readlines()
- mcl_lines = [item.strip() for item in mcl_lines]
- self.diff_mcl_contents = mcl_lines
-
- bin_asm_location = create_unique_directory_name(self.coreclr_args.spmi_location, "asm.{}.{}.{}".format(self.coreclr_args.host_os, self.coreclr_args.arch, self.coreclr_args.build_type))
- base_asm_location = os.path.join(bin_asm_location, "base")
- diff_asm_location = os.path.join(bin_asm_location, "diff")
-
- if not self.coreclr_args.diff_with_code_only:
- # Create a diff and baseline directory
- assert(not os.path.isdir(base_asm_location))
- assert(not os.path.isdir(diff_asm_location))
-
- os.makedirs(base_asm_location)
- os.makedirs(diff_asm_location)
-
- if self.coreclr_args.diff_jit_dump:
- # Create a diff and baseline directory for jit_dumps
- bin_dump_location = create_unique_directory_name(self.coreclr_args.spmi_location, "jitdump.{}.{}.{}".format(self.coreclr_args.host_os, self.coreclr_args.arch, self.coreclr_args.build_type))
- base_dump_location = os.path.join(bin_dump_location, "base")
- diff_dump_location = os.path.join(bin_dump_location, "diff")
-
- assert(not os.path.isdir(base_dump_location))
- assert(not os.path.isdir(diff_dump_location))
-
- os.makedirs(base_dump_location)
- os.makedirs(diff_dump_location)
-
- text_differences = asyncio.Queue()
- jit_dump_differences = asyncio.Queue()
-
- asm_complus_vars = {
- "COMPlus_JitDisasm": "*",
- "COMPlus_JitUnwindDump": "*",
- "COMPlus_JitEHDump": "*",
- "COMPlus_JitDiffableDasm": "1",
- "COMPlus_NgenDisasm": "*",
- "COMPlus_NgenDump": "*",
- "COMPlus_NgenUnwindDump": "*",
- "COMPlus_NgenEHDump": "*",
- "COMPlus_JitEnableNoWayAssert": "1",
- "COMPlus_JitNoForceFallback": "1",
- "COMPlus_JitRequired": "1",
- "COMPlus_TieredCompilation": "0" }
-
- jit_dump_complus_vars = {
- "COMPlus_JitEnableNoWayAssert": "1",
- "COMPlus_JitNoForceFallback": "1",
- "COMPlus_JitRequired": "1",
- "COMPlus_JitDump": "*" }
-
- altjit_string = "*" if self.coreclr_args.altjit else ""
- altjit_flags = [
- "-jitoption", "force", "AltJit=" + altjit_string,
- "-jitoption", "force", "AltJitNgen=" + altjit_string
- ]
-
- async def create_asm(print_prefix, item, self, text_differences, base_asm_location, diff_asm_location):
- """ Run superpmi over an mc to create dasm for the method.
- """
- # Setup to call SuperPMI for both the diff jit and the base jit
-
flags = [
- "-c",
- item,
- "-v",
- "q" # only log from the jit.
+ "-a", # Asm diffs
+ "-v", "ew", # only display errors and warnings
+ "-f", fail_mcl_file, # Failing mc List
+ "-diffMCList", diff_mcl_file, # Create all of the diffs in an mcl file
+ "-r", os.path.join(temp_location, "repro") # Repro name, create .mc repro files
]
+ flags += altjit_asm_diffs_flags
- flags += altjit_flags
-
- # Add in all the COMPlus variables we need to generate asm.
- os.environ.update(asm_complus_vars)
-
- # Change the working directory to the core root we will call SuperPMI from.
- # This is done to allow libcorcedistools to be loaded correctly on unix
- # as the loadlibrary path will be relative to the current directory.
- with ChangeDir(self.coreclr_args.core_root) as dir:
- # Generate diff and base asm
- base_txt = None
- diff_txt = None
-
- command = [self.superpmi_path] + flags + [self.base_jit_path, self.mch_file]
-
- with open(os.path.join(base_asm_location, "{}.dasm".format(item)), 'w') as file_handle:
- print("{}Invoking: {}".format(print_prefix, " ".join(command)))
- proc = await asyncio.create_subprocess_shell(" ".join(command), stdout=file_handle, stderr=asyncio.subprocess.PIPE)
- await proc.communicate()
-
- with open(os.path.join(base_asm_location, "{}.dasm".format(item)), 'r') as file_handle:
- base_txt = file_handle.read()
-
- command = [self.superpmi_path] + flags + [self.diff_jit_path, self.mch_file]
-
- with open(os.path.join(diff_asm_location, "{}.dasm".format(item)), 'w') as file_handle:
- print("Invoking: ".format(print_prefix) + " ".join(command))
- proc = await asyncio.create_subprocess_shell(" ".join(command), stdout=file_handle, stderr=asyncio.subprocess.PIPE)
- await proc.communicate()
-
- with open(os.path.join(diff_asm_location, "{}.dasm".format(item)), 'r') as file_handle:
- diff_txt = file_handle.read()
-
- # Sanity checks
- assert base_txt != ""
- assert base_txt is not None
+ if not self.coreclr_args.sequential:
+ flags += [ "-p" ]
- assert diff_txt != ""
- assert diff_txt is not None
+ if self.coreclr_args.break_on_assert:
+ flags += [ "-boa" ]
- if base_txt != diff_txt:
- text_differences.put_nowait(item)
+ if self.coreclr_args.break_on_error:
+ flags += [ "-boe" ]
- print("{}Finished. ------------------------------------------------------------------".format(print_prefix))
+ if self.coreclr_args.spmi_log_file is not None:
+ flags += [ "-w", self.coreclr_args.spmi_log_file ]
- async def create_jit_dump(print_prefix, item, self, jit_dump_differences, base_dump_location, diff_dump_location):
- """ Run superpmi over an mc to create dasm for the method.
- """
- # Setup to call SuperPMI for both the diff jit and the base jit
-
- flags = [
- "-c",
- item,
- "-v",
- "q" # only log from the jit.
- ]
+ if self.coreclr_args.altjit:
+ if self.coreclr_args.arch == "arm":
+ flags += [ "-target", "arm" ]
+ elif self.coreclr_args.arch == "arm64":
+ flags += [ "-target", "arm64" ]
- flags += altjit_flags
-
- # Add in all the COMPlus variables we need to generate JitDump.
- os.environ.update(jit_dump_complus_vars)
-
- # Generate jit dumps
- base_txt = None
- diff_txt = None
-
- # Change the working directory to the core root we will call SuperPMI from.
+ # Change the working directory to the Core_Root we will call SuperPMI from.
# This is done to allow libcoredistools to be loaded correctly on unix
# as the loadlibrary path will be relative to the current directory.
- with ChangeDir(self.coreclr_args.core_root) as dir:
-
- command = [self.superpmi_path] + flags + [self.base_jit_path, self.mch_file]
-
- with open(os.path.join(base_dump_location, "{}.txt".format(item)), 'w') as file_handle:
- print("{}Invoking: ".format(print_prefix) + " ".join(command))
- proc = await asyncio.create_subprocess_shell(" ".join(command), stdout=file_handle, stderr=asyncio.subprocess.PIPE)
- await proc.communicate()
-
- with open(os.path.join(base_dump_location, "{}.txt".format(item)), 'r') as file_handle:
- base_txt = file_handle.read()
-
- command = [self.superpmi_path] + flags + [self.diff_jit_path, self.mch_file]
-
- with open(os.path.join(diff_dump_location, "{}.txt".format(item)), 'w') as file_handle:
- print("{}Invoking: ".format(print_prefix) + " ".join(command))
- proc = await asyncio.create_subprocess_shell(" ".join(command), stdout=file_handle, stderr=asyncio.subprocess.PIPE)
- await proc.communicate()
-
- with open(os.path.join(diff_dump_location, "{}.txt".format(item)), 'r') as file_handle:
- diff_txt = file_handle.read()
-
- # Sanity checks
- assert base_txt != ""
- assert base_txt is not None
-
- assert diff_txt != ""
- assert diff_txt is not None
-
- if base_txt != diff_txt:
- jit_dump_differences.put_nowait(item)
-
- if not self.coreclr_args.diff_with_code_only:
- diff_items = []
-
- for item in self.diff_mcl_contents:
- diff_items.append(item)
-
- print("Creating asm files")
- subproc_helper = AsyncSubprocessHelper(diff_items, verbose=True)
- subproc_helper.run_to_completion(create_asm, self, text_differences, base_asm_location, diff_asm_location)
-
- if self.coreclr_args.diff_jit_dump:
- print("Creating JitDump files")
- subproc_helper.run_to_completion(create_jit_dump, self, jit_dump_differences, base_dump_location, diff_dump_location)
-
- else:
- # We have already generated asm under /asm/base and /asm/diff
- for item in os.listdir(base_asm_location):
- base_asm_file = os.path.join(base_asm_location, item)
- diff_asm_file = os.path.join(diff_asm_location, item)
-
- base_txt = None
- diff_txt = None
-
- # Every file should have a diff asm file.
- assert os.path.isfile(diff_asm_file)
-
- with open(base_asm_file) as file_handle:
- base_txt = file_handle.read()
-
- with open(diff_asm_file) as file_handle:
- diff_txt = file_handle.read()
+ with ChangeDir(self.coreclr_args.core_root):
+ command = [self.superpmi_path] + flags + [self.base_jit_path, self.diff_jit_path, mch_file]
+ return_code = run_and_log(command)
+ print_superpmi_failure_code(return_code, self.coreclr_args)
+ if return_code == 0:
+ logging.info("Clean SuperPMI replay")
+ else:
+ files_with_replay_failures.append(mch_file)
+ result = False
+
+ if is_nonzero_length_file(fail_mcl_file):
+ # Unclean replay. Examine the contents of the fail.mcl file to dig into failures.
+ if return_code == 0:
+ logging.warning("Warning: SuperPMI returned a zero exit code, but generated a non-zero-sized mcl file")
+ print_fail_mcl_file_method_numbers(fail_mcl_file)
+ repro_base_command_line = "{} {} {}".format(self.superpmi_path, " ".join(altjit_asm_diffs_flags), self.diff_jit_path)
+ save_repro_mc_files(temp_location, self.coreclr_args, repro_base_command_line)
+
+ # There were diffs. Go through each method that created diffs and
+ # create a base/diff asm file with diffable asm. In addition, create
+ # a standalone .mc for easy iteration.
+ if is_nonzero_length_file(diff_mcl_file) or self.coreclr_args.diff_with_code_only:
+ # AsmDiffs. Save the contents of the fail.mcl file to dig into failures.
+
+ if return_code == 0:
+ logging.warning("Warning: SuperPMI returned a zero exit code, but generated a non-zero-sized mcl file")
+
+ # This file had asm diffs; keep track of that.
+ files_with_asm_diffs.append(mch_file)
+
+ if not self.coreclr_args.diff_with_code_only:
+ self.diff_mcl_contents = None
+ with open(diff_mcl_file) as file_handle:
+ mcl_lines = file_handle.readlines()
+ mcl_lines = [item.strip() for item in mcl_lines]
+ self.diff_mcl_contents = mcl_lines
+
+ asm_root_dir = create_unique_directory_name(self.coreclr_args.spmi_location, "asm.{}.{}.{}".format(self.coreclr_args.host_os, self.coreclr_args.arch, self.coreclr_args.build_type))
+ base_asm_location = os.path.join(asm_root_dir, "base")
+ diff_asm_location = os.path.join(asm_root_dir, "diff")
+
+ if not self.coreclr_args.diff_with_code_only:
+ # Create a diff and baseline directory
+ assert not os.path.isdir(base_asm_location)
+ assert not os.path.isdir(diff_asm_location)
+
+ os.makedirs(base_asm_location)
+ os.makedirs(diff_asm_location)
+
+ if self.coreclr_args.diff_jit_dump:
+ # If JIT dumps are requested, create a diff and baseline directory for JIT dumps
+ jitdump_root_dir = create_unique_directory_name(self.coreclr_args.spmi_location, "jitdump.{}.{}.{}".format(self.coreclr_args.host_os, self.coreclr_args.arch, self.coreclr_args.build_type))
+ base_dump_location = os.path.join(jitdump_root_dir, "base")
+ diff_dump_location = os.path.join(jitdump_root_dir, "diff")
+
+ assert not os.path.isdir(base_dump_location)
+ assert not os.path.isdir(diff_dump_location)
+
+ os.makedirs(base_dump_location)
+ os.makedirs(diff_dump_location)
+
+ text_differences = queue.Queue()
+ jit_dump_differences = queue.Queue()
+
+ async def create_replay_artifacts(print_prefix, item, self, mch_file, env_vars, jit_differences_queue, base_location, diff_location, extension):
+ """ Run superpmi over an MC to create JIT asm or JIT dumps for the method.
+ """
+ # Setup flags to call SuperPMI for both the diff jit and the base jit
+
+ flags = [
+ "-c", item,
+ "-v", "q" # only log from the jit.
+ ]
+ flags += altjit_replay_flags
+
+ # Add in all the COMPlus variables we need
+ os.environ.update(env_vars)
+
+ # Change the working directory to the core root we will call SuperPMI from.
+ # This is done to allow libcoredistools to be loaded correctly on unix
+ # as the LoadLibrary path will be relative to the current directory.
+ with ChangeDir(self.coreclr_args.core_root):
+
+ async def create_one_artifact(jit_path: str, location: str) -> str:
+ command = [self.superpmi_path] + flags + [jit_path, mch_file]
+ item_path = os.path.join(location, "{}{}".format(item, extension))
+ with open(item_path, 'w') as file_handle:
+ logging.debug("%sGenerating %s", print_prefix, item_path)
+ logging.debug("%sInvoking: %s", print_prefix, " ".join(command))
+ proc = await asyncio.create_subprocess_shell(" ".join(command), stdout=file_handle, stderr=asyncio.subprocess.PIPE)
+ await proc.communicate()
+ with open(item_path, 'r') as file_handle:
+ generated_txt = file_handle.read()
+ return generated_txt
+
+ # Generate diff and base JIT dumps
+ base_txt = await create_one_artifact(self.base_jit_path, base_location)
+ diff_txt = await create_one_artifact(self.diff_jit_path, diff_location)
- if base_txt != diff_txt:
- text_differences.append(item[:-4])
+ if base_txt != diff_txt:
+ jit_differences_queue.put_nowait(item)
+ ################################################################################################ end of create_replay_artifacts()
+
+ if not self.coreclr_args.diff_with_code_only:
+ diff_items = []
+ for item in self.diff_mcl_contents:
+ diff_items.append(item)
+
+ logging.info("Creating dasm files")
+ subproc_helper = AsyncSubprocessHelper(diff_items, verbose=True)
+ subproc_helper.run_to_completion(create_replay_artifacts, self, mch_file, asm_complus_vars, text_differences, base_asm_location, diff_asm_location, ".dasm")
+
+ if self.coreclr_args.diff_jit_dump:
+ logging.info("Creating JitDump files")
+ subproc_helper.run_to_completion(create_replay_artifacts, self, mch_file, jit_dump_complus_vars, jit_dump_differences, base_dump_location, diff_dump_location, ".txt")
+
+ logging.info("Differences found. To replay SuperPMI use:")
+ logging.info("")
+ for var, value in asm_complus_vars.items():
+ print_platform_specific_environment_vars(logging.INFO, self.coreclr_args, var, value)
+ logging.info("%s %s -c ### %s %s", self.superpmi_path, " ".join(altjit_replay_flags), self.diff_jit_path, mch_file)
+ logging.info("")
+
+ if self.coreclr_args.diff_jit_dump:
+ logging.info("To generate JitDump with SuperPMI use:")
+ logging.info("")
+ for var, value in jit_dump_complus_vars.items():
+ print_platform_specific_environment_vars(logging.INFO, self.coreclr_args, var, value)
+ logging.info("%s %s -c ### %s %s", self.superpmi_path, " ".join(altjit_replay_flags), self.diff_jit_path, mch_file)
+ logging.info("")
+
+ logging.debug("Method numbers with binary differences:")
+ for item in self.diff_mcl_contents:
+ logging.debug(item)
+ logging.debug("")
- if self.coreclr_args.diff_jit_dump:
- for item in os.listdir(base_dump_location):
- base_dump_file = os.path.join(base_dump_location, item)
- diff_dump_file = os.path.join(diff_dump_location, item)
+ else:
+ # This is the `--diff_with_code_only` path.
+ # We have already generated asm under /asm/base and /asm/diff
+ for item in os.listdir(base_asm_location):
+ base_asm_file = os.path.join(base_asm_location, item)
+ diff_asm_file = os.path.join(diff_asm_location, item)
base_txt = None
diff_txt = None
# Every file should have a diff asm file.
- assert os.path.isfile(diff_dump_file)
+ assert os.path.isfile(diff_asm_file)
- with open(base_dump_file) as file_handle:
+ with open(base_asm_file) as file_handle:
base_txt = file_handle.read()
- with open(diff_dump_file) as file_handle:
+ with open(diff_asm_file) as file_handle:
diff_txt = file_handle.read()
if base_txt != diff_txt:
- jit_dump_differences.append(item[:-4])
-
- if not self.coreclr_args.diff_with_code_only:
- print("Differences found. To replay SuperPMI use:")
- print("")
- for var, value in asm_complus_vars.items():
- print_platform_specific_environment_vars(self.coreclr_args, var, value)
- print("{} {} -c ### {} {}".format(self.superpmi_path, " ".join(altjit_flags), self.diff_jit_path, self.mch_file))
- print("")
- if self.coreclr_args.diff_jit_dump:
- print("To generate JitDump with SuperPMI use:")
- print("")
- for var, value in jit_dump_complus_vars.items():
- print_platform_specific_environment_vars(self.coreclr_args, var, value)
- print("{} {} -c ### {} {}".format(self.superpmi_path, " ".join(altjit_flags), self.diff_jit_path, self.mch_file))
- print("")
- print("Method numbers with binary differences:")
- print(self.diff_mcl_contents)
- print("")
-
- try:
- current_text_diff = text_differences.get_nowait()
- except:
- current_text_diff = None
-
- if current_text_diff is not None:
- print("Textual differences found. Asm is located under %s %s" % (base_asm_location, diff_asm_location))
- print("Generate a diff analysis report by building jit-analyze from https://github.com/dotnet/jitutils and running:")
- print(" jit-analyze -r --base %s --diff %s" % (base_asm_location, diff_asm_location))
-
- # Find jit-analyze.bat/sh on PATH, if it exists, then invoke it.
- search_path = os.environ.get("PATH")
- if search_path is not None:
- search_path = search_path.split(";")
- jit_analyze_file = "jit-analyze.bat" if platform.system() == "Windows" else "jit-analyze.sh"
- jit_analyze_path = find_file(jit_analyze_file, search_path)
- if jit_analyze_path is not None:
- # It appears we have a built jit-analyze on the path, so try to run it.
- command = [ jit_analyze_path, "-r", "--base", base_asm_location, "--diff", diff_asm_location ]
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
- proc.communicate()
-
- # Open VS Code on the diffs.
-
- if self.coreclr_args.diff_with_code and not self.coreclr_args.diff_jit_dump_only:
- batch_command = ["cmd", "/c"] if platform.system() == "Windows" else []
- index = 0
- while current_text_diff is not None:
- command = batch_command + [
- "code",
- "-d",
- os.path.join(base_asm_location, "{}.asm".format(item)),
- os.path.join(diff_asm_location, "{}.asm".format(item))
- ]
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
-
- if index > 5:
- break
-
- try:
- current_text_diff = text_differences.get_nowait()
- except:
- current_text_diff = None
- index += 1
-
- print("")
- else:
- print("No textual differences. Is this an issue with libcoredistools?")
-
- try:
- current_jit_dump_diff = jit_dump_differences.get_nowait()
- except:
- current_jit_dump_diff = None
-
- if current_jit_dump_diff is not None:
- print("Textual differences found in JitDump. JitDump is located under %s %s" % (base_dump_location, diff_dump_location))
-
- if self.coreclr_args.diff_with_code:
- batch_command = ["cmd", "/c"] if platform.system() == "Windows" else []
-
- index = 0
- while current_jit_dump_diff is not None:
- command = batch_command + [
- "code",
- "-d",
- os.path.join(base_dump_location, "{}.txt".format(item)),
- os.path.join(diff_dump_location, "{}.txt".format(item))
- ]
- print("Invoking: " + " ".join(command))
- proc = subprocess.Popen(command)
-
- if index > 5:
- break
-
- try:
- current_jit_dump_diff = jit_dump_differences.get_nowait()
- except:
- current_jit_dump_diff = None
-
- index += 1
-
- print("")
-
- if not self.coreclr_args.skip_cleanup:
- if os.path.isfile(self.fail_mcl_file):
- os.remove(self.fail_mcl_file)
- self.fail_mcl_file = None
+ text_differences.put_nowait(item[:-4])
+
+ if self.coreclr_args.diff_jit_dump:
+ for item in os.listdir(base_dump_location):
+ base_dump_file = os.path.join(base_dump_location, item)
+ diff_dump_file = os.path.join(diff_dump_location, item)
+
+ base_txt = None
+ diff_txt = None
+
+ # Every file should have a diff asm file.
+ assert os.path.isfile(diff_dump_file)
+
+ with open(base_dump_file) as file_handle:
+ base_txt = file_handle.read()
+
+ with open(diff_dump_file) as file_handle:
+ diff_txt = file_handle.read()
+
+ if base_txt != diff_txt:
+ jit_dump_differences.put_nowait(item[:-4])
+
+ # Limit the number of diffs we'll show in VS Code.
+ max_vscode_diff_file_display = 3
+
+ try:
+ current_text_diff = text_differences.get_nowait()
+ except:
+ current_text_diff = None
+
+ if current_text_diff is not None:
+ logging.info("Textual differences found. Asm is located under %s %s", base_asm_location, diff_asm_location)
+ logging.info("Generate a diff analysis report by building jit-analyze from https://github.com/dotnet/jitutils and running:")
+ logging.info(" jit-analyze -r --base %s --diff %s", base_asm_location, diff_asm_location)
+
+ # Find jit-analyze.bat/sh on PATH, if it exists, then invoke it.
+ path_var = os.environ.get("PATH")
+ if path_var is not None:
+ jit_analyze_file = "jit-analyze.bat" if platform.system() == "Windows" else "jit-analyze.sh"
+ jit_analyze_path = find_file(jit_analyze_file, path_var.split(";"))
+ if jit_analyze_path is not None:
+ # It appears we have a built jit-analyze on the path, so try to run it.
+ command = [ jit_analyze_path, "-r", "--base", base_asm_location, "--diff", diff_asm_location ]
+ run_and_log(command, logging.INFO)
+
+ if self.coreclr_args.diff_with_code and not self.coreclr_args.diff_jit_dump_only:
+ # Open VS Code on the diffs.
+ batch_command = ["cmd", "/c"] if platform.system() == "Windows" else []
+ index = 1
+ while current_text_diff is not None:
+ command = batch_command + [
+ "code",
+ "-d",
+ os.path.join(base_asm_location, "{}.dasm".format(current_text_diff)),
+ os.path.join(diff_asm_location, "{}.dasm".format(current_text_diff))
+ ]
+ run_and_log(command)
+
+ if index >= max_vscode_diff_file_display:
+ break
+
+ try:
+ current_text_diff = text_differences.get_nowait()
+ except:
+ current_text_diff = None
+ index += 1
+ else:
+ logging.warning("No textual differences. Is this an issue with coredistools?")
+
+ try:
+ current_jit_dump_diff = jit_dump_differences.get_nowait()
+ except:
+ current_jit_dump_diff = None
+
+ if current_jit_dump_diff is not None:
+ logging.info("Textual differences found in JitDump. JitDump is located under %s %s", base_dump_location, diff_dump_location)
+
+ if self.coreclr_args.diff_with_code:
+ # Open VS Code on the diffs. Only do this for the first 6.
+ batch_command = ["cmd", "/c"] if platform.system() == "Windows" else []
+ index = 1
+ while current_jit_dump_diff is not None:
+ command = batch_command + [
+ "code",
+ "-d",
+ os.path.join(base_dump_location, "{}.txt".format(current_jit_dump_diff)),
+ os.path.join(diff_dump_location, "{}.txt".format(current_jit_dump_diff))
+ ]
+ run_and_log(command)
+
+ if index >= max_vscode_diff_file_display:
+ break
+
+ try:
+ current_jit_dump_diff = jit_dump_differences.get_nowait()
+ except:
+ current_jit_dump_diff = None
+ index += 1
+ ################################################################################################ end of processing asm diffs (if is_nonzero_length_file(diff_mcl_file)...
+
+ if not self.coreclr_args.skip_cleanup:
+ if os.path.isfile(fail_mcl_file):
+ os.remove(fail_mcl_file)
+ fail_mcl_file = None
+
+ ################################################################################################ end of for mch_file in self.mch_files
+
+ logging.info("Asm diffs summary:")
+
+ if len(files_with_replay_failures) != 0:
+ logging.info(" Replay failures in %s MCH files:", len(files_with_replay_failures))
+ for file in files_with_replay_failures:
+ logging.info(" %s", file)
+
+ if len(files_with_asm_diffs) == 0:
+ logging.info(" No asm diffs")
+ else:
+ logging.info(" Asm diffs in %s MCH files:", len(files_with_asm_diffs))
+ for file in files_with_asm_diffs:
+ logging.info(" %s", file)
- return return_code
+ return result
+ ################################################################################################ end of replay_with_asm_diffs()
################################################################################
-# Helper Methods
+# Argument handling helpers
################################################################################
+
def determine_coredis_tools(coreclr_args):
- """ Determine the coredistools location
+ """ Determine the coredistools location. First, look in Core_Root. It will be there if
+ the setup-stress-dependencies.cmd/sh script has been run, which is typically only
+ if tests have been run. If unable to find coredistools, download it from a cached
+ copy in the CLRJIT Azure Storage. (Ideally, we would instead download the NuGet
+ package and extract it using the same mechanism as setup-stress-dependencies
+ instead of having our own copy in Azure Storage).
Args:
coreclr_args (CoreclrArguments) : parsed args
Returns:
- coredistools_location (str) : path of libcoredistools.dylib|so|dll
-
- Notes:
- If unable to find libcoredis tools, download it from azure storage.
+ coredistools_location (str) : path of [lib]coredistools.dylib|so|dll
"""
+ if not hasattr(coreclr_args, "core_root") or coreclr_args.core_root is None:
+ raise RuntimeError("Core_Root not set properly")
+
coredistools_dll_name = None
if coreclr_args.host_os.lower() == "osx":
coredistools_dll_name = "libcoredistools.dylib"
@@ -1514,83 +1624,81 @@ def determine_coredis_tools(coreclr_args):
elif coreclr_args.host_os.lower() == "windows_nt":
coredistools_dll_name = "coredistools.dll"
else:
- raise RuntimeError("Unknown host os: {}").format(coreclr_args.host_os)
-
- coredistools_uri = "https://clrjit.blob.core.windows.net/superpmi/libcoredistools/{}-{}/{}".format(coreclr_args.host_os.lower(), coreclr_args.arch.lower(), coredistools_dll_name)
+ raise RuntimeError("Unknown host os: {}".format(coreclr_args.host_os))
coredistools_location = os.path.join(coreclr_args.core_root, coredistools_dll_name)
if os.path.isfile(coredistools_location):
- print("Using coredistools found at {}".format(coredistools_location))
+ logging.info("Using coredistools found at %s", coredistools_location)
else:
- print("Download: {} -> {}".format(coredistools_uri, coredistools_location))
+ # Often, Core_Root will already exist. However, you can do a product build without
+ # creating a Core_Root, and successfully run replay or asm diffs, if we just create Core_Root
+ # and copy coredistools there. Note that our replays all depend on Core_Root existing, as we
+ # set the current directory to Core_Root before running superpmi.
+ if not os.path.isdir(coreclr_args.core_root):
+ logging.warning("Warning: Core_Root does not exist at \"%s\"; creating it now", coreclr_args.core_root)
+ os.makedirs(coreclr_args.core_root)
+ coredistools_uri = az_blob_storage_superpmi_container_uri + "/libcoredistools/{}-{}/{}".format(coreclr_args.host_os.lower(), coreclr_args.arch.lower(), coredistools_dll_name)
+ logging.info("Download: %s -> %s", coredistools_uri, coredistools_location)
urllib.request.urlretrieve(coredistools_uri, coredistools_location)
assert os.path.isfile(coredistools_location)
return coredistools_location
+
def determine_pmi_location(coreclr_args):
- """ Determine pmi location
+ """ Determine pmi.dll location, using the following steps:
+ First, use the `-pmi_location` argument, if set.
+ Else, look for pmi.dll on the PATH. This will be true if you build jitutils yourself
+ and put the built `bin` directory on your PATH.
+ Else, look for pmi.dll in Core_Root. This is where we cache it if downloaded from Azure Storage
+ Otherwise, download a cached copy from CLRJIT Azure Storage and cache it in Core_Root.
Args:
coreclr_args (CoreclrArguments) : parsed args
Returns:
pmi_location (str) : path of pmi.dll
-
- Notes:
- If unable to find pmi.dll, download it from Azure storage.
-
- TODO: look for pmi.dll on PATH?
"""
if coreclr_args.pmi_location is not None:
pmi_location = os.path.abspath(coreclr_args.pmi_location)
if not os.path.isfile(pmi_location):
raise RuntimeError("PMI not found at {}".format(pmi_location))
- print("Using PMI at {}".format(pmi_location))
+ logging.info("Using PMI at %s", pmi_location)
else:
- pmi_dll_name = "pmi.dll"
- pmi_uri = "https://clrjit.blob.core.windows.net/superpmi/pmi/pmi.dll"
- pmi_location = os.path.join(coreclr_args.core_root, pmi_dll_name)
- if os.path.isfile(pmi_location):
- print("Using PMI found at {}".format(pmi_location))
+ path_var = os.environ.get("PATH")
+ pmi_location = find_file("pmi.dll", path_var.split(";")) if path_var is not None else None
+ if pmi_location is not None:
+ logging.info("Using PMI found on PATH at %s", pmi_location)
else:
- print("Download: {} -> {}".format(pmi_uri, pmi_location))
- urllib.request.urlretrieve(pmi_uri, pmi_location)
+ pmi_location = os.path.join(coreclr_args.core_root, "pmi.dll")
+ if os.path.isfile(pmi_location):
+ logging.info("Using PMI found at %s", pmi_location)
+ else:
+ pmi_uri = az_blob_storage_superpmi_container_uri + "/pmi/pmi.dll"
+ logging.info("Download: %s -> %s", pmi_uri, pmi_location)
+ urllib.request.urlretrieve(pmi_uri, pmi_location)
assert os.path.isfile(pmi_location)
return pmi_location
-def determine_remote_mch_location(coreclr_args):
- """ Determine where the azure storage location for the mch files is
-
- Args:
- coreclr_args (CoreclrArguments): parsed_args
-
- Returns:
- mch_remote_uri (str): uri for the mch files
-
- """
-
- location = "https://clrjit.blob.core.windows.net/superpmi/{}/{}/{}/".format(coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type)
-
- return location
def determine_jit_name(coreclr_args):
- """ Determine the jit based on the os
+ """ Determine the jit based on the OS. If "-altjit" is specified, then use the specified altjit.
+ This function is called for cases where the "-altjit" flag is not used, so be careful not
+ to depend on the "altjit" attribute existing.
Args:
coreclr_args (CoreclrArguments): parsed args
Return:
- jit_name(str) : name of the jit for this os
+ jit_name(str) : name of the jit for this OS
"""
- jit_base_name = "clrjit"
- if isinstance(coreclr_args.altjit, str):
- jit_base_name = coreclr_args.altjit
- elif coreclr_args.altjit == True:
- jit_base_name = "protononjit"
+ # If `-altjit` is used, it must be given a full filename, not just a "base name", so use it without additional processing.
+ if hasattr(coreclr_args, "altjit") and coreclr_args.altjit is not None:
+ return coreclr_args.altjit
+ jit_base_name = "clrjit"
if coreclr_args.host_os == "OSX":
return "lib" + jit_base_name + ".dylib"
elif coreclr_args.host_os == "Linux":
@@ -1600,6 +1708,48 @@ def determine_jit_name(coreclr_args):
else:
raise RuntimeError("Unknown OS.")
+
+def find_tool(coreclr_args, tool_name, search_core_root=True, search_product_location=True, search_path=True):
+ """ Find a tool or any specified file (e.g., clrjit.dll) and return the full path to that tool if found.
+
+ Args:
+ coreclr_args (CoreclrArguments): parsed args
+ tool_name (str): tool to find, e.g., "superpmi.exe"
+ search_core_root (bool): True to search the Core_Root folder
+ search_product_location: True to search the build product folder
+ search_path: True to search along the PATH
+
+ Return:
+ (str) Full path of the tool, or None if not found.
+ """
+
+ # First, look in Core_Root, if there is one.
+ if search_core_root and hasattr(coreclr_args, "core_root") and coreclr_args.core_root is not None and os.path.isdir(coreclr_args.core_root):
+ tool_path = os.path.join(coreclr_args.core_root, tool_name)
+ if os.path.isfile(tool_path):
+ logging.debug("Using %s from Core_Root: %s", tool_name, tool_path)
+ return tool_path
+
+ # Next, look in the built product directory, if it exists. We can use superpmi/mcs directly from the
+ # product build directory instead from Core_Root because they don't depend on managed code libraries.
+ if search_product_location and hasattr(coreclr_args, "product_location") and coreclr_args.product_location is not None and os.path.isdir(coreclr_args.product_location):
+ tool_path = os.path.join(coreclr_args.product_location, tool_name)
+ if os.path.isfile(tool_path):
+ logging.debug("Using %s from product build location: %s", tool_name, tool_path)
+ return tool_path
+
+ # Finally, look on the PATH
+ if search_path:
+ path_var = os.environ.get("PATH")
+ if path_var is not None:
+ tool_path = find_file(tool_name, path_var.split(";"))
+ if tool_path is not None:
+ logging.debug("Using %s from PATH: %s", tool_name, tool_path)
+ return tool_path
+
+ raise RuntimeError("Tool " + tool_name + " not found. Have you built the runtime repo and created a Core_Root, or put it on your PATH?")
+
+
def determine_superpmi_tool_name(coreclr_args):
""" Determine the superpmi tool name based on the OS
@@ -1607,19 +1757,124 @@ def determine_superpmi_tool_name(coreclr_args):
coreclr_args (CoreclrArguments): parsed args
Return:
- superpmi_tool_name(str) : name of the jit for this OS
+ (str) Name of the superpmi tool to use
"""
- if coreclr_args.host_os == "OSX":
- return "superpmi"
- elif coreclr_args.host_os == "Linux":
+ if coreclr_args.host_os == "OSX" or coreclr_args.host_os == "Linux":
return "superpmi"
elif coreclr_args.host_os == "Windows_NT":
return "superpmi.exe"
else:
raise RuntimeError("Unknown OS.")
-def print_platform_specific_environment_vars(coreclr_args, var, value):
+
+def determine_superpmi_tool_path(coreclr_args):
+ """ Determine the superpmi tool full path
+
+ Args:
+ coreclr_args (CoreclrArguments): parsed args
+
+ Return:
+ (str) Path of the superpmi tool to use
+ """
+
+ superpmi_tool_name = determine_superpmi_tool_name(coreclr_args)
+ return find_tool(coreclr_args, superpmi_tool_name)
+
+
+def determine_mcs_tool_name(coreclr_args):
+ """ Determine the mcs tool name based on the OS
+
+ Args:
+ coreclr_args (CoreclrArguments): parsed args
+
+ Return:
+ (str) Name of the mcs tool to use
+ """
+
+ if coreclr_args.host_os == "OSX" or coreclr_args.host_os == "Linux":
+ return "mcs"
+ elif coreclr_args.host_os == "Windows_NT":
+ return "mcs.exe"
+ else:
+ raise RuntimeError("Unsupported OS.")
+
+
+def determine_mcs_tool_path(coreclr_args):
+ """ Determine the mcs tool full path
+
+ Args:
+ coreclr_args (CoreclrArguments): parsed args
+
+ Return:
+ (str) Path of the mcs tool to use
+ """
+
+ mcs_tool_name = determine_mcs_tool_name(coreclr_args)
+ return find_tool(coreclr_args, mcs_tool_name)
+
+
+def determine_jit_ee_version(coreclr_args):
+ """ Determine the JIT-EE version to use.
+
+ The JIT-EE version is used for determining which MCH files to download and use. It is determined as follows:
+ 1. Try to parse it out of the source code. If we can find src\\coreclr\\src\\inc\\corinfo.h in the source
+ tree (and we're already assuming we can find the repo root from the relative path of this script),
+ then the JIT-EE version lives in corinfo.h as follows:
+
+ constexpr GUID JITEEVersionIdentifier = { /* a5eec3a4-4176-43a7-8c2b-a05b551d4f49 */
+ 0xa5eec3a4,
+ 0x4176,
+ 0x43a7,
+ {0x8c, 0x2b, 0xa0, 0x5b, 0x55, 0x1d, 0x4f, 0x49}
+ };
+
+ We want the string between the /* */ comments.
+ 2. Find the mcs tool and run "mcs -printJITEEVersion".
+ 3. Otherwise, just use "unknown-jit-ee-version", which will probably cause downstream failures.
+
+ NOTE: When using mcs, we need to run the tool. So we need a version that will run. If a user specifies
+ an "-arch" argument that creates a Core_Root path that won't run, like an arm32 Core_Root on an
+ x64 machine, this won't work. This could happen if doing "upload" or "list-collections" on
+ collections from a machine that didn't create the native collections. We should create a "native"
+ Core_Root and use that in case there are "cross-arch" scenarios.
+
+ Args:
+ coreclr_args (CoreclrArguments): parsed args
+
+ Return:
+ (str) The JIT-EE version to use
+ """
+
+ corinfo_h_path = os.path.join(coreclr_args.coreclr_dir, "src", "inc", "corinfo.h")
+ if os.path.isfile(corinfo_h_path):
+ # The string is near the beginning of the somewhat large file, so just read a line at a time when searching.
+ with open(corinfo_h_path, 'r') as file_handle:
+ for line in file_handle:
+ match_obj = re.search(r'JITEEVersionIdentifier *= *{ */\* *([^ ]*) *\*/', line)
+ if match_obj is not None:
+ corinfo_h_jit_ee_version = match_obj.group(1)
+ logging.info("Using JIT/EE Version from corinfo.h: %s", corinfo_h_jit_ee_version)
+ return corinfo_h_jit_ee_version
+ logging.warning("Warning: couldn't find JITEEVersionIdentifier in %s; is the file corrupt?", corinfo_h_path)
+
+ mcs_path = determine_mcs_tool_path(coreclr_args)
+ command = [mcs_path, "-printJITEEVersion"]
+ proc = subprocess.Popen(command, stdout=subprocess.PIPE)
+ stdout_jit_ee_version, _ = proc.communicate()
+ return_code = proc.returncode
+ if return_code == 0:
+ mcs_jit_ee_version = stdout_jit_ee_version.decode('utf-8').strip()
+ logging.info("Using JIT/EE Version from mcs: %s", mcs_jit_ee_version)
+ return mcs_jit_ee_version
+
+ # Otherwise, use the default "unknown" version.
+ default_jit_ee_version = "unknown-jit-ee-version"
+ logging.info("Using default JIT/EE Version: %s", default_jit_ee_version)
+ return default_jit_ee_version
+
+
+def print_platform_specific_environment_vars(loglevel, coreclr_args, var, value):
""" Print environment variables as set {}={} or export {}={}
Args:
@@ -1629,195 +1884,648 @@ def print_platform_specific_environment_vars(coreclr_args, var, value):
"""
if coreclr_args.host_os == "Windows_NT":
- print("set {}={}".format(var, value))
+ logging.log(loglevel, "set %s=%s", var, value)
else:
- print("export {}={}".format(var, value))
+ logging.log(loglevel, "export %s=%s", var, value)
-def list_superpmi_container_via_rest_api(coreclr_args, filter=lambda unused: True):
- """ List the superpmi using the azure storage rest api
+
+def list_superpmi_collections_container_via_rest_api(url_filter=lambda unused: True):
+ """ List the superpmi collections using the Azure Storage REST api
Args:
- filter (lambda: string): filter to apply to the list
+ url_filter (lambda: string -> bool): filter to apply to the list. The filter takes a URL and returns True if this URL is acceptable.
+
+ Returns:
+ urls (list): set of collection URLs in Azure Storage that match the filter.
Notes:
- This method does not require installing the azure storage python
- package.
+ This method does not require installing the Azure Storage python package.
"""
- list_superpmi_container_uri = "https://clrjit.blob.core.windows.net/superpmi?restype=container&comp=list"
+ # This URI will return *all* the blobs, for all jit-ee-version/OS/architecture combinations.
+ # pass "prefix=foo/bar/..." to only show a subset. Or, we can filter later using string search.
+ list_superpmi_container_uri = az_blob_storage_superpmi_container_uri + "?restype=container&comp=list&prefix=" + az_collections_root_folder + "/"
+
+ try:
+ contents = urllib.request.urlopen(list_superpmi_container_uri).read().decode('utf-8')
+ except Exception as exception:
+ logging.error("Didn't find any collections using %s", list_superpmi_container_uri)
+ logging.error(" Error: %s", exception)
+ return None
+
+ # Contents is an XML file with contents like:
+ #
+ #
+ #
+ #
+ # jit-ee-guid/Linux/x64/Linux.x64.Checked.frameworks.mch.zip
+ # https://clrjit.blob.core.windows.net/superpmi/jit-ee-guid/Linux/x64/Linux.x64.Checked.frameworks.mch.zip
+ #
+ # ...
+ #
+ #
+ #
+ # jit-ee-guid/Linux/x64/Linux.x64.Checked.mch.zip
+ # https://clrjit.blob.core.windows.net/superpmi/jit-ee-guid/Linux/x64/Linux.x64.Checked.mch.zip
+ # ... etc. ...
+ #
+ #
+ #
+ # We just want to extract the entries. We could probably use an XML parsing package, but we just
+ # use regular expressions.
- contents = urllib.request.urlopen(list_superpmi_container_uri).read().decode('utf-8')
urls_split = contents.split("")[1:]
urls = []
for item in urls_split:
url = item.split("")[0].strip()
-
- if "{}/{}/{}".format(coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type) in url and filter(url):
+ if url_filter(url):
urls.append(url)
return urls
-def download_index(coreclr_args):
- """ Download the index.json for the collection.
+
+def process_mch_files_arg(coreclr_args):
+ """ Process the -mch_files argument. If the argument is empty, then download files from Azure Storage.
+ If the argument is non-empty, check it for UNC paths and download/cache those files, replacing
+ them with a reference to the newly cached local paths (this is on Windows only).
Args:
coreclr_args (CoreclrArguments): parsed args
- Notes:
- The index.json file includes a dictionary of all of the different
- collections that were done.
-
- The index.json file is a simply a dictionary mapping the a name of a
- collection to the file name that will be stored on disk.
+ Returns:
+ nothing
- Example:
+ coreclr_args.mch_files is updated
- {
- "frameworks": "Windows_NT.x64.Checked.frameworks.mch",
- "default": "Windows_NT.x64.Checked.mch",
- "tests": "Windows_NT.x64.Checked.tests.mch"
- }
"""
- urls = list_superpmi_container_via_rest_api(coreclr_args, lambda url: "index.json" in url)
+ if coreclr_args.mch_files is None:
+ coreclr_args.mch_files = download_mch(coreclr_args, include_baseline_jit=True)
+ return
- if len(urls) == 0:
- print("Didn't find any index.json for the specified configuration.")
- sys.exit(1)
- elif len(urls) > 1:
- print("Error: found {} index.json files (expected 1).".format(len(urls)))
- sys.exit(1)
+ # Create the cache location. Note that we'll create it even if we end up not copying anything.
+ default_mch_root_dir = os.path.join(coreclr_args.spmi_location, "mch")
+ default_mch_dir = os.path.join(default_mch_root_dir, "{}.{}.{}".format(coreclr_args.jit_ee_version, coreclr_args.host_os, coreclr_args.arch))
+ if not os.path.isdir(default_mch_dir):
+ os.makedirs(default_mch_dir)
- json_string = urllib.request.urlopen(urls[0]).read().decode('utf-8')
+ # Process the mch_files list. Download and cache UNC and HTTP files.
+ urls = []
+ local_mch_files = []
+ for item in coreclr_args.mch_files:
+ # On Windows only, see if any of the mch_files are UNC paths (i.e., "\\server\share\...").
+ # If so, download and cache all the files found there to our usual local cache location, to avoid future network access.
+ if coreclr_args.host_os == "Windows_NT" and item.startswith("\\\\"):
+ # Special case: if the user specifies a .mch file, we'll also look for and cache a .mch.mct file next to it, if one exists.
+ # This happens naturally if a directory is passed and we search for all .mch and .mct files in that directory.
+ mch_file = os.path.abspath(item)
+ if os.path.isfile(mch_file) and mch_file.endswith(".mch"):
+ files = [ mch_file ]
+ mct_file = mch_file + ".mct"
+ if os.path.isfile(mct_file):
+ files.append(mct_file)
+ else:
+ files = get_files_from_path(mch_file, match_func=lambda path: any(path.endswith(extension) for extension in [".mch", ".mct"]))
+
+ for file in files:
+ # Download file to cache, and report that as the file to use.
+ cache_file = os.path.join(default_mch_dir, os.path.basename(file))
+ logging.info("Cache %s => %s", file, cache_file)
+ local_mch_file = shutil.copy2(file, cache_file)
+ local_mch_files.append(local_mch_file)
+ elif item.lower().startswith("http:") or item.lower().startswith("https:"): # probably could use urllib.parse to be more precise
+ urls.append(item)
+ else:
+ # Doesn't appear to be a UNC path (on Windows) or a URL, so just use it as-is.
+ local_mch_files.append(item)
- json_obj = json.loads(json_string)
- return json_obj
+ # Download all the urls at once, and add the local cache filenames to our accumulated list of local file names.
+ if len(urls) != 0:
+ local_mch_files += download_urls(urls, default_mch_dir)
-def download_mch(coreclr_args, specific_mch=None, include_baseline_jit=False):
- """ Download the mch files
+ # Special case: walk the URLs list list and for every ".mch" or ".mch.zip" file, check to see that either the associated ".mct" file is already
+ # in the list, or add it to a new list to attempt to download (but don't fail the download if it doesn't exist).
+ mct_urls = []
+ for url in urls:
+ if url.endswith(".mch") or url.endswith(".mch.zip"):
+ mct_url = url.replace(".mch", ".mch.mct")
+ if mct_url not in urls:
+ mct_urls.append(mct_url)
+ if len(mct_urls) != 0:
+ local_mch_files += download_urls(mct_urls, default_mch_dir, fail_if_not_found=False)
+
+ coreclr_args.mch_files = local_mch_files
+
+
+def download_mch(coreclr_args, include_baseline_jit=False):
+ """ Download the mch files. This can be called to re-download files and
+ overwrite them in the target location.
Args:
coreclr_args (CoreclrArguments): parsed args
- specific_mch (str): Download a specific mch file
- include_baseline_jit (bool): include downloading the baseline jit
+ include_baseline_jit (bool): If True, also download the baseline jit
Returns:
- index (defaultdict(lambda: None)): collection type -> name
+ list containing the directory to which the files were downloaded
"""
- urls = list_superpmi_container_via_rest_api(coreclr_args)
- default_mch_dir = os.path.join(coreclr_args.spmi_location, "mch", "{}.{}.{}".format(coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type))
+ default_mch_root_dir = os.path.join(coreclr_args.spmi_location, "mch")
+ default_mch_dir = os.path.join(default_mch_root_dir, "{}.{}.{}".format(coreclr_args.jit_ee_version, coreclr_args.host_os, coreclr_args.arch))
+
+ if os.path.isdir(default_mch_dir) and not coreclr_args.force_download:
+ # The cache directory is already there, and "--force_download" was passed, so just
+ # assume it's got what we want.
+ # NOTE: a different solution might be to verify that everything we would download is
+ # already in the cache, and simply not download if it is. However, that would
+ # require hitting the network, and currently once you've cached these, you
+ # don't need to do that.
+ logging.info("Found download cache directory \"%s\" and --force_download not set; skipping download", default_mch_dir)
+ return [ default_mch_dir ]
+
+ blob_filter_string = "{}/{}/{}".format(coreclr_args.jit_ee_version, coreclr_args.host_os, coreclr_args.arch)
+ blob_prefix_filter = "{}/{}/{}".format(az_blob_storage_superpmi_container_uri, az_collections_root_folder, blob_filter_string).lower()
+
+ # Determine if a URL in Azure Storage should be allowed. The URL looks like:
+ # https://clrjit.blob.core.windows.net/superpmi/jit-ee-guid/Linux/x64/Linux.x64.Checked.frameworks.mch.zip
+ # Filter to just the current jit-ee-guid, OS, and architecture.
+ # Include both MCH and MCT files as well as the CLR JIT dll (processed below).
+ # If there are filters, only download those matching files.
+ def filter_superpmi_collections(url):
+ url = url.lower()
+ if "clrjit" in url and not include_baseline_jit:
+ return False
+ return url.startswith(blob_prefix_filter) and ((coreclr_args.filter is None) or any((filter_item.lower() in url) for filter_item in coreclr_args.filter))
+
+ urls = list_superpmi_collections_container_via_rest_api(filter_superpmi_collections)
+ if urls is None:
+ return []
+
+ download_urls(urls, default_mch_dir)
+ return [ default_mch_dir ]
+
+
+def download_urls(urls, target_dir, verbose=True, fail_if_not_found=True):
+ """ Download a set of files, specified as URLs, to a target directory.
+ If the URLs are to .ZIP files, then uncompress them and copy all contents
+ to the target directory.
- if not os.path.isdir(default_mch_dir):
- os.makedirs(default_mch_dir)
+ Args:
+ urls (list): the URLs to download
+ target_dir (str): target directory where files are copied. Directory must exist
+ fail_if_not_found (bool): if True, fail if a download fails due to file not found (HTTP error 404).
+ Otherwise, ignore the failure.
- with TempDir() as temp_location:
+ Returns:
+ list of local filenames of downloaded files
+ """
+
+ if verbose:
+ logging.info("Downloading:")
for url in urls:
- temp_location_items = [os.path.join(temp_location, item) for item in os.listdir(temp_location)]
- for item in temp_location_items:
- if os.path.isdir(item):
- shutil.rmtree(item)
- else:
- os.remove(item)
+ logging.info(" %s", url)
- if "clrjit" in url and not include_baseline_jit:
- continue
+ local_files = []
- if "index.json" in url:
- continue
+ # In case we'll need a temp directory for ZIP file processing, create it first.
+ with TempDir() as temp_location:
+ for url in urls:
+ item_name = url.split("/")[-1]
- if specific_mch is not None:
- if specific_mch not in url:
- continue
+ if url.lower().endswith(".zip"):
+ # Delete everything in the temp_location (from previous iterations of this loop, so previous URL downloads).
+ temp_location_items = [os.path.join(temp_location, item) for item in os.listdir(temp_location)]
+ for item in temp_location_items:
+ if os.path.isdir(item):
+ shutil.rmtree(item)
+ else:
+ os.remove(item)
- item_name = url.split("/")[-1]
- download_path = os.path.join(temp_location, item_name)
+ download_path = os.path.join(temp_location, item_name)
- print("Download: {} -> {}".format(url, download_path))
- urllib.request.urlretrieve(url, download_path)
+ try:
+ if verbose:
+ logging.info("Download: %s -> %s", url, download_path)
+ urllib.request.urlretrieve(url, download_path)
+ except urllib.error.HTTPError as httperror:
+ if (httperror == 404) and fail_if_not_found:
+ raise httperror
+ # Otherwise, swallow the error and continue to next file.
+ continue
- if url.endswith(".zip"):
- print ("unzip {}".format(download_path))
+ if verbose:
+ logging.info("Uncompress %s", download_path)
with zipfile.ZipFile(download_path, "r") as file_handle:
file_handle.extractall(temp_location)
- print("")
+ # Copy everything that was extracted to the target directory.
+ if not os.path.isdir(target_dir):
+ os.makedirs(target_dir)
+ items = [ os.path.join(temp_location, item) for item in os.listdir(temp_location) if not item.endswith(".zip") ]
+ for item in items:
+ target_path = os.path.join(target_dir, os.path.basename(item))
+ if verbose:
+ logging.info("Copy %s -> %s", item, target_path)
+ shutil.copy2(item, target_dir)
+ local_files.append(target_path)
+ else:
+ # Not a zip file; download directory to target directory
+ if not os.path.isdir(target_dir):
+ os.makedirs(target_dir)
+ download_path = os.path.join(target_dir, item_name)
- items = [os.path.join(temp_location, item) for item in os.listdir(temp_location) if not item.endswith(".zip")]
+ try:
+ if verbose:
+ logging.info("Download: %s -> %s", url, download_path)
+ urllib.request.urlretrieve(url, download_path)
+ local_files.append(download_path)
+ except urllib.error.HTTPError as httperror:
+ if (httperror == 404) and fail_if_not_found:
+ raise httperror
+ # Otherwise, swallow the error and continue to next file.
+ continue
- for item in items:
- print("Copying: {} -> {}".format(item, default_mch_dir))
- shutil.copy2(item, default_mch_dir)
+ return local_files
def upload_mch(coreclr_args):
- """ Upload the mch files
+ """ Upload a set of MCH files. Each MCH file is first ZIP compressed to save data space and upload/download time.
+
+ TODO: Upload baseline altjits or cross-compile JITs?
Args:
coreclr_args (CoreclrArguments): parsed args
"""
+ def upload_blob(file, blob_name):
+ blob_client = blob_service_client.get_blob_client(container=az_superpmi_container_name, blob=blob_name)
+
+ # Check if the blob already exists, and delete it if it does, before uploading / replacing it.
+ try:
+ blob_client.get_blob_properties()
+ # If no exception, then the blob already exists. Delete it!
+ logging.warning("Warning: replacing existing blob!")
+ blob_client.delete_blob()
+ except Exception:
+ # Blob doesn't exist already; that's good
+ pass
+
+ with open(file, "rb") as data:
+ blob_client.upload_blob(data)
+
+ files = []
+ for item in coreclr_args.mch_files:
+ files += get_files_from_path(item, match_func=lambda path: any(path.endswith(extension) for extension in [".mch", ".mct"]))
+
+ # Special case: walk the files list and for every ".mch" file, check to see that either the associated ".mct" file is already
+ # in the list, or add it if the ".mct" file exists.
+ for file in files.copy():
+ if file.endswith(".mch"):
+ mct_file = file + ".mct"
+ if mct_file not in files:
+ if os.path.isfile(mct_file):
+ files.append(mct_file)
+
+ logging.info("Uploading:")
+ for item in files:
+ logging.info(" %s", item)
+
try:
- from azure.storage.blob import BlockBlobService, PublicAccess
+ from azure.storage.blob import BlobServiceClient
except:
- print("Please install:")
- print("pip install azure-storage-blob")
- print("pip install cffi")
-
+ logging.error("Please install:")
+ logging.error(" pip install azure-storage-blob")
+ logging.error("See also https://docs.microsoft.com/en-us/azure/storage/blobs/storage-quickstart-blobs-python")
raise RuntimeError("Missing azure storage package.")
- block_blob_service = BlockBlobService(account_name="clrjit", account_key=coreclr_args.az_storage_key)
+ blob_service_client = BlobServiceClient(account_url=az_blob_storage_account_uri, credential=coreclr_args.az_storage_key)
+ blob_folder_name = "{}/{}/{}/{}".format(az_collections_root_folder, coreclr_args.jit_ee_version, coreclr_args.host_os, coreclr_args.arch)
- container_name = "superpmi"
- json_item = defaultdict(lambda: None)
+ total_bytes_uploaded = 0
with TempDir() as temp_location:
- for item in coreclr_args.mch_files:
- item_name = "{}/{}/{}/{}.zip".format(coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type, os.path.basename(item))
- zip_name = os.path.join(temp_location, os.path.basename(item) + ".zip")
+ for file in files:
+ # Zip compress the file we will upload
+ zip_name = os.path.basename(file) + ".zip"
+ zip_path = os.path.join(temp_location, zip_name)
+ logging.info("Compress %s -> %s", file, zip_path)
+ with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zip_file:
+ zip_file.write(file, os.path.basename(file))
+
+ original_stat_result = os.stat(file)
+ zip_stat_result = os.stat(zip_path)
+ logging.info("Compressed {:n} to {:n} bytes".format(original_stat_result.st_size, zip_stat_result.st_size))
+ total_bytes_uploaded += zip_stat_result.st_size
+
+ blob_name = "{}/{}".format(blob_folder_name, zip_name)
+ logging.info("Uploading: %s (%s) -> %s", file, zip_path, az_blob_storage_superpmi_container_uri + "/" + blob_name)
+ upload_blob(zip_path, blob_name)
+
+ # Upload a JIT matching the MCH files just collected.
+ # Consider: rename uploaded JIT to include build_type
- print ("zip {} {}".format(zip_name, item))
+ jit_location = coreclr_args.jit_location
+ if jit_location is None:
+ jit_name = determine_jit_name(coreclr_args)
+ jit_location = os.path.join(coreclr_args.core_root, jit_name)
- # Zip the file we will upload
- with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zip_file:
- zip_file.write(item, os.path.basename(item))
+ assert os.path.isfile(jit_location)
- print("")
- print("Uploading: {} -> {}".format(item, "https://clrjit.blob.core.windows.net/superpmi/" + item_name))
- block_blob_service.create_blob_from_path(container_name, item_name, zip_name)
- print("")
+ jit_name = os.path.basename(jit_location)
+ jit_blob_name = "{}/{}".format(blob_folder_name, jit_name)
+ logging.info("Uploading: %s -> %s", jit_location, az_blob_storage_superpmi_container_uri + "/" + jit_blob_name)
+ upload_blob(jit_location, jit_blob_name)
- item_basename = os.path.basename(item)
+ jit_stat_result = os.stat(jit_location)
+ total_bytes_uploaded += jit_stat_result.st_size
- collection_name = item_basename.split(".")[3]
- if collection_name == "mch":
- collection_name = "default"
+ logging.info("Uploaded {:n} bytes".format(total_bytes_uploaded))
- json_item[collection_name] = os.path.basename(item)
- file_handle = tempfile.NamedTemporaryFile(delete=False, mode='w')
- try:
- json.dump(json_item, file_handle)
- file_handle.close()
+def list_collections_command(coreclr_args):
+ """ List the SuperPMI collections in Azure Storage
- item_name = "{}/{}/{}/index.json".format(coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type)
- print("Uploading: {} -> {}".format(file_handle.name, "https://clrjit.blob.core.windows.net/superpmi/" + item_name))
- block_blob_service.create_blob_from_path(container_name, item_name, file_handle.name)
- finally:
- os.remove(file_handle.name)
+ Args:
+ coreclr_args (CoreclrArguments) : parsed args
+ """
+
+ blob_filter_string = "{}/{}/{}".format(coreclr_args.jit_ee_version, coreclr_args.host_os, coreclr_args.arch)
+ blob_prefix_filter = "{}/{}/{}".format(az_blob_storage_superpmi_container_uri, az_collections_root_folder, blob_filter_string).lower()
+
+ # Determine if a URL in Azure Storage should be allowed. The URL looks like:
+ # https://clrjit.blob.core.windows.net/superpmi/jit-ee-guid/Linux/x64/Linux.x64.Checked.frameworks.mch.zip
+ # By default, filter to just the current jit-ee-guid, OS, and architecture.
+ # Only include MCH files, not clrjit.dll or MCT (TOC) files.
+ def filter_superpmi_collections(url: str):
+ url = url.lower()
+ return (url.endswith(".mch") or url.endswith(".mch.zip")) and (coreclr_args.all or url.startswith(blob_prefix_filter))
+
+ urls = list_superpmi_collections_container_via_rest_api(filter_superpmi_collections)
+ if urls is None:
+ return
+
+ count = len(urls)
+
+ logging.info("SuperPMI list-collections")
+ logging.info("")
+ if coreclr_args.all:
+ logging.info("%s collections", count)
+ else:
+ logging.info("%s collections for %s", count, blob_filter_string)
+ logging.info("")
+
+ for url in urls:
+ logging.info("%s", url)
+
+
+def list_collections_local_command(coreclr_args):
+ """ List the SuperPMI collections local cache: where the Azure Storage collections are copied
+
+ Args:
+ coreclr_args (CoreclrArguments) : parsed args
+ """
+
+ # Display the blob filter string the local cache corresponds to
+ blob_filter_string = "{}/{}/{}".format(coreclr_args.jit_ee_version, coreclr_args.host_os, coreclr_args.arch)
+
+ default_mch_root_dir = os.path.join(coreclr_args.spmi_location, "mch")
+ default_mch_dir = os.path.join(default_mch_root_dir, "{}.{}.{}".format(coreclr_args.jit_ee_version, coreclr_args.host_os, coreclr_args.arch))
+
+ # Determine if a file should be allowed. The filenames look like:
+ # c:\gh\runtime\artifacts\spmi\mch\a5eec3a4-4176-43a7-8c2b-a05b551d4f49.Windows_NT.x64\corelib.Windows_NT.x64.Checked.mch
+ # c:\gh\runtime\artifacts\spmi\mch\a5eec3a4-4176-43a7-8c2b-a05b551d4f49.Windows_NT.x64\corelib.Windows_NT.x64.Checked.mch.mct
+ # Only include MCH files, not clrjit.dll or MCT (TOC) files.
+ def filter_superpmi_collections(path: str):
+ return path.lower().endswith(".mch")
+
+ if coreclr_args.all:
+ if not os.path.isdir(default_mch_root_dir):
+ logging.error("Local dir \"%s\" not found", default_mch_root_dir)
+ return
+ local_items = get_files_from_path(default_mch_root_dir)
+ else:
+ if not os.path.isdir(default_mch_dir):
+ logging.error("Local dir \"%s\" not found", default_mch_dir)
+ return
+ local_items = get_files_from_path(default_mch_dir)
+
+ filtered_local_items = [item for item in local_items if filter_superpmi_collections(item)]
+
+ count = len(filtered_local_items)
+
+ logging.info("SuperPMI list-collections --local")
+ logging.info("")
+ if coreclr_args.all:
+ logging.info("%s collections", count)
+ else:
+ logging.info("%s collections for %s", count, blob_filter_string)
+ logging.info("")
+
+ for item in filtered_local_items:
+ logging.info("%s", item)
+
+
+def merge_mch(coreclr_args):
+ """ Merge all the files specified by a given pattern into a single output MCH file.
+ This is a utility function mostly for use by the CI scripting. It is a
+ thin wrapper around:
+
+ mcs -merge -recursive -dedup -thin
+ mcs -toc
+
+ Args:
+ coreclr_args (CoreclrArguments) : parsed args
+
+ Returns:
+ True on success, else False
+ """
+
+ logging.info("Merging %s -> %s", coreclr_args.pattern, coreclr_args.output_mch_path)
+ mcs_path = determine_mcs_tool_path(coreclr_args)
+ command = [mcs_path, "-merge", coreclr_args.output_mch_path, coreclr_args.pattern, "-recursive", "-dedup", "-thin"]
+ return_code = run_and_log(command)
+ if return_code != 0:
+ logging.error("mcs -merge Failed with code %s", return_code)
+ return False
+
+ logging.info("Creating MCT file for %s", coreclr_args.output_mch_path)
+ command = [mcs_path, "-toc", coreclr_args.output_mch_path]
+ return_code = run_and_log(command)
+ if return_code != 0:
+ logging.error("mcs -toc Failed with code %s", return_code)
+ return False
+
+ return True
+
+
+def get_mch_files_for_replay(coreclr_args):
+ """ Given the argument `mch_files`, and any specified filters, find all the MCH files to
+ use for replay.
+
+ Args:
+ coreclr_args (CoreclrArguments) : parsed args
+
+ Returns:
+ None if error (with an error message already printed), else a list of MCH files.
+ """
+
+ if coreclr_args.mch_files is None:
+ logging.error("No MCH files specified")
+ return None
+
+ mch_files = []
+ for item in coreclr_args.mch_files:
+ # If there are specified filters, only run those matching files.
+ mch_files += get_files_from_path(item,
+ match_func=lambda path:
+ any(path.endswith(extension) for extension in [".mch"])
+ and ((coreclr_args.filter is None) or any(filter_item.lower() in path for filter_item in coreclr_args.filter)))
+
+ if len(mch_files) == 0:
+ logging.error("No MCH files found to replay")
+ return None
+
+ return mch_files
+
+
+def process_base_jit_path_arg(coreclr_args):
+ """ Process the -base_jit_path argument.
+
+ If the argument is present, check it for being a path to a file.
+ If not present, try to find and download a baseline JIT based on the current environment:
+ 1. Determine the current git hash using:
+ git rev-parse HEAD
+ or use the `-git_hash` argument (call the result `git_hash`).
+ 2. Determine the baseline: where does this hash meet `master` using:
+ git merge-base `git_hash` master
+ or use the `-base_git_hash` argument (call the result `base_git_hash`).
+ 3. If the `-base_git_hash` argument is used, use that directly as the exact git
+ hash of the baseline JIT to use.
+ 4. Otherwise, figure out the latest hash, starting with `base_git_hash`, that contains any changes to
+ the src\\coreclr\\src\\jit directory. (We do this because the JIT rolling build only includes
+ builds for changes to this directory. So, this logic needs to stay in sync with the logic
+ that determines what causes the JIT directory to be rebuilt. E.g., it should also get
+ rebuilt if the JIT-EE interface GUID changes. Alternatively, we can take the entire list
+ of changes, and probe the rolling build drop for all of them.)
+ 5. Check if we've already downloaded a JIT that matches `base_git_hash`, and use that if available.
+ 6. Starting with `base_git_hash`, and possibly walking to older changes, look for matching builds
+ in the JIT rolling build drops.
+ 7. If a baseline clrjit is found, download it to the `spmi/basejit/git-hash.os.architecture.build_type`
+ cache directory.
+ 8. Set coreclr_args.base_jit_path to the full path to the downloaded baseline JIT.
+
+ Args:
+ coreclr_args (CoreclrArguments) : parsed args
+
+ Returns:
+ Nothing
+
+ coreclr_args.base_jit_path is set to the path to the JIT to use for the baseline JIT.
+ """
+
+ if coreclr_args.base_jit_path is not None:
+ if not os.path.isfile(coreclr_args.base_jit_path):
+ raise RuntimeError("Specified -base_jit_path does not point to a file")
+ return
+
+ # We cache baseline jits under the following directory. Note that we can't create the full directory path
+ # until we know the baseline JIT hash.
+ default_basejit_root_dir = os.path.join(coreclr_args.spmi_location, "basejit")
+
+ # Do all the remaining commands, including a number of 'git' commands including relative paths,
+ # from the root of the runtime repo.
+
+ with ChangeDir(coreclr_args.runtime_repo_location):
+ if coreclr_args.git_hash is None:
+ command = [ "git", "rev-parse", "HEAD" ]
+ logging.debug("Invoking: %s", " ".join(command))
+ proc = subprocess.Popen(command, stdout=subprocess.PIPE)
+ stdout_git_rev_parse, _ = proc.communicate()
+ return_code = proc.returncode
+ if return_code == 0:
+ current_hash = stdout_git_rev_parse.decode('utf-8').strip()
+ logging.debug("Current hash: %s", current_hash)
+ else:
+ raise RuntimeError("Couldn't determine current git hash")
+ else:
+ current_hash = coreclr_args.git_hash
+
+ if coreclr_args.base_git_hash is None:
+ # We've got the current hash; figure out the baseline hash.
+ command = [ "git", "merge-base", current_hash, "master" ]
+ logging.debug("Invoking: %s", " ".join(command))
+ proc = subprocess.Popen(command, stdout=subprocess.PIPE)
+ stdout_git_merge_base, _ = proc.communicate()
+ return_code = proc.returncode
+ if return_code == 0:
+ baseline_hash = stdout_git_merge_base.decode('utf-8').strip()
+ logging.info("Baseline hash: %s", current_hash)
+ else:
+ raise RuntimeError("Couldn't determine baseline git hash")
+ else:
+ baseline_hash = coreclr_args.base_git_hash
+
+ if coreclr_args.base_git_hash is None:
+ # Enumerate the last 20 changes, starting with the baseline, that included JIT changes.
+ command = [ "git", "log", "--pretty=format:%H", baseline_hash, "-20", "--", "src/coreclr/src/jit/*" ]
+ logging.debug("Invoking: %s", " ".join(command))
+ proc = subprocess.Popen(command, stdout=subprocess.PIPE)
+ stdout_change_list, _ = proc.communicate()
+ return_code = proc.returncode
+ change_list_hashes = []
+ if return_code == 0:
+ change_list_hashes = stdout_change_list.decode('utf-8').strip().splitlines()
+ else:
+ raise RuntimeError("Couldn't determine list of JIT changes starting with baseline hash")
+
+ if len(change_list_hashes) == 0:
+ raise RuntimeError("No JIT changes found starting with baseline hash")
+ else:
+ # If `-base_git_hash` is specified, then we use exactly that hash and no other for the baseline.
+ change_list_hashes = [ coreclr_args.base_git_hash ]
+
+ # For each hash, (1) see if we have the JIT already, and if not (2) try to download the corresponding JIT from the rolling build.
+
+ hashnum = 1
+ for git_hash in change_list_hashes:
+ logging.debug("%s: %s", hashnum, git_hash)
- jit_location = coreclr_args.jit_location
- if jit_location is None:
jit_name = determine_jit_name(coreclr_args)
- jit_location = os.path.join(coreclr_args.core_root, jit_name)
+ basejit_dir = os.path.join(default_basejit_root_dir, "{}.{}.{}.{}".format(git_hash, coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type))
+ basejit_path = os.path.join(basejit_dir, jit_name)
+ if os.path.isfile(basejit_path):
+ # We found this baseline JIT in our cache; use it!
+ coreclr_args.base_jit_path = basejit_path
+ logging.info("Using baseline %s", coreclr_args.base_jit_path)
+ return
- container_path = "{}/{}/{}/{}".format(coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type, os.path.basename(jit_location))
+ # It's not in our cache; is there one built by the rolling build to download?
+ blob_folder_name = "{}/{}/{}/{}/{}/{}".format(az_builds_root_folder, git_hash, coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type, jit_name)
+ blob_uri = "{}/{}".format(az_blob_storage_jitrollingbuild_container_uri, blob_folder_name)
+ urls = [ blob_uri ]
+ local_files = download_urls(urls, basejit_dir, verbose=False, fail_if_not_found=False)
+
+ if len(local_files) > 0:
+ if hashnum > 1:
+ logging.warning("Warning: the baseline found is not built with the first git hash with JIT code changes; there may be extraneous diffs")
+ # We expect local_files to be length 1, since we only attempted to download a single file.
+ if len(local_files) > 1:
+ logging.error("Error: downloaded more than one file?")
+
+ coreclr_args.base_jit_path = local_files[0]
+ logging.info("Downloaded %s", blob_uri)
+ logging.info("Using baseline %s", coreclr_args.base_jit_path)
+ return
+
+ # We didn't find a baseline; keep looking
+ hashnum += 1
+
+ # We ran out of hashes of JIT changes, and didn't find a baseline. Give up.
+ logging.error("Error: no baseline JIT found")
+
+ raise RuntimeError("No baseline JIT found")
- assert os.path.isfile(jit_location)
- print("Uploading: {} -> {}".format(jit_location, "https://clrjit.blob.core.windows.net/superpmi/" + os.path.basename(jit_location)))
- block_blob_service.create_blob_from_path(container_name, container_path, jit_location)
def setup_args(args):
""" Setup the args for SuperPMI to use.
@@ -1829,40 +2537,92 @@ def setup_args(args):
args (CoreclrArguments)
"""
+
+ # Start setting up logging.
+ # Set up the console logger immediately. Later, after we've parsed some arguments, we'll add the file logger and
+ # change the console logger level to the one parsed by the arguments. We need to do this initial setup before the first
+ # logging command is executed.
+ logger = logging.getLogger()
+ logger.setLevel(logging.DEBUG)
+
+ stream_handler = logging.StreamHandler(sys.stdout)
+ stream_handler.setLevel(logging.DEBUG)
+ logger.addHandler(stream_handler)
+
+ # Parse the arguments
+
coreclr_args = CoreclrArguments(args, require_built_core_root=False, require_built_product_dir=False, require_built_test_dir=False, default_build_type="Checked")
coreclr_args.verify(args,
- "mode", # "mode" is from the `parser.add_subparsers(dest='mode')` call
+ "mode", # "mode" is from the `parser.add_subparsers(dest='mode')` call
lambda unused: True,
"Unable to set mode")
- def setup_mch_arg(mch_file):
- if mch_file is not None:
- return mch_file
-
- mch_directory = os.path.join(coreclr_args.spmi_location, "mch", "{}.{}.{}".format(coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type))
- mch_filename = "{}.{}.{}.mch".format(coreclr_args.host_os, coreclr_args.arch, coreclr_args.build_type)
- default_mch_location = os.path.join(mch_directory, mch_filename)
-
- if os.path.isfile(default_mch_location) and not args.force_download and coreclr_args.collection == "default":
- return default_mch_location
-
- # Download the mch
- else:
- index = download_index(coreclr_args)
+ coreclr_args.verify(args,
+ "log_level",
+ lambda arg: any(arg.upper() == level for level in [ "CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG" ]),
+ "Unable to set log_level {}".format,
+ modify_arg=lambda arg: "INFO" if arg is None else arg.upper())
- mch_filename = index[coreclr_args.collection]
- mch_location = os.path.join(mch_directory, mch_filename)
+ coreclr_args.verify(args,
+ "log_file",
+ lambda unused: True,
+ "Unable to set log_file.")
- if not os.path.isfile(mch_location):
- download_mch(coreclr_args, specific_mch=index[coreclr_args.collection], include_baseline_jit=True)
+ def setup_spmi_location_arg(spmi_location):
+ return os.path.abspath(os.path.join(coreclr_args.artifacts_location, "spmi")) if spmi_location is None else spmi_location
- return mch_location
+ coreclr_args.verify(args,
+ "spmi_location",
+ lambda unused: True,
+ "Unable to set spmi_location",
+ modify_arg=setup_spmi_location_arg)
+
+ # Finish setting up logging.
+ # The spmi_location is the root directory where we put the log file.
+ # Log everything to the log file and only the specified verbosity to the console logger.
+
+ # Now, change the stream handler output level.
+ stream_handler.setLevel(coreclr_args.log_level)
+
+ log_file = None
+ if coreclr_args.log_file is None:
+ if hasattr(coreclr_args, "spmi_location"):
+ log_file = os.path.join(coreclr_args.spmi_location, "superpmi.log")
+ if not os.path.isdir(coreclr_args.spmi_location):
+ os.makedirs(coreclr_args.spmi_location)
+ else:
+ log_file = coreclr_args.log_file
+ log_dir = os.path.basename(log_file)
+ if not os.path.isdir(log_dir):
+ os.makedirs(log_dir)
+
+ if log_file is not None:
+ # If the log file exists, we could use the default behavior and simply append.
+ # For now, though, just delete it and warn. We can change behavior later if there's user feedback on it.
+ if os.path.isfile(log_file):
+ logging.critical("Warning: deleting existing log file %s", log_file)
+ os.remove(log_file)
+ file_handler = logging.FileHandler(log_file)
+ file_handler.setLevel(logging.DEBUG)
+ logger.addHandler(file_handler)
+ logging.critical("================ Logging to %s", log_file)
+
+ # Finish verifying the arguments
+
+ def setup_jit_ee_version_arg(jit_ee_version):
+ if jit_ee_version is not None:
+ # The user passed a specific jit_ee_version on the command-line, so use that
+ return jit_ee_version
+ return determine_jit_ee_version(coreclr_args)
+
+ def setup_jit_path_arg(jit_path):
+ if jit_path is not None:
+ return os.path.abspath(jit_path)
+ return find_tool(coreclr_args, determine_jit_name(coreclr_args), search_path=False) # It doesn't make sense to search PATH for the JIT dll.
def verify_superpmi_common_args():
- # core_root has already been verified in CoreclrArguments() initialization.
-
coreclr_args.verify(args,
"break_on_assert",
lambda unused: True,
@@ -1873,12 +2633,6 @@ def verify_superpmi_common_args():
lambda unused: True,
"Unable to set break_on_error")
- coreclr_args.verify(args,
- "spmi_location",
- lambda unused: True,
- "Unable to set spmi_location",
- modify_arg=lambda spmi_location: os.path.abspath(os.path.join(coreclr_args.artifacts_location, "spmi")) if spmi_location is None else spmi_location)
-
coreclr_args.verify(args,
"skip_cleanup",
lambda unused: True,
@@ -1890,18 +2644,51 @@ def verify_superpmi_common_args():
"Unable to set sequential.")
coreclr_args.verify(args,
- "log_file",
+ "spmi_log_file",
lambda unused: True,
- "Unable to set log_file.")
+ "Unable to set spmi_log_file.")
- if coreclr_args.log_file is not None and not coreclr_args.sequential:
- print("-log_file requires --sequential")
+ if coreclr_args.spmi_log_file is not None and not coreclr_args.sequential:
+ print("-spmi_log_file requires --sequential")
sys.exit(1)
+ def verify_replay_common_args():
+
+ coreclr_args.verify(args,
+ "force_download",
+ lambda unused: True,
+ "Unable to set force_download")
+
+ coreclr_args.verify(args,
+ "altjit", # Must be set before `jit_path` (determine_jit_name() depends on it)
+ lambda unused: True,
+ "Unable to set altjit.")
+
+ coreclr_args.verify(args,
+ "jit_ee_version",
+ lambda unused: True,
+ "Invalid JIT-EE Version.",
+ modify_arg=setup_jit_ee_version_arg)
+
+ coreclr_args.verify(args,
+ "filter",
+ lambda unused: True,
+ "Unable to set filter.")
+
+ coreclr_args.verify(args,
+ "mch_files",
+ lambda unused: True,
+ "Unable to set mch_files")
+
if coreclr_args.mode == "collect":
verify_superpmi_common_args()
+ coreclr_args.verify(args,
+ "altjit", # The replay code checks this, so make sure it's set
+ lambda unused: True,
+ "Unable to set altjit.")
+
coreclr_args.verify(args,
"collection_command",
lambda command: command is None or os.path.isfile(command),
@@ -1950,35 +2737,30 @@ def verify_superpmi_common_args():
"Unable to set skip_collect_mc_files")
coreclr_args.verify(args,
- "existing_temp_dir",
+ "temp_dir",
lambda unused: True,
- "Unable to set existing_temp_dir.")
+ "Unable to set temp_dir.")
coreclr_args.verify(args,
- "has_run_collection_command",
+ "skip_collection_step",
lambda unused: True,
- "Unable to set has_run_collection_command.")
+ "Unable to set skip_collection_step.")
coreclr_args.verify(args,
- "has_merged_mch",
+ "skip_merge_step",
lambda unused: True,
- "Unable to set has_merged_mch.")
+ "Unable to set skip_merge_step.")
coreclr_args.verify(args,
- "has_verified_clean_mch",
+ "skip_clean_and_verify_step",
lambda unused: True,
- "Unable to set has_verified_clean_mch.")
+ "Unable to set skip_clean_and_verify_step.")
coreclr_args.verify(args,
"use_zapdisable",
lambda unused: True,
"Unable to set use_zapdisable")
- coreclr_args.verify(False, # Force it to false. TODO: support altjit collections?
- "altjit",
- lambda unused: True,
- "Unable to set altjit.")
-
if args.collection_command is None and args.merge_mch_files is not True:
assert args.collection_args is None
assert args.pmi is True
@@ -1986,41 +2768,32 @@ def verify_superpmi_common_args():
if coreclr_args.merge_mch_files:
assert len(coreclr_args.mch_files) > 0
- coreclr_args.has_run_collection_command = True
+ coreclr_args.skip_collection_step = True
elif coreclr_args.mode == "replay":
verify_superpmi_common_args()
-
- coreclr_args.verify(args,
- "collection",
- lambda collection_name: collection_name in download_index(coreclr_args),
- "Invalid collection. Please run 'superpmi.py list-collections' to see valid options.")
-
- coreclr_args.verify(args,
- "altjit", # Must be set before `jit_path` (determine_jit_name() depends on it)
- lambda unused: True,
- "Unable to set altjit.")
+ verify_replay_common_args()
coreclr_args.verify(args,
"jit_path",
- lambda jit_path: os.path.isfile(jit_path),
- lambda jit_path: "Error: JIT not found at jit_path {}".format(jit_path),
- modify_arg=lambda arg: os.path.join(coreclr_args.core_root, determine_jit_name(coreclr_args)) if arg is None else os.path.abspath(arg))
+ os.path.isfile,
+ "Error: JIT not found at jit_path {}".format,
+ modify_arg=setup_jit_path_arg)
- standard_location = False
+ jit_in_product_location = False
if coreclr_args.product_location.lower() in coreclr_args.jit_path.lower():
- standard_location = True
+ jit_in_product_location = True
determined_arch = None
determined_build_type = None
- if standard_location:
+ if jit_in_product_location:
# Get os/arch/flavor directory, e.g. split "F:\gh\runtime\artifacts\bin\coreclr\Windows_NT.x64.Checked" with "F:\gh\runtime\artifacts\bin\coreclr"
# yielding
# [0]: ""
# [1]: "\Windows_NT.x64.Checked"
standard_location_split = os.path.dirname(coreclr_args.jit_path).split(os.path.dirname(coreclr_args.product_location))
- assert(coreclr_args.host_os in standard_location_split[1])
+ assert coreclr_args.host_os in standard_location_split[1]
# Get arch/flavor. Remove leading slash.
specialized_path = standard_location_split[1].split(os.path.sep)[1]
@@ -2036,7 +2809,7 @@ def verify_superpmi_common_args():
# Make a more intelligent decision about the arch and build type
# based on the path of the jit passed
- if standard_location and not coreclr_args.build_type in coreclr_args.jit_path:
+ if jit_in_product_location and coreclr_args.build_type not in coreclr_args.jit_path:
coreclr_args.verify(determined_arch.lower(),
"arch",
lambda unused: True,
@@ -2047,15 +2820,10 @@ def verify_superpmi_common_args():
coreclr_args.check_build_type,
"Invalid build_type")
- coreclr_args.verify(args,
- "mch_file",
- lambda mch_file: os.path.isfile(mch_file),
- lambda mch_file: "Incorrect file path to mch_file: {}".format(mch_file),
- modify_arg=lambda arg: setup_mch_arg(arg))
-
elif coreclr_args.mode == "asmdiffs":
verify_superpmi_common_args()
+ verify_replay_common_args()
coreclr_args.verify(args,
"base_jit_path",
@@ -2063,20 +2831,20 @@ def verify_superpmi_common_args():
"Unable to set base_jit_path")
coreclr_args.verify(args,
- "altjit", # Must be set before `jit_path` (determine_jit_name() depends on it)
- lambda unused: True,
- "Unable to set altjit.")
+ "diff_jit_path",
+ os.path.isfile,
+ "Error: JIT not found at diff_jit_path {}".format,
+ modify_arg=setup_jit_path_arg)
coreclr_args.verify(args,
- "diff_jit_path",
- lambda jit_path: os.path.isfile(jit_path),
- "Unable to set diff_jit_path",
- modify_arg=lambda arg: os.path.join(coreclr_args.core_root, determine_jit_name(coreclr_args)) if arg is None else os.path.abspath(arg))
+ "git_hash",
+ lambda unused: True,
+ "Unable to set git_hash")
coreclr_args.verify(args,
- "collection",
- lambda collection_name: collection_name in download_index(coreclr_args),
- "Invalid collection. Please run 'superpmi.py list-collections' to see valid options.")
+ "base_git_hash",
+ lambda unused: True,
+ "Unable to set base_git_hash")
coreclr_args.verify(args,
"diff_with_code",
@@ -2089,9 +2857,9 @@ def verify_superpmi_common_args():
"Unable to set diff_with_code_only.")
coreclr_args.verify(args,
- "previous_temp_location",
+ "temp_dir",
lambda unused: True,
- "Unable to set previous_temp_location.")
+ "Unable to set temp_dir.")
if coreclr_args.diff_with_code_only:
# Set diff with code if we are not running SuperPMI to regenerate diffs.
@@ -2117,19 +2885,21 @@ def verify_superpmi_common_args():
lambda unused: True,
"Unable to set diff_jit_dump.")
- standard_location = False
+ process_base_jit_path_arg(coreclr_args)
+
+ jit_in_product_location = False
if coreclr_args.product_location.lower() in coreclr_args.base_jit_path.lower():
- standard_location = True
+ jit_in_product_location = True
determined_arch = None
determined_build_type = None
- if standard_location:
+ if jit_in_product_location:
# Get os/arch/flavor directory, e.g. split "F:\gh\runtime\artifacts\bin\coreclr\Windows_NT.x64.Checked" with "F:\gh\runtime\artifacts\bin\coreclr"
# yielding
# [0]: ""
# [1]: "\Windows_NT.x64.Checked"
- standard_location_split = os.path.dirname(coreclr_args.jit_path).split(os.path.dirname(coreclr_args.product_location))
- assert(coreclr_args.host_os in standard_location_split[1])
+ standard_location_split = os.path.dirname(coreclr_args.base_jit_path).split(os.path.dirname(coreclr_args.product_location))
+ assert coreclr_args.host_os in standard_location_split[1]
# Get arch/flavor. Remove leading slash.
specialized_path = standard_location_split[1].split(os.path.sep)[1]
@@ -2145,13 +2915,13 @@ def verify_superpmi_common_args():
# Make a more intelligent decision about the arch and build type
# based on the path of the jit passed
- if standard_location and not coreclr_args.build_type in coreclr_args.base_jit_path:
+ if jit_in_product_location and coreclr_args.build_type not in coreclr_args.base_jit_path:
coreclr_args.verify(determined_build_type,
"build_type",
coreclr_args.check_build_type,
"Invalid build_type")
- if standard_location and not coreclr_args.arch in coreclr_args.base_jit_path:
+ if jit_in_product_location and coreclr_args.arch not in coreclr_args.base_jit_path:
coreclr_args.verify(determined_arch.lower(),
"arch",
lambda unused: True,
@@ -2159,37 +2929,85 @@ def verify_superpmi_common_args():
coreclr_args.verify(determine_coredis_tools(coreclr_args),
"coredistools_location",
- lambda coredistools_path: os.path.isfile(coredistools_path),
+ os.path.isfile,
"Unable to find coredistools.")
- coreclr_args.verify(args,
- "mch_file",
- lambda mch_file: os.path.isfile(mch_file),
- lambda mch_file: "Incorrect file path to mch_file: {}".format(mch_file),
- modify_arg=lambda arg: setup_mch_arg(arg))
-
elif coreclr_args.mode == "upload":
coreclr_args.verify(args,
"az_storage_key",
lambda item: item is not None,
- "Unable to set az_storage_key.",
- modify_arg=lambda arg: os.environ["CLRJIT_AZ_KEY"] if arg is None else arg)
+ "Specify az_storage_key or set environment variable CLRJIT_AZ_KEY to the key to use.",
+ modify_arg=lambda arg: os.environ["CLRJIT_AZ_KEY"] if arg is None and "CLRJIT_AZ_KEY" in os.environ else arg)
+
+ coreclr_args.verify(args,
+ "jit_location",
+ lambda unused: True,
+ "Unable to set jit_location.")
+
+ coreclr_args.verify(args,
+ "jit_ee_version",
+ lambda unused: True,
+ "Invalid JIT-EE Version.",
+ modify_arg=setup_jit_ee_version_arg)
coreclr_args.verify(args,
"mch_files",
- lambda mch_files: all(os.path.isfile(item) for item in mch_files),
- "Unable to set mch_files.")
+ lambda unused: True,
+ "Unable to set mch_files")
+
+ elif coreclr_args.mode == "download":
coreclr_args.verify(args,
- "jit_location",
+ "force_download",
lambda unused: True,
- "Unable to set jit_location.")
+ "Unable to set force_download")
- coreclr_args.verify(False, # Force `altjit` to false. TODO: support altjit uploads?
- "altjit",
+ coreclr_args.verify(args,
+ "jit_ee_version",
lambda unused: True,
- "Unable to set altjit.")
+ "Invalid JIT-EE Version.",
+ modify_arg=setup_jit_ee_version_arg)
+
+ coreclr_args.verify(args,
+ "filter",
+ lambda unused: True,
+ "Unable to set filter.")
+
+ coreclr_args.verify(args,
+ "mch_files",
+ lambda unused: True,
+ "Unable to set mch_files")
+
+ elif coreclr_args.mode == "list-collections":
+
+ coreclr_args.verify(args,
+ "jit_ee_version",
+ lambda unused: True,
+ "Invalid JIT-EE Version.",
+ modify_arg=setup_jit_ee_version_arg)
+
+ coreclr_args.verify(args,
+ "all",
+ lambda unused: True,
+ "Unable to set all")
+
+ coreclr_args.verify(args,
+ "local",
+ lambda unused: True,
+ "Unable to set local")
+
+ elif coreclr_args.mode == "merge-mch":
+
+ coreclr_args.verify(args,
+ "output_mch_path",
+ lambda output_mch_path: not os.path.isdir(os.path.abspath(output_mch_path)) and not os.path.isfile(os.path.abspath(output_mch_path)),
+ "Invalid output_mch_path; is it an existing directory or file?")
+
+ coreclr_args.verify(args,
+ "pattern",
+ lambda unused: True,
+ "Unable to set pattern")
return coreclr_args
@@ -2197,6 +3015,7 @@ def verify_superpmi_common_args():
# main
################################################################################
+
def main(args):
""" Main method
"""
@@ -2209,9 +3028,18 @@ def main(args):
return 1
# Force tiered compilation off. It will affect both collection and replay.
+ # REVIEW: Is this true for replay? We specifically set this when doing collections. Can we remove this line?
+ # Or move it more close to the location that requires it, and output to the console that we're setting this?
os.environ["COMPlus_TieredCompilation"] = "0"
+ # Parse the arguments.
+
coreclr_args = setup_args(args)
+
+ #
+ # Run the selected command
+ #
+
success = True
if coreclr_args.mode == "collect":
@@ -2219,110 +3047,126 @@ def main(args):
begin_time = datetime.datetime.now()
- print("SuperPMI collect")
- print("------------------------------------------------------------")
- print("Start time: {}".format(begin_time.strftime("%H:%M:%S")))
+ logging.info("SuperPMI collect")
+ logging.debug("------------------------------------------------------------")
+ logging.debug("Start time: %s", begin_time.strftime("%H:%M:%S"))
collection = SuperPMICollect(coreclr_args)
success = collection.collect()
- print("Finished SuperPMI collect")
-
- if coreclr_args.output_mch_path != None:
- print("MCH path: {}".format(coreclr_args.output_mch_path))
+ if success and coreclr_args.output_mch_path is not None:
+ logging.info("Generated MCH file: %s", coreclr_args.output_mch_path)
end_time = datetime.datetime.now()
elapsed_time = end_time - begin_time
- print("Finish time: {}".format(end_time.strftime("%H:%M:%S")))
- print("Elapsed time: {}".format(elapsed_time))
+ logging.debug("Finish time: %s", end_time.strftime("%H:%M:%S"))
+ logging.debug("Elapsed time: %s", elapsed_time)
elif coreclr_args.mode == "replay":
# Start a new SuperPMI Replay
+ process_mch_files_arg(coreclr_args)
+ mch_files = get_mch_files_for_replay(coreclr_args)
+ if mch_files is None:
+ return 1
+
begin_time = datetime.datetime.now()
- print("SuperPMI replay")
- print("------------------------------------------------------------")
- print("Start time: {}".format(begin_time.strftime("%H:%M:%S")))
+ logging.info("SuperPMI replay")
+ logging.debug("------------------------------------------------------------")
+ logging.debug("Start time: %s", begin_time.strftime("%H:%M:%S"))
- mch_file = coreclr_args.mch_file
jit_path = coreclr_args.jit_path
- print("")
- print("MCH Path: {}".format(mch_file))
- print("JIT Path: {}".format(jit_path))
+ logging.info("JIT Path: %s", jit_path)
- replay = SuperPMIReplay(coreclr_args, mch_file, jit_path)
- success = replay.replay()
+ logging.info("Using MCH files:")
+ for mch_file in mch_files:
+ logging.info(" %s", mch_file)
- print("Finished SuperPMI replay")
+ replay = SuperPMIReplay(coreclr_args, mch_files, jit_path)
+ success = replay.replay()
end_time = datetime.datetime.now()
elapsed_time = end_time - begin_time
- print("Finish time: {}".format(end_time.strftime("%H:%M:%S")))
- print("Elapsed time: {}".format(elapsed_time))
+ logging.debug("Finish time: %s", end_time.strftime("%H:%M:%S"))
+ logging.debug("Elapsed time: %s", elapsed_time)
elif coreclr_args.mode == "asmdiffs":
# Start a new SuperPMI Replay with AsmDiffs
+ process_mch_files_arg(coreclr_args)
+ mch_files = get_mch_files_for_replay(coreclr_args)
+ if mch_files is None:
+ return 1
+
begin_time = datetime.datetime.now()
- print("SuperPMI ASM diffs")
- print("------------------------------------------------------------")
- print("Start time: {}".format(begin_time.strftime("%H:%M:%S")))
+ logging.info("SuperPMI ASM diffs")
+ logging.debug("------------------------------------------------------------")
+ logging.debug("Start time: %s", begin_time.strftime("%H:%M:%S"))
- mch_file = coreclr_args.mch_file
base_jit_path = coreclr_args.base_jit_path
diff_jit_path = coreclr_args.diff_jit_path
- print("")
- print("MCH Path: {}".format(mch_file))
- print("Base JIT Path: {}".format(base_jit_path))
- print("Diff JIT Path: {}".format(diff_jit_path))
+ logging.info("Base JIT Path: %s", base_jit_path)
+ logging.info("Diff JIT Path: %s", diff_jit_path)
- asm_diffs = SuperPMIReplayAsmDiffs(coreclr_args, mch_file, base_jit_path, diff_jit_path)
- success = asm_diffs.replay_with_asm_diffs()
+ logging.info("Using MCH files:")
+ for mch_file in mch_files:
+ logging.info(" %s", mch_file)
- print("Finished SuperPMI replay")
+ asm_diffs = SuperPMIReplayAsmDiffs(coreclr_args, mch_files, base_jit_path, diff_jit_path)
+ success = asm_diffs.replay_with_asm_diffs()
end_time = datetime.datetime.now()
elapsed_time = end_time - begin_time
- print("Finish time: {}".format(end_time.strftime("%H:%M:%S")))
- print("Elapsed time: {}".format(elapsed_time))
+ logging.debug("Finish time: %s", end_time.strftime("%H:%M:%S"))
+ logging.debug("Elapsed time: %s", elapsed_time)
elif coreclr_args.mode == "upload":
begin_time = datetime.datetime.now()
- print("SuperPMI upload")
- print("------------------------------------------------------------")
- print("Start time: {}".format(begin_time.strftime("%H:%M:%S")))
+ logging.info("SuperPMI upload")
+ logging.debug("------------------------------------------------------------")
+ logging.debug("Start time: %s", begin_time.strftime("%H:%M:%S"))
upload_mch(coreclr_args)
- print("Finished SuperPMI upload")
+ end_time = datetime.datetime.now()
+ elapsed_time = end_time - begin_time
+
+ logging.debug("Finish time: %s", end_time.strftime("%H:%M:%S"))
+ logging.debug("Elapsed time: %s", elapsed_time)
+
+ elif coreclr_args.mode == "download":
+ begin_time = datetime.datetime.now()
+
+ logging.info("SuperPMI download")
+ logging.debug("------------------------------------------------------------")
+ logging.debug("Start time: %s", begin_time.strftime("%H:%M:%S"))
+
+ # Processing the arg does the download and caching
+ process_mch_files_arg(coreclr_args)
end_time = datetime.datetime.now()
elapsed_time = end_time - begin_time
- print("Finish time: {}".format(end_time.strftime("%H:%M:%S")))
- print("Elapsed time: {}".format(elapsed_time))
+ logging.debug("Finish time: %s", end_time.strftime("%H:%M:%S"))
+ logging.debug("Elapsed time: %s", elapsed_time)
elif coreclr_args.mode == "list-collections":
- index = download_index(coreclr_args)
-
- index_count = len(index)
- print("SuperPMI list-collections")
- print("")
- print("{} different collections".format(index_count))
- print("")
+ if coreclr_args.local:
+ list_collections_local_command(coreclr_args)
+ else:
+ list_collections_command(coreclr_args)
- for item, value in index.items():
- print("{} : {}".format(item, value))
+ elif coreclr_args.mode == "merge-mch":
+ success = merge_mch(coreclr_args)
- print("")
else:
raise NotImplementedError(coreclr_args.mode)
@@ -2332,6 +3176,7 @@ def main(args):
# __main__
################################################################################
+
if __name__ == "__main__":
args = parser.parse_args()
sys.exit(main(args))
diff --git a/src/coreclr/src/.nuget/Directory.Build.props b/src/coreclr/src/.nuget/Directory.Build.props
index 1a8f5c0d7414..e44f8de0a11c 100644
--- a/src/coreclr/src/.nuget/Directory.Build.props
+++ b/src/coreclr/src/.nuget/Directory.Build.props
@@ -3,14 +3,19 @@
+
+
+
AnyCPU
-
- true
+
+ falsetrue
@@ -161,6 +166,9 @@
arm
+
+ arm
+ arm64
diff --git a/src/coreclr/src/.nuget/Microsoft.CrossOsDiag.Private.CoreCLR/Microsoft.CrossOsDiag.Private.CoreCLR.proj b/src/coreclr/src/.nuget/Microsoft.CrossOsDiag.Private.CoreCLR/Microsoft.CrossOsDiag.Private.CoreCLR.proj
index 037a6b102605..1b1eb74c02a5 100644
--- a/src/coreclr/src/.nuget/Microsoft.CrossOsDiag.Private.CoreCLR/Microsoft.CrossOsDiag.Private.CoreCLR.proj
+++ b/src/coreclr/src/.nuget/Microsoft.CrossOsDiag.Private.CoreCLR/Microsoft.CrossOsDiag.Private.CoreCLR.proj
@@ -3,7 +3,7 @@
false
- linux-x64;linux-musl-x64;linux-arm64;linux-musl-arm64;linux-arm;
+ linux-x64;linux-musl-x64;linux-arm64;linux-musl-arm64;linux-arm;linux-musl-arm
@@ -19,6 +19,7 @@
%(AdditionalProperties);CrossDacBinRoot=$(CrossDacArtifactsDir)/Linux.arm64.$(Configuration)/x64%(AdditionalProperties);CrossDacBinRoot=$(CrossDacArtifactsDir)/Linux_musl.arm64.$(Configuration)/x64%(AdditionalProperties);CrossDacBinRoot=$(CrossDacArtifactsDir)/Linux.arm.$(Configuration)/x86
+ %(AdditionalProperties);CrossDacBinRoot=$(CrossDacArtifactsDir)/Linux_musl.arm.$(Configuration)/x86
diff --git a/src/coreclr/src/.nuget/Microsoft.NET.Sdk.IL/targets/Microsoft.NET.Sdk.IL.targets b/src/coreclr/src/.nuget/Microsoft.NET.Sdk.IL/targets/Microsoft.NET.Sdk.IL.targets
index 9a4272c39479..6a286e91706d 100644
--- a/src/coreclr/src/.nuget/Microsoft.NET.Sdk.IL/targets/Microsoft.NET.Sdk.IL.targets
+++ b/src/coreclr/src/.nuget/Microsoft.NET.Sdk.IL/targets/Microsoft.NET.Sdk.IL.targets
@@ -30,7 +30,7 @@ Copyright (c) .NET Foundation. All rights reserved.
<_OSArchitecture>$([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture)
$(_OSPlatform)-$(_OSArchitecture.ToLower())
- 5.0.0
+ 6.0.0runtime.$(MicrosoftNetCoreIlasmPackageRuntimeId).microsoft.netcore.ilasmruntime.$(MicrosoftNetCoreIlasmPackageRuntimeId).microsoft.netcore.ildasm
@@ -79,7 +79,7 @@ Copyright (c) .NET Foundation. All rights reserved.
<_ilResourceReference>%(ILResourceReference.FullPath)
- <_IldasmCommand>$(_IldasmDir)ildasm
+ <_IldasmCommand>"$(_IldasmDir)ildasm"
<_IldasmCommand>$(_IldasmCommand) "$(_ilResourceReference)"
<_IldasmCommand>$(_IldasmCommand) /OUT="$(IntermediateOutputPath)/$(MSBuildProjectName).ref.il"
@@ -132,10 +132,10 @@ Copyright (c) .NET Foundation. All rights reserved.
<_IlasmSwitches Condition="'$(DebugType)' == 'Impl'">$(_IlasmSwitches) -DEBUG=IMPL
<_IlasmSwitches Condition="'$(DebugType)' == 'PdbOnly'">$(_IlasmSwitches) -DEBUG=OPT
<_IlasmSwitches Condition="'$(Optimize)' == 'True'">$(_IlasmSwitches) -OPTIMIZE
- <_IlasmSwitches Condition="'$(IlasmResourceFile)' != ''">$(_IlasmSwitches) -RESOURCES=$(IlasmResourceFile)
+ <_IlasmSwitches Condition="'$(IlasmResourceFile)' != ''">$(_IlasmSwitches) -RESOURCES="$(IlasmResourceFile)"
-
+
@@ -143,6 +143,9 @@ Copyright (c) .NET Foundation. All rights reserved.
+
+
+
diff --git a/src/coreclr/src/.nuget/Microsoft.NETCore.ILAsm/Microsoft.NETCore.ILAsm.pkgproj b/src/coreclr/src/.nuget/Microsoft.NETCore.ILAsm/Microsoft.NETCore.ILAsm.pkgproj
index c21e7eaa736b..7db8e23c29b5 100644
--- a/src/coreclr/src/.nuget/Microsoft.NETCore.ILAsm/Microsoft.NETCore.ILAsm.pkgproj
+++ b/src/coreclr/src/.nuget/Microsoft.NETCore.ILAsm/Microsoft.NETCore.ILAsm.pkgproj
@@ -8,7 +8,7 @@
-
+
diff --git a/src/coreclr/src/.nuget/Microsoft.NETCore.ILDAsm/Microsoft.NETCore.ILDAsm.pkgproj b/src/coreclr/src/.nuget/Microsoft.NETCore.ILDAsm/Microsoft.NETCore.ILDAsm.pkgproj
index ce1739f8d6f5..357c60565948 100644
--- a/src/coreclr/src/.nuget/Microsoft.NETCore.ILDAsm/Microsoft.NETCore.ILDAsm.pkgproj
+++ b/src/coreclr/src/.nuget/Microsoft.NETCore.ILDAsm/Microsoft.NETCore.ILDAsm.pkgproj
@@ -8,7 +8,7 @@
-
+
diff --git a/src/coreclr/src/.nuget/Microsoft.NETCore.TestHost/Microsoft.NETCore.TestHost.pkgproj b/src/coreclr/src/.nuget/Microsoft.NETCore.TestHost/Microsoft.NETCore.TestHost.pkgproj
index 5188a4cae994..f3ef1f744710 100644
--- a/src/coreclr/src/.nuget/Microsoft.NETCore.TestHost/Microsoft.NETCore.TestHost.pkgproj
+++ b/src/coreclr/src/.nuget/Microsoft.NETCore.TestHost/Microsoft.NETCore.TestHost.pkgproj
@@ -8,7 +8,7 @@
-
+
diff --git a/src/coreclr/src/CMakeLists.txt b/src/coreclr/src/CMakeLists.txt
index e269657e5add..5f74a587d849 100644
--- a/src/coreclr/src/CMakeLists.txt
+++ b/src/coreclr/src/CMakeLists.txt
@@ -15,9 +15,11 @@ endif(CLR_CMAKE_TARGET_WIN32 AND FEATURE_EVENT_TRACE)
add_subdirectory(debug/dbgutil)
if(CLR_CMAKE_HOST_UNIX)
- if(CLR_CMAKE_HOST_OSX OR (CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID))
- add_subdirectory(debug/createdump)
- endif(CLR_CMAKE_HOST_OSX OR (CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID))
+ if(CLR_CMAKE_BUILD_SUBSET_RUNTIME)
+ if(CLR_CMAKE_HOST_OSX OR (CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID))
+ add_subdirectory(debug/createdump)
+ endif(CLR_CMAKE_HOST_OSX OR (CLR_CMAKE_HOST_LINUX AND NOT CLR_CMAKE_HOST_UNIX_X86 AND NOT CLR_CMAKE_HOST_ANDROID))
+ endif(CLR_CMAKE_BUILD_SUBSET_RUNTIME)
# Include the dummy c++ include files
include_directories("pal/inc/rt/cpp")
@@ -58,25 +60,42 @@ if(CLR_CMAKE_HOST_UNIX)
add_subdirectory(nativeresources)
endif(CLR_CMAKE_HOST_UNIX)
+if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 10.0))
+ add_compile_options(-Wno-error=stringop-overflow=)
+endif()
+
add_subdirectory(utilcode)
add_subdirectory(gcinfo)
add_subdirectory(jit)
-add_subdirectory(vm)
-add_subdirectory(md)
-add_subdirectory(debug)
add_subdirectory(inc)
-add_subdirectory(binder)
-add_subdirectory(classlibnative)
-add_subdirectory(dlls)
-add_subdirectory(ToolBox)
-add_subdirectory(tools)
-add_subdirectory(unwinder)
-add_subdirectory(ildasm)
-add_subdirectory(ilasm)
-add_subdirectory(interop)
if(CLR_CMAKE_HOST_UNIX)
add_subdirectory(palrt)
-elseif(CLR_CMAKE_HOST_WIN32)
- add_subdirectory(hosts)
endif(CLR_CMAKE_HOST_UNIX)
+
+add_subdirectory(vm)
+if (CLR_CMAKE_BUILD_SUBSET_RUNTIME)
+ add_subdirectory(md)
+ add_subdirectory(debug)
+ add_subdirectory(binder)
+ add_subdirectory(classlibnative)
+ add_subdirectory(dlls)
+ add_subdirectory(ToolBox)
+ add_subdirectory(tools)
+ add_subdirectory(unwinder)
+ add_subdirectory(ildasm)
+ add_subdirectory(ilasm)
+ add_subdirectory(interop)
+
+ if(CLR_CMAKE_HOST_WIN32)
+ add_subdirectory(hosts)
+ endif(CLR_CMAKE_HOST_WIN32)
+else()
+ if(CLR_CMAKE_HOST_UNIX)
+ # this is needed to compile the jit on unix platforms.
+ # When the runtime subset is compiled, the add_subdirectory(dlls) above
+ # brings the mscorrc library into the build graph
+ add_subdirectory(dlls/mscorrc)
+ endif(CLR_CMAKE_HOST_UNIX)
+endif(CLR_CMAKE_BUILD_SUBSET_RUNTIME)
+
diff --git a/src/coreclr/src/Directory.Build.targets b/src/coreclr/src/Directory.Build.targets
index 99a237595384..bc0daa25262b 100644
--- a/src/coreclr/src/Directory.Build.targets
+++ b/src/coreclr/src/Directory.Build.targets
@@ -10,10 +10,10 @@
AfterTargets="Build"
Condition="Exists(@(BuiltBinary -> '%(RootDir)%(Directory)%(Filename).pdb'))"
Inputs="@(BuiltBinary -> '%(RootDir)%(Directory)%(Filename).pdb')"
- Outputs="@(BuiltBinary -> '$(BinDir)PDB/%(Filename).pdb')">
+ Outputs="@(BuiltBinary -> '$(RuntimeBinDir)PDB/%(Filename).pdb')">
+ DestinationFolder="$(RuntimeBinDir)PDB" />
diff --git a/src/coreclr/src/System.Private.CoreLib/CreateRuntimeRootILLinkDescriptorFile.targets b/src/coreclr/src/System.Private.CoreLib/CreateRuntimeRootILLinkDescriptorFile.targets
index 18a6d21e57dc..e12999eccd73 100644
--- a/src/coreclr/src/System.Private.CoreLib/CreateRuntimeRootILLinkDescriptorFile.targets
+++ b/src/coreclr/src/System.Private.CoreLib/CreateRuntimeRootILLinkDescriptorFile.targets
@@ -7,18 +7,18 @@
<_ILLinkRuntimeRootDescriptorFilePath>$(ILLinkTrimXml)
<_NamespaceFilePath Condition=" '$(_NamespaceFilePath)' == '' ">$(MSBuildThisFileDirectory)..\vm\namespace.h
- <_MscorlibFilePath Condition=" '$(_MscorlibFilePath)' == '' ">$(MSBuildThisFileDirectory)..\vm\mscorlib.h
+ <_MscorlibFilePath Condition=" '$(_MscorlibFilePath)' == '' ">$(MSBuildThisFileDirectory)..\vm\corelib.h
<_CortypeFilePath Condition=" '$(_CortypeFilePath)' == '' ">$(MSBuildThisFileDirectory)..\inc\cortypeinfo.h
<_RexcepFilePath Condition=" '$(_RexcepFilePath)' == '' ">$(MSBuildThisFileDirectory)..\vm\rexcep.h
<_ILLinkDescriptorsIntermediatePath>$(IntermediateOutputPath)ILLink.Descriptors.Combined.xml
<_ILLinkTasksToolsDir>$(PkgMicrosoft_NET_ILLink_Tasks)/tools
- <_ILLinkTasksDir>$(_ILLinkTasksToolsDir)/$(NetFrameworkCurrent)/
- <_ILLinkTasksDir Condition="'$(MSBuildRuntimeType)' == 'Core'">$(_ILLinkTasksToolsDir)/netcoreapp3.0/
+ <_ILLinkTasksDir>$(_ILLinkTasksToolsDir)/net472/
+ <_ILLinkTasksDir Condition="'$(MSBuildRuntimeType)' == 'Core'">$(_ILLinkTasksToolsDir)/net5.0/
<_ILLinkTasksPath>$(_ILLinkTasksDir)ILLink.Tasks.dll
- <_ILLinkDescriptorsFilePaths Include="$(MSBuildThisFileDirectory)ILLinkTrim.xml" />
+ <_ILLinkDescriptorsFilePaths Include="$(ILLinkDirectory)ILLinkTrim.xml" />
<_ILLinkDescriptorsFilePaths Include="$(CoreLibSharedDir)ILLink\ILLink.Descriptors.Shared.xml" />
diff --git a/src/coreclr/src/System.Private.CoreLib/ILLinkTrim.xml b/src/coreclr/src/System.Private.CoreLib/ILLinkTrim.xml
deleted file mode 100644
index 11a67fdac313..000000000000
--- a/src/coreclr/src/System.Private.CoreLib/ILLinkTrim.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/coreclr/src/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/coreclr/src/System.Private.CoreLib/System.Private.CoreLib.csproj
index 501487c6a111..b5bf44baebd3 100644
--- a/src/coreclr/src/System.Private.CoreLib/System.Private.CoreLib.csproj
+++ b/src/coreclr/src/System.Private.CoreLib/System.Private.CoreLib.csproj
@@ -13,12 +13,16 @@
true
- $(BinDir)/IL/
+ $(RuntimeBinDir)/IL/Debug;Release;Checkedx64;x86;arm;arm64true$(IntermediateOutputPath)System.Private.CoreLib.xml
+ $(MSBuildThisFileDirectory)src\ILLink\
+
+ true
+ true
@@ -37,14 +41,7 @@
falsetrue
- true
- true
- 6.00v4.0.30319
- true
- true
- prompt
- 4true$(NoWarn),0419,0649,CA2249,CA1830enable
@@ -53,13 +50,8 @@
CORECLR;NETCOREAPP;SYSTEM_PRIVATE_CORELIBtrue
-
- <_TargetFrameworkDirectories>$(MSBuildThisFileDirectory)/Documentation
- <_FullFrameworkReferenceAssemblyPaths>$(MSBuildThisFileDirectory)/Documentation
true$(OutputPath)$(MSBuildProjectName).xml
- true
@@ -115,7 +107,6 @@
-
@@ -219,11 +210,11 @@
-
+
@@ -238,7 +229,7 @@
-
+
@@ -254,21 +245,6 @@
-
- Common\Interop\Windows\Kernel32\Interop.GetStdHandle.cs
-
-
- Common\Interop\Windows\Kernel32\Interop.HandleTypes.cs
-
-
- Common\Interop\Windows\Kernel32\Interop.LocalAlloc.cs
-
-
- Common\Interop\Windows\Ole32\Interop.CoTaskMemAlloc.cs
-
-
- Common\Interop\Windows\OleAut32\Interop.SysAllocStringByteLen.cs
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/coreclr/src/System.Private.CoreLib/src/Internal/Console.cs b/src/coreclr/src/System.Private.CoreLib/src/Internal/Console.cs
deleted file mode 100644
index 307fd9177a81..000000000000
--- a/src/coreclr/src/System.Private.CoreLib/src/Internal/Console.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Text;
-using Microsoft.Win32.SafeHandles;
-
-namespace Internal
-{
- //
- // Simple limited console class for internal printf-style debugging in System.Private.CoreLib
- // and low-level tests that want to call System.Private.CoreLib directly
- //
-
- public static class Console
- {
- private static readonly SafeFileHandle _outputHandle =
- new SafeFileHandle(Interop.Kernel32.GetStdHandle(Interop.Kernel32.HandleTypes.STD_OUTPUT_HANDLE), ownsHandle: false);
-
- public static unsafe void Write(string s)
- {
- byte[] bytes = Encoding.UTF8.GetBytes(s);
- fixed (byte* pBytes = bytes)
- {
- Interop.Kernel32.WriteFile(_outputHandle, pBytes, bytes.Length, out _, IntPtr.Zero);
- }
- }
-
- public static void WriteLine(string? s) =>
- Write(s + Environment.NewLineConst);
-
- public static void WriteLine() =>
- Write(Environment.NewLineConst);
- }
-}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs b/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs
index 45f4d4839fb8..6caaede63b1f 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs
@@ -9,6 +9,7 @@
using System.Reflection;
using System.Runtime.InteropServices;
using System.Runtime.Loader;
+using System.Runtime.Versioning;
//
// Types in this file marked as 'public' are done so only to aid in
@@ -25,7 +26,7 @@ public interface IClassFactory
void CreateInstance(
[MarshalAs(UnmanagedType.Interface)] object? pUnkOuter,
ref Guid riid,
- [MarshalAs(UnmanagedType.Interface)] out object? ppvObject);
+ out IntPtr ppvObject);
void LockServer([MarshalAs(UnmanagedType.Bool)] bool fLock);
}
@@ -51,7 +52,7 @@ internal interface IClassFactory2 : IClassFactory
new void CreateInstance(
[MarshalAs(UnmanagedType.Interface)] object? pUnkOuter,
ref Guid riid,
- [MarshalAs(UnmanagedType.Interface)] out object? ppvObject);
+ out IntPtr ppvObject);
new void LockServer([MarshalAs(UnmanagedType.Bool)] bool fLock);
@@ -66,7 +67,7 @@ void CreateInstanceLic(
[MarshalAs(UnmanagedType.Interface)] object? pUnkReserved,
ref Guid riid,
[MarshalAs(UnmanagedType.BStr)] string bstrKey,
- [MarshalAs(UnmanagedType.Interface)] out object ppvObject);
+ out IntPtr ppvObject);
}
[StructLayout(LayoutKind.Sequential)]
@@ -108,6 +109,7 @@ public static unsafe ComActivationContext Create(ref ComActivationContextInterna
}
}
+ [SupportedOSPlatform("windows")]
public static class ComActivator
{
#if FEATURE_COMINTEROP_UNMANAGED_ACTIVATION
@@ -219,7 +221,7 @@ public static void ClassRegistrationScenarioForType(ComActivationContext cxt, bo
if (methParams[0].ParameterType == typeof(string))
{
// We are dealing with the string overload of the function - provide the registry key - see comhost.dll implementation
- objs[0] = $"HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{cxt.ClassId.ToString("B")}";
+ objs[0] = $"HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID\\{cxt.ClassId:B}";
}
else
{
@@ -493,28 +495,32 @@ public static Type GetValidatedInterfaceType(Type classType, ref Guid riid, obje
#endif
}
- public static void ValidateObjectIsMarshallableAsInterface(object obj, Type interfaceType)
+ public static IntPtr GetObjectAsInterface(object obj, Type interfaceType)
{
#if FEATURE_COMINTEROP_UNMANAGED_ACTIVATION
- // If the requested "interface type" is type object then return
- // because type object is always marshallable.
+ // If the requested "interface type" is type object then return as IUnknown
if (interfaceType == typeof(object))
{
- return;
+ return Marshal.GetIUnknownForObject(obj);
}
Debug.Assert(interfaceType.IsInterface);
- // The intent of this call is to validate the interface can be
+ // The intent of this call is to get AND validate the interface can be
// marshalled to native code. An exception will be thrown if the
// type is unable to be marshalled to native code.
// Scenarios where this is relevant:
// - Interfaces that use Generics
// - Interfaces that define implementation
- IntPtr ptr = Marshal.GetComInterfaceForObject(obj, interfaceType, CustomQueryInterfaceMode.Ignore);
+ IntPtr interfaceMaybe = Marshal.GetComInterfaceForObject(obj, interfaceType, CustomQueryInterfaceMode.Ignore);
- // Decrement the above 'Marshal.GetComInterfaceForObject()'
- Marshal.Release(ptr);
+ if (interfaceMaybe == IntPtr.Zero)
+ {
+ // E_NOINTERFACE
+ throw new InvalidCastException();
+ }
+
+ return interfaceMaybe;
#else
throw new PlatformNotSupportedException();
#endif
@@ -544,18 +550,18 @@ public static object CreateAggregatedObject(object pUnkOuter, object comObject)
public void CreateInstance(
[MarshalAs(UnmanagedType.Interface)] object? pUnkOuter,
ref Guid riid,
- [MarshalAs(UnmanagedType.Interface)] out object? ppvObject)
+ out IntPtr ppvObject)
{
#if FEATURE_COMINTEROP_UNMANAGED_ACTIVATION
Type interfaceType = BasicClassFactory.GetValidatedInterfaceType(_classType, ref riid, pUnkOuter);
- ppvObject = Activator.CreateInstance(_classType)!;
+ object obj = Activator.CreateInstance(_classType)!;
if (pUnkOuter != null)
{
- ppvObject = BasicClassFactory.CreateAggregatedObject(pUnkOuter, ppvObject);
+ obj = BasicClassFactory.CreateAggregatedObject(pUnkOuter, obj);
}
- BasicClassFactory.ValidateObjectIsMarshallableAsInterface(ppvObject, interfaceType);
+ ppvObject = BasicClassFactory.GetObjectAsInterface(obj, interfaceType);
#else
throw new PlatformNotSupportedException();
#endif
@@ -593,7 +599,7 @@ public LicenseClassFactory(Guid clsid, Type classType)
public void CreateInstance(
[MarshalAs(UnmanagedType.Interface)] object? pUnkOuter,
ref Guid riid,
- [MarshalAs(UnmanagedType.Interface)] out object? ppvObject)
+ out IntPtr ppvObject)
{
#if FEATURE_COMINTEROP_UNMANAGED_ACTIVATION
CreateInstanceInner(pUnkOuter, ref riid, key: null, isDesignTime: true, out ppvObject);
@@ -640,7 +646,7 @@ public void CreateInstanceLic(
[MarshalAs(UnmanagedType.Interface)] object? pUnkReserved,
ref Guid riid,
[MarshalAs(UnmanagedType.BStr)] string bstrKey,
- [MarshalAs(UnmanagedType.Interface)] out object ppvObject)
+ out IntPtr ppvObject)
{
#if FEATURE_COMINTEROP_UNMANAGED_ACTIVATION
Debug.Assert(pUnkReserved == null);
@@ -655,18 +661,18 @@ private void CreateInstanceInner(
ref Guid riid,
string? key,
bool isDesignTime,
- out object ppvObject)
+ out IntPtr ppvObject)
{
#if FEATURE_COMINTEROP_UNMANAGED_ACTIVATION
Type interfaceType = BasicClassFactory.GetValidatedInterfaceType(_classType, ref riid, pUnkOuter);
- ppvObject = _licenseProxy.AllocateAndValidateLicense(_classType, key, isDesignTime);
+ object obj = _licenseProxy.AllocateAndValidateLicense(_classType, key, isDesignTime);
if (pUnkOuter != null)
{
- ppvObject = BasicClassFactory.CreateAggregatedObject(pUnkOuter, ppvObject);
+ obj = BasicClassFactory.CreateAggregatedObject(pUnkOuter, obj);
}
- BasicClassFactory.ValidateObjectIsMarshallableAsInterface(ppvObject, interfaceType);
+ ppvObject = BasicClassFactory.GetObjectAsInterface(obj, interfaceType);
#else
throw new PlatformNotSupportedException();
#endif
diff --git a/src/coreclr/src/System.Private.CoreLib/src/Interop/Unix/Interop.Libraries.cs b/src/coreclr/src/System.Private.CoreLib/src/Interop/Unix/Interop.Libraries.cs
index 9a34b905608b..9e09c265d799 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/Interop/Unix/Interop.Libraries.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/Interop/Unix/Interop.Libraries.cs
@@ -8,9 +8,5 @@ internal static partial class Interop
internal static partial class Libraries
{
internal const string Kernel32 = RuntimeHelpers.QCall;
- internal const string User32 = RuntimeHelpers.QCall;
- internal const string Ole32 = RuntimeHelpers.QCall;
- internal const string OleAut32 = RuntimeHelpers.QCall;
- internal const string Advapi32 = RuntimeHelpers.QCall;
}
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/ArgIterator.cs b/src/coreclr/src/System.Private.CoreLib/src/System/ArgIterator.cs
index d9ed61c6c103..10ede24a6573 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/ArgIterator.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/ArgIterator.cs
@@ -134,50 +134,50 @@ public override bool Equals(object? o)
#else
public ArgIterator(RuntimeArgumentHandle arglist)
{
- throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/coreclr/issues/9204
+ throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/runtime/issues/7317
}
[CLSCompliant(false)]
public unsafe ArgIterator(RuntimeArgumentHandle arglist, void* ptr)
{
- throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/coreclr/issues/9204
+ throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/runtime/issues/7317
}
public void End()
{
- throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/coreclr/issues/9204
+ throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/runtime/issues/7317
}
public override bool Equals(object? o)
{
- throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/coreclr/issues/9204
+ throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/runtime/issues/7317
}
public override int GetHashCode()
{
- throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/coreclr/issues/9204
+ throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/runtime/issues/7317
}
[CLSCompliant(false)]
public System.TypedReference GetNextArg()
{
- throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/coreclr/issues/9204
+ throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/runtime/issues/7317
}
[CLSCompliant(false)]
public System.TypedReference GetNextArg(System.RuntimeTypeHandle rth)
{
- throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/coreclr/issues/9204
+ throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/runtime/issues/7317
}
public unsafe System.RuntimeTypeHandle GetNextArgType()
{
- throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/coreclr/issues/9204
+ throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/runtime/issues/7317
}
public int GetRemainingCount()
{
- throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/coreclr/issues/9204
+ throw new PlatformNotSupportedException(SR.PlatformNotSupported_ArgIterator); // https://github.com/dotnet/runtime/issues/7317
}
#endif // TARGET_WINDOWS
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Array.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Array.CoreCLR.cs
index ee2e02db3798..e661ca109c0d 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Array.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Array.CoreCLR.cs
@@ -483,6 +483,7 @@ private unsafe bool IsValueOfElementType(object value)
public extern void Initialize();
}
+#pragma warning disable CA1822 // Mark members as static
//----------------------------------------------------------------------------------------
// ! READ THIS BEFORE YOU WORK ON THIS CLASS.
//
@@ -619,4 +620,5 @@ private void RemoveAt(int index)
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_FixedSizeCollection);
}
}
+#pragma warning restore CA1822
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Buffer.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Buffer.CoreCLR.cs
index 081f1d6c05d5..59126ce8808f 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Buffer.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Buffer.CoreCLR.cs
@@ -80,10 +80,11 @@ private static void _BulkMoveWithWriteBarrier(ref byte destination, ref byte sou
[DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
private static extern unsafe void __Memmove(byte* dest, byte* src, nuint len);
+ // Used by ilmarshalers.cpp
internal static unsafe void Memcpy(byte* dest, byte* src, int len)
{
Debug.Assert(len >= 0, "Negative length in memcpy!");
- Memmove(dest, src, (nuint)len);
+ Memmove(ref *dest, ref *src, (nuint)len);
}
// Used by ilmarshalers.cpp
@@ -91,24 +92,16 @@ internal static unsafe void Memcpy(byte* pDest, int destIndex, byte[] src, int s
{
Debug.Assert((srcIndex >= 0) && (destIndex >= 0) && (len >= 0), "Index and length must be non-negative!");
Debug.Assert(src.Length - srcIndex >= len, "not enough bytes in src");
- // If dest has 0 elements, the fixed statement will throw an
- // IndexOutOfRangeException. Special-case 0-byte copies.
- if (len == 0)
- return;
- fixed (byte* pSrc = src)
- {
- Memcpy(pDest + destIndex, pSrc + srcIndex, len);
- }
+
+ Memmove(ref *(pDest + destIndex), ref Unsafe.Add(ref MemoryMarshal.GetArrayDataReference(src), srcIndex), (nuint)len);
}
- // This method has different signature for x64 and other platforms and is done for performance reasons.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void Memmove(ref T destination, ref T source, nuint elementCount)
{
if (!RuntimeHelpers.IsReferenceOrContainsReferences())
{
// Blittable memmove
-
Memmove(
ref Unsafe.As(ref destination),
ref Unsafe.As(ref source),
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/CLRConfig.cs b/src/coreclr/src/System.Private.CoreLib/src/System/CLRConfig.cs
index 9ac34e44182b..cb2a0321325c 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/CLRConfig.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/CLRConfig.cs
@@ -28,7 +28,7 @@ internal static bool GetBoolValueWithFallbacks(string switchName, string environ
// abstractions where reasonably possible.
Span buffer = stackalloc char[32];
- int length = Interop.Kernel32.GetEnvironmentVariable(environmentName, buffer);
+ uint length = Interop.Kernel32.GetEnvironmentVariable(environmentName, ref buffer.GetPinnableReference(), (uint)buffer.Length);
switch (length)
{
case 1:
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Collections/Generic/ComparerHelpers.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Collections/Generic/ComparerHelpers.cs
index 7a49fad02133..1fb54677d0c5 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Collections/Generic/ComparerHelpers.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Collections/Generic/ComparerHelpers.cs
@@ -126,7 +126,7 @@ internal static object CreateDefaultEqualityComparer(Type type)
result = new ByteEqualityComparer();
}
// If T implements IEquatable return a GenericEqualityComparer
- else if (typeof(IEquatable<>).MakeGenericType(type).IsAssignableFrom(type))
+ else if (type.IsAssignableTo(typeof(IEquatable<>).MakeGenericType(type)))
{
result = CreateInstanceForAnotherGenericParameter((RuntimeType)typeof(GenericEqualityComparer), runtimeType);
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Collections/Generic/EqualityComparer.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Collections/Generic/EqualityComparer.CoreCLR.cs
index 2bc0e7ad5c91..252627d27633 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Collections/Generic/EqualityComparer.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Collections/Generic/EqualityComparer.CoreCLR.cs
@@ -12,26 +12,6 @@ public abstract partial class EqualityComparer : IEqualityComparer, IEquality
// To minimize generic instantiation overhead of creating the comparer per type, we keep the generic portion of the code as small
// as possible and define most of the creation logic in a non-generic class.
public static EqualityComparer Default { [Intrinsic] get; } = (EqualityComparer)ComparerHelpers.CreateDefaultEqualityComparer(typeof(T));
-
- internal virtual int IndexOf(T[] array, T value, int startIndex, int count)
- {
- int endIndex = startIndex + count;
- for (int i = startIndex; i < endIndex; i++)
- {
- if (Equals(array[i], value)) return i;
- }
- return -1;
- }
-
- internal virtual int LastIndexOf(T[] array, T value, int startIndex, int count)
- {
- int endIndex = startIndex - count + 1;
- for (int i = startIndex; i >= endIndex; i--)
- {
- if (Equals(array[i], value)) return i;
- }
- return -1;
- }
}
public sealed partial class GenericEqualityComparer : EqualityComparer where T : IEquatable
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs
index 5e51ac062923..1d026a643233 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Diagnostics/Debugger.cs
@@ -16,9 +16,6 @@ public static class Debugger
[MethodImpl(MethodImplOptions.NoInlining)]
public static void Break() => BreakInternal();
- // The VM depends on this private method.
- private static void BreakCanThrow() => BreakInternal();
-
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void BreakInternal();
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Diagnostics/StackFrame.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Diagnostics/StackFrame.CoreCLR.cs
index cf60a806a9ce..948ebd253723 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Diagnostics/StackFrame.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Diagnostics/StackFrame.CoreCLR.cs
@@ -49,6 +49,6 @@ private void BuildStackFrame(int skipFrames, bool needFileInfo)
}
}
- private bool AppendStackFrameWithoutMethodBase(StringBuilder sb) => false;
+ private static bool AppendStackFrameWithoutMethodBase(StringBuilder sb) => false;
}
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Environment.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Environment.CoreCLR.cs
index d2ea1e3fbdd0..b375cfddc7ba 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Environment.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Environment.CoreCLR.cs
@@ -11,7 +11,11 @@ namespace System
{
public static partial class Environment
{
- public static int CurrentManagedThreadId => Thread.CurrentThread.ManagedThreadId;
+ public static extern int CurrentManagedThreadId
+ {
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ get;
+ }
// Terminates this process with the given exit code.
[DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
@@ -83,9 +87,7 @@ public static string[] GetCommandLineArgs()
[DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
private static extern int GetProcessorCount();
- // If you change this method's signature then you must change the code that calls it
- // in excep.cpp and probably you will have to visit mscorlib.h to add the new signature
- // as well as metasig.h to create the new signature type
+ // Used by VM
internal static string? GetResourceStringLocal(string key) => SR.GetResourceString(key);
public static string StackTrace
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Exception.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Exception.CoreCLR.cs
index c3f1e5b4fd43..d6bb435387b0 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Exception.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Exception.CoreCLR.cs
@@ -266,8 +266,8 @@ private string? SerializationStackTraceString
}
// This piece of infrastructure exists to help avoid deadlocks
- // between parts of mscorlib that might throw an exception while
- // holding a lock that are also used by mscorlib's ResourceManager
+ // between parts of CoreLib that might throw an exception while
+ // holding a lock that are also used by CoreLib's ResourceManager
// instance. As a special case of code that may throw while holding
// a lock, we also need to fix our asynchronous exceptions to use
// Win32 resources as well (assuming we ever call a managed
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/GC.cs b/src/coreclr/src/System.Private.CoreLib/src/System/GC.cs
index 865600fe8d2d..d932d18d9fc9 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/GC.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/GC.cs
@@ -294,7 +294,7 @@ public static int GetGeneration(WeakReference wo)
public static void WaitForPendingFinalizers()
{
- // QCalls can not be exposed from mscorlib directly, need to wrap it.
+ // QCalls can not be exposed directly, need to wrap it.
_WaitForPendingFinalizers();
}
@@ -659,7 +659,7 @@ internal static void UnregisterMemoryLoadChangeNotification(Action notification)
/// If pinned is set to true, must not be a reference type or a type that contains object references.
///
[MethodImpl(MethodImplOptions.AggressiveInlining)] // forced to ensure no perf drop for small memory buffers (hot path)
- public static T[] AllocateUninitializedArray(int length, bool pinned = false)
+ public static T[] AllocateUninitializedArray(int length, bool pinned = false) // T[] rather than T?[] to match `new T[length]` behavior
{
if (!pinned)
{
@@ -685,7 +685,7 @@ public static T[] AllocateUninitializedArray(int length, bool pinned = false)
// kept outside of the small arrays hot path to have inlining without big size growth
return AllocateNewUninitializedArray(length, pinned);
- // remove the local function when https://github.com/dotnet/coreclr/issues/5329 is implemented
+ // remove the local function when https://github.com/dotnet/runtime/issues/5973 is implemented
static T[] AllocateNewUninitializedArray(int length, bool pinned)
{
GC_ALLOC_FLAGS flags = GC_ALLOC_FLAGS.GC_ALLOC_ZEROING_OPTIONAL;
@@ -705,7 +705,7 @@ static T[] AllocateNewUninitializedArray(int length, bool pinned)
///
/// If pinned is set to true, must not be a reference type or a type that contains object references.
///
- public static T[] AllocateArray(int length, bool pinned = false)
+ public static T[] AllocateArray(int length, bool pinned = false) // T[] rather than T?[] to match `new T[length]` behavior
{
GC_ALLOC_FLAGS flags = GC_ALLOC_FLAGS.GC_ALLOC_NO_FLAGS;
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Math.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Math.CoreCLR.cs
index 74aca4342ee3..beeb322b52c0 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Math.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Math.CoreCLR.cs
@@ -56,6 +56,7 @@ public static partial class Math
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern double Cbrt(double d);
+ [Intrinsic]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern double Ceiling(double a);
@@ -71,6 +72,7 @@ public static partial class Math
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern double Exp(double d);
+ [Intrinsic]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern double Floor(double d);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/MathF.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/MathF.CoreCLR.cs
index 371780f6abe0..f3dd3289c1c2 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/MathF.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/MathF.CoreCLR.cs
@@ -45,6 +45,7 @@ public static partial class MathF
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern float Cbrt(float x);
+ [Intrinsic]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern float Ceiling(float x);
@@ -60,6 +61,7 @@ public static partial class MathF
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern float Exp(float x);
+ [Intrinsic]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern float Floor(float x);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/MulticastDelegate.cs b/src/coreclr/src/System.Private.CoreLib/src/System/MulticastDelegate.cs
index a2598bd7779a..bba499737c27 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/MulticastDelegate.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/MulticastDelegate.cs
@@ -153,7 +153,7 @@ private bool InvocationListEquals(MulticastDelegate d)
return true;
}
- private bool TrySetSlot(object?[] a, int index, object o)
+ private static bool TrySetSlot(object?[] a, int index, object o)
{
if (a[index] == null && System.Threading.Interlocked.CompareExchange(ref a[index], o, null) == null)
return true;
@@ -221,7 +221,7 @@ internal void StoreDynamicMethod(MethodInfo dynamicMethod)
// to form a new delegate.
protected sealed override Delegate CombineImpl(Delegate? follow)
{
- if ((object?)follow == null) // cast to object for a more efficient test
+ if (follow is null)
return this;
// Verify that the types are the same...
@@ -322,7 +322,7 @@ private object[] DeleteFromInvocationList(object[] invocationList, int invocatio
return newInvocationList;
}
- private bool EqualInvocationLists(object[] a, object[] b, int start, int count)
+ private static bool EqualInvocationLists(object[] a, object[] b, int start, int count)
{
for (int i = 0; i < count; i++)
{
@@ -437,7 +437,7 @@ public sealed override Delegate[] GetInvocationList()
// so it can become a simple test
if (d2 is null)
{
- // return true/false not the test result https://github.com/dotnet/coreclr/issues/914
+ // return true/false not the test result https://github.com/dotnet/runtime/issues/4207
return (d1 is null) ? true : false;
}
@@ -454,7 +454,7 @@ public sealed override Delegate[] GetInvocationList()
// so it can become a simple test
if (d2 is null)
{
- // return true/false not the test result https://github.com/dotnet/coreclr/issues/914
+ // return true/false not the test result https://github.com/dotnet/runtime/issues/4207
return (d1 is null) ? false : true;
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Associates.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Associates.cs
index 8876fdabb881..6d90ebf7b993 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Associates.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Associates.cs
@@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
namespace System.Reflection
{
@@ -31,6 +32,11 @@ internal static bool IncludeAccessor(MethodInfo? associate, bool nonPublic)
return false;
}
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
+ Justification = "Module.ResolveMethod is marked as RequiresUnreferencedCode because it relies on tokens" +
+ "which are not guaranteed to be stable across trimming. So if somebody harcodes a token it could break." +
+ "The usage here is not like that as all these tokes come from existing metadata loaded from some IL" +
+ "and so trimming has no effect (the tokens are read AFTER trimming occured).")]
private static RuntimeMethodInfo? AssignAssociates(
int tkMethod,
RuntimeType declaredType,
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/CustomAttribute.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/CustomAttribute.cs
index a7625465c0e8..49f4cedbeef7 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/CustomAttribute.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/CustomAttribute.cs
@@ -5,6 +5,7 @@
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
namespace System.Reflection
{
@@ -289,6 +290,10 @@ protected CustomAttributeData()
{
}
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern",
+ Justification = "property setters and fiels which are accessed by any attribute instantiation which is present in the code linker has analyzed." +
+ "As such enumerating all fields and properties may return different results fater trimming" +
+ "but all those which are needed to actually have data should be there.")]
private CustomAttributeData(RuntimeModule scope, MetadataToken caCtorToken, in ConstArray blob)
{
m_scope = scope;
@@ -1160,6 +1165,10 @@ private static object[] GetCustomAttributes(
return result;
}
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2065:UnrecognizedReflectionPattern",
+ Justification = "Linker guarantees presence of all the constructor parameters, property setters and fiels which are accessed by any " +
+ "attribute instantiation which is present in the code linker has analyzed." +
+ "As such the reflection usage in this method should never fail as those methods/fields should always be present.")]
private static void AddCustomAttributes(
ref RuntimeType.ListBuilder attributes,
RuntimeModule decoratedModule, int decoratedMetadataToken,
@@ -1294,6 +1303,11 @@ private static void AddCustomAttributes(
}
}
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
+ Justification = "Module.ResolveMethod and Module.ResolveType are marked as RequiresUnreferencedCode because they rely on tokens" +
+ "which are not guaranteed to be stable across trimming. So if somebody harcodes a token it could break." +
+ "The usage here is not like that as all these tokes come from existing metadata loaded from some IL" +
+ "and so trimming has no effect (the tokens are read AFTER trimming occured).")]
private static bool FilterCustomAttributeRecord(
MetadataToken caCtorToken,
in MetadataImport scope,
@@ -1336,7 +1350,7 @@ private static bool FilterCustomAttributeRecord(
if (ctorHasParameters)
{
// Resolve method ctor token found in decorated decoratedModule scope
- // See https://github.com/dotnet/coreclr/issues/21456 for why we fast-path non-generics here (fewer allocations)
+ // See https://github.com/dotnet/runtime/issues/11637 for why we fast-path non-generics here (fewer allocations)
if (attributeType.IsGenericType)
{
ctorWithParameters = decoratedModule.ResolveMethod(caCtorToken, attributeType.GenericTypeArguments, null)!.MethodHandle.GetMethodInfo();
@@ -1426,6 +1440,11 @@ private static bool AttributeUsageCheck(
return true;
}
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
+ Justification = "Module.ResolveType is marked as RequiresUnreferencedCode because it relies on tokens" +
+ "which are not guaranteed to be stable across trimming. So if somebody harcodes a token it could break." +
+ "The usage here is not like that as all these tokes come from existing metadata loaded from some IL" +
+ "and so trimming has no effect (the tokens are read AFTER trimming occured).")]
internal static AttributeUsageAttribute GetAttributeUsage(RuntimeType decoratedAttribute)
{
RuntimeModule decoratedModule = decoratedAttribute.GetRuntimeModule();
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.cs
index 60d6791a0572..1a384d14282c 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/AssemblyBuilder.cs
@@ -497,7 +497,7 @@ public override FileStream[] GetFiles(bool getResourceModules)
public override Module? GetModule(string name) => InternalAssembly.GetModule(name);
- [RequiresUnreferencedCode("Types might be removed")]
+ [RequiresUnreferencedCode("Assembly references might be removed")]
public override AssemblyName[] GetReferencedAssemblies()
{
return InternalAssembly.GetReferencedAssemblies();
@@ -595,7 +595,7 @@ private void SetCustomAttributeNoLock(ConstructorInfo con, byte[] binaryAttribut
TypeBuilder.DefineCustomAttribute(
_manifestModuleBuilder, // pass in the in-memory assembly module
AssemblyBuilderData.AssemblyDefToken,
- _manifestModuleBuilder.GetConstructorToken(con).Token,
+ _manifestModuleBuilder.GetConstructorToken(con),
binaryAttribute,
false,
typeof(DebuggableAttribute) == con.DeclaringType);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.cs
index de668d586341..245486413868 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ConstructorBuilder.cs
@@ -23,7 +23,7 @@ internal ConstructorBuilder(string name, MethodAttributes attributes, CallingCon
m_methodBuilder.GetMethodSignature().InternalGetSignature(out _);
- m_methodBuilder.GetToken();
+ int dummy = m_methodBuilder.MetadataToken;
}
internal ConstructorBuilder(string name, MethodAttributes attributes, CallingConventions callingConvention,
@@ -45,6 +45,10 @@ private TypeBuilder GetTypeBuilder()
{
return m_methodBuilder.GetTypeBuilder();
}
+ internal SignatureHelper GetMethodSignature()
+ {
+ return m_methodBuilder.GetMethodSignature();
+ }
#endregion
#region Object Overrides
@@ -56,7 +60,7 @@ public override string ToString()
#endregion
#region MemberInfo Overrides
- internal int MetadataTokenInternal => m_methodBuilder.MetadataTokenInternal;
+ public override int MetadataToken => m_methodBuilder.MetadataToken;
public override Module Module => m_methodBuilder.Module;
@@ -118,11 +122,6 @@ public override bool IsDefined(Type attributeType, bool inherit)
#endregion
#region Public Members
- public MethodToken GetToken()
- {
- return m_methodBuilder.GetToken();
- }
-
public ParameterBuilder DefineParameter(int iSequence, ParameterAttributes attributes, string? strParamName)
{
// Theoretically we shouldn't allow iSequence to be 0 because in reflection ctors don't have
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/CustomAttributeBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/CustomAttributeBuilder.cs
index 2754a6e81216..51487b02a4c0 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/CustomAttributeBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/CustomAttributeBuilder.cs
@@ -527,7 +527,7 @@ private static void EmitValue(BinaryWriter writer, Type type, object? value)
// return the byte interpretation of the custom attribute
internal void CreateCustomAttribute(ModuleBuilder mod, int tkOwner)
{
- CreateCustomAttribute(mod, tkOwner, mod.GetConstructorToken(m_con).Token, false);
+ CreateCustomAttribute(mod, tkOwner, mod.GetConstructorToken(m_con), false);
}
///
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs
index 34d501c1363d..693a2937c152 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/DynamicILGenerator.cs
@@ -428,6 +428,8 @@ public override void EndScope()
private int GetMemberRefToken(MethodBase methodInfo, Type[]? optionalParameterTypes)
{
Type[]? parameterTypes;
+ Type[][]? requiredCustomModifiers;
+ Type[][]? optionalCustomModifiers;
if (optionalParameterTypes != null && (methodInfo.CallingConvention & CallingConventions.VarArgs) == 0)
throw new InvalidOperationException(SR.InvalidOperation_NotAVarArgCallingConvention);
@@ -442,17 +444,28 @@ private int GetMemberRefToken(MethodBase methodInfo, Type[]? optionalParameterTy
if (paramInfo != null && paramInfo.Length != 0)
{
parameterTypes = new Type[paramInfo.Length];
+ requiredCustomModifiers = new Type[parameterTypes.Length][];
+ optionalCustomModifiers = new Type[parameterTypes.Length][];
+
for (int i = 0; i < paramInfo.Length; i++)
+ {
parameterTypes[i] = paramInfo[i].ParameterType;
+ requiredCustomModifiers[i] = paramInfo[i].GetRequiredCustomModifiers();
+ optionalCustomModifiers[i] = paramInfo[i].GetOptionalCustomModifiers();
+ }
}
else
{
parameterTypes = null;
+ requiredCustomModifiers = null;
+ optionalCustomModifiers = null;
}
SignatureHelper sig = GetMemberRefSignature(methodInfo.CallingConvention,
MethodBuilder.GetMethodBaseReturnType(methodInfo),
parameterTypes,
+ requiredCustomModifiers,
+ optionalCustomModifiers,
optionalParameterTypes);
if (rtMeth != null)
@@ -465,13 +478,17 @@ internal override SignatureHelper GetMemberRefSignature(
CallingConventions call,
Type? returnType,
Type[]? parameterTypes,
+ Type[][]? requiredCustomModifiers,
+ Type[][]? optionalCustomModifiers,
Type[]? optionalParameterTypes)
{
SignatureHelper sig = SignatureHelper.GetMethodSigHelper(call, returnType);
if (parameterTypes != null)
{
- foreach (Type t in parameterTypes)
- sig.AddArgument(t);
+ for (int i = 0; i < parameterTypes.Length; i++)
+ {
+ sig.AddArgument(parameterTypes[i], requiredCustomModifiers![i], optionalCustomModifiers![i]);
+ }
}
if (optionalParameterTypes != null && optionalParameterTypes.Length != 0)
{
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs
index 4d52ddcb876f..873979ecb7ac 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/EnumBuilder.cs
@@ -50,7 +50,7 @@ public FieldBuilder DefineLiteral(string literalName, object? literalValue)
}
// Get the internal metadata token for this class.
- public TypeToken TypeToken => m_typeBuilder.TypeToken;
+ internal int TypeToken => m_typeBuilder.TypeToken;
// return the underlying field for the enum
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/EventBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/EventBuilder.cs
index 426d0af22887..a66718182a83 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/EventBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/EventBuilder.cs
@@ -30,7 +30,7 @@ internal EventBuilder(
EventAttributes attr, // event attribute such as Public, Private, and Protected defined above
// int eventType, // event type
TypeBuilder type, // containing type
- EventToken evToken)
+ int evToken)
{
m_name = name;
m_module = mod;
@@ -41,7 +41,7 @@ internal EventBuilder(
// Return the Token for this event within the TypeBuilder that the
// event is defined within.
- public EventToken GetEventToken()
+ internal int GetEventToken()
{
return m_evToken;
}
@@ -57,9 +57,9 @@ private void SetMethodSemantics(MethodBuilder mdBuilder, MethodSemanticsAttribut
ModuleBuilder module = m_module;
TypeBuilder.DefineMethodSemantics(
new QCallModule(ref module),
- m_evToken.Token,
+ m_evToken,
semantics,
- mdBuilder.GetToken().Token);
+ mdBuilder.MetadataToken);
}
public void SetAddOnMethod(MethodBuilder mdBuilder)
@@ -94,8 +94,8 @@ public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
TypeBuilder.DefineCustomAttribute(
m_module,
- m_evToken.Token,
- m_module.GetConstructorToken(con).Token,
+ m_evToken,
+ m_module.GetConstructorToken(con),
binaryAttribute,
false, false);
}
@@ -108,12 +108,12 @@ public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
throw new ArgumentNullException(nameof(customBuilder));
}
m_type.ThrowIfCreated();
- customBuilder.CreateCustomAttribute(m_module, m_evToken.Token);
+ customBuilder.CreateCustomAttribute(m_module, m_evToken);
}
// These are package private so that TypeBuilder can access them.
private string m_name; // The name of the event
- private EventToken m_evToken; // The token of this event
+ private int m_evToken; // The token of this event
private ModuleBuilder m_module;
private EventAttributes m_attributes;
private TypeBuilder m_type;
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/FieldBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/FieldBuilder.cs
index 3001b3df82de..c136a2c69368 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/FieldBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/FieldBuilder.cs
@@ -10,7 +10,6 @@ public sealed class FieldBuilder : FieldInfo
{
#region Private Data Members
private int m_fieldTok;
- private FieldToken m_tkField;
private TypeBuilder m_typeBuilder;
private string m_fieldName;
private FieldAttributes m_Attributes;
@@ -48,9 +47,7 @@ internal FieldBuilder(TypeBuilder typeBuilder, string fieldName, Type type,
ModuleBuilder module = m_typeBuilder.GetModuleBuilder();
m_fieldTok = TypeBuilder.DefineField(new QCallModule(ref module),
- typeBuilder.TypeToken.Token, fieldName, signature, sigLength, m_Attributes);
-
- m_tkField = new FieldToken(m_fieldTok, type);
+ typeBuilder.TypeToken, fieldName, signature, sigLength, m_Attributes);
}
#endregion
@@ -59,12 +56,12 @@ internal FieldBuilder(TypeBuilder typeBuilder, string fieldName, Type type,
internal void SetData(byte[]? data, int size)
{
ModuleBuilder module = m_typeBuilder.GetModuleBuilder();
- ModuleBuilder.SetFieldRVAContent(new QCallModule(ref module), m_tkField.Token, data, size);
+ ModuleBuilder.SetFieldRVAContent(new QCallModule(ref module), m_fieldTok, data, size);
}
#endregion
#region MemberInfo Overrides
- internal int MetadataTokenInternal => m_fieldTok;
+ public override int MetadataToken => m_fieldTok;
public override Module Module => m_typeBuilder.Module;
@@ -140,17 +137,12 @@ public override bool IsDefined(Type attributeType, bool inherit)
#endregion
#region Public Members
- public FieldToken GetToken()
- {
- return m_tkField;
- }
-
public void SetOffset(int iOffset)
{
m_typeBuilder.ThrowIfCreated();
ModuleBuilder module = m_typeBuilder.GetModuleBuilder();
- TypeBuilder.SetFieldLayoutOffset(new QCallModule(ref module), GetToken().Token, iOffset);
+ TypeBuilder.SetFieldLayoutOffset(new QCallModule(ref module), m_fieldTok, iOffset);
}
public void SetConstant(object? defaultValue)
@@ -164,7 +156,7 @@ public void SetConstant(object? defaultValue)
throw new ArgumentException(SR.Argument_ConstantNull);
}
- TypeBuilder.SetConstantValue(m_typeBuilder.GetModuleBuilder(), GetToken().Token, m_fieldType, defaultValue);
+ TypeBuilder.SetConstantValue(m_typeBuilder.GetModuleBuilder(), m_fieldTok, m_fieldType, defaultValue);
}
public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
@@ -180,7 +172,7 @@ public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
m_typeBuilder.ThrowIfCreated();
TypeBuilder.DefineCustomAttribute(module,
- m_tkField.Token, module.GetConstructorToken(con).Token, binaryAttribute, false, false);
+ m_fieldTok, module.GetConstructorToken(con), binaryAttribute, false, false);
}
public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
@@ -192,7 +184,7 @@ public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
ModuleBuilder? module = m_typeBuilder.Module as ModuleBuilder;
- customBuilder.CreateCustomAttribute(module!, m_tkField.Token);
+ customBuilder.CreateCustomAttribute(module!, m_fieldTok);
}
#endregion
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs
index e21b2c1a6a84..4dc0b22b3b46 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/GenericTypeParameterBuilder.cs
@@ -53,7 +53,7 @@ public override bool Equals(object? o)
public override bool IsByRefLike => false;
- internal int MetadataTokenInternal => m_type.MetadataTokenInternal;
+ public override int MetadataToken => m_type.MetadataToken;
#endregion
#region Type Overrides
@@ -220,13 +220,13 @@ public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
public void SetBaseTypeConstraint([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type? baseTypeConstraint)
{
- m_type.CheckContext(baseTypeConstraint);
+ AssemblyBuilder.CheckContext(baseTypeConstraint);
m_type.SetParent(baseTypeConstraint);
}
public void SetInterfaceConstraints(params Type[]? interfaceConstraints)
{
- m_type.CheckContext(interfaceConstraints);
+ AssemblyBuilder.CheckContext(interfaceConstraints);
m_type.SetInterfaces(interfaceConstraints);
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs
index c587b18c62ac..acdf1663b80c 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ILGenerator.cs
@@ -162,16 +162,24 @@ private int GetMethodToken(MethodBase method, Type[]? optionalParameterTypes, bo
return ((ModuleBuilder)m_methodBuilder.Module).GetMethodTokenInternal(method, optionalParameterTypes, useMethodDef);
}
+ internal SignatureHelper GetMemberRefSignature(
+ CallingConventions call,
+ Type? returnType,
+ Type[]? parameterTypes,
+ Type[]? optionalParameterTypes)
+ {
+ return GetMemberRefSignature(call, returnType, parameterTypes, null, null, optionalParameterTypes);
+ }
internal virtual SignatureHelper GetMemberRefSignature(CallingConventions call, Type? returnType,
- Type[]? parameterTypes, Type[]? optionalParameterTypes)
+ Type[]? parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers, Type[]? optionalParameterTypes)
{
- return GetMemberRefSignature(call, returnType, parameterTypes, optionalParameterTypes, 0);
+ return GetMemberRefSignature(call, returnType, parameterTypes, requiredCustomModifiers, optionalCustomModifiers, optionalParameterTypes, 0);
}
private SignatureHelper GetMemberRefSignature(CallingConventions call, Type? returnType,
- Type[]? parameterTypes, Type[]? optionalParameterTypes, int cGenericParameters)
+ Type[]? parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers, Type[]? optionalParameterTypes, int cGenericParameters)
{
- return ((ModuleBuilder)m_methodBuilder.Module).GetMemberRefSignature(call, returnType, parameterTypes, optionalParameterTypes, cGenericParameters);
+ return ((ModuleBuilder)m_methodBuilder.Module).GetMemberRefSignature(call, returnType, parameterTypes, requiredCustomModifiers, optionalCustomModifiers, optionalParameterTypes, cGenericParameters);
}
internal byte[]? BakeByteArray()
@@ -534,7 +542,7 @@ public virtual void EmitCalli(OpCode opcode, CallingConventions callingConventio
UpdateStackSize(OpCodes.Calli, stackchange);
RecordTokenFixup();
- PutInteger4(modBuilder.GetSignatureToken(sig).Token);
+ PutInteger4(modBuilder.GetSignatureToken(sig));
}
public virtual void EmitCalli(OpCode opcode, CallingConvention unmanagedCallConv, Type? returnType, Type[]? parameterTypes)
@@ -577,7 +585,7 @@ public virtual void EmitCalli(OpCode opcode, CallingConvention unmanagedCallConv
EnsureCapacity(7);
Emit(OpCodes.Calli);
RecordTokenFixup();
- PutInteger4(modBuilder.GetSignatureToken(sig).Token);
+ PutInteger4(modBuilder.GetSignatureToken(sig));
}
public virtual void EmitCall(OpCode opcode, MethodInfo methodInfo, Type[]? optionalParameterTypes)
@@ -622,9 +630,9 @@ public virtual void Emit(OpCode opcode, SignatureHelper signature)
int stackchange = 0;
ModuleBuilder modBuilder = (ModuleBuilder)m_methodBuilder.Module;
- SignatureToken sig = modBuilder.GetSignatureToken(signature);
+ int sig = modBuilder.GetSignatureToken(signature);
- int tempVal = sig.Token;
+ int tempVal = sig;
EnsureCapacity(7);
InternalEmit(opcode);
@@ -701,13 +709,13 @@ public virtual void Emit(OpCode opcode, Type cls)
if (opcode == OpCodes.Ldtoken && cls != null && cls.IsGenericTypeDefinition)
{
// This gets the token for the generic type definition if cls is one.
- tempVal = modBuilder.GetTypeToken(cls).Token;
+ tempVal = modBuilder.GetTypeToken(cls);
}
else
{
// This gets the token for the generic type instantiated on the formal parameters
// if cls is a generic type definition.
- tempVal = modBuilder.GetTypeTokenInternal(cls!).Token;
+ tempVal = modBuilder.GetTypeTokenInternal(cls!);
}
EnsureCapacity(7);
@@ -792,7 +800,7 @@ public virtual void Emit(OpCode opcode, Label[] labels)
public virtual void Emit(OpCode opcode, FieldInfo field)
{
ModuleBuilder modBuilder = (ModuleBuilder)m_methodBuilder.Module;
- int tempVal = modBuilder.GetFieldToken(field).Token;
+ int tempVal = modBuilder.GetFieldToken(field);
EnsureCapacity(7);
InternalEmit(opcode);
RecordTokenFixup();
@@ -806,7 +814,7 @@ public virtual void Emit(OpCode opcode, string str)
// fixups if the module is persisted to a PE.
ModuleBuilder modBuilder = (ModuleBuilder)m_methodBuilder.Module;
- int tempVal = modBuilder.GetStringConstant(str).Token;
+ int tempVal = modBuilder.GetStringConstant(str);
EnsureCapacity(7);
InternalEmit(opcode);
PutInteger4(tempVal);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.cs
index 65b5033e996e..e99c584074c1 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/MethodBuilder.cs
@@ -16,7 +16,7 @@ public sealed class MethodBuilder : MethodInfo
#region Private Data Members
// Identity
internal string m_strName; // The name of the method
- private MethodToken m_tkMethod; // The token of this method
+ private int m_token; // The token of this method
private readonly ModuleBuilder m_module;
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]
@@ -98,20 +98,6 @@ internal MethodBuilder(string name, MethodAttributes attributes, CallingConventi
throw new ArgumentException(SR.Arg_NoStaticVirtual);
}
-#if !FEATURE_DEFAULT_INTERFACES
- if ((attributes & MethodAttributes.SpecialName) != MethodAttributes.SpecialName)
- {
- if ((type.Attributes & TypeAttributes.Interface) == TypeAttributes.Interface)
- {
- // methods on interface have to be abstract + virtual except special name methods such as type initializer
- if ((attributes & (MethodAttributes.Abstract | MethodAttributes.Virtual)) !=
- (MethodAttributes.Abstract | MethodAttributes.Virtual) &&
- (attributes & MethodAttributes.Static) == 0)
- throw new ArgumentException(SR.Argument_BadAttributeOnInterfaceMethod);
- }
- }
-#endif
-
m_callingConvention = callingConvention;
if (parameterTypes != null)
@@ -149,16 +135,6 @@ internal MethodBuilder(string name, MethodAttributes attributes, CallingConventi
#region Internal Members
- internal void CheckContext(params Type[]?[]? typess)
- {
- m_module.CheckContext(typess);
- }
-
- internal void CheckContext(params Type?[]? types)
- {
- m_module.CheckContext(types);
- }
-
internal void CreateMethodBodyHelper(ILGenerator il)
{
// Sets the IL of the method. An ILGenerator is passed as an argument and the method
@@ -230,7 +206,7 @@ internal void CreateMethodBodyHelper(ILGenerator il)
int tkExceptionClass = 0;
if (catchClass[j] != null)
{
- tkExceptionClass = dynMod.GetTypeTokenInternal(catchClass[j]).Token;
+ tkExceptionClass = dynMod.GetTypeTokenInternal(catchClass[j]);
}
switch (type[j])
@@ -256,7 +232,7 @@ internal void CreateMethodBodyHelper(ILGenerator il)
// set the debugging information such as scope and line number
// if it is in a debug module
//
- SymbolToken tk = new SymbolToken(MetadataTokenInternal);
+ SymbolToken tk = new SymbolToken(MetadataToken);
ISymbolWriter symWriter = dynMod.GetSymWriter()!;
// call OpenMethod to make this method the current method
@@ -311,9 +287,9 @@ internal void ReleaseBakedStructures()
}
}
- internal void SetToken(MethodToken token)
+ internal void SetToken(int token)
{
- m_tkMethod = token;
+ m_token = token;
}
internal byte[]? GetBody()
@@ -459,7 +435,7 @@ public override string ToString()
#region MemberInfo Overrides
public override string Name => m_strName;
- internal int MetadataTokenInternal => GetToken().Token;
+ public override int MetadataToken => GetToken();
public override Module Module => m_containingType.Module;
@@ -584,7 +560,7 @@ public GenericTypeParameterBuilder[] DefineGenericParameters(params string[] nam
if (names[i] == null)
throw new ArgumentNullException(nameof(names));
- if (m_tkMethod.Token != 0)
+ if (m_token != 0)
throw new InvalidOperationException(SR.InvalidOperation_MethodBuilderBaked);
m_bIsGenMethDef = true;
@@ -599,7 +575,7 @@ public GenericTypeParameterBuilder[] DefineGenericParameters(params string[] nam
#endregion
#region Public Members
- public MethodToken GetToken()
+ private int GetToken()
{
// We used to always "tokenize" a MethodBuilder when it is constructed. After change list 709498
// we only "tokenize" a method when requested. But the order in which the methods are tokenized
@@ -611,13 +587,13 @@ public MethodToken GetToken()
// I don't fully understand this change. So I will keep the logic and only fix the recursion and
// the race condition.
- if (m_tkMethod.Token != 0)
+ if (m_token != 0)
{
- return m_tkMethod;
+ return m_token;
}
MethodBuilder? currentMethod = null;
- MethodToken currentToken = new MethodToken(0);
+ int currentToken = 0;
int i;
// We need to lock here to prevent a method from being "tokenized" twice.
@@ -625,9 +601,9 @@ public MethodToken GetToken()
// constructed MethodBuilders to the end of m_listMethods
lock (m_containingType.m_listMethods!)
{
- if (m_tkMethod.Token != 0)
+ if (m_token != 0)
{
- return m_tkMethod;
+ return m_token;
}
// If m_tkMethod is still 0 when we obtain the lock, m_lastTokenizedMethod must be smaller
@@ -645,20 +621,20 @@ public MethodToken GetToken()
}
Debug.Assert(currentMethod == this, "We should have found this method in m_containingType.m_listMethods");
- Debug.Assert(currentToken.Token != 0, "The token should not be 0");
+ Debug.Assert(currentToken != 0, "The token should not be 0");
return currentToken;
}
- private MethodToken GetTokenNoLock()
+ private int GetTokenNoLock()
{
- Debug.Assert(m_tkMethod.Token == 0, "m_tkMethod should not have been initialized");
+ Debug.Assert(m_token == 0, "m_token should not have been initialized");
byte[] sigBytes = GetMethodSignature().InternalGetSignature(out int sigLength);
ModuleBuilder module = m_module;
- int token = TypeBuilder.DefineMethod(new QCallModule(ref module), m_containingType.MetadataTokenInternal, m_strName, sigBytes, sigLength, Attributes);
- m_tkMethod = new MethodToken(token);
+ int token = TypeBuilder.DefineMethod(new QCallModule(ref module), m_containingType.MetadataToken, m_strName, sigBytes, sigLength, Attributes);
+ m_token = token;
if (m_inst != null)
foreach (GenericTypeParameterBuilder tb in m_inst)
@@ -666,19 +642,19 @@ private MethodToken GetTokenNoLock()
TypeBuilder.SetMethodImpl(new QCallModule(ref module), token, m_dwMethodImplFlags);
- return m_tkMethod;
+ return m_token;
}
public void SetParameters(params Type[] parameterTypes)
{
- CheckContext(parameterTypes);
+ AssemblyBuilder.CheckContext(parameterTypes);
SetSignature(null, null, null, parameterTypes, null, null);
}
public void SetReturnType(Type? returnType)
{
- CheckContext(returnType);
+ AssemblyBuilder.CheckContext(returnType);
SetSignature(returnType, null, null, null, null, null);
}
@@ -689,13 +665,13 @@ public void SetSignature(
{
// We should throw InvalidOperation_MethodBuilderBaked here if the method signature has been baked.
// But we cannot because that would be a breaking change from V2.
- if (m_tkMethod.Token != 0)
+ if (m_token != 0)
return;
- CheckContext(returnType);
- CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes);
- CheckContext(parameterTypeRequiredCustomModifiers);
- CheckContext(parameterTypeOptionalCustomModifiers);
+ AssemblyBuilder.CheckContext(returnType);
+ AssemblyBuilder.CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes);
+ AssemblyBuilder.CheckContext(parameterTypeRequiredCustomModifiers);
+ AssemblyBuilder.CheckContext(parameterTypeOptionalCustomModifiers);
ThrowIfGeneric();
@@ -742,7 +718,7 @@ public void SetImplementationFlags(MethodImplAttributes attributes)
m_canBeRuntimeImpl = true;
ModuleBuilder module = m_module;
- TypeBuilder.SetMethodImpl(new QCallModule(ref module), MetadataTokenInternal, attributes);
+ TypeBuilder.SetMethodImpl(new QCallModule(ref module), MetadataToken, attributes);
}
public ILGenerator GetILGenerator()
@@ -797,8 +773,8 @@ public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
ThrowIfGeneric();
- TypeBuilder.DefineCustomAttribute(m_module, MetadataTokenInternal,
- ((ModuleBuilder)m_module).GetConstructorToken(con).Token,
+ TypeBuilder.DefineCustomAttribute(m_module, MetadataToken,
+ ((ModuleBuilder)m_module).GetConstructorToken(con),
binaryAttribute,
false, false);
@@ -813,7 +789,7 @@ public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
ThrowIfGeneric();
- customBuilder.CreateCustomAttribute((ModuleBuilder)m_module, MetadataTokenInternal);
+ customBuilder.CreateCustomAttribute((ModuleBuilder)m_module, MetadataToken);
if (IsKnownCA(customBuilder.m_con))
ParseCA(customBuilder.m_con);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.cs
index c1ed6b887a02..6127c5947806 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ModuleBuilder.cs
@@ -122,16 +122,6 @@ internal void CheckTypeNameConflict(string strTypeName, Type? enclosingType)
return SymbolType.FormCompoundType(strFormat, baseType, 0);
}
- internal void CheckContext(params Type[]?[]? typess)
- {
- AssemblyBuilder.CheckContext(typess);
- }
-
- internal void CheckContext(params Type?[]? types)
- {
- AssemblyBuilder.CheckContext(types);
- }
-
[DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
private static extern int GetTypeRef(QCallModule module, string strFullName, QCallModule refedModule, string? strRefedModuleFileName, int tkResolution);
@@ -255,7 +245,7 @@ private int GetTypeRefNested(Type type, Module? refedModule, string? strRefedMod
return GetTypeRef(new QCallModule(ref thisModule), typeName, new QCallModule(ref refedRuntimeModule), strRefedModuleFileName, tkResolution);
}
- internal MethodToken InternalGetConstructorToken(ConstructorInfo con, bool usingRef)
+ internal int InternalGetConstructorToken(ConstructorInfo con, bool usingRef)
{
// Helper to get constructor token. If usingRef is true, we will never use the def token
if (con == null)
@@ -264,29 +254,29 @@ internal MethodToken InternalGetConstructorToken(ConstructorInfo con, bool using
}
int tr;
- int mr = 0;
+ int mr;
if (con is ConstructorBuilder conBuilder)
{
if (!usingRef && conBuilder.Module.Equals(this))
- return conBuilder.GetToken();
+ return conBuilder.MetadataToken;
// constructor is defined in a different module
- tr = GetTypeTokenInternal(con.ReflectedType!).Token;
- mr = GetMemberRef(con.ReflectedType!.Module, tr, conBuilder.GetToken().Token);
+ tr = GetTypeTokenInternal(con.ReflectedType!);
+ mr = GetMemberRef(con.ReflectedType!.Module, tr, conBuilder.MetadataToken);
}
else if (con is ConstructorOnTypeBuilderInstantiation conOnTypeBuilderInst)
{
if (usingRef) throw new InvalidOperationException();
- tr = GetTypeTokenInternal(con.DeclaringType!).Token;
- mr = GetMemberRef(con.DeclaringType!.Module, tr, conOnTypeBuilderInst.MetadataTokenInternal);
+ tr = GetTypeTokenInternal(con.DeclaringType!);
+ mr = GetMemberRef(con.DeclaringType!.Module, tr, conOnTypeBuilderInst.MetadataToken);
}
else if (con is RuntimeConstructorInfo rtCon && !con.ReflectedType!.IsArray)
{
// constructor is not a dynamic field
// We need to get the TypeRef tokens
- tr = GetTypeTokenInternal(con.ReflectedType).Token;
+ tr = GetTypeTokenInternal(con.ReflectedType);
mr = GetMemberRefOfMethodInfo(tr, rtCon);
}
else
@@ -315,14 +305,14 @@ internal MethodToken InternalGetConstructorToken(ConstructorInfo con, bool using
optionalCustomModifiers[i] = parameters[i].GetOptionalCustomModifiers();
}
- tr = GetTypeTokenInternal(con.ReflectedType!).Token;
+ tr = GetTypeTokenInternal(con.ReflectedType!);
SignatureHelper sigHelp = SignatureHelper.GetMethodSigHelper(this, con.CallingConvention, null, null, null, parameterTypes, requiredCustomModifiers, optionalCustomModifiers);
byte[] sigBytes = sigHelp.InternalGetSignature(out int length);
mr = GetMemberRefFromSignature(tr, con.Name, sigBytes, length);
}
- return new MethodToken(mr);
+ return mr;
}
internal void Init(string strModuleName)
@@ -357,12 +347,11 @@ private static RuntimeModule GetRuntimeModuleFromModule(Module? m)
return (m as RuntimeModule)!;
}
- private int GetMemberRefToken(MethodBase method, IEnumerable? optionalParameterTypes)
+ private int GetMemberRefToken(MethodBase method, Type[]? optionalParameterTypes)
{
- Type[] parameterTypes;
- Type? returnType;
int tkParent;
int cGenericParameters = 0;
+ SignatureHelper sigHelp;
if (method.IsGenericMethod)
{
@@ -387,55 +376,22 @@ private int GetMemberRefToken(MethodBase method, IEnumerable? optionalPara
if (method.DeclaringType!.IsGenericType)
{
- MethodBase methDef; // methodInfo = G.M ==> methDef = G.M
-
- if (method is MethodOnTypeBuilderInstantiation motbi)
- {
- methDef = motbi.m_method;
- }
- else if (method is ConstructorOnTypeBuilderInstantiation cotbi)
- {
- methDef = cotbi.m_ctor;
- }
- else if (method is MethodBuilder || method is ConstructorBuilder)
- {
- // methodInfo must be GenericMethodDefinition; trying to emit G>.M
- methDef = method;
- }
- else
- {
- Debug.Assert(method is RuntimeMethodInfo || method is RuntimeConstructorInfo);
-
- if (method.IsGenericMethod)
- {
- Debug.Assert(masmi != null);
+ MethodBase methDef = GetGenericMethodBaseDefinition(method);
- methDef = masmi.GetGenericMethodDefinition()!;
- methDef = methDef.Module.ResolveMethod(
- method.MetadataToken,
- methDef.DeclaringType?.GetGenericArguments(),
- methDef.GetGenericArguments())!;
- }
- else
- {
- methDef = method.Module.ResolveMethod(
- method.MetadataToken,
- method.DeclaringType?.GetGenericArguments(),
- null)!;
- }
- }
-
- parameterTypes = methDef.GetParameterTypes();
- returnType = MethodBuilder.GetMethodBaseReturnType(methDef);
+ sigHelp = GetMemberRefSignature(methDef, cGenericParameters);
}
else
{
- parameterTypes = method.GetParameterTypes();
- returnType = MethodBuilder.GetMethodBaseReturnType(method);
+ sigHelp = GetMemberRefSignature(method, cGenericParameters);
+ }
+
+ if (optionalParameterTypes?.Length > 0)
+ {
+ sigHelp.AddSentinel();
+ sigHelp.AddArguments(optionalParameterTypes, null, null);
}
- byte[] sigBytes = GetMemberRefSignature(method.CallingConvention, returnType, parameterTypes,
- optionalParameterTypes, cGenericParameters).InternalGetSignature(out int sigLength);
+ byte[] sigBytes = sigHelp.InternalGetSignature(out int sigLength);
if (method.DeclaringType!.IsGenericType)
{
@@ -445,30 +401,31 @@ private int GetMemberRefToken(MethodBase method, IEnumerable? optionalPara
else if (!method.Module.Equals(this))
{
// Use typeRef as parent because the method's declaringType lives in a different assembly
- tkParent = GetTypeToken(method.DeclaringType).Token;
+ tkParent = GetTypeToken(method.DeclaringType);
}
else
{
// Use methodDef as parent because the method lives in this assembly and its declaringType has no generic arguments
if (masmi != null)
- tkParent = GetMethodToken(masmi).Token;
+ tkParent = GetMethodToken(masmi);
else
- tkParent = GetConstructorToken((method as ConstructorInfo)!).Token;
+ tkParent = GetConstructorToken((method as ConstructorInfo)!);
}
return GetMemberRefFromSignature(tkParent, method.Name, sigBytes, sigLength);
}
internal SignatureHelper GetMemberRefSignature(CallingConventions call, Type? returnType,
- Type[]? parameterTypes, IEnumerable? optionalParameterTypes, int cGenericParameters)
+ Type[]? parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers,
+ IEnumerable? optionalParameterTypes, int cGenericParameters)
{
SignatureHelper sig = SignatureHelper.GetMethodSigHelper(this, call, returnType, cGenericParameters);
if (parameterTypes != null)
{
- foreach (Type t in parameterTypes)
+ for (int i = 0; i < parameterTypes.Length; i++)
{
- sig.AddArgument(t);
+ sig.AddArgument(parameterTypes[i], requiredCustomModifiers![i], optionalCustomModifiers![i]);
}
}
@@ -491,6 +448,90 @@ internal SignatureHelper GetMemberRefSignature(CallingConventions call, Type? re
return sig;
}
+ private static MethodBase GetGenericMethodBaseDefinition(MethodBase methodBase)
+ {
+ // methodInfo = G.M ==> methDef = G.M
+ MethodInfo? masmi = methodBase as MethodInfo;
+ MethodBase methDef;
+
+ if (methodBase is MethodOnTypeBuilderInstantiation motbi)
+ {
+ methDef = motbi.m_method;
+ }
+ else if (methodBase is ConstructorOnTypeBuilderInstantiation cotbi)
+ {
+ methDef = cotbi.m_ctor;
+ }
+ else if (methodBase is MethodBuilder || methodBase is ConstructorBuilder)
+ {
+ // methodInfo must be GenericMethodDefinition; trying to emit G>.M
+ methDef = methodBase;
+ }
+ else
+ {
+ Debug.Assert(methodBase is RuntimeMethodInfo || methodBase is RuntimeConstructorInfo);
+
+ if (methodBase.IsGenericMethod)
+ {
+ Debug.Assert(masmi != null);
+
+ methDef = masmi.GetGenericMethodDefinition()!;
+ methDef = methDef.Module.ResolveMethod(
+ methodBase.MetadataToken,
+ methDef.DeclaringType?.GetGenericArguments(),
+ methDef.GetGenericArguments())!;
+ }
+ else
+ {
+ methDef = methodBase.Module.ResolveMethod(
+ methodBase.MetadataToken,
+ methodBase.DeclaringType?.GetGenericArguments(),
+ null)!;
+ }
+ }
+
+ return methDef;
+ }
+
+ internal SignatureHelper GetMemberRefSignature(MethodBase? method, int cGenericParameters)
+ {
+ switch (method)
+ {
+ case MethodBuilder methodBuilder:
+ return methodBuilder.GetMethodSignature();
+ case ConstructorBuilder constructorBuilder:
+ return constructorBuilder.GetMethodSignature();
+ case MethodOnTypeBuilderInstantiation motbi when motbi.m_method is MethodBuilder methodBuilder:
+ return methodBuilder.GetMethodSignature();
+ case MethodOnTypeBuilderInstantiation motbi:
+ method = motbi.m_method;
+ break;
+ case ConstructorOnTypeBuilderInstantiation cotbi when cotbi.m_ctor is ConstructorBuilder constructorBuilder:
+ return constructorBuilder.GetMethodSignature();
+ case ConstructorOnTypeBuilderInstantiation cotbi:
+ method = cotbi.m_ctor;
+ break;
+ }
+
+ Debug.Assert(method is RuntimeMethodInfo || method is RuntimeConstructorInfo);
+ ParameterInfo[] parameters = method.GetParametersNoCopy();
+
+ Type[] parameterTypes = new Type[parameters.Length];
+ Type[][] requiredCustomModifiers = new Type[parameterTypes.Length][];
+ Type[][] optionalCustomModifiers = new Type[parameterTypes.Length][];
+
+ for (int i = 0; i < parameters.Length; i++)
+ {
+ parameterTypes[i] = parameters[i].ParameterType;
+ requiredCustomModifiers[i] = parameters[i].GetRequiredCustomModifiers();
+ optionalCustomModifiers[i] = parameters[i].GetOptionalCustomModifiers();
+ }
+
+ ParameterInfo? returnParameter = method is MethodInfo mi ? mi.ReturnParameter : null;
+ SignatureHelper sigHelp = SignatureHelper.GetMethodSigHelper(this, method.CallingConvention, cGenericParameters, returnParameter?.ParameterType, returnParameter?.GetRequiredCustomModifiers(), returnParameter?.GetOptionalCustomModifiers(), parameterTypes, requiredCustomModifiers, optionalCustomModifiers);
+ return sigHelp;
+ }
+
#endregion
public override bool Equals(object? obj) => InternalModule.Equals(obj);
@@ -742,13 +783,13 @@ public override FieldInfo[] GetFields(BindingFlags bindingFlags)
return InternalModule.GetField(name, bindingAttr);
}
- [RequiresUnreferencedCode("Fields might be removed")]
+ [RequiresUnreferencedCode("Methods might be removed")]
public override MethodInfo[] GetMethods(BindingFlags bindingFlags)
{
return InternalModule.GetMethods(bindingFlags);
}
- [RequiresUnreferencedCode("Fields might be removed")]
+ [RequiresUnreferencedCode("Methods might be removed")]
protected override MethodInfo? GetMethodImpl(string name, BindingFlags bindingAttr, Binder? binder,
CallingConventions callConvention, Type[]? types, ParameterModifier[]? modifiers)
{
@@ -788,7 +829,7 @@ public TypeBuilder DefineType(string name, TypeAttributes attr, [DynamicallyAcce
{
lock (SyncRoot)
{
- CheckContext(parent);
+ AssemblyBuilder.CheckContext(parent);
return DefineTypeNoLock(name, attr, parent, null, PackingSize.Unspecified, TypeBuilder.UnspecifiedTypeSize);
}
@@ -844,7 +885,7 @@ private TypeBuilder DefineTypeNoLock(string name, TypeAttributes attr, [Dynamica
// Nested enum types can be defined manually using ModuleBuilder.DefineType.
public EnumBuilder DefineEnum(string name, TypeAttributes visibility, Type underlyingType)
{
- CheckContext(underlyingType);
+ AssemblyBuilder.CheckContext(underlyingType);
lock (SyncRoot)
{
EnumBuilder enumBuilder = DefineEnumNoLock(name, visibility, underlyingType);
@@ -885,8 +926,8 @@ public MethodBuilder DefinePInvokeMethod(string name, string dllName, string ent
throw new ArgumentException(SR.Argument_GlobalFunctionHasToBeStatic);
}
- CheckContext(returnType);
- CheckContext(parameterTypes);
+ AssemblyBuilder.CheckContext(returnType);
+ AssemblyBuilder.CheckContext(parameterTypes);
return _moduleData._globalTypeBuilder.DefinePInvokeMethod(name, dllName, entryName, attributes, callingConvention, returnType, parameterTypes, nativeCallConv, nativeCharSet);
}
@@ -936,10 +977,10 @@ private MethodBuilder DefineGlobalMethodNoLock(string name, MethodAttributes att
throw new ArgumentException(SR.Argument_GlobalFunctionHasToBeStatic);
}
- CheckContext(returnType);
- CheckContext(requiredReturnTypeCustomModifiers, optionalReturnTypeCustomModifiers, parameterTypes);
- CheckContext(requiredParameterTypeCustomModifiers);
- CheckContext(optionalParameterTypeCustomModifiers);
+ AssemblyBuilder.CheckContext(returnType);
+ AssemblyBuilder.CheckContext(requiredReturnTypeCustomModifiers, optionalReturnTypeCustomModifiers, parameterTypes);
+ AssemblyBuilder.CheckContext(requiredParameterTypeCustomModifiers);
+ AssemblyBuilder.CheckContext(optionalParameterTypeCustomModifiers);
return _moduleData._globalTypeBuilder.DefineMethod(name, attributes, callingConvention,
returnType, requiredReturnTypeCustomModifiers, optionalReturnTypeCustomModifiers,
@@ -1024,12 +1065,12 @@ private FieldBuilder DefineUninitializedDataNoLock(string name, int size, FieldA
// 1. GetTypeToken
// 2. ldtoken (see ILGenerator)
// For all other occasions we should return the generic type instantiated on its formal parameters.
- internal TypeToken GetTypeTokenInternal(Type type)
+ internal int GetTypeTokenInternal(Type type)
{
return GetTypeTokenInternal(type, getGenericDefinition: false);
}
- private TypeToken GetTypeTokenInternal(Type type, bool getGenericDefinition)
+ private int GetTypeTokenInternal(Type type, bool getGenericDefinition)
{
lock (SyncRoot)
{
@@ -1037,19 +1078,19 @@ private TypeToken GetTypeTokenInternal(Type type, bool getGenericDefinition)
}
}
- public TypeToken GetTypeToken(Type type)
+ internal int GetTypeToken(Type type)
{
return GetTypeTokenInternal(type, getGenericDefinition: true);
}
- private TypeToken GetTypeTokenWorkerNoLock(Type type, bool getGenericDefinition)
+ private int GetTypeTokenWorkerNoLock(Type type, bool getGenericDefinition)
{
if (type == null)
{
throw new ArgumentNullException(nameof(type));
}
- CheckContext(type);
+ AssemblyBuilder.CheckContext(type);
// Return a token for the class relative to the Module. Tokens
// are used to indentify objects when the objects are used in IL
@@ -1071,7 +1112,7 @@ private TypeToken GetTypeTokenWorkerNoLock(Type type, bool getGenericDefinition)
type.IsPointer)
{
byte[] sig = SignatureHelper.GetTypeSigToken(this, type).InternalGetSignature(out int length);
- return new TypeToken(GetTokenFromTypeSpec(sig, length));
+ return GetTokenFromTypeSpec(sig, length);
}
Module refedModule = type.Module;
@@ -1091,10 +1132,10 @@ private TypeToken GetTypeTokenWorkerNoLock(Type type, bool getGenericDefinition)
}
else if (type is GenericTypeParameterBuilder paramBuilder)
{
- return new TypeToken(paramBuilder.MetadataTokenInternal);
+ return paramBuilder.MetadataToken;
}
- return new TypeToken(GetTypeRefNested(type, this, string.Empty));
+ return GetTypeRefNested(type, this, string.Empty);
}
// After this point, the referenced module is not the same as the referencing
@@ -1117,10 +1158,10 @@ private TypeToken GetTypeTokenWorkerNoLock(Type type, bool getGenericDefinition)
referencedModuleFileName = refedModuleBuilder._moduleData._moduleName;
}
- return new TypeToken(GetTypeRefNested(type, refedModule, referencedModuleFileName));
+ return GetTypeRefNested(type, refedModule, referencedModuleFileName);
}
- public TypeToken GetTypeToken(string name)
+ internal int GetTypeToken(string name)
{
// Return a token for the class relative to the Module.
// Module.GetType() verifies name
@@ -1131,15 +1172,7 @@ public TypeToken GetTypeToken(string name)
return GetTypeToken(InternalModule.GetType(name, false, true)!);
}
- public MethodToken GetMethodToken(MethodInfo method)
- {
- lock (SyncRoot)
- {
- return GetMethodTokenNoLock(method, true);
- }
- }
-
- internal MethodToken GetMethodTokenInternal(MethodInfo method)
+ internal int GetMethodToken(MethodInfo method)
{
lock (SyncRoot)
{
@@ -1151,7 +1184,7 @@ internal MethodToken GetMethodTokenInternal(MethodInfo method)
// 1. GetMethodToken
// 2. ldtoken (see ILGenerator)
// For all other occasions we should return the method on the generic type instantiated on the formal parameters.
- private MethodToken GetMethodTokenNoLock(MethodInfo method, bool getGenericTypeDefinition)
+ private int GetMethodTokenNoLock(MethodInfo method, bool getGenericTypeDefinition)
{
// Return a MemberRef token if MethodInfo is not defined in this module. Or
// return the MethodDef token.
@@ -1165,10 +1198,10 @@ private MethodToken GetMethodTokenNoLock(MethodInfo method, bool getGenericTypeD
if (method is MethodBuilder methBuilder)
{
- int methodToken = methBuilder.MetadataTokenInternal;
+ int methodToken = methBuilder.MetadataToken;
if (method.Module.Equals(this))
{
- return new MethodToken(methodToken);
+ return methodToken;
}
if (method.DeclaringType == null)
@@ -1177,17 +1210,17 @@ private MethodToken GetMethodTokenNoLock(MethodInfo method, bool getGenericTypeD
}
// method is defined in a different module
- tr = getGenericTypeDefinition ? GetTypeToken(method.DeclaringType).Token : GetTypeTokenInternal(method.DeclaringType).Token;
+ tr = getGenericTypeDefinition ? GetTypeToken(method.DeclaringType) : GetTypeTokenInternal(method.DeclaringType);
mr = GetMemberRef(method.DeclaringType.Module, tr, methodToken);
}
else if (method is MethodOnTypeBuilderInstantiation)
{
- return new MethodToken(GetMemberRefToken(method, null));
+ return GetMemberRefToken(method, null);
}
else if (method is SymbolMethod symMethod)
{
if (symMethod.GetModule() == this)
- return symMethod.GetToken();
+ return symMethod.MetadataToken;
// form the method token
return symMethod.GetToken(this);
@@ -1216,7 +1249,7 @@ private MethodToken GetMethodTokenNoLock(MethodInfo method, bool getGenericTypeD
}
else if (method is RuntimeMethodInfo rtMeth)
{
- tr = getGenericTypeDefinition ? GetTypeToken(declaringType).Token : GetTypeTokenInternal(declaringType).Token;
+ tr = getGenericTypeDefinition ? GetTypeToken(declaringType) : GetTypeTokenInternal(declaringType);
mr = GetMemberRefOfMethodInfo(tr, rtMeth);
}
else
@@ -1236,7 +1269,7 @@ private MethodToken GetMethodTokenNoLock(MethodInfo method, bool getGenericTypeD
optionalCustomModifiers[i] = parameters[i].GetOptionalCustomModifiers();
}
- tr = getGenericTypeDefinition ? GetTypeToken(declaringType).Token : GetTypeTokenInternal(declaringType).Token;
+ tr = getGenericTypeDefinition ? GetTypeToken(declaringType) : GetTypeTokenInternal(declaringType);
SignatureHelper sigHelp;
@@ -1258,10 +1291,10 @@ private MethodToken GetMethodTokenNoLock(MethodInfo method, bool getGenericTypeD
}
}
- return new MethodToken(mr);
+ return mr;
}
- internal int GetMethodTokenInternal(MethodBase method, IEnumerable? optionalParameterTypes, bool useMethodDef)
+ internal int GetMethodTokenInternal(MethodBase method, Type[]? optionalParameterTypes, bool useMethodDef)
{
int tk;
MethodInfo? methodInfo = method as MethodInfo;
@@ -1287,7 +1320,7 @@ internal int GetMethodTokenInternal(MethodBase method, IEnumerable? option
}
else
{
- tk = GetMethodTokenInternal(methodInfoUnbound).Token;
+ tk = GetMethodToken(methodInfoUnbound);
}
// For Ldtoken, Ldftn, and Ldvirtftn, we should emit the method def/ref token for a generic method definition.
@@ -1310,11 +1343,11 @@ internal int GetMethodTokenInternal(MethodBase method, IEnumerable? option
{
if (methodInfo != null)
{
- tk = GetMethodTokenInternal(methodInfo).Token;
+ tk = GetMethodToken(methodInfo);
}
else
{
- tk = GetConstructorToken((method as ConstructorInfo)!).Token;
+ tk = GetConstructorToken((method as ConstructorInfo)!);
}
}
else
@@ -1326,7 +1359,7 @@ internal int GetMethodTokenInternal(MethodBase method, IEnumerable? option
return tk;
}
- public MethodToken GetArrayMethodToken(Type arrayClass, string methodName, CallingConventions callingConvention,
+ internal int GetArrayMethodToken(Type arrayClass, string methodName, CallingConventions callingConvention,
Type? returnType, Type[]? parameterTypes)
{
lock (SyncRoot)
@@ -1335,7 +1368,7 @@ public MethodToken GetArrayMethodToken(Type arrayClass, string methodName, Calli
}
}
- private MethodToken GetArrayMethodTokenNoLock(Type arrayClass, string methodName, CallingConventions callingConvention,
+ private int GetArrayMethodTokenNoLock(Type arrayClass, string methodName, CallingConventions callingConvention,
Type? returnType, Type[]? parameterTypes)
{
if (arrayClass == null)
@@ -1355,44 +1388,44 @@ private MethodToken GetArrayMethodTokenNoLock(Type arrayClass, string methodName
throw new ArgumentException(SR.Argument_HasToBeArrayClass);
}
- CheckContext(returnType, arrayClass);
- CheckContext(parameterTypes);
+ AssemblyBuilder.CheckContext(returnType, arrayClass);
+ AssemblyBuilder.CheckContext(parameterTypes);
// Return a token for the MethodInfo for a method on an Array. This is primarily
// used to get the LoadElementAddress method.
SignatureHelper sigHelp = SignatureHelper.GetMethodSigHelper(
this, callingConvention, returnType, null, null, parameterTypes, null, null);
byte[] sigBytes = sigHelp.InternalGetSignature(out int length);
- TypeToken typeSpec = GetTypeTokenInternal(arrayClass);
+ int typeSpec = GetTypeTokenInternal(arrayClass);
ModuleBuilder thisModule = this;
- return new MethodToken(GetArrayMethodToken(new QCallModule(ref thisModule),
- typeSpec.Token, methodName, sigBytes, length));
+ return GetArrayMethodToken(new QCallModule(ref thisModule),
+ typeSpec, methodName, sigBytes, length);
}
public MethodInfo GetArrayMethod(Type arrayClass, string methodName, CallingConventions callingConvention,
Type? returnType, Type[]? parameterTypes)
{
- CheckContext(returnType, arrayClass);
- CheckContext(parameterTypes);
+ AssemblyBuilder.CheckContext(returnType, arrayClass);
+ AssemblyBuilder.CheckContext(parameterTypes);
// GetArrayMethod is useful when you have an array of a type whose definition has not been completed and
// you want to access methods defined on Array. For example, you might define a type and want to define a
// method that takes an array of the type as a parameter. In order to access the elements of the array,
// you will need to call methods of the Array class.
- MethodToken token = GetArrayMethodToken(arrayClass, methodName, callingConvention, returnType, parameterTypes);
+ int token = GetArrayMethodToken(arrayClass, methodName, callingConvention, returnType, parameterTypes);
return new SymbolMethod(this, token, arrayClass, methodName, callingConvention, returnType, parameterTypes);
}
- public MethodToken GetConstructorToken(ConstructorInfo con)
+ internal int GetConstructorToken(ConstructorInfo con)
{
// Return a token for the ConstructorInfo relative to the Module.
return InternalGetConstructorToken(con, false);
}
- public FieldToken GetFieldToken(FieldInfo field)
+ internal int GetFieldToken(FieldInfo field)
{
lock (SyncRoot)
{
@@ -1400,7 +1433,7 @@ public FieldToken GetFieldToken(FieldInfo field)
}
}
- private FieldToken GetFieldTokenNoLock(FieldInfo field)
+ private int GetFieldTokenNoLock(FieldInfo field)
{
if (field == null)
{
@@ -1416,12 +1449,12 @@ private FieldToken GetFieldTokenNoLock(FieldInfo field)
{
byte[] sig = SignatureHelper.GetTypeSigToken(this, field.DeclaringType).InternalGetSignature(out int length);
tr = GetTokenFromTypeSpec(sig, length);
- mr = GetMemberRef(this, tr, fdBuilder.GetToken().Token);
+ mr = GetMemberRef(this, tr, fdBuilder.MetadataToken);
}
else if (fdBuilder.Module.Equals(this))
{
// field is defined in the same module
- return fdBuilder.GetToken();
+ return fdBuilder.MetadataToken;
}
else
{
@@ -1430,8 +1463,8 @@ private FieldToken GetFieldTokenNoLock(FieldInfo field)
{
throw new InvalidOperationException(SR.InvalidOperation_CannotImportGlobalFromDifferentModule);
}
- tr = GetTypeTokenInternal(field.DeclaringType).Token;
- mr = GetMemberRef(field.ReflectedType!.Module, tr, fdBuilder.GetToken().Token);
+ tr = GetTypeTokenInternal(field.DeclaringType);
+ mr = GetMemberRef(field.ReflectedType!.Module, tr, fdBuilder.MetadataToken);
}
}
else if (field is RuntimeFieldInfo rtField)
@@ -1451,7 +1484,7 @@ private FieldToken GetFieldTokenNoLock(FieldInfo field)
}
else
{
- tr = GetTypeTokenInternal(field.DeclaringType!).Token;
+ tr = GetTypeTokenInternal(field.DeclaringType!);
mr = GetMemberRefOfFieldInfo(tr, field.DeclaringType!.GetTypeHandleInternal(), rtField);
}
}
@@ -1460,12 +1493,12 @@ private FieldToken GetFieldTokenNoLock(FieldInfo field)
FieldInfo fb = fOnTB.FieldInfo;
byte[] sig = SignatureHelper.GetTypeSigToken(this, field.DeclaringType!).InternalGetSignature(out int length);
tr = GetTokenFromTypeSpec(sig, length);
- mr = GetMemberRef(fb.ReflectedType!.Module, tr, fOnTB.MetadataTokenInternal);
+ mr = GetMemberRef(fb.ReflectedType!.Module, tr, fOnTB.MetadataToken);
}
else
{
// user defined FieldInfo
- tr = GetTypeTokenInternal(field.ReflectedType!).Token;
+ tr = GetTypeTokenInternal(field.ReflectedType!);
SignatureHelper sigHelp = SignatureHelper.GetFieldSigHelper(this);
@@ -1475,10 +1508,10 @@ private FieldToken GetFieldTokenNoLock(FieldInfo field)
mr = GetMemberRefFromSignature(tr, field.Name, sigBytes, length);
}
- return new FieldToken(mr, field.GetType());
+ return mr;
}
- public StringToken GetStringConstant(string str)
+ internal int GetStringConstant(string str)
{
if (str == null)
{
@@ -1488,10 +1521,10 @@ public StringToken GetStringConstant(string str)
// Returns a token representing a String constant. If the string
// value has already been defined, the existing token will be returned.
ModuleBuilder thisModule = this;
- return new StringToken(GetStringConstant(new QCallModule(ref thisModule), str, str.Length));
+ return GetStringConstant(new QCallModule(ref thisModule), str, str.Length);
}
- public SignatureToken GetSignatureToken(SignatureHelper sigHelper)
+ internal int GetSignatureToken(SignatureHelper sigHelper)
{
// Define signature token given a signature helper. This will define a metadata
// token for the signature described by SignatureHelper.
@@ -1503,10 +1536,10 @@ public SignatureToken GetSignatureToken(SignatureHelper sigHelper)
// get the signature in byte form
byte[] sigBytes = sigHelper.InternalGetSignature(out int sigLength);
ModuleBuilder thisModule = this;
- return new SignatureToken(TypeBuilder.GetTokenFromSig(new QCallModule(ref thisModule), sigBytes, sigLength));
+ return TypeBuilder.GetTokenFromSig(new QCallModule(ref thisModule), sigBytes, sigLength);
}
- public SignatureToken GetSignatureToken(byte[] sigBytes, int sigLength)
+ internal int GetSignatureToken(byte[] sigBytes, int sigLength)
{
if (sigBytes == null)
{
@@ -1517,7 +1550,7 @@ public SignatureToken GetSignatureToken(byte[] sigBytes, int sigLength)
Buffer.BlockCopy(sigBytes, 0, localSigBytes, 0, sigBytes.Length);
ModuleBuilder thisModule = this;
- return new SignatureToken(TypeBuilder.GetTokenFromSig(new QCallModule(ref thisModule), localSigBytes, sigLength));
+ return TypeBuilder.GetTokenFromSig(new QCallModule(ref thisModule), localSigBytes, sigLength);
}
#endregion
@@ -1538,7 +1571,7 @@ public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
TypeBuilder.DefineCustomAttribute(
this,
1, // This is hard coding the module token to 1
- GetConstructorToken(con).Token,
+ GetConstructorToken(con),
binaryAttribute,
false, false);
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ParameterBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ParameterBuilder.cs
index e50546e54bfc..661bb8eddf6d 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ParameterBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/ParameterBuilder.cs
@@ -12,7 +12,7 @@ public virtual void SetConstant(object? defaultValue)
{
TypeBuilder.SetConstantValue(
_methodBuilder.GetModuleBuilder(),
- _token.Token,
+ _token,
_position == 0 ? _methodBuilder.ReturnType : _methodBuilder.m_parameterTypes![_position - 1],
defaultValue);
}
@@ -31,8 +31,8 @@ public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
TypeBuilder.DefineCustomAttribute(
_methodBuilder.GetModuleBuilder(),
- _token.Token,
- ((ModuleBuilder)_methodBuilder.GetModule()).GetConstructorToken(con).Token,
+ _token,
+ ((ModuleBuilder)_methodBuilder.GetModule()).GetConstructorToken(con),
binaryAttribute,
false, false);
}
@@ -44,7 +44,7 @@ public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
{
throw new ArgumentNullException(nameof(customBuilder));
}
- customBuilder.CreateCustomAttribute((ModuleBuilder)(_methodBuilder.GetModule()), _token.Token);
+ customBuilder.CreateCustomAttribute((ModuleBuilder)(_methodBuilder.GetModule()), _token);
}
internal ParameterBuilder(
@@ -58,15 +58,15 @@ internal ParameterBuilder(
_methodBuilder = methodBuilder;
_attributes = attributes;
ModuleBuilder module = _methodBuilder.GetModuleBuilder();
- _token = new ParameterToken(TypeBuilder.SetParamInfo(
+ _token = TypeBuilder.SetParamInfo(
new QCallModule(ref module),
- _methodBuilder.GetToken().Token,
+ _methodBuilder.MetadataToken,
sequence,
attributes,
- paramName));
+ paramName);
}
- public virtual ParameterToken GetToken()
+ internal int GetToken()
{
return _token;
}
@@ -87,6 +87,6 @@ public virtual ParameterToken GetToken()
private readonly int _position;
private readonly ParameterAttributes _attributes;
private MethodBuilder _methodBuilder;
- private ParameterToken _token;
+ private int _token;
}
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/PropertyBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/PropertyBuilder.cs
index 76b14a4cf813..4151db895be0 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/PropertyBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/PropertyBuilder.cs
@@ -26,12 +26,12 @@ public sealed class PropertyBuilder : PropertyInfo
// Constructs a PropertyBuilder.
//
internal PropertyBuilder(
- ModuleBuilder mod, // the module containing this PropertyBuilder
- string name, // property name
- SignatureHelper sig, // property signature descriptor info
- PropertyAttributes attr, // property attribute such as DefaultProperty, Bindable, DisplayBind, etc
- Type returnType, // return type of the property.
- PropertyToken prToken, // the metadata token for this property
+ ModuleBuilder mod, // the module containing this PropertyBuilder
+ string name, // property name
+ SignatureHelper sig, // property signature descriptor info
+ PropertyAttributes attr, // property attribute such as DefaultProperty, Bindable, DisplayBind, etc
+ Type returnType, // return type of the property.
+ int prToken, // the metadata token for this property
TypeBuilder containingType) // the containing type
{
if (name == null)
@@ -43,11 +43,9 @@ internal PropertyBuilder(
m_name = name;
m_moduleBuilder = mod;
- m_signature = sig;
m_attributes = attr;
m_returnType = returnType;
- m_prToken = prToken;
- m_tkProperty = prToken.Token;
+ m_tkProperty = prToken;
m_containingType = containingType;
}
@@ -60,7 +58,7 @@ public void SetConstant(object? defaultValue)
TypeBuilder.SetConstantValue(
m_moduleBuilder,
- m_prToken.Token,
+ m_tkProperty,
m_returnType,
defaultValue);
}
@@ -68,7 +66,7 @@ public void SetConstant(object? defaultValue)
// Return the Token for this property within the TypeBuilder that the
// property is defined within.
- public PropertyToken PropertyToken => m_prToken;
+ internal int PropertyToken => m_tkProperty;
public override Module Module => m_containingType.Module;
@@ -83,9 +81,9 @@ private void SetMethodSemantics(MethodBuilder mdBuilder, MethodSemanticsAttribut
ModuleBuilder module = m_moduleBuilder;
TypeBuilder.DefineMethodSemantics(
new QCallModule(ref module),
- m_prToken.Token,
+ m_tkProperty,
semantics,
- mdBuilder.GetToken().Token);
+ mdBuilder.MetadataToken);
}
public void SetGetMethod(MethodBuilder mdBuilder)
@@ -117,8 +115,8 @@ public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
m_containingType.ThrowIfCreated();
TypeBuilder.DefineCustomAttribute(
m_moduleBuilder,
- m_prToken.Token,
- m_moduleBuilder.GetConstructorToken(con).Token,
+ m_tkProperty,
+ m_moduleBuilder.GetConstructorToken(con),
binaryAttribute,
false, false);
}
@@ -131,7 +129,7 @@ public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
throw new ArgumentNullException(nameof(customBuilder));
}
m_containingType.ThrowIfCreated();
- customBuilder.CreateCustomAttribute(m_moduleBuilder, m_prToken.Token);
+ customBuilder.CreateCustomAttribute(m_moduleBuilder, m_tkProperty);
}
// Not supported functions in dynamic module.
@@ -221,13 +219,11 @@ public override bool IsDefined(Type attributeType, bool inherit)
public override Type? ReflectedType => m_containingType;
// These are package private so that TypeBuilder can access them.
- private string m_name; // The name of the property
- private PropertyToken m_prToken; // The token of this property
- private int m_tkProperty;
+ private string m_name; // The name of the property
+ private int m_tkProperty; // The token of this property
private ModuleBuilder m_moduleBuilder;
- private SignatureHelper m_signature;
- private PropertyAttributes m_attributes; // property's attribute flags
- private Type m_returnType; // property's return type
+ private PropertyAttributes m_attributes; // property's attribute flags
+ private Type m_returnType; // property's return type
private MethodInfo? m_getMethod;
private MethodInfo? m_setMethod;
private TypeBuilder m_containingType;
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/SignatureHelper.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/SignatureHelper.cs
index fc17ba8391c3..1dd65bffeb02 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/SignatureHelper.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/SignatureHelper.cs
@@ -301,7 +301,7 @@ private void AddOneArgTypeHelper(Type clsArgument, Type[]? requiredCustomModifie
AddElementType(CorElementType.ELEMENT_TYPE_CMOD_OPT);
- int token = m_module!.GetTypeToken(t).Token;
+ int token = m_module!.GetTypeToken(t);
Debug.Assert(!MetadataToken.IsNullToken(token));
AddToken(token);
}
@@ -324,7 +324,7 @@ private void AddOneArgTypeHelper(Type clsArgument, Type[]? requiredCustomModifie
AddElementType(CorElementType.ELEMENT_TYPE_CMOD_REQD);
- int token = m_module!.GetTypeToken(t).Token;
+ int token = m_module!.GetTypeToken(t);
Debug.Assert(!MetadataToken.IsNullToken(token));
AddToken(token);
}
@@ -361,7 +361,7 @@ private void AddOneArgTypeHelperWorker(Type clsArgument, bool lastWasGenericInst
else if (clsArgument is TypeBuilder)
{
TypeBuilder clsBuilder = (TypeBuilder)clsArgument;
- TypeToken tkType;
+ int tkType;
if (clsBuilder.Module.Equals(m_module))
{
@@ -384,7 +384,7 @@ private void AddOneArgTypeHelperWorker(Type clsArgument, bool lastWasGenericInst
else if (clsArgument is EnumBuilder)
{
TypeBuilder clsBuilder = ((EnumBuilder)clsArgument).m_typeBuilder;
- TypeToken tkType;
+ int tkType;
if (clsBuilder.Module.Equals(m_module))
{
@@ -545,11 +545,11 @@ private void AddToken(int token)
AddData(rid);
}
- private void InternalAddTypeToken(TypeToken clsToken, CorElementType CorType)
+ private void InternalAddTypeToken(int clsToken, CorElementType CorType)
{
// Add a type token into signature. CorType will be either CorElementType.ELEMENT_TYPE_CLASS or CorElementType.ELEMENT_TYPE_VALUETYPE
AddElementType(CorType);
- AddToken(clsToken.Token);
+ AddToken(clsToken);
}
private unsafe void InternalAddRuntimeType(Type type)
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/SymbolMethod.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/SymbolMethod.cs
index 0eb874a7b1f1..9e9aab8fcac4 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/SymbolMethod.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/SymbolMethod.cs
@@ -13,13 +13,12 @@ internal sealed class SymbolMethod : MethodInfo
private string m_name;
private CallingConventions m_callingConvention;
private Type m_returnType;
- private MethodToken m_mdMethod;
+ private int m_token;
private Type[] m_parameterTypes;
- private SignatureHelper m_signature;
#endregion
#region Constructor
- internal SymbolMethod(ModuleBuilder mod, MethodToken token, Type arrayClass, string methodName,
+ internal SymbolMethod(ModuleBuilder mod, int token, Type arrayClass, string methodName,
CallingConventions callingConvention, Type? returnType, Type[]? parameterTypes)
{
// This is a kind of MethodInfo to represent methods for array type of unbaked type
@@ -29,7 +28,7 @@ internal SymbolMethod(ModuleBuilder mod, MethodToken token, Type arrayClass, str
// passed into it is this MethodToken. The MethodToken was forged using a TypeSpec for an Array type and
// the name of the method on Array.
// As none of the methods on Array have CustomModifiers their is no need to pass those around in here.
- m_mdMethod = token;
+ m_token = token;
// The ParameterTypes are also a bit interesting in that they may be unbaked TypeBuilders.
m_returnType = returnType ?? typeof(void);
@@ -48,7 +47,8 @@ internal SymbolMethod(ModuleBuilder mod, MethodToken token, Type arrayClass, str
m_name = methodName;
m_callingConvention = callingConvention;
- m_signature = SignatureHelper.GetMethodSigHelper(
+ // Validate signature
+ SignatureHelper.GetMethodSigHelper(
mod, callingConvention, returnType, null, null, parameterTypes, null, null);
}
#endregion
@@ -59,7 +59,7 @@ internal override Type[] GetParameterTypes()
return m_parameterTypes;
}
- internal MethodToken GetToken(ModuleBuilder mod)
+ internal int GetToken(ModuleBuilder mod)
{
return mod.GetArrayMethodToken(m_containingType, m_name, m_callingConvention, m_returnType, m_parameterTypes);
}
@@ -135,11 +135,6 @@ public Module GetModule()
return m_module;
}
- public MethodToken GetToken()
- {
- return m_mdMethod;
- }
-
#endregion
}
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs
index 5b2acd1605bb..d485dc69c1cc 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilder.cs
@@ -50,7 +50,7 @@ public void Bake(ModuleBuilder module, int token)
if (m_customBuilder == null)
{
Debug.Assert(m_con != null);
- DefineCustomAttribute(module, token, module.GetConstructorToken(m_con).Token,
+ DefineCustomAttribute(module, token, module.GetConstructorToken(m_con),
m_binaryAttribute, false, false);
}
else
@@ -394,7 +394,7 @@ internal static unsafe void SetConstantValue(ModuleBuilder module, int tk, Type
#region Private Data Members
private List? m_ca;
- private TypeToken m_tdType;
+ private int m_tdType;
private readonly ModuleBuilder m_module;
private readonly string? m_strName;
private readonly string? m_strNameSpace;
@@ -432,7 +432,7 @@ internal static unsafe void SetConstantValue(ModuleBuilder module, int tk, Type
// ctor for the global (module) type
internal TypeBuilder(ModuleBuilder module)
{
- m_tdType = new TypeToken((int)MetadataTokenType.TypeDef);
+ m_tdType = ((int)MetadataTokenType.TypeDef);
m_isHiddenGlobalType = true;
m_module = module;
m_listMethods = new List();
@@ -514,7 +514,7 @@ internal TypeBuilder(
interfaceTokens = new int[interfaces.Length + 1];
for (i = 0; i < interfaces.Length; i++)
{
- interfaceTokens[i] = m_module.GetTypeTokenInternal(interfaces[i]).Token;
+ interfaceTokens[i] = m_module.GetTypeTokenInternal(interfaces[i]);
}
}
@@ -545,21 +545,21 @@ internal TypeBuilder(
int tkParent = 0;
if (m_typeParent != null)
- tkParent = m_module.GetTypeTokenInternal(m_typeParent).Token;
+ tkParent = m_module.GetTypeTokenInternal(m_typeParent);
int tkEnclosingType = 0;
if (enclosingType != null)
{
- tkEnclosingType = enclosingType.m_tdType.Token;
+ tkEnclosingType = enclosingType.m_tdType;
}
- m_tdType = new TypeToken(DefineType(new QCallModule(ref module),
- fullname, tkParent, m_iAttr, tkEnclosingType, interfaceTokens!));
+ m_tdType = DefineType(new QCallModule(ref module),
+ fullname, tkParent, m_iAttr, tkEnclosingType, interfaceTokens!);
m_iPackingSize = iPackingSize;
m_iTypeSize = iTypeSize;
if ((m_iPackingSize != 0) || (m_iTypeSize != 0))
- SetClassLayout(new QCallModule(ref module), m_tdType.Token, m_iPackingSize, m_iTypeSize);
+ SetClassLayout(new QCallModule(ref module), m_tdType, m_iPackingSize, m_iTypeSize);
m_module.AddType(FullName!, this);
}
@@ -728,7 +728,7 @@ public override string ToString()
public override bool IsByRefLike => false;
- internal int MetadataTokenInternal => m_tdType.Token;
+ public override int MetadataToken => m_tdType;
#endregion
@@ -1183,7 +1183,7 @@ public GenericTypeParameterBuilder[] DefineGenericParameters(params string[] nam
public override Type MakeGenericType(params Type[] typeArguments)
{
- CheckContext(typeArguments);
+ AssemblyBuilder.CheckContext(typeArguments);
return TypeBuilderInstantiation.MakeGenericType(this, typeArguments);
}
@@ -1225,11 +1225,11 @@ private void DefineMethodOverrideNoLock(MethodInfo methodInfoBody, MethodInfo me
// Loader restriction: body method has to be from this class
throw new ArgumentException(SR.ArgumentException_BadMethodImplBody);
- MethodToken tkBody = m_module.GetMethodTokenInternal(methodInfoBody);
- MethodToken tkDecl = m_module.GetMethodTokenInternal(methodInfoDeclaration);
+ int tkBody = m_module.GetMethodToken(methodInfoBody);
+ int tkDecl = m_module.GetMethodToken(methodInfoDeclaration);
ModuleBuilder module = m_module;
- DefineMethodImpl(new QCallModule(ref module), m_tdType.Token, tkBody.Token, tkDecl.Token);
+ DefineMethodImpl(new QCallModule(ref module), m_tdType, tkBody, tkDecl);
}
public MethodBuilder DefineMethod(string name, MethodAttributes attributes, Type? returnType, Type[]? parameterTypes)
@@ -1275,10 +1275,10 @@ private MethodBuilder DefineMethodNoLock(string name, MethodAttributes attribute
if (name.Length == 0)
throw new ArgumentException(SR.Argument_EmptyName, nameof(name));
- CheckContext(returnType);
- CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes);
- CheckContext(parameterTypeRequiredCustomModifiers);
- CheckContext(parameterTypeOptionalCustomModifiers);
+ AssemblyBuilder.CheckContext(returnType);
+ AssemblyBuilder.CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes);
+ AssemblyBuilder.CheckContext(parameterTypeRequiredCustomModifiers);
+ AssemblyBuilder.CheckContext(parameterTypeOptionalCustomModifiers);
if (parameterTypes != null)
{
@@ -1291,15 +1291,6 @@ private MethodBuilder DefineMethodNoLock(string name, MethodAttributes attribute
ThrowIfCreated();
-#if !FEATURE_DEFAULT_INTERFACES
- if (!m_isHiddenGlobalType)
- {
- if (((m_iAttr & TypeAttributes.ClassSemanticsMask) == TypeAttributes.Interface) &&
- (attributes & MethodAttributes.Abstract) == 0 && (attributes & MethodAttributes.Static) == 0)
- throw new ArgumentException(SR.Argument_BadAttributeOnInterfaceMethod);
- }
-#endif
-
// pass in Method attributes
MethodBuilder method = new MethodBuilder(
name, attributes, callingConvention,
@@ -1359,10 +1350,10 @@ private MethodBuilder DefinePInvokeMethodHelper(
Type[]? parameterTypes, Type[][]? parameterTypeRequiredCustomModifiers, Type[][]? parameterTypeOptionalCustomModifiers,
CallingConvention nativeCallConv, CharSet nativeCharSet)
{
- CheckContext(returnType);
- CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes);
- CheckContext(parameterTypeRequiredCustomModifiers);
- CheckContext(parameterTypeOptionalCustomModifiers);
+ AssemblyBuilder.CheckContext(returnType);
+ AssemblyBuilder.CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes);
+ AssemblyBuilder.CheckContext(parameterTypeRequiredCustomModifiers);
+ AssemblyBuilder.CheckContext(parameterTypeOptionalCustomModifiers);
lock (SyncRoot)
{
@@ -1408,7 +1399,7 @@ private MethodBuilder DefinePInvokeMethodHelper(
}
m_listMethods.Add(method);
- MethodToken token = method.GetToken();
+ int token = method.MetadataToken;
int linkFlags = 0;
switch (nativeCallConv)
@@ -1449,8 +1440,9 @@ private MethodBuilder DefinePInvokeMethodHelper(
SetPInvokeData(new QCallModule(ref module),
dllName,
importName,
- token.Token,
+ token,
linkFlags);
+
method.SetToken(token);
return method;
@@ -1569,9 +1561,9 @@ public ConstructorBuilder DefineConstructor(MethodAttributes attributes, Calling
private ConstructorBuilder DefineConstructorNoLock(MethodAttributes attributes, CallingConventions callingConvention,
Type[]? parameterTypes, Type[][]? requiredCustomModifiers, Type[][]? optionalCustomModifiers)
{
- CheckContext(parameterTypes);
- CheckContext(requiredCustomModifiers);
- CheckContext(optionalCustomModifiers);
+ AssemblyBuilder.CheckContext(parameterTypes);
+ AssemblyBuilder.CheckContext(requiredCustomModifiers);
+ AssemblyBuilder.CheckContext(optionalCustomModifiers);
ThrowIfCreated();
@@ -1613,8 +1605,8 @@ public TypeBuilder DefineNestedType(string name, TypeAttributes attr, [Dynamical
lock (SyncRoot)
{
// Why do we only call CheckContext here? Why don't we call it in the other overloads?
- CheckContext(parent);
- CheckContext(interfaces);
+ AssemblyBuilder.CheckContext(parent);
+ AssemblyBuilder.CheckContext(interfaces);
return DefineNestedTypeNoLock(name, attr, parent, interfaces, PackingSize.Unspecified, UnspecifiedTypeSize);
}
@@ -1686,8 +1678,8 @@ private FieldBuilder DefineFieldNoLock(string fieldName, Type type, Type[]? requ
Type[]? optionalCustomModifiers, FieldAttributes attributes)
{
ThrowIfCreated();
- CheckContext(type);
- CheckContext(requiredCustomModifiers);
+ AssemblyBuilder.CheckContext(type);
+ AssemblyBuilder.CheckContext(requiredCustomModifiers);
if (m_enumUnderlyingType == null && IsEnum)
{
@@ -1780,10 +1772,10 @@ private PropertyBuilder DefinePropertyNoLock(string name, PropertyAttributes att
if (name.Length == 0)
throw new ArgumentException(SR.Argument_EmptyName, nameof(name));
- CheckContext(returnType);
- CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes);
- CheckContext(parameterTypeRequiredCustomModifiers);
- CheckContext(parameterTypeOptionalCustomModifiers);
+ AssemblyBuilder.CheckContext(returnType);
+ AssemblyBuilder.CheckContext(returnTypeRequiredCustomModifiers, returnTypeOptionalCustomModifiers, parameterTypes);
+ AssemblyBuilder.CheckContext(parameterTypeRequiredCustomModifiers);
+ AssemblyBuilder.CheckContext(parameterTypeOptionalCustomModifiers);
SignatureHelper sigHelper;
byte[] sigBytes;
@@ -1801,13 +1793,13 @@ private PropertyBuilder DefinePropertyNoLock(string name, PropertyAttributes att
ModuleBuilder module = m_module;
- PropertyToken prToken = new PropertyToken(DefineProperty(
+ int prToken = DefineProperty(
new QCallModule(ref module),
- m_tdType.Token,
+ m_tdType,
name,
attributes,
sigBytes,
- sigLength));
+ sigLength);
// create the property builder now.
return new PropertyBuilder(
@@ -1838,22 +1830,22 @@ private EventBuilder DefineEventNoLock(string name, EventAttributes attributes,
throw new ArgumentException(SR.Argument_IllegalName, nameof(name));
int tkType;
- EventToken evToken;
+ int evToken;
- CheckContext(eventtype);
+ AssemblyBuilder.CheckContext(eventtype);
ThrowIfCreated();
- tkType = m_module.GetTypeTokenInternal(eventtype).Token;
+ tkType = m_module.GetTypeTokenInternal(eventtype);
// Internal helpers to define property records
ModuleBuilder module = m_module;
- evToken = new EventToken(DefineEvent(
+ evToken = DefineEvent(
new QCallModule(ref module),
- m_tdType.Token,
+ m_tdType,
name,
attributes,
- tkType));
+ tkType);
// create the property builder now.
return new EventBuilder(
@@ -1885,15 +1877,6 @@ private EventBuilder DefineEventNoLock(string name, EventAttributes attributes,
}
}
- internal void CheckContext(params Type[]?[]? typess)
- {
- m_module.CheckContext(typess);
- }
- internal void CheckContext(params Type?[]? types)
- {
- m_module.CheckContext(types);
- }
-
private TypeInfo? CreateTypeNoLock()
{
if (IsCreated())
@@ -1904,12 +1887,12 @@ internal void CheckContext(params Type?[]? types)
int[] interfaceTokens = new int[m_typeInterfaces.Count];
for (int i = 0; i < m_typeInterfaces.Count; i++)
{
- interfaceTokens[i] = m_module.GetTypeTokenInternal(m_typeInterfaces[i]).Token;
+ interfaceTokens[i] = m_module.GetTypeTokenInternal(m_typeInterfaces[i]);
}
int tkParent = 0;
if (m_typeParent != null)
- tkParent = m_module.GetTypeTokenInternal(m_typeParent).Token;
+ tkParent = m_module.GetTypeTokenInternal(m_typeParent);
ModuleBuilder module = m_module;
@@ -1929,17 +1912,17 @@ internal void CheckContext(params Type?[]? types)
for (int i = 0; i < m_typeInterfaces.Count; i++)
{
- constraints[i] = m_module.GetTypeTokenInternal(m_typeInterfaces[i]).Token;
+ constraints[i] = m_module.GetTypeTokenInternal(m_typeInterfaces[i]);
}
- int declMember = m_declMeth == null ? m_DeclaringType!.m_tdType.Token : m_declMeth.GetToken().Token;
- m_tdType = new TypeToken(DefineGenericParam(new QCallModule(ref module),
- m_strName!, declMember, m_genParamAttributes, m_genParamPos, constraints));
+ int declMember = m_declMeth == null ? m_DeclaringType!.m_tdType : m_declMeth.MetadataToken;
+ m_tdType = DefineGenericParam(new QCallModule(ref module),
+ m_strName!, declMember, m_genParamAttributes, m_genParamPos, constraints);
if (m_ca != null)
{
foreach (CustAttr ca in m_ca)
- ca.Bake(m_module, MetadataTokenInternal);
+ ca.Bake(m_module, MetadataToken);
}
m_hasBeenCreated = true;
@@ -1951,9 +1934,9 @@ internal void CheckContext(params Type?[]? types)
else
{
// Check for global typebuilder
- if (((m_tdType.Token & 0x00FFFFFF) != 0) && ((tkParent & 0x00FFFFFF) != 0))
+ if (((m_tdType & 0x00FFFFFF) != 0) && ((tkParent & 0x00FFFFFF) != 0))
{
- SetParentType(new QCallModule(ref module), m_tdType.Token, tkParent);
+ SetParentType(new QCallModule(ref module), m_tdType, tkParent);
}
if (m_inst != null)
@@ -1982,7 +1965,9 @@ internal void CheckContext(params Type?[]? types)
MethodBuilder meth = m_listMethods[i];
if (meth.IsGenericMethodDefinition)
- meth.GetToken(); // Doubles as "CreateMethod" for MethodBuilder -- analogous to CreateType()
+ {
+ int dummy = meth.MetadataToken; // Doubles as "CreateMethod" for MethodBuilder -- analogous to CreateType()
+ }
MethodAttributes methodAttrs = meth.Attributes;
@@ -2036,7 +2021,7 @@ internal void CheckContext(params Type?[]? types)
ExceptionHandler[]? exceptions = meth.GetExceptionHandlers();
int[]? tokenFixups = meth.GetTokenFixups();
- SetMethodIL(new QCallModule(ref module), meth.GetToken().Token, meth.InitLocals,
+ SetMethodIL(new QCallModule(ref module), meth.MetadataToken, meth.InitLocals,
body, (body != null) ? body.Length : 0,
localSig, sigLength, maxStack,
exceptions, (exceptions != null) ? exceptions.Length : 0,
@@ -2054,7 +2039,7 @@ internal void CheckContext(params Type?[]? types)
// Terminate the process.
RuntimeType? cls = null;
- TermCreateClass(new QCallModule(ref module), m_tdType.Token, ObjectHandleOnStack.Create(ref cls));
+ TermCreateClass(new QCallModule(ref module), m_tdType, ObjectHandleOnStack.Create(ref cls));
if (!m_isHiddenGlobalType)
{
@@ -2087,7 +2072,7 @@ public void SetParent([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes
if (parent != null)
{
- CheckContext(parent);
+ AssemblyBuilder.CheckContext(parent);
if (parent.IsInterface)
throw new ArgumentException(SR.Argument_CannotSetParentToInterface);
@@ -2118,18 +2103,18 @@ public void AddInterfaceImplementation([DynamicallyAccessedMembers(DynamicallyAc
throw new ArgumentNullException(nameof(interfaceType));
}
- CheckContext(interfaceType);
+ AssemblyBuilder.CheckContext(interfaceType);
ThrowIfCreated();
- TypeToken tkInterface = m_module.GetTypeTokenInternal(interfaceType);
+ int tkInterface = m_module.GetTypeTokenInternal(interfaceType);
ModuleBuilder module = m_module;
- AddInterfaceImpl(new QCallModule(ref module), m_tdType.Token, tkInterface.Token);
+ AddInterfaceImpl(new QCallModule(ref module), m_tdType, tkInterface);
m_typeInterfaces!.Add(interfaceType);
}
- public TypeToken TypeToken
+ internal int TypeToken
{
get
{
@@ -2148,7 +2133,7 @@ public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
if (binaryAttribute == null)
throw new ArgumentNullException(nameof(binaryAttribute));
- DefineCustomAttribute(m_module, m_tdType.Token, ((ModuleBuilder)m_module).GetConstructorToken(con).Token,
+ DefineCustomAttribute(m_module, m_tdType, ((ModuleBuilder)m_module).GetConstructorToken(con),
binaryAttribute, false, false);
}
@@ -2157,7 +2142,7 @@ public void SetCustomAttribute(CustomAttributeBuilder customBuilder)
if (customBuilder == null)
throw new ArgumentNullException(nameof(customBuilder));
- customBuilder.CreateCustomAttribute((ModuleBuilder)m_module, m_tdType.Token);
+ customBuilder.CreateCustomAttribute((ModuleBuilder)m_module, m_tdType);
}
#endregion
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs
index 4e3844dac940..44774438e0c2 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/TypeBuilderInstantiation.cs
@@ -106,6 +106,11 @@ public override Type MakeArrayType(int rank)
public override string? FullName => m_strFullQualName ??= TypeNameBuilder.ToString(this, TypeNameBuilder.Format.FullName);
public override string? Namespace => m_type.Namespace;
public override string? AssemblyQualifiedName => TypeNameBuilder.ToString(this, TypeNameBuilder.Format.AssemblyQualifiedName);
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2055:UnrecognizedReflectionPatter",
+ Justification = "The entire TypeBuilderInstantiation is serving the MakeGenericType implementation. " +
+ "Currently this is not supported by linker. Once it is supported the outercall (Type.MakeGenericType)" +
+ "will validate that the types fullfill the necessary requirements of annotations on type parameters." +
+ "As such the actual internals of the implementation are not interesting.")]
private Type Substitute(Type[] substitutes)
{
Type[] inst = GetGenericArguments();
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/XXXOnTypeBuilderInstantiation.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/XXXOnTypeBuilderInstantiation.cs
index 4443867b1b52..a500e1ddf25a 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/XXXOnTypeBuilderInstantiation.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/Emit/XXXOnTypeBuilderInstantiation.cs
@@ -122,14 +122,14 @@ internal override Type GetReturnType()
public override object[] GetCustomAttributes(bool inherit) { return m_ctor.GetCustomAttributes(inherit); }
public override object[] GetCustomAttributes(Type attributeType, bool inherit) { return m_ctor.GetCustomAttributes(attributeType, inherit); }
public override bool IsDefined(Type attributeType, bool inherit) { return m_ctor.IsDefined(attributeType, inherit); }
- internal int MetadataTokenInternal
+ public override int MetadataToken
{
get
{
ConstructorBuilder? cb = m_ctor as ConstructorBuilder;
if (cb != null)
- return cb.MetadataTokenInternal;
+ return cb.MetadataToken;
else
{
Debug.Assert(m_ctor is RuntimeConstructorInfo);
@@ -223,14 +223,14 @@ internal FieldOnTypeBuilderInstantiation(FieldInfo field, TypeBuilderInstantiati
public override object[] GetCustomAttributes(bool inherit) { return m_field.GetCustomAttributes(inherit); }
public override object[] GetCustomAttributes(Type attributeType, bool inherit) { return m_field.GetCustomAttributes(attributeType, inherit); }
public override bool IsDefined(Type attributeType, bool inherit) { return m_field.IsDefined(attributeType, inherit); }
- internal int MetadataTokenInternal
+ public override int MetadataToken
{
get
{
FieldBuilder? fb = m_field as FieldBuilder;
if (fb != null)
- return fb.MetadataTokenInternal;
+ return fb.MetadataToken;
else
{
Debug.Assert(m_field is RuntimeFieldInfo);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/INVOCATION_FLAGS.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/INVOCATION_FLAGS.cs
index e7d9b97ac5c6..b6a55518914a 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/INVOCATION_FLAGS.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/INVOCATION_FLAGS.cs
@@ -14,7 +14,8 @@ internal enum INVOCATION_FLAGS : uint
INVOCATION_FLAGS_INITIALIZED = 0x00000001,
// it's used for both method and field to signify that no access is allowed
INVOCATION_FLAGS_NO_INVOKE = 0x00000002,
- /* unused 0x00000004 */
+ // Set for static ctors, to ensure that the static ctor is run as a static ctor before it is explicitly executed via reflection
+ INVOCATION_FLAGS_RUN_CLASS_CONSTRUCTOR = 0x00000004,
// Set for static ctors and ctors on abstract types, which
// can be invoked only if the "this" object is provided (even if it's null).
INVOCATION_FLAGS_NO_CTOR_INVOKE = 0x00000008,
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs
index d2476660973f..20a72464b3ac 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs
@@ -69,19 +69,33 @@ public override event ModuleResolveEventHandler? ModuleResolve
}
[DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
- private static extern void GetCodeBase(QCallAssembly assembly,
- bool copiedName,
+ private static extern bool GetCodeBase(QCallAssembly assembly,
StringHandleOnStack retString);
- internal string? GetCodeBase(bool copiedName)
+ internal string? GetCodeBase()
{
string? codeBase = null;
RuntimeAssembly runtimeAssembly = this;
- GetCodeBase(new QCallAssembly(ref runtimeAssembly), copiedName, new StringHandleOnStack(ref codeBase));
- return codeBase;
+ if (GetCodeBase(new QCallAssembly(ref runtimeAssembly), new StringHandleOnStack(ref codeBase)))
+ {
+ return codeBase;
+ }
+ return null;
}
- public override string? CodeBase => GetCodeBase(false);
+ public override string? CodeBase
+ {
+ get
+ {
+ var codeBase = GetCodeBase();
+ if (codeBase is null)
+ {
+ // Not supported if the assembly was loaded from memory
+ throw new NotSupportedException(SR.NotSupported_CodeBase);
+ }
+ return codeBase;
+ }
+ }
internal RuntimeAssembly GetNativeHandle() => this;
@@ -90,7 +104,7 @@ private static extern void GetCodeBase(QCallAssembly assembly,
// is returned.
public override AssemblyName GetName(bool copiedName)
{
- string? codeBase = GetCodeBase(copiedName);
+ string? codeBase = GetCodeBase();
var an = new AssemblyName(GetSimpleName(),
GetPublicKey(),
@@ -360,6 +374,12 @@ private static extern void InternalLoad(ObjectHandleOnStack assemblyName,
// given name. (Name should not include path.)
public override FileStream? GetFile(string name)
{
+ if (Location.Length == 0)
+ {
+ // Throw if the assembly was loaded from memory, indicated by Location returning an empty string
+ throw new FileNotFoundException(SR.IO_NoFileTableInInMemoryAssemblies);
+ }
+
RuntimeModule? m = (RuntimeModule?)GetModule(name);
if (m == null)
return null;
@@ -371,6 +391,12 @@ private static extern void InternalLoad(ObjectHandleOnStack assemblyName,
public override FileStream[] GetFiles(bool getResourceModules)
{
+ if (Location.Length == 0)
+ {
+ // Throw if the assembly was loaded from memory, indicated by Location returning an empty string
+ throw new FileNotFoundException(SR.IO_NoFileTableInInMemoryAssemblies);
+ }
+
Module[] m = GetModules(getResourceModules);
FileStream[] fs = new FileStream[m.Length];
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs
index 9d0086ca4425..20162964af46 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeConstructorInfo.cs
@@ -5,6 +5,7 @@
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
+using System.Runtime.CompilerServices;
using System.Text;
using RuntimeTypeCache = System.RuntimeType.RuntimeTypeCache;
@@ -47,7 +48,12 @@ internal INVOCATION_FLAGS InvocationFlags
// We don't need other flags if this method cannot be invoked
invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_INVOKE;
}
- else if (IsStatic || declaringType != null && declaringType.IsAbstract)
+ else if (IsStatic)
+ {
+ invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_RUN_CLASS_CONSTRUCTOR |
+ INVOCATION_FLAGS.INVOCATION_FLAGS_NO_CTOR_INVOKE;
+ }
+ else if (declaringType != null && declaringType.IsAbstract)
{
invocationFlags |= INVOCATION_FLAGS.INVOCATION_FLAGS_NO_CTOR_INVOKE;
}
@@ -280,6 +286,21 @@ internal void ThrowNoInvokeException()
// check basic method consistency. This call will throw if there are problems in the target/method relationship
CheckConsistency(obj);
+ if ((invocationFlags & INVOCATION_FLAGS.INVOCATION_FLAGS_RUN_CLASS_CONSTRUCTOR) != 0)
+ {
+ // Run the class constructor through the class constructor mechanism instead of the Invoke path.
+ // This avoids allowing mutation of readonly static fields, and initializes the type correctly.
+
+ var declaringType = DeclaringType;
+
+ if (declaringType != null)
+ RuntimeHelpers.RunClassConstructor(declaringType.TypeHandle);
+ else
+ RuntimeHelpers.RunModuleConstructor(Module.ModuleHandle);
+
+ return null;
+ }
+
Signature sig = Signature;
// get the signature
@@ -302,6 +323,7 @@ internal void ThrowNoInvokeException()
return RuntimeMethodHandle.InvokeMethod(obj, null, sig, false, wrapExceptions);
}
+ [RequiresUnreferencedCode("Trimming may change method bodies. For example it can change some instructions, remove branches or local variables.")]
public override MethodBody? GetMethodBody()
{
RuntimeMethodBody? mb = RuntimeMethodHandle.GetMethodBody(this, ReflectedTypeInternal);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeExceptionHandlingClause.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeExceptionHandlingClause.cs
index b8f5df8b4539..ff5ea23c21ef 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeExceptionHandlingClause.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeExceptionHandlingClause.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Globalization;
namespace System.Reflection
@@ -38,6 +39,11 @@ public override int FilterOffset
public override Type? CatchType
{
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
+ Justification = "Module.ResolveType is marked as RequiresUnreferencedCode because it relies on tokens" +
+ "which are not guaranteed to be stable across trimming. So if somebody harcodes a token it could break." +
+ "The usage here is not like that as all these tokes come from existing metadata loaded from some IL" +
+ "and so trimming has no effect (the tokens are read AFTER trimming occured).")]
get
{
if (_flags != ExceptionHandlingClauseOptions.Clause)
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs
index d0441ffbfa8f..9dfffd64a2e2 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimeMethodInfo.cs
@@ -318,6 +318,7 @@ public override MethodImplAttributes GetMethodImplementationFlags()
public override CallingConventions CallingConvention => Signature.CallingConvention;
+ [RequiresUnreferencedCode("Trimming may change method bodies. For example it can change some instructions, remove branches or local variables.")]
public override MethodBody? GetMethodBody()
{
RuntimeMethodBody? mb = RuntimeMethodHandle.GetMethodBody(this, ReflectedTypeInternal);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs
index ef1f82b58f36..b7e6a58f1fe4 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs
@@ -226,7 +226,7 @@ public override MethodInfo[] GetAccessors(bool nonPublic)
if (Associates.IncludeAccessor(m_setterMethod, nonPublic))
accessorList.Add(m_setterMethod!);
- if ((object?)m_otherMethod != null)
+ if (m_otherMethod is not null)
{
for (int i = 0; i < m_otherMethod.Length; i++)
{
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs
index 5c9a38e2a6f7..6b6e4639bfec 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs
@@ -286,9 +286,6 @@ public static IntPtr AllocateTypeAssociatedMemory(Type type, int size)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern IntPtr AllocTailCallArgBuffer(int size, IntPtr gcDesc);
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void FreeTailCallArgBuffer();
-
[MethodImpl(MethodImplOptions.InternalCall)]
private static unsafe extern TailCallTls* GetTailCallInfo(IntPtr retAddrSlot, IntPtr* retAddr);
@@ -323,6 +320,12 @@ private static unsafe void DispatchTailCalls(
finally
{
tls->Frame = prevFrame;
+
+ // If the arg buffer is reporting inst argument, it is safe to abandon it now
+ if (tls->ArgBuffer != IntPtr.Zero && *(int*)tls->ArgBuffer == 1 /* TAILCALLARGBUFFER_INSTARG_ONLY */)
+ {
+ *(int*)tls->ArgBuffer = 2 /* TAILCALLARGBUFFER_ABANDONED */;
+ }
}
}
@@ -481,9 +484,6 @@ internal unsafe struct TailCallTls
{
public PortableTailCallFrame* Frame;
public IntPtr ArgBuffer;
- private IntPtr _argBufferSize;
- private IntPtr _argBufferGCDesc;
- private fixed byte _argBufferInline[64];
}
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventsHelper.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventsHelper.cs
index 368d942f403a..93fd276b9d26 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventsHelper.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventsHelper.cs
@@ -81,12 +81,15 @@
// means that the problem is already quite complex and we should not be dealing with it - see
// ComEventsMethod.Invoke
+using System.Runtime.Versioning;
+
namespace System.Runtime.InteropServices
{
///
/// The static methods provided in ComEventsHelper allow using .NET delegates to subscribe to events
/// raised COM objects.
///
+ [SupportedOSPlatform("windows")]
public static class ComEventsHelper
{
///
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventsInfo.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventsInfo.cs
index d8a0ea49e7d5..ac434ad00d9b 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventsInfo.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventsInfo.cs
@@ -1,8 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Runtime.Versioning;
+
namespace System.Runtime.InteropServices
{
+ [SupportedOSPlatform("windows")]
internal class ComEventsInfo
{
private ComEventsSink? _sinks;
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.cs
index 1b0c1a717487..1e377a9978f4 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/ComWrappers.cs
@@ -5,6 +5,7 @@
using System.Collections;
using System.Threading;
using System.Runtime.CompilerServices;
+using System.Runtime.Versioning;
using Internal.Runtime.CompilerServices;
namespace System.Runtime.InteropServices
@@ -68,6 +69,7 @@ internal enum ComWrappersScenario
///
/// Class for managing wrappers of COM IUnknown types.
///
+ [SupportedOSPlatform("windows")]
[CLSCompliant(false)]
public abstract partial class ComWrappers
{
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/ComDataHelpers.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/ComDataHelpers.cs
index e871eca76361..d0e230a6e564 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/ComDataHelpers.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/ComDataHelpers.cs
@@ -1,10 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Runtime.Versioning;
+
namespace System.Runtime.InteropServices.CustomMarshalers
{
internal static class ComDataHelpers
{
+ [SupportedOSPlatform("windows")]
public static TView GetOrCreateManagedViewFromComData(object comObject, Func createCallback)
{
object key = typeof(TView);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumerableToDispatchMarshaler.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumerableToDispatchMarshaler.cs
index 10034bae86a0..3bd63b33612f 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumerableToDispatchMarshaler.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumerableToDispatchMarshaler.cs
@@ -2,9 +2,11 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections;
+using System.Runtime.Versioning;
namespace System.Runtime.InteropServices.CustomMarshalers
{
+ [SupportedOSPlatform("windows")]
internal class EnumerableToDispatchMarshaler : ICustomMarshaler
{
private static readonly EnumerableToDispatchMarshaler s_enumerableToDispatchMarshaler = new EnumerableToDispatchMarshaler();
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumerableViewOfDispatch.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumerableViewOfDispatch.cs
index 06f1f083ce20..a64da6919c2e 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumerableViewOfDispatch.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumerableViewOfDispatch.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using System.Runtime.InteropServices.ComTypes;
namespace System.Runtime.InteropServices.CustomMarshalers
@@ -38,6 +39,7 @@ public System.Collections.IEnumerator GetEnumerator()
IntPtr.Zero);
}
+ Debug.Assert(OperatingSystem.IsWindows());
IntPtr enumVariantPtr = IntPtr.Zero;
try
{
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumeratorToEnumVariantMarshaler.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumeratorToEnumVariantMarshaler.cs
index 61e65f833d89..b4718f5e7c28 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumeratorToEnumVariantMarshaler.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/CustomMarshalers/EnumeratorToEnumVariantMarshaler.cs
@@ -2,10 +2,12 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections;
+using System.Runtime.Versioning;
using ComTypes = System.Runtime.InteropServices.ComTypes;
namespace System.Runtime.InteropServices.CustomMarshalers
{
+ [SupportedOSPlatform("windows")]
internal class EnumeratorToEnumVariantMarshaler : ICustomMarshaler
{
private static readonly EnumeratorToEnumVariantMarshaler s_enumeratorToEnumVariantMarshaler = new EnumeratorToEnumVariantMarshaler();
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Expando/IExpando.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Expando/IExpando.cs
deleted file mode 100644
index bbe6e24b645b..000000000000
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Expando/IExpando.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Reflection;
-
-namespace System.Runtime.InteropServices.Expando
-{
- ///
- /// IExpando is an interface which allows Objects implementing this interface to
- /// support the ability to modify the object by adding and removing members,
- /// represented by MemberInfo objects.
- ///
- [Guid("AFBF15E6-C37C-11d2-B88E-00A0C9B471B8")]
- internal interface IExpando : IReflect
- {
- ///
- /// Add a new Field to the reflection object. The field has
- /// name as its name.
- ///
- FieldInfo AddField(string name);
-
- ///
- /// Removes the specified member.
- ///
- void RemoveMember(MemberInfo m);
- }
-}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs
index 33d43881adb3..22a918584a56 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs
@@ -5,6 +5,7 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices.ComTypes;
+using System.Runtime.Versioning;
using System.StubHelpers;
namespace System.Runtime.InteropServices
@@ -25,7 +26,7 @@ public static partial class Marshal
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int SizeOfHelper(Type t, bool throwIfNotMarshalable);
- [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2006:UnrecognizedReflectionPattern",
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern",
Justification = "Trimming doesn't affect types eligible for marshalling. Different exception for invalid inputs doesn't matter.")]
public static IntPtr OffsetOf(Type t, string fieldName)
{
@@ -249,52 +250,6 @@ public static IntPtr GetHINSTANCE(Module m)
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern Exception GetExceptionForHRInternal(int errorCode, IntPtr errorInfo);
- public static IntPtr AllocHGlobal(IntPtr cb)
- {
- // For backwards compatibility on 32 bit platforms, ensure we pass values between
- // int.MaxValue and uint.MaxValue to Windows. If the binary has had the
- // LARGEADDRESSAWARE bit set in the PE header, it may get 3 or 4 GB of user mode
- // address space. It is remotely that those allocations could have succeeded,
- // though I couldn't reproduce that. In either case, that means we should continue
- // throwing an OOM instead of an ArgumentOutOfRangeException for "negative" amounts of memory.
- UIntPtr numBytes;
-#if TARGET_64BIT
- numBytes = new UIntPtr(unchecked((ulong)cb.ToInt64()));
-#else // 32
- numBytes = new UIntPtr(unchecked((uint)cb.ToInt32()));
-#endif
-
- IntPtr pNewMem = Interop.Kernel32.LocalAlloc(Interop.Kernel32.LMEM_FIXED, unchecked(numBytes));
- if (pNewMem == IntPtr.Zero)
- {
- throw new OutOfMemoryException();
- }
-
- return pNewMem;
- }
-
- public static void FreeHGlobal(IntPtr hglobal)
- {
- if (!IsNullOrWin32Atom(hglobal))
- {
- if (IntPtr.Zero != Interop.Kernel32.LocalFree(hglobal))
- {
- ThrowExceptionForHR(GetHRForLastWin32Error());
- }
- }
- }
-
- public static IntPtr ReAllocHGlobal(IntPtr pv, IntPtr cb)
- {
- IntPtr pNewMem = Interop.Kernel32.LocalReAlloc(pv, cb, Interop.Kernel32.LMEM_MOVEABLE);
- if (pNewMem == IntPtr.Zero)
- {
- throw new OutOfMemoryException();
- }
-
- return pNewMem;
- }
-
#if FEATURE_COMINTEROP
///
/// Converts the CLR exception to an HRESULT. This function also sets
@@ -306,6 +261,7 @@ public static IntPtr ReAllocHGlobal(IntPtr pv, IntPtr cb)
///
/// Given a managed object that wraps an ITypeInfo, return its name.
///
+ [SupportedOSPlatform("windows")]
public static string GetTypeInfoName(ITypeInfo typeInfo)
{
if (typeInfo is null)
@@ -319,12 +275,24 @@ public static string GetTypeInfoName(ITypeInfo typeInfo)
// This method is identical to Type.GetTypeFromCLSID. Since it's interop specific, we expose it
// on Marshal for more consistent API surface.
- public static Type? GetTypeFromCLSID(Guid clsid) => RuntimeType.GetTypeFromCLSIDImpl(clsid, null, throwOnError: false);
+ internal static Type? GetTypeFromCLSID(Guid clsid, string? server, bool throwOnError)
+ {
+ // Note: "throwOnError" is a vacuous parameter. Any errors due to the CLSID not being registered or the server not being found will happen
+ // on the Activator.CreateInstance() call. GetTypeFromCLSID() merely wraps the data in a Type object without any validation.
+
+ Type? type = null;
+ GetTypeFromCLSID(clsid, server, ObjectHandleOnStack.Create(ref type));
+ return type;
+ }
+
+ [DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
+ private static extern void GetTypeFromCLSID(in Guid clsid, string? server, ObjectHandleOnStack retType);
///
/// Return the IUnknown* for an Object if the current context is the one
/// where the RCW was first seen. Will return null otherwise.
///
+ [SupportedOSPlatform("windows")]
public static IntPtr /* IUnknown* */ GetIUnknownForObject(object o)
{
if (o is null)
@@ -348,6 +316,7 @@ public static string GetTypeInfoName(ITypeInfo typeInfo)
///
/// Return the IDispatch* for an Object.
///
+ [SupportedOSPlatform("windows")]
public static IntPtr /* IDispatch */ GetIDispatchForObject(object o)
{
if (o is null)
@@ -365,6 +334,7 @@ public static string GetTypeInfoName(ITypeInfo typeInfo)
/// Return the IUnknown* representing the interface for the Object.
/// Object o should support Type T
///
+ [SupportedOSPlatform("windows")]
public static IntPtr /* IUnknown* */ GetComInterfaceForObject(object o, Type T)
{
if (o is null)
@@ -380,6 +350,7 @@ public static string GetTypeInfoName(ITypeInfo typeInfo)
return GetComInterfaceForObjectNative(o, T, false, true);
}
+ [SupportedOSPlatform("windows")]
public static IntPtr GetComInterfaceForObject([DisallowNull] T o) => GetComInterfaceForObject(o!, typeof(TInterface));
///
@@ -387,6 +358,7 @@ public static string GetTypeInfoName(ITypeInfo typeInfo)
/// Object o should support Type T, it refer the value of mode to
/// invoke customized QueryInterface or not.
///
+ [SupportedOSPlatform("windows")]
public static IntPtr /* IUnknown* */ GetComInterfaceForObject(object o, Type T, CustomQueryInterfaceMode mode)
{
if (o is null)
@@ -409,6 +381,7 @@ public static string GetTypeInfoName(ITypeInfo typeInfo)
///
/// Return the managed object representing the IUnknown*
///
+ [SupportedOSPlatform("windows")]
public static object GetObjectForIUnknown(IntPtr /* IUnknown* */ pUnk)
{
if (pUnk == IntPtr.Zero)
@@ -422,6 +395,7 @@ public static object GetObjectForIUnknown(IntPtr /* IUnknown* */ pUnk)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern object GetObjectForIUnknownNative(IntPtr /* IUnknown* */ pUnk);
+ [SupportedOSPlatform("windows")]
public static object GetUniqueObjectForIUnknown(IntPtr unknown)
{
if (unknown == IntPtr.Zero)
@@ -445,12 +419,15 @@ public static object GetUniqueObjectForIUnknown(IntPtr unknown)
/// Return an Object for IUnknown, using the Type T.
/// Type T should be either a COM imported Type or a sub-type of COM imported Type
///
+ [SupportedOSPlatform("windows")]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern object GetTypedObjectForIUnknown(IntPtr /* IUnknown* */ pUnk, Type t);
+ [SupportedOSPlatform("windows")]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern IntPtr CreateAggregatedObject(IntPtr pOuter, object o);
+ [SupportedOSPlatform("windows")]
public static IntPtr CreateAggregatedObject(IntPtr pOuter, T o) where T : notnull
{
return CreateAggregatedObject(pOuter, (object)o);
@@ -468,87 +445,11 @@ public static IntPtr CreateAggregatedObject(IntPtr pOuter, T o) where T : not
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern bool IsComObject(object o);
-#endif // FEATURE_COMINTEROP
-
- public static IntPtr AllocCoTaskMem(int cb)
- {
- IntPtr pNewMem = Interop.Ole32.CoTaskMemAlloc(new UIntPtr((uint)cb));
- if (pNewMem == IntPtr.Zero)
- {
- throw new OutOfMemoryException();
- }
-
- return pNewMem;
- }
-
- public static void FreeCoTaskMem(IntPtr ptr)
- {
- if (!IsNullOrWin32Atom(ptr))
- {
- Interop.Ole32.CoTaskMemFree(ptr);
- }
- }
-
- public static IntPtr ReAllocCoTaskMem(IntPtr pv, int cb)
- {
- IntPtr pNewMem = Interop.Ole32.CoTaskMemRealloc(pv, new UIntPtr((uint)cb));
- if (pNewMem == IntPtr.Zero && cb != 0)
- {
- throw new OutOfMemoryException();
- }
-
- return pNewMem;
- }
-
- internal static IntPtr AllocBSTR(int length)
- {
- IntPtr bstr = Interop.OleAut32.SysAllocStringLen(null, length);
- if (bstr == IntPtr.Zero)
- {
- throw new OutOfMemoryException();
- }
- return bstr;
- }
-
- public static void FreeBSTR(IntPtr ptr)
- {
- if (!IsNullOrWin32Atom(ptr))
- {
- Interop.OleAut32.SysFreeString(ptr);
- }
- }
-
- public static IntPtr StringToBSTR(string? s)
- {
- if (s is null)
- {
- return IntPtr.Zero;
- }
-
- IntPtr bstr = Interop.OleAut32.SysAllocStringLen(s, s.Length);
- if (bstr == IntPtr.Zero)
- {
- throw new OutOfMemoryException();
- }
-
- return bstr;
- }
-
- public static string PtrToStringBSTR(IntPtr ptr)
- {
- if (ptr == IntPtr.Zero)
- {
- throw new ArgumentNullException(nameof(ptr));
- }
-
- return PtrToStringUni(ptr, (int)(SysStringByteLen(ptr) / sizeof(char)));
- }
-
-#if FEATURE_COMINTEROP
///
/// Release the COM component and if the reference hits 0 zombie this object.
/// Further usage of this Object might throw an exception
///
+ [SupportedOSPlatform("windows")]
public static int ReleaseComObject(object o)
{
if (o is null)
@@ -571,6 +472,7 @@ public static int ReleaseComObject(object o)
/// Release the COM component and zombie this object.
/// Further usage of this Object might throw an exception
///
+ [SupportedOSPlatform("windows")]
public static int FinalReleaseComObject(object o)
{
if (o is null)
@@ -589,6 +491,7 @@ public static int FinalReleaseComObject(object o)
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void InternalFinalReleaseComObject(object o);
+ [SupportedOSPlatform("windows")]
public static object? GetComObjectData(object obj, object key)
{
if (obj is null)
@@ -614,6 +517,7 @@ public static int FinalReleaseComObject(object o)
/// false if the data could not be added because there already was data for the
/// specified key.
///
+ [SupportedOSPlatform("windows")]
public static bool SetComObjectData(object obj, object key, object? data)
{
if (obj is null)
@@ -637,6 +541,7 @@ public static bool SetComObjectData(object obj, object key, object? data)
/// This method takes the given COM object and wraps it in an object
/// of the specified type. The type must be derived from __ComObject.
///
+ [SupportedOSPlatform("windows")]
[return: NotNullIfNotNull("o")]
public static object? CreateWrapperOfType(object? o, Type t)
{
@@ -680,14 +585,15 @@ public static bool SetComObjectData(object obj, object key, object? data)
if (!SetComObjectData(o, t, Wrapper))
{
// Another thead already cached the wrapper so use that one instead.
- Wrapper = GetComObjectData(o, t);
+ Wrapper = GetComObjectData(o, t)!;
}
}
return Wrapper;
}
- public static TWrapper CreateWrapperOfType([AllowNull] T o)
+ [SupportedOSPlatform("windows")]
+ public static TWrapper CreateWrapperOfType(T? o)
{
return (TWrapper)CreateWrapperOfType(o, typeof(TWrapper))!;
}
@@ -701,6 +607,7 @@ public static TWrapper CreateWrapperOfType([AllowNull] T o)
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern bool IsTypeVisibleFromCom(Type t);
+ [SupportedOSPlatform("windows")]
public static unsafe int QueryInterface(IntPtr pUnk, ref Guid iid, out IntPtr ppv)
{
if (pUnk == IntPtr.Zero)
@@ -709,46 +616,53 @@ public static unsafe int QueryInterface(IntPtr pUnk, ref Guid iid, out IntPtr pp
fixed (Guid* pIID = &iid)
fixed (IntPtr* p = &ppv)
{
- return ((delegate * stdcall )(*(*(void***)pUnk + 0 /* IUnknown.QueryInterface slot */)))(pUnk, pIID, p);
+ return ((delegate* unmanaged)(*(*(void***)pUnk + 0 /* IUnknown.QueryInterface slot */)))(pUnk, pIID, p);
}
}
+ [SupportedOSPlatform("windows")]
public static unsafe int AddRef(IntPtr pUnk)
{
if (pUnk == IntPtr.Zero)
throw new ArgumentNullException(nameof(pUnk));
- return ((delegate * stdcall )(*(*(void***)pUnk + 1 /* IUnknown.AddRef slot */)))(pUnk);
+ return ((delegate* unmanaged)(*(*(void***)pUnk + 1 /* IUnknown.AddRef slot */)))(pUnk);
}
+ [SupportedOSPlatform("windows")]
public static unsafe int Release(IntPtr pUnk)
{
if (pUnk == IntPtr.Zero)
throw new ArgumentNullException(nameof(pUnk));
- return ((delegate * stdcall )(*(*(void***)pUnk + 2 /* IUnknown.Release slot */)))(pUnk);
+ return ((delegate* unmanaged)(*(*(void***)pUnk + 2 /* IUnknown.Release slot */)))(pUnk);
}
+ [SupportedOSPlatform("windows")]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern void GetNativeVariantForObject(object? obj, /* VARIANT * */ IntPtr pDstNativeVariant);
- public static void GetNativeVariantForObject([AllowNull] T obj, IntPtr pDstNativeVariant)
+ [SupportedOSPlatform("windows")]
+ public static void GetNativeVariantForObject(T? obj, IntPtr pDstNativeVariant)
{
GetNativeVariantForObject((object?)obj, pDstNativeVariant);
}
+ [SupportedOSPlatform("windows")]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern object? GetObjectForNativeVariant(/* VARIANT * */ IntPtr pSrcNativeVariant);
- [return: MaybeNull]
- public static T GetObjectForNativeVariant(IntPtr pSrcNativeVariant)
+ [SupportedOSPlatform("windows")]
+ public static T? GetObjectForNativeVariant(IntPtr pSrcNativeVariant)
{
- return (T)GetObjectForNativeVariant(pSrcNativeVariant)!;
+ return (T?)GetObjectForNativeVariant(pSrcNativeVariant);
}
+ [SupportedOSPlatform("windows")]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern object?[] GetObjectsForNativeVariants(/* VARIANT * */ IntPtr aSrcNativeVariant, int cVars);
+ [SupportedOSPlatform("windows")]
public static T[] GetObjectsForNativeVariants(IntPtr aSrcNativeVariant, int cVars)
{
object?[] objects = GetObjectsForNativeVariants(aSrcNativeVariant, cVars);
@@ -763,15 +677,18 @@ public static T[] GetObjectsForNativeVariants(IntPtr aSrcNativeVariant, int c
/// Returns the first valid COM slot that GetMethodInfoForSlot will work on
/// This will be 3 for IUnknown based interfaces and 7 for IDispatch based interfaces.
///
+ [SupportedOSPlatform("windows")]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern int GetStartComSlot(Type t);
///
/// Returns the last valid COM slot that GetMethodInfoForSlot will work on.
///
+ [SupportedOSPlatform("windows")]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern int GetEndComSlot(Type t);
+ [SupportedOSPlatform("windows")]
public static object BindToMoniker(string monikerName)
{
CreateBindCtx(0, out IBindCtx bindctx);
@@ -791,6 +708,7 @@ public static object BindToMoniker(string monikerName)
[DllImport(Interop.Libraries.Ole32, PreserveSig = false)]
private static extern void BindMoniker(IMoniker pmk, uint grfOpt, ref Guid iidResult, [MarshalAs(UnmanagedType.Interface)] out object ppvResult);
+ [SupportedOSPlatform("windows")]
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern void ChangeWrapperHandleStrength(object otp, bool fIsWeak);
#endif // FEATURE_COMINTEROP
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/X86Base.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/X86Base.CoreCLR.cs
new file mode 100644
index 000000000000..e523487f0d6b
--- /dev/null
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/X86Base.CoreCLR.cs
@@ -0,0 +1,14 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace System.Runtime.Intrinsics.X86
+{
+ public abstract partial class X86Base
+ {
+ [DllImport(RuntimeHelpers.QCall)]
+ private static extern unsafe void __cpuidex(int* cpuInfo, int functionId, int subFunctionId);
+ }
+}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/Versioning/CompatibilitySwitch.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/Versioning/CompatibilitySwitch.cs
index 3b69f789e61c..d90f81d48e98 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/Versioning/CompatibilitySwitch.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Runtime/Versioning/CompatibilitySwitch.cs
@@ -7,24 +7,7 @@ namespace System.Runtime.Versioning
{
internal static class CompatibilitySwitch
{
- /* This class contains 3 sets of api:
- * 1. internal apis : These apis are supposed to be used by mscorlib.dll and other assemblies which use the section in config
- * These apis query for the value of quirk not only in windows quirk DB but also in runtime section of config files,
- * registry and environment vars.
- * 2. public apis : These apis are supposed to be used by FX assemblies which do not read the runtime section of config files and have
- * have their own section in config files or do not use configs at all.
- *
- * 3. specialized apis: These apis are defined in order to retrieve a specific value defined in CLR Config. That value can have specific look-up rules
- * for the order and location of the config sources used.
- *
- * These apis are for internal use only for FX assemblies. It has not been decided if they can be used by OOB components due to EULA restrictions
- */
- internal static string? GetValueInternal(string compatibilitySwitchName)
- {
- return GetValueInternalCall(compatibilitySwitchName, false);
- }
-
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern string? GetValueInternalCall(string compatibilitySwitchName, bool onlyDB);
+ internal static extern string? GetValueInternal(string compatibilitySwitchName);
}
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeHandles.cs b/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeHandles.cs
index 965df43cfaf3..adc808e43de5 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeHandles.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeHandles.cs
@@ -126,10 +126,7 @@ internal static bool IsTypeDefinition(RuntimeType type)
internal static bool IsPrimitive(RuntimeType type)
{
- CorElementType corElemType = GetCorElementType(type);
- return (corElemType >= CorElementType.ELEMENT_TYPE_BOOLEAN && corElemType <= CorElementType.ELEMENT_TYPE_R8) ||
- corElemType == CorElementType.ELEMENT_TYPE_I ||
- corElemType == CorElementType.ELEMENT_TYPE_U;
+ return RuntimeHelpers.IsPrimitiveType(GetCorElementType(type));
}
internal static bool IsByRef(RuntimeType type)
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs
index a883bad112b3..744efa515e3c 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs
@@ -234,6 +234,48 @@ internal MemberInfoCache(RuntimeTypeCache runtimeTypeCache)
internal MethodBase AddMethod(RuntimeType declaringType, RuntimeMethodHandleInternal method, CacheType cacheType)
{
+ // First, see if we've already cached an RuntimeMethodInfo or
+ // RuntimeConstructorInfo that corresponds to this member. Since another
+ // thread could be updating the backing store at the same time it's
+ // possible that the check below will result in a false negative. That's
+ // ok; we'll handle any concurrency issues in the later call to Insert.
+
+ T?[]? allMembersLocal = m_allMembers;
+ if (allMembersLocal != null)
+ {
+ // if not a Method or a Constructor, fall through
+ if (cacheType == CacheType.Method)
+ {
+ foreach (T? candidate in allMembersLocal)
+ {
+ if (candidate is null)
+ {
+ break; // end of list; stop iteration and fall through to slower path
+ }
+
+ if (candidate is RuntimeMethodInfo candidateRMI && candidateRMI.MethodHandle.Value == method.Value)
+ {
+ return candidateRMI; // match!
+ }
+ }
+ }
+ else if (cacheType == CacheType.Constructor)
+ {
+ foreach (T? candidate in allMembersLocal)
+ {
+ if (candidate is null)
+ {
+ break; // end of list; stop iteration and fall through to slower path
+ }
+
+ if (candidate is RuntimeConstructorInfo candidateRCI && candidateRCI.MethodHandle.Value == method.Value)
+ {
+ return candidateRCI; // match!
+ }
+ }
+ }
+ }
+
T[] list = null!;
MethodAttributes methodAttributes = RuntimeMethodHandle.GetAttributes(method);
bool isPublic = (methodAttributes & MethodAttributes.MemberAccessMask) == MethodAttributes.Public;
@@ -264,6 +306,29 @@ internal MethodBase AddMethod(RuntimeType declaringType, RuntimeMethodHandleInte
internal FieldInfo AddField(RuntimeFieldHandleInternal field)
{
+ // First, see if we've already cached an RtFieldInfo that corresponds
+ // to this field. Since another thread could be updating the backing
+ // store at the same time it's possible that the check below will
+ // result in a false negative. That's ok; we'll handle any concurrency
+ // issues in the later call to Insert.
+
+ T?[]? allMembersLocal = m_allMembers;
+ if (allMembersLocal != null)
+ {
+ foreach (T? candidate in allMembersLocal)
+ {
+ if (candidate is null)
+ {
+ break; // end of list; stop iteration and fall through to slower path
+ }
+
+ if (candidate is RtFieldInfo candidateRtFI && candidateRtFI.GetFieldHandle() == field.Value)
+ {
+ return candidateRtFI; // match!
+ }
+ }
+ }
+
// create the runtime field info
FieldAttributes fieldAttributes = RuntimeFieldHandle.GetAttributes(field);
bool isPublic = (fieldAttributes & FieldAttributes.FieldAccessMask) == FieldAttributes.Public;
@@ -507,7 +572,7 @@ private void MergeWithGlobalList(T[] list)
}
Debug.Assert(cachedMembers![freeSlotIndex] == null);
- cachedMembers[freeSlotIndex] = newMemberInfo;
+ Volatile.Write(ref cachedMembers[freeSlotIndex], newMemberInfo); // value may be read outside of lock
freeSlotIndex++;
}
}
@@ -1679,6 +1744,9 @@ internal FieldInfo GetField(RuntimeFieldHandleInternal field)
return retval;
}
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070:UnrecognizedReflectionPattern",
+ Justification = "The code in this method looks up the method by name, but it always starts with a method handle." +
+ "To get here something somwhere had to get the method handle and thus the method must exist.")]
internal static MethodBase? GetMethodBase(RuntimeType? reflectedType, RuntimeMethodHandleInternal methodHandle)
{
Debug.Assert(!methodHandle.IsNullHandle());
@@ -2138,7 +2206,7 @@ private static bool FilterApplyBase(
private static bool FilterApplyType(
Type type, BindingFlags bindingFlags, string name, bool prefixLookup, string? ns)
{
- Debug.Assert((object)type != null);
+ Debug.Assert(type is not null);
Debug.Assert(type is RuntimeType);
bool isPublic = type.IsNestedPublic || type.IsPublic;
@@ -2276,7 +2344,7 @@ private static bool FilterApplyMethodBase(
for (int i = 0; i < parameterInfos.Length; i++)
{
// a null argument type implies a null arg which is always a perfect match
- if ((object)argumentTypes[i] != null && !argumentTypes[i].MatchesParameterTypeExactly(parameterInfos[i]))
+ if (argumentTypes[i] is Type t && !t.MatchesParameterTypeExactly(parameterInfos[i]))
return false;
}
}
@@ -2769,7 +2837,7 @@ public override InterfaceMapping GetInterfaceMap(Type ifaceType)
{
PropertyInfo firstCandidate = candidates[0];
- if ((object?)returnType != null && !returnType.IsEquivalentTo(firstCandidate.PropertyType))
+ if (returnType is not null && !returnType.IsEquivalentTo(firstCandidate.PropertyType))
return null;
return firstCandidate;
@@ -3798,7 +3866,9 @@ private void CreateInstanceCheckThis()
throw new NotSupportedException(SR.Acc_CreateVoid);
}
- [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2006:UnrecognizedReflectionPattern",
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2082:UnrecognizedReflectionPattern",
+ Justification = "Implementation detail of Activator that linker intrinsically recognizes")]
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2085:UnrecognizedReflectionPattern",
Justification = "Implementation detail of Activator that linker intrinsically recognizes")]
internal object? CreateInstanceImpl(
BindingFlags bindingAttr, Binder? binder, object?[]? args, CultureInfo? culture)
@@ -4018,24 +4088,6 @@ private extern object InvokeDispMethod(
bool[]? byrefModifiers, int culture, string[]? namedParameters);
#endif // FEATURE_COMINTEROP
-#if FEATURE_COMINTEROP_UNMANAGED_ACTIVATION
- [MethodImpl(MethodImplOptions.InternalCall)]
- internal static extern Type? GetTypeFromProgIDImpl(string progID, string? server, bool throwOnError);
-
- [MethodImpl(MethodImplOptions.InternalCall)]
- internal static extern Type? GetTypeFromCLSIDImpl(Guid clsid, string? server, bool throwOnError);
-#else // FEATURE_COMINTEROP_UNMANAGED_ACTIVATION
- internal static Type GetTypeFromProgIDImpl(string progID, string? server, bool throwOnError)
- {
- throw new NotImplementedException("CoreCLR_REMOVED -- Unmanaged activation removed");
- }
-
- internal static Type GetTypeFromCLSIDImpl(Guid clsid, string? server, bool throwOnError)
- {
- throw new NotImplementedException("CoreCLR_REMOVED -- Unmanaged activation removed");
- }
-#endif // FEATURE_COMINTEROP_UNMANAGED_ACTIVATION
-
#endregion
#if FEATURE_COMINTEROP
@@ -4185,6 +4237,7 @@ private static void WrapArgsForInvokeCall(object[] aArgs, int[] aArgsWrapperType
aArgs[i] = new UnknownWrapper(aArgs[i]);
break;
case DispatchWrapperType.Dispatch:
+ Debug.Assert(OperatingSystem.IsWindows());
aArgs[i] = new DispatchWrapper(aArgs[i]);
break;
case DispatchWrapperType.Error:
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/String.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/String.CoreCLR.cs
index e97cdaa3c9bc..23ac59b6cd45 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/String.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/String.CoreCLR.cs
@@ -3,6 +3,7 @@
using System.Runtime.CompilerServices;
using System.Text;
+using Internal.Runtime.CompilerServices;
namespace System
{
@@ -80,15 +81,12 @@ public static string Intern(string str)
}
// Copies the source String (byte buffer) to the destination IntPtr memory allocated with len bytes.
+ // Used by ilmarshalers.cpp
internal static unsafe void InternalCopy(string src, IntPtr dest, int len)
{
- if (len == 0)
- return;
- fixed (char* charPtr = &src._firstChar)
+ if (len != 0)
{
- byte* srcPtr = (byte*)charPtr;
- byte* dstPtr = (byte*)dest;
- Buffer.Memcpy(dstPtr, srcPtr, len);
+ Buffer.Memmove(ref *(byte*)dest, ref Unsafe.As(ref src.GetRawStringData()), (nuint)len);
}
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/StubHelpers.cs b/src/coreclr/src/System.Private.CoreLib/src/System/StubHelpers.cs
index b507b28559da..1c4a5649c251 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/StubHelpers.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/StubHelpers.cs
@@ -104,10 +104,7 @@ internal static unsafe IntPtr ConvertToNative(int flags, string strManaged, IntP
// + 1 for the null character from the user. + 1 for the null character we put in.
pbNativeBuffer = (byte*)Marshal.AllocCoTaskMem(nb + 2);
- fixed (byte* pBytes = &bytes[0])
- {
- Buffer.Memcpy(pbNativeBuffer, pBytes, nb);
- }
+ Buffer.Memmove(ref *pbNativeBuffer, ref MemoryMarshal.GetArrayDataReference(bytes), (nuint)nb);
}
}
@@ -127,7 +124,7 @@ internal static unsafe IntPtr ConvertToNative(int flags, string strManaged, IntP
internal static void ClearNative(IntPtr pNative)
{
- Interop.Ole32.CoTaskMemFree(pNative);
+ Marshal.FreeCoTaskMem(pNative);
}
internal static unsafe void ConvertFixedToNative(int flags, string strManaged, IntPtr pNativeBuffer, int length)
@@ -257,10 +254,7 @@ internal static unsafe IntPtr ConvertToNative(int flags, string strManaged, IntP
internal static void ClearNative(IntPtr pNative)
{
- if (pNative != IntPtr.Zero)
- {
- Interop.Ole32.CoTaskMemFree(pNative);
- }
+ Marshal.FreeCoTaskMem(pNative);
}
}
@@ -336,24 +330,13 @@ internal static unsafe IntPtr ConvertToNative(string strManaged, IntPtr pNativeB
}
else
{
- // If not provided, allocate the buffer using SysAllocStringByteLen so
+ // If not provided, allocate the buffer using Marshal.AllocBSTRByteLen so
// that odd-sized strings will be handled as well.
- ptrToFirstChar = (byte*)Interop.OleAut32.SysAllocStringByteLen(null, lengthInBytes);
-
- if (ptrToFirstChar == null)
- {
- throw new OutOfMemoryException();
- }
+ ptrToFirstChar = (byte*)Marshal.AllocBSTRByteLen(lengthInBytes);
}
// copy characters from the managed string
- fixed (char* ch = strManaged)
- {
- Buffer.Memcpy(
- ptrToFirstChar,
- (byte*)ch,
- (strManaged.Length + 1) * 2);
- }
+ Buffer.Memmove(ref *(char*)ptrToFirstChar, ref strManaged.GetRawStringData(), (nuint)strManaged.Length + 1);
// copy the trail byte if present
if (hasTrailByte)
@@ -412,10 +395,7 @@ internal static unsafe IntPtr ConvertToNative(string strManaged, IntPtr pNativeB
internal static void ClearNative(IntPtr pNative)
{
- if (IntPtr.Zero != pNative)
- {
- Interop.OleAut32.SysFreeString(pNative);
- }
+ Marshal.FreeBSTR(pNative);
}
} // class BSTRMarshaler
@@ -449,11 +429,9 @@ internal static unsafe IntPtr ConvertToNative(string strManaged, bool fBestFit,
{
byte[] bytes = AnsiCharMarshaler.DoAnsiConversion(strManaged, fBestFit, fThrowOnUnmappableChar, out int nbytesused);
- Debug.Assert(nbytesused < nbytes, "Insufficient buffer allocated in VBByValStrMarshaler.ConvertToNative");
- fixed (byte* pBytes = &bytes[0])
- {
- Buffer.Memcpy(pNative, pBytes, nbytesused);
- }
+ Debug.Assert(nbytesused >= 0 && nbytesused < nbytes, "Insufficient buffer allocated in VBByValStrMarshaler.ConvertToNative");
+
+ Buffer.Memmove(ref *pNative, ref MemoryMarshal.GetArrayDataReference(bytes), (nuint)nbytesused);
pNative[nbytesused] = 0;
*pLength = nbytesused;
@@ -476,14 +454,14 @@ internal static void ClearNative(IntPtr pNative)
{
if (IntPtr.Zero != pNative)
{
- Interop.Ole32.CoTaskMemFree((IntPtr)(((long)pNative) - sizeof(uint)));
+ Marshal.FreeCoTaskMem((IntPtr)(((long)pNative) - sizeof(uint)));
}
}
} // class VBByValStrMarshaler
internal static class AnsiBSTRMarshaler
{
- internal static IntPtr ConvertToNative(int flags, string strManaged)
+ internal static unsafe IntPtr ConvertToNative(int flags, string strManaged)
{
if (null == strManaged)
{
@@ -498,7 +476,14 @@ internal static IntPtr ConvertToNative(int flags, string strManaged)
bytes = AnsiCharMarshaler.DoAnsiConversion(strManaged, 0 != (flags & 0xFF), 0 != (flags >> 8), out nb);
}
- return Interop.OleAut32.SysAllocStringByteLen(bytes, (uint)nb);
+ uint length = (uint)nb;
+ IntPtr bstr = Marshal.AllocBSTRByteLen(length);
+ if (bytes != null)
+ {
+ Buffer.Memmove(ref *(byte*)bstr, ref MemoryMarshal.GetArrayDataReference(bytes), length);
+ }
+
+ return bstr;
}
internal static unsafe string? ConvertToManaged(IntPtr bstr)
@@ -518,10 +503,7 @@ internal static IntPtr ConvertToNative(int flags, string strManaged)
internal static void ClearNative(IntPtr pNative)
{
- if (IntPtr.Zero != pNative)
- {
- Interop.OleAut32.SysFreeString(pNative);
- }
+ Marshal.FreeBSTR(pNative);
}
} // class AnsiBSTRMarshaler
@@ -853,11 +835,12 @@ private static IntPtr ConvertStringToNative(string pManagedHome, int dwFlags)
else
{
// marshal the object as Unicode string (UnmanagedType.LPWStr)
-
int allocSize = (pManagedHome.Length + 1) * 2;
pNativeHome = Marshal.AllocCoTaskMem(allocSize);
-
- string.InternalCopy(pManagedHome, pNativeHome, allocSize);
+ unsafe
+ {
+ Buffer.Memmove(ref *(char*)pNativeHome, ref pManagedHome.GetRawStringData(), (nuint)pManagedHome.Length + 1);
+ }
}
return pNativeHome;
@@ -880,14 +863,23 @@ private unsafe IntPtr ConvertStringBuilderToNative(StringBuilder pManagedHome, i
// | | |
// +====================================+ / <-- native home
+ // Cache StringBuilder capacity and length to ensure we don't allocate a certain amount of
+ // native memory and then walk beyond its end if the StringBuilder concurrently grows erroneously.
+ int pManagedHomeCapacity = pManagedHome.Capacity;
+ int pManagedHomeLength = pManagedHome.Length;
+ if (pManagedHomeLength > pManagedHomeCapacity)
+ {
+ ThrowHelper.ThrowInvalidOperationException();
+ }
+
// Note that StringBuilder.Capacity is the number of characters NOT including any terminators.
if (IsAnsi(dwFlags))
{
- StubHelpers.CheckStringLength(pManagedHome.Capacity);
+ StubHelpers.CheckStringLength(pManagedHomeCapacity);
// marshal the object as Ansi string (UnmanagedType.LPStr)
- int allocSize = checked((pManagedHome.Capacity * Marshal.SystemMaxDBCSCharSize) + 4);
+ int allocSize = checked((pManagedHomeCapacity * Marshal.SystemMaxDBCSCharSize) + 4);
pNativeHome = Marshal.AllocCoTaskMem(allocSize);
byte* ptr = (byte*)pNativeHome;
@@ -911,7 +903,7 @@ private unsafe IntPtr ConvertStringBuilderToNative(StringBuilder pManagedHome, i
else
{
// marshal the object as Unicode string (UnmanagedType.LPWStr)
- int allocSize = checked((pManagedHome.Capacity * 2) + 4);
+ int allocSize = checked((pManagedHomeCapacity * 2) + 4);
pNativeHome = Marshal.AllocCoTaskMem(allocSize);
byte* ptr = (byte*)pNativeHome;
@@ -920,10 +912,10 @@ private unsafe IntPtr ConvertStringBuilderToNative(StringBuilder pManagedHome, i
if (IsIn(dwFlags))
{
- int length = pManagedHome.Length * 2;
- pManagedHome.InternalCopy(pNativeHome, length);
+ pManagedHome.InternalCopy(pNativeHome, pManagedHomeLength);
// null-terminate the native string
+ int length = pManagedHomeLength * 2;
*(ptr + length + 0) = 0;
*(ptr + length + 1) = 0;
}
@@ -1067,7 +1059,7 @@ internal void ClearNative(IntPtr pNativeHome)
// this must happen regardless of BackPropAction
Marshal.DestroyStructure(pNativeHome, layoutType);
}
- Interop.Ole32.CoTaskMemFree(pNativeHome);
+ Marshal.FreeCoTaskMem(pNativeHome);
}
StubHelpers.DestroyCleanupList(ref cleanupWorkList);
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Text/StringBuilder.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Text/StringBuilder.CoreCLR.cs
index d23263f57bc1..93775554ab35 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Text/StringBuilder.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Text/StringBuilder.CoreCLR.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using System.Runtime.InteropServices;
namespace System.Text
{
@@ -104,58 +105,8 @@ internal unsafe void ReplaceBufferAnsiInternal(sbyte* newBuffer, int newLength)
/// Copies the contents of this builder to the specified buffer.
///
/// The destination buffer.
- /// The number of bytes in the destination buffer.
- internal unsafe void InternalCopy(IntPtr dest, int len)
- {
- if (len == 0)
- {
- return;
- }
-
- bool isLastChunk = true;
- byte* dstPtr = (byte*)dest.ToPointer();
- StringBuilder? currentSrc = FindChunkForByte(len);
-
- do
- {
- int chunkOffsetInBytes = currentSrc.m_ChunkOffset * sizeof(char);
- int chunkLengthInBytes = currentSrc.m_ChunkLength * sizeof(char);
- fixed (char* charPtr = ¤tSrc.m_ChunkChars[0])
- {
- byte* srcPtr = (byte*)charPtr;
- if (isLastChunk)
- {
- isLastChunk = false;
- Buffer.Memcpy(dstPtr + chunkOffsetInBytes, srcPtr, len - chunkOffsetInBytes);
- }
- else
- {
- Buffer.Memcpy(dstPtr + chunkOffsetInBytes, srcPtr, chunkLengthInBytes);
- }
- }
-
- currentSrc = currentSrc.m_ChunkPrevious;
- }
- while (currentSrc != null);
- }
-
- ///
- /// Gets the chunk corresponding to the logical byte index in this builder.
- ///
- /// The logical byte index in this builder.
- private StringBuilder FindChunkForByte(int byteIndex)
- {
- Debug.Assert(0 <= byteIndex && byteIndex <= Length * sizeof(char));
-
- StringBuilder result = this;
- while (result.m_ChunkOffset * sizeof(char) > byteIndex)
- {
- Debug.Assert(result.m_ChunkPrevious != null);
- result = result.m_ChunkPrevious;
- }
-
- Debug.Assert(result != null);
- return result;
- }
+ /// The number of chars in the destination buffer.
+ internal unsafe void InternalCopy(IntPtr dest, int charLen) =>
+ CopyTo(0, new Span((char*)dest, charLen), charLen);
}
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ClrThreadPoolBoundHandle.Windows.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ClrThreadPoolBoundHandle.Windows.cs
index 595051fd2160..097277e894d9 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ClrThreadPoolBoundHandle.Windows.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ClrThreadPoolBoundHandle.Windows.cs
@@ -16,6 +16,7 @@ private static ThreadPoolBoundHandle BindHandleCore(SafeHandle handle)
try
{
+ Debug.Assert(OperatingSystem.IsWindows());
// ThreadPool.BindHandle will always return true, otherwise, it throws. See the underlying FCall
// implementation in ThreadPoolNative::CorBindIoCompletionCallback to see the implementation.
bool succeeded = ThreadPool.BindHandle(handle);
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Unix.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Unix.cs
new file mode 100644
index 000000000000..552fed57a7b9
--- /dev/null
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/LowLevelLifoSemaphore.Unix.cs
@@ -0,0 +1,51 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using Microsoft.Win32.SafeHandles;
+
+namespace System.Threading
+{
+ ///
+ /// A LIFO semaphore implemented using the PAL's semaphore with uninterruptible waits.
+ ///
+ internal sealed partial class LowLevelLifoSemaphore : IDisposable
+ {
+ private Semaphore? _semaphore;
+
+ private void Create(int maximumSignalCount)
+ {
+ Debug.Assert(maximumSignalCount > 0);
+ _semaphore = new Semaphore(0, maximumSignalCount);
+ }
+
+ public bool WaitCore(int timeoutMs)
+ {
+ Debug.Assert(_semaphore != null);
+ Debug.Assert(timeoutMs >= -1);
+
+ int waitResult = WaitNative(_semaphore!.SafeWaitHandle, timeoutMs);
+ Debug.Assert(waitResult == WaitHandle.WaitSuccess || waitResult == WaitHandle.WaitTimeout);
+ return waitResult == WaitHandle.WaitSuccess;
+ }
+
+ [DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
+ private static extern int WaitNative(SafeWaitHandle handle, int timeoutMs);
+
+ public void ReleaseCore(int count)
+ {
+ Debug.Assert(_semaphore != null);
+ Debug.Assert(count > 0);
+
+ _semaphore!.Release(count);
+ }
+
+ public void Dispose()
+ {
+ Debug.Assert(_semaphore != null);
+ _semaphore!.Dispose();
+ }
+ }
+}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Monitor.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Monitor.CoreCLR.cs
new file mode 100644
index 000000000000..8064083eab77
--- /dev/null
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Monitor.CoreCLR.cs
@@ -0,0 +1,203 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+//
+/*=============================================================================
+**
+**
+**
+** Purpose: Synchronizes access to a shared resource or region of code in a multi-threaded
+** program.
+**
+**
+=============================================================================*/
+
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.Versioning;
+
+namespace System.Threading
+{
+ public static partial class Monitor
+ {
+ /*=========================================================================
+ ** Obtain the monitor lock of obj. Will block if another thread holds the lock
+ ** Will not block if the current thread holds the lock,
+ ** however the caller must ensure that the same number of Exit
+ ** calls are made as there were Enter calls.
+ **
+ ** Exceptions: ArgumentNullException if object is null.
+ =========================================================================*/
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ public static extern void Enter(object obj);
+
+
+ // Use a ref bool instead of out to ensure that unverifiable code must
+ // initialize this value to something. If we used out, the value
+ // could be uninitialized if we threw an exception in our prolog.
+ // The JIT should inline this method to allow check of lockTaken argument to be optimized out
+ // in the typical case. Note that the method has to be transparent for inlining to be allowed by the VM.
+ public static void Enter(object obj, ref bool lockTaken)
+ {
+ if (lockTaken)
+ ThrowLockTakenException();
+
+ ReliableEnter(obj, ref lockTaken);
+ Debug.Assert(lockTaken);
+ }
+
+ [DoesNotReturn]
+ private static void ThrowLockTakenException()
+ {
+ throw new ArgumentException(SR.Argument_MustBeFalse, "lockTaken");
+ }
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern void ReliableEnter(object obj, ref bool lockTaken);
+
+
+
+ /*=========================================================================
+ ** Release the monitor lock. If one or more threads are waiting to acquire the
+ ** lock, and the current thread has executed as many Exits as
+ ** Enters, one of the threads will be unblocked and allowed to proceed.
+ **
+ ** Exceptions: ArgumentNullException if object is null.
+ ** SynchronizationLockException if the current thread does not
+ ** own the lock.
+ =========================================================================*/
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ public static extern void Exit(object obj);
+
+ /*=========================================================================
+ ** Similar to Enter, but will never block. That is, if the current thread can
+ ** acquire the monitor lock without blocking, it will do so and TRUE will
+ ** be returned. Otherwise FALSE will be returned.
+ **
+ ** Exceptions: ArgumentNullException if object is null.
+ =========================================================================*/
+ public static bool TryEnter(object obj)
+ {
+ bool lockTaken = false;
+ TryEnter(obj, 0, ref lockTaken);
+ return lockTaken;
+ }
+
+ // The JIT should inline this method to allow check of lockTaken argument to be optimized out
+ // in the typical case. Note that the method has to be transparent for inlining to be allowed by the VM.
+ public static void TryEnter(object obj, ref bool lockTaken)
+ {
+ if (lockTaken)
+ ThrowLockTakenException();
+
+ ReliableEnterTimeout(obj, 0, ref lockTaken);
+ }
+
+ /*=========================================================================
+ ** Version of TryEnter that will block, but only up to a timeout period
+ ** expressed in milliseconds. If timeout == Timeout.Infinite the method
+ ** becomes equivalent to Enter.
+ **
+ ** Exceptions: ArgumentNullException if object is null.
+ ** ArgumentException if timeout < -1 (Timeout.Infinite).
+ =========================================================================*/
+ // The JIT should inline this method to allow check of lockTaken argument to be optimized out
+ // in the typical case. Note that the method has to be transparent for inlining to be allowed by the VM.
+ public static bool TryEnter(object obj, int millisecondsTimeout)
+ {
+ bool lockTaken = false;
+ TryEnter(obj, millisecondsTimeout, ref lockTaken);
+ return lockTaken;
+ }
+
+ // The JIT should inline this method to allow check of lockTaken argument to be optimized out
+ // in the typical case. Note that the method has to be transparent for inlining to be allowed by the VM.
+ public static void TryEnter(object obj, int millisecondsTimeout, ref bool lockTaken)
+ {
+ if (lockTaken)
+ ThrowLockTakenException();
+
+ ReliableEnterTimeout(obj, millisecondsTimeout, ref lockTaken);
+ }
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern void ReliableEnterTimeout(object obj, int timeout, ref bool lockTaken);
+
+ public static bool IsEntered(object obj)
+ {
+ if (obj == null)
+ throw new ArgumentNullException(nameof(obj));
+
+ return IsEnteredNative(obj);
+ }
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern bool IsEnteredNative(object obj);
+
+ /*========================================================================
+ ** Waits for notification from the object (via a Pulse/PulseAll).
+ ** timeout indicates how long to wait before the method returns.
+ ** This method acquires the monitor waithandle for the object
+ ** If this thread holds the monitor lock for the object, it releases it.
+ ** On exit from the method, it obtains the monitor lock back.
+ **
+ ** Exceptions: ArgumentNullException if object is null.
+ ========================================================================*/
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern bool ObjWait(int millisecondsTimeout, object obj);
+
+ [UnsupportedOSPlatform("browser")]
+ public static bool Wait(object obj, int millisecondsTimeout)
+ {
+ if (obj == null)
+ throw (new ArgumentNullException(nameof(obj)));
+ if (millisecondsTimeout < -1)
+ throw new ArgumentOutOfRangeException(nameof(millisecondsTimeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1);
+
+ return ObjWait(millisecondsTimeout, obj);
+ }
+
+ /*========================================================================
+ ** Sends a notification to a single waiting object.
+ * Exceptions: SynchronizationLockException if this method is not called inside
+ * a synchronized block of code.
+ ========================================================================*/
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern void ObjPulse(object obj);
+
+ public static void Pulse(object obj)
+ {
+ if (obj == null)
+ {
+ throw new ArgumentNullException(nameof(obj));
+ }
+
+ ObjPulse(obj);
+ }
+ /*========================================================================
+ ** Sends a notification to all waiting objects.
+ ========================================================================*/
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern void ObjPulseAll(object obj);
+
+ public static void PulseAll(object obj)
+ {
+ if (obj == null)
+ {
+ throw new ArgumentNullException(nameof(obj));
+ }
+
+ ObjPulseAll(obj);
+ }
+
+ ///
+ /// Gets the number of times there was contention upon trying to take a 's lock so far.
+ ///
+ public static long LockContentionCount => GetLockContentionCount();
+
+ [DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
+ private static extern long GetLockContentionCount();
+ }
+}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Monitor.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Monitor.cs
deleted file mode 100644
index 80226acdbcec..000000000000
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Monitor.cs
+++ /dev/null
@@ -1,241 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-//
-/*=============================================================================
-**
-**
-**
-** Purpose: Synchronizes access to a shared resource or region of code in a multi-threaded
-** program.
-**
-**
-=============================================================================*/
-
-using System.Runtime.CompilerServices;
-using System.Diagnostics;
-using System.Runtime.InteropServices;
-using System.Diagnostics.CodeAnalysis;
-
-namespace System.Threading
-{
- public static class Monitor
- {
- /*=========================================================================
- ** Obtain the monitor lock of obj. Will block if another thread holds the lock
- ** Will not block if the current thread holds the lock,
- ** however the caller must ensure that the same number of Exit
- ** calls are made as there were Enter calls.
- **
- ** Exceptions: ArgumentNullException if object is null.
- =========================================================================*/
- [MethodImpl(MethodImplOptions.InternalCall)]
- public static extern void Enter(object obj);
-
-
- // Use a ref bool instead of out to ensure that unverifiable code must
- // initialize this value to something. If we used out, the value
- // could be uninitialized if we threw an exception in our prolog.
- // The JIT should inline this method to allow check of lockTaken argument to be optimized out
- // in the typical case. Note that the method has to be transparent for inlining to be allowed by the VM.
- public static void Enter(object obj, ref bool lockTaken)
- {
- if (lockTaken)
- ThrowLockTakenException();
-
- ReliableEnter(obj, ref lockTaken);
- Debug.Assert(lockTaken);
- }
-
- [DoesNotReturn]
- private static void ThrowLockTakenException()
- {
- throw new ArgumentException(SR.Argument_MustBeFalse, "lockTaken");
- }
-
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void ReliableEnter(object obj, ref bool lockTaken);
-
-
-
- /*=========================================================================
- ** Release the monitor lock. If one or more threads are waiting to acquire the
- ** lock, and the current thread has executed as many Exits as
- ** Enters, one of the threads will be unblocked and allowed to proceed.
- **
- ** Exceptions: ArgumentNullException if object is null.
- ** SynchronizationLockException if the current thread does not
- ** own the lock.
- =========================================================================*/
- [MethodImpl(MethodImplOptions.InternalCall)]
- public static extern void Exit(object obj);
-
- /*=========================================================================
- ** Similar to Enter, but will never block. That is, if the current thread can
- ** acquire the monitor lock without blocking, it will do so and TRUE will
- ** be returned. Otherwise FALSE will be returned.
- **
- ** Exceptions: ArgumentNullException if object is null.
- =========================================================================*/
- public static bool TryEnter(object obj)
- {
- bool lockTaken = false;
- TryEnter(obj, 0, ref lockTaken);
- return lockTaken;
- }
-
- // The JIT should inline this method to allow check of lockTaken argument to be optimized out
- // in the typical case. Note that the method has to be transparent for inlining to be allowed by the VM.
- public static void TryEnter(object obj, ref bool lockTaken)
- {
- if (lockTaken)
- ThrowLockTakenException();
-
- ReliableEnterTimeout(obj, 0, ref lockTaken);
- }
-
- /*=========================================================================
- ** Version of TryEnter that will block, but only up to a timeout period
- ** expressed in milliseconds. If timeout == Timeout.Infinite the method
- ** becomes equivalent to Enter.
- **
- ** Exceptions: ArgumentNullException if object is null.
- ** ArgumentException if timeout < -1 (Timeout.Infinite).
- =========================================================================*/
- // The JIT should inline this method to allow check of lockTaken argument to be optimized out
- // in the typical case. Note that the method has to be transparent for inlining to be allowed by the VM.
- public static bool TryEnter(object obj, int millisecondsTimeout)
- {
- bool lockTaken = false;
- TryEnter(obj, millisecondsTimeout, ref lockTaken);
- return lockTaken;
- }
-
- private static int MillisecondsTimeoutFromTimeSpan(TimeSpan timeout)
- {
- long tm = (long)timeout.TotalMilliseconds;
- if (tm < -1 || tm > (long)int.MaxValue)
- throw new ArgumentOutOfRangeException(nameof(timeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1);
- return (int)tm;
- }
-
- public static bool TryEnter(object obj, TimeSpan timeout)
- {
- return TryEnter(obj, MillisecondsTimeoutFromTimeSpan(timeout));
- }
-
- // The JIT should inline this method to allow check of lockTaken argument to be optimized out
- // in the typical case. Note that the method has to be transparent for inlining to be allowed by the VM.
- public static void TryEnter(object obj, int millisecondsTimeout, ref bool lockTaken)
- {
- if (lockTaken)
- ThrowLockTakenException();
-
- ReliableEnterTimeout(obj, millisecondsTimeout, ref lockTaken);
- }
-
- public static void TryEnter(object obj, TimeSpan timeout, ref bool lockTaken)
- {
- if (lockTaken)
- ThrowLockTakenException();
-
- ReliableEnterTimeout(obj, MillisecondsTimeoutFromTimeSpan(timeout), ref lockTaken);
- }
-
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void ReliableEnterTimeout(object obj, int timeout, ref bool lockTaken);
-
- public static bool IsEntered(object obj)
- {
- if (obj == null)
- throw new ArgumentNullException(nameof(obj));
-
- return IsEnteredNative(obj);
- }
-
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern bool IsEnteredNative(object obj);
-
- /*========================================================================
- ** Waits for notification from the object (via a Pulse/PulseAll).
- ** timeout indicates how long to wait before the method returns.
- ** This method acquires the monitor waithandle for the object
- ** If this thread holds the monitor lock for the object, it releases it.
- ** On exit from the method, it obtains the monitor lock back.
- ** If exitContext is true then the synchronization domain for the context
- ** (if in a synchronized context) is exited before the wait and reacquired
- **
- ** Exceptions: ArgumentNullException if object is null.
- ========================================================================*/
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern bool ObjWait(bool exitContext, int millisecondsTimeout, object obj);
-
- public static bool Wait(object obj, int millisecondsTimeout, bool exitContext)
- {
- if (obj == null)
- throw (new ArgumentNullException(nameof(obj)));
- return ObjWait(exitContext, millisecondsTimeout, obj);
- }
-
- public static bool Wait(object obj, TimeSpan timeout, bool exitContext)
- {
- return Wait(obj, MillisecondsTimeoutFromTimeSpan(timeout), exitContext);
- }
-
- public static bool Wait(object obj, int millisecondsTimeout)
- {
- return Wait(obj, millisecondsTimeout, false);
- }
-
- public static bool Wait(object obj, TimeSpan timeout)
- {
- return Wait(obj, MillisecondsTimeoutFromTimeSpan(timeout), false);
- }
-
- public static bool Wait(object obj)
- {
- return Wait(obj, Timeout.Infinite, false);
- }
-
- /*========================================================================
- ** Sends a notification to a single waiting object.
- * Exceptions: SynchronizationLockException if this method is not called inside
- * a synchronized block of code.
- ========================================================================*/
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void ObjPulse(object obj);
-
- public static void Pulse(object obj)
- {
- if (obj == null)
- {
- throw new ArgumentNullException(nameof(obj));
- }
-
- ObjPulse(obj);
- }
- /*========================================================================
- ** Sends a notification to all waiting objects.
- ========================================================================*/
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void ObjPulseAll(object obj);
-
- public static void PulseAll(object obj)
- {
- if (obj == null)
- {
- throw new ArgumentNullException(nameof(obj));
- }
-
- ObjPulseAll(obj);
- }
-
- ///
- /// Gets the number of times there was contention upon trying to take a 's lock so far.
- ///
- public static long LockContentionCount => GetLockContentionCount();
-
- [DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
- private static extern long GetLockContentionCount();
- }
-}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs
index 9edaf81e8a87..cc894d286a92 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/Thread.CoreCLR.cs
@@ -6,6 +6,7 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
+using System.Runtime.Versioning;
namespace System.Threading
{
@@ -143,6 +144,11 @@ public sealed partial class Thread
private int _managedThreadId; // INT32
#pragma warning restore CA1823, 169
+ // This is used for a quick check on thread pool threads after running a work item to determine if the name, background
+ // state, or priority were changed by the work item, and if so to reset it. Other threads may also change some of those,
+ // but those types of changes may race with the reset anyway, so this field doesn't need to be synchronized.
+ private bool _mayNeedResetForThreadPool;
+
private Thread() { }
private void Create(ThreadStart start) =>
@@ -182,6 +188,7 @@ internal ThreadHandle GetNativeHandle()
/// method on the IThreadable interface passed in the constructor. Once the
/// thread is dead, it cannot be restarted with another call to Start.
///
+ [UnsupportedOSPlatform("browser")]
public void Start(object? parameter)
{
// In the case of a null delegate (second call to start on same thread)
@@ -196,6 +203,7 @@ public void Start(object? parameter)
Start();
}
+ [UnsupportedOSPlatform("browser")]
public void Start()
{
#if FEATURE_COMINTEROP_APARTMENT_SUPPORT
@@ -256,6 +264,9 @@ private void SetCultureOnUnstartedThreadNoCheck(CultureInfo value, bool uiCultur
public static void Sleep(int millisecondsTimeout) => SleepInternal(millisecondsTimeout);
+ [DllImport(RuntimeHelpers.QCall)]
+ internal static extern void UninterruptibleSleep0();
+
///
/// Wait for a length of time proportional to 'iterations'. Each iteration is should
/// only take a few machine instructions. Calling this API is preferable to coding
@@ -334,7 +345,14 @@ public extern bool IsAlive
public bool IsBackground
{
get => IsBackgroundNative();
- set => SetBackgroundNative(value);
+ set
+ {
+ SetBackgroundNative(value);
+ if (!value)
+ {
+ _mayNeedResetForThreadPool = true;
+ }
+ }
}
[MethodImpl(MethodImplOptions.InternalCall)]
@@ -348,13 +366,22 @@ public extern bool IsThreadPoolThread
{
[MethodImpl(MethodImplOptions.InternalCall)]
get;
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ internal set;
}
/// Returns the priority of the thread.
public ThreadPriority Priority
{
get => (ThreadPriority)GetPriorityNative();
- set => SetPriorityNative((int)value);
+ set
+ {
+ SetPriorityNative((int)value);
+ if (value != ThreadPriority.Normal)
+ {
+ _mayNeedResetForThreadPool = true;
+ }
+ }
}
[MethodImpl(MethodImplOptions.InternalCall)]
@@ -417,7 +444,7 @@ private bool TrySetApartmentStateUnchecked(ApartmentState state)
[MethodImpl(MethodImplOptions.InternalCall)]
internal extern int SetApartmentStateNative(int state);
#else // FEATURE_COMINTEROP_APARTMENT_SUPPORT
- private bool TrySetApartmentStateUnchecked(ApartmentState state)
+ private static bool TrySetApartmentStateUnchecked(ApartmentState state)
{
return state == ApartmentState.Unknown;
}
@@ -500,10 +527,23 @@ public static int GetCurrentProcessorId()
// we will record that in a readonly static so that it could become a JIT constant and bypass caching entirely.
private static readonly bool s_isProcessorNumberReallyFast = ProcessorIdCache.ProcessorNumberSpeedCheck();
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
internal void ResetThreadPoolThread()
{
- // Currently implemented in unmanaged method Thread::InternalReset and
- // called internally from the ThreadPool in NotifyWorkItemComplete.
+ Debug.Assert(this == CurrentThread);
+ Debug.Assert(IsThreadPoolThread);
+
+ if (!ThreadPool.UsePortableThreadPool)
+ {
+ // Currently implemented in unmanaged method Thread::InternalReset and
+ // called internally from the ThreadPool in NotifyWorkItemComplete.
+ return;
+ }
+
+ if (_mayNeedResetForThreadPool)
+ {
+ ResetThreadPoolThreadSlow();
+ }
}
} // End of class Thread
}
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ThreadPool.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ThreadPool.CoreCLR.cs
index 59fecc735dd7..95b283e707c6 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ThreadPool.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Threading/ThreadPool.CoreCLR.cs
@@ -14,6 +14,7 @@
using System.Runtime.CompilerServices;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
+using System.Runtime.Versioning;
namespace System.Threading
{
@@ -28,128 +29,102 @@ internal static class _ThreadPoolWaitCallback
internal static bool PerformWaitCallback() => ThreadPoolWorkQueue.Dispatch();
}
- internal sealed class RegisteredWaitHandleSafe : CriticalFinalizerObject
+ public sealed partial class RegisteredWaitHandle : MarshalByRefObject
{
- private static IntPtr InvalidHandle => new IntPtr(-1);
- private IntPtr registeredWaitHandle = InvalidHandle;
- private WaitHandle? m_internalWaitObject;
- private bool bReleaseNeeded;
- private volatile int m_lock;
+ private IntPtr _nativeRegisteredWaitHandle = InvalidHandleValue;
+ private bool _releaseHandle;
- internal IntPtr GetHandle() => registeredWaitHandle;
+ private static bool IsValidHandle(IntPtr handle) => handle != InvalidHandleValue && handle != IntPtr.Zero;
- internal void SetHandle(IntPtr handle)
+ internal void SetNativeRegisteredWaitHandle(IntPtr nativeRegisteredWaitHandle)
{
- registeredWaitHandle = handle;
+ Debug.Assert(!ThreadPool.UsePortableThreadPool);
+ Debug.Assert(IsValidHandle(nativeRegisteredWaitHandle));
+ Debug.Assert(!IsValidHandle(_nativeRegisteredWaitHandle));
+
+ _nativeRegisteredWaitHandle = nativeRegisteredWaitHandle;
}
- internal void SetWaitObject(WaitHandle waitObject)
+ internal void OnBeforeRegister()
{
- m_internalWaitObject = waitObject;
- if (waitObject != null)
+ if (ThreadPool.UsePortableThreadPool)
{
- m_internalWaitObject.SafeWaitHandle.DangerousAddRef(ref bReleaseNeeded);
+ GC.SuppressFinalize(this);
+ return;
}
+
+ Handle.DangerousAddRef(ref _releaseHandle);
}
- internal bool Unregister(
- WaitHandle? waitObject // object to be notified when all callbacks to delegates have completed
- )
+ ///
+ /// Unregisters this wait handle registration from the wait threads.
+ ///
+ /// The event to signal when the handle is unregistered.
+ /// If the handle was successfully marked to be removed and the provided wait handle was set as the user provided event.
+ ///
+ /// This method will only return true on the first call.
+ /// Passing in a wait handle with a value of -1 will result in a blocking wait, where Unregister will not return until the full unregistration is completed.
+ ///
+ public bool Unregister(WaitHandle waitObject)
{
- bool result = false;
+ if (ThreadPool.UsePortableThreadPool)
+ {
+ return UnregisterPortable(waitObject);
+ }
- // lock(this) cannot be used reliably in Cer since thin lock could be
- // promoted to syncblock and that is not a guaranteed operation
- bool bLockTaken = false;
- do
+ s_callbackLock.Acquire();
+ try
{
- if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0)
+ if (!IsValidHandle(_nativeRegisteredWaitHandle) ||
+ !UnregisterWaitNative(_nativeRegisteredWaitHandle, waitObject?.SafeWaitHandle))
{
- bLockTaken = true;
- try
- {
- if (ValidHandle())
- {
- result = UnregisterWaitNative(GetHandle(), waitObject?.SafeWaitHandle);
- if (result)
- {
- if (bReleaseNeeded)
- {
- Debug.Assert(m_internalWaitObject != null, "Must be non-null for bReleaseNeeded to be true");
- m_internalWaitObject.SafeWaitHandle.DangerousRelease();
- bReleaseNeeded = false;
- }
- // if result not true don't release/suppress here so finalizer can make another attempt
- SetHandle(InvalidHandle);
- m_internalWaitObject = null;
- GC.SuppressFinalize(this);
- }
- }
- }
- finally
- {
- m_lock = 0;
- }
+ return false;
+ }
+ _nativeRegisteredWaitHandle = InvalidHandleValue;
+
+ if (_releaseHandle)
+ {
+ Handle.DangerousRelease();
+ _releaseHandle = false;
}
- Thread.SpinWait(1); // yield to processor
}
- while (!bLockTaken);
+ finally
+ {
+ s_callbackLock.Release();
+ }
- return result;
+ GC.SuppressFinalize(this);
+ return true;
}
- private bool ValidHandle() =>
- registeredWaitHandle != InvalidHandle && registeredWaitHandle != IntPtr.Zero;
-
- ~RegisteredWaitHandleSafe()
+ ~RegisteredWaitHandle()
{
- // if the app has already unregistered the wait, there is nothing to cleanup
- // we can detect this by checking the handle. Normally, there is no race condition here
- // so no need to protect reading of handle. However, if this object gets
- // resurrected and then someone does an unregister, it would introduce a race condition
- //
- // PrepareConstrainedRegions call not needed since finalizer already in Cer
- //
- // lock(this) cannot be used reliably even in Cer since thin lock could be
- // promoted to syncblock and that is not a guaranteed operation
- //
- // Note that we will not "spin" to get this lock. We make only a single attempt;
- // if we can't get the lock, it means some other thread is in the middle of a call
- // to Unregister, which will do the work of the finalizer anyway.
- //
- // Further, it's actually critical that we *not* wait for the lock here, because
- // the other thread that's in the middle of Unregister may be suspended for shutdown.
- // Then, during the live-object finalization phase of shutdown, this thread would
- // end up spinning forever, as the other thread would never release the lock.
- // This will result in a "leak" of sorts (since the handle will not be cleaned up)
- // but the process is exiting anyway.
- //
- // During AD-unload, we don't finalize live objects until all threads have been
- // aborted out of the AD. Since these locked regions are CERs, we won't abort them
- // while the lock is held. So there should be no leak on AD-unload.
- //
- if (Interlocked.CompareExchange(ref m_lock, 1, 0) == 0)
+ if (ThreadPool.UsePortableThreadPool)
{
- try
+ return;
+ }
+
+ s_callbackLock.Acquire();
+ try
+ {
+ if (!IsValidHandle(_nativeRegisteredWaitHandle))
{
- if (ValidHandle())
- {
- WaitHandleCleanupNative(registeredWaitHandle);
- if (bReleaseNeeded)
- {
- Debug.Assert(m_internalWaitObject != null, "Must be non-null for bReleaseNeeded to be true");
- m_internalWaitObject.SafeWaitHandle.DangerousRelease();
- bReleaseNeeded = false;
- }
- SetHandle(InvalidHandle);
- m_internalWaitObject = null;
- }
+ return;
}
- finally
+
+ WaitHandleCleanupNative(_nativeRegisteredWaitHandle);
+ _nativeRegisteredWaitHandle = InvalidHandleValue;
+
+ if (_releaseHandle)
{
- m_lock = 0;
+ Handle.DangerousRelease();
+ _releaseHandle = false;
}
}
+ finally
+ {
+ s_callbackLock.Release();
+ }
}
[MethodImpl(MethodImplOptions.InternalCall)]
@@ -159,50 +134,137 @@ private bool ValidHandle() =>
private static extern bool UnregisterWaitNative(IntPtr handle, SafeHandle? waitObject);
}
- public sealed class RegisteredWaitHandle : MarshalByRefObject
+ internal sealed partial class CompleteWaitThreadPoolWorkItem : IThreadPoolWorkItem
{
- private readonly RegisteredWaitHandleSafe internalRegisteredWait;
+ void IThreadPoolWorkItem.Execute() => CompleteWait();
- internal RegisteredWaitHandle()
+ // Entry point from unmanaged code
+ private void CompleteWait()
{
- internalRegisteredWait = new RegisteredWaitHandleSafe();
+ Debug.Assert(ThreadPool.UsePortableThreadPool);
+ PortableThreadPool.CompleteWait(_registeredWaitHandle, _timedOut);
}
+ }
- internal void SetHandle(IntPtr handle)
- {
- internalRegisteredWait.SetHandle(handle);
- }
+ internal sealed class UnmanagedThreadPoolWorkItem : IThreadPoolWorkItem
+ {
+ private readonly IntPtr _callback;
+ private readonly IntPtr _state;
- internal void SetWaitObject(WaitHandle waitObject)
+ public UnmanagedThreadPoolWorkItem(IntPtr callback, IntPtr state)
{
- internalRegisteredWait.SetWaitObject(waitObject);
+ _callback = callback;
+ _state = state;
}
- public bool Unregister(
- WaitHandle? waitObject // object to be notified when all callbacks to delegates have completed
- )
- {
- return internalRegisteredWait.Unregister(waitObject);
- }
+ void IThreadPoolWorkItem.Execute() => ExecuteUnmanagedThreadPoolWorkItem(_callback, _state);
+
+ [DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
+ private static extern void ExecuteUnmanagedThreadPoolWorkItem(IntPtr callback, IntPtr state);
}
public static partial class ThreadPool
{
- // Time in ms for which ThreadPoolWorkQueue.Dispatch keeps executing work items before returning to the OS
- private const uint DispatchQuantum = 30;
-
+ // SOS's ThreadPool command depends on this name
+ internal static readonly bool UsePortableThreadPool = InitializeConfigAndDetermineUsePortableThreadPool();
+
+ // Time-senstiive work items are those that may need to run ahead of normal work items at least periodically. For a
+ // runtime that does not support time-sensitive work items on the managed side, the thread pool yields the thread to the
+ // runtime periodically (by exiting the dispatch loop) so that the runtime may use that thread for processing
+ // any time-sensitive work. For a runtime that supports time-sensitive work items on the managed side, the thread pool
+ // does not yield the thread and instead processes time-sensitive work items queued by specific APIs periodically.
+ internal static bool SupportsTimeSensitiveWorkItems => UsePortableThreadPool;
+
+ // This needs to be initialized after UsePortableThreadPool above, as it may depend on UsePortableThreadPool and the
+ // config initialization
internal static readonly bool EnableWorkerTracking = GetEnableWorkerTracking();
- internal static bool KeepDispatching(int startTickCount)
+ private static unsafe bool InitializeConfigAndDetermineUsePortableThreadPool()
+ {
+ bool usePortableThreadPool = false;
+ int configVariableIndex = 0;
+ while (true)
+ {
+ int nextConfigVariableIndex =
+ GetNextConfigUInt32Value(
+ configVariableIndex,
+ out uint configValue,
+ out bool isBoolean,
+ out char* appContextConfigNameUnsafe);
+ if (nextConfigVariableIndex < 0)
+ {
+ break;
+ }
+
+ Debug.Assert(nextConfigVariableIndex > configVariableIndex);
+ configVariableIndex = nextConfigVariableIndex;
+
+ if (appContextConfigNameUnsafe == null)
+ {
+ // Special case for UsePortableThreadPool, which doesn't go into the AppContext
+ Debug.Assert(configValue != 0);
+ Debug.Assert(isBoolean);
+ usePortableThreadPool = true;
+ continue;
+ }
+
+ var appContextConfigName = new string(appContextConfigNameUnsafe);
+ if (isBoolean)
+ {
+ AppContext.SetSwitch(appContextConfigName, configValue != 0);
+ }
+ else
+ {
+ AppContext.SetData(appContextConfigName, configValue);
+ }
+ }
+
+ return usePortableThreadPool;
+ }
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern unsafe int GetNextConfigUInt32Value(
+ int configVariableIndex,
+ out uint configValue,
+ out bool isBoolean,
+ out char* appContextConfigName);
+
+ private static bool GetEnableWorkerTracking() =>
+ UsePortableThreadPool
+ ? AppContextConfigHelper.GetBooleanConfig("System.Threading.ThreadPool.EnableWorkerTracking", false)
+ : GetEnableWorkerTrackingNative();
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ internal static extern bool CanSetMinIOCompletionThreads(int ioCompletionThreads);
+
+ internal static void SetMinIOCompletionThreads(int ioCompletionThreads)
{
- // Note: this function may incorrectly return false due to TickCount overflow
- // if work item execution took around a multiple of 2^32 milliseconds (~49.7 days),
- // which is improbable.
- return (uint)(Environment.TickCount - startTickCount) < DispatchQuantum;
+ Debug.Assert(UsePortableThreadPool);
+ Debug.Assert(ioCompletionThreads >= 0);
+
+ bool success = SetMinThreadsNative(1, ioCompletionThreads); // worker thread count is ignored
+ Debug.Assert(success);
+ }
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ internal static extern bool CanSetMaxIOCompletionThreads(int ioCompletionThreads);
+
+ internal static void SetMaxIOCompletionThreads(int ioCompletionThreads)
+ {
+ Debug.Assert(UsePortableThreadPool);
+ Debug.Assert(ioCompletionThreads > 0);
+
+ bool success = SetMaxThreadsNative(1, ioCompletionThreads); // worker thread count is ignored
+ Debug.Assert(success);
}
public static bool SetMaxThreads(int workerThreads, int completionPortThreads)
{
+ if (UsePortableThreadPool)
+ {
+ return PortableThreadPool.ThreadPoolInstance.SetMaxThreads(workerThreads, completionPortThreads);
+ }
+
return
workerThreads >= 0 &&
completionPortThreads >= 0 &&
@@ -212,10 +274,20 @@ public static bool SetMaxThreads(int workerThreads, int completionPortThreads)
public static void GetMaxThreads(out int workerThreads, out int completionPortThreads)
{
GetMaxThreadsNative(out workerThreads, out completionPortThreads);
+
+ if (UsePortableThreadPool)
+ {
+ workerThreads = PortableThreadPool.ThreadPoolInstance.GetMaxThreads();
+ }
}
public static bool SetMinThreads(int workerThreads, int completionPortThreads)
{
+ if (UsePortableThreadPool)
+ {
+ return PortableThreadPool.ThreadPoolInstance.SetMinThreads(workerThreads, completionPortThreads);
+ }
+
return
workerThreads >= 0 &&
completionPortThreads >= 0 &&
@@ -225,11 +297,21 @@ public static bool SetMinThreads(int workerThreads, int completionPortThreads)
public static void GetMinThreads(out int workerThreads, out int completionPortThreads)
{
GetMinThreadsNative(out workerThreads, out completionPortThreads);
+
+ if (UsePortableThreadPool)
+ {
+ workerThreads = PortableThreadPool.ThreadPoolInstance.GetMinThreads();
+ }
}
public static void GetAvailableThreads(out int workerThreads, out int completionPortThreads)
{
GetAvailableThreadsNative(out workerThreads, out completionPortThreads);
+
+ if (UsePortableThreadPool)
+ {
+ workerThreads = PortableThreadPool.ThreadPoolInstance.GetAvailableThreads();
+ }
}
///
@@ -238,11 +320,11 @@ public static void GetAvailableThreads(out int workerThreads, out int completion
///
/// For a thread pool implementation that may have different types of threads, the count includes all types.
///
- public static extern int ThreadCount
- {
- [MethodImpl(MethodImplOptions.InternalCall)]
- get;
- }
+ public static int ThreadCount =>
+ (UsePortableThreadPool ? PortableThreadPool.ThreadPoolInstance.ThreadCount : 0) + GetThreadCount();
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern int GetThreadCount();
///
/// Gets the number of work items that have been processed so far.
@@ -250,51 +332,119 @@ public static extern int ThreadCount
///
/// For a thread pool implementation that may have different types of work items, the count includes all types.
///
- public static long CompletedWorkItemCount => GetCompletedWorkItemCount();
+ public static long CompletedWorkItemCount
+ {
+ get
+ {
+ long count = GetCompletedWorkItemCount();
+ if (UsePortableThreadPool)
+ {
+ count += PortableThreadPool.ThreadPoolInstance.CompletedWorkItemCount;
+ }
+ return count;
+ }
+ }
[DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
private static extern long GetCompletedWorkItemCount();
- private static extern long PendingUnmanagedWorkItemCount
- {
- [MethodImpl(MethodImplOptions.InternalCall)]
- get;
- }
+ private static long PendingUnmanagedWorkItemCount => UsePortableThreadPool ? 0 : GetPendingUnmanagedWorkItemCount();
+
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern long GetPendingUnmanagedWorkItemCount();
private static RegisteredWaitHandle RegisterWaitForSingleObject(
- WaitHandle waitObject,
- WaitOrTimerCallback callBack,
+ WaitHandle? waitObject,
+ WaitOrTimerCallback? callBack,
object? state,
uint millisecondsTimeOutInterval,
- bool executeOnlyOnce, // NOTE: we do not allow other options that allow the callback to be queued as an APC
- bool compressStack
- )
+ bool executeOnlyOnce,
+ bool flowExecutionContext)
{
- RegisteredWaitHandle registeredWaitHandle = new RegisteredWaitHandle();
- if (callBack != null)
+ if (waitObject == null)
+ throw new ArgumentNullException(nameof(waitObject));
+
+ if (callBack == null)
+ throw new ArgumentNullException(nameof(callBack));
+
+ RegisteredWaitHandle registeredWaitHandle = new RegisteredWaitHandle(
+ waitObject,
+ new _ThreadPoolWaitOrTimerCallback(callBack, state, flowExecutionContext),
+ (int)millisecondsTimeOutInterval,
+ !executeOnlyOnce);
+
+ registeredWaitHandle.OnBeforeRegister();
+
+ if (UsePortableThreadPool)
{
- _ThreadPoolWaitOrTimerCallback callBackHelper = new _ThreadPoolWaitOrTimerCallback(callBack, state, compressStack);
- state = (object)callBackHelper;
- // call SetWaitObject before native call so that waitObject won't be closed before threadpoolmgr registration
- // this could occur if callback were to fire before SetWaitObject does its addref
- registeredWaitHandle.SetWaitObject(waitObject);
- IntPtr nativeRegisteredWaitHandle = RegisterWaitForSingleObjectNative(waitObject,
- state,
- millisecondsTimeOutInterval,
- executeOnlyOnce,
- registeredWaitHandle);
- registeredWaitHandle.SetHandle(nativeRegisteredWaitHandle);
+ PortableThreadPool.ThreadPoolInstance.RegisterWaitHandle(registeredWaitHandle);
}
else
{
- throw new ArgumentNullException(nameof(WaitOrTimerCallback));
+ IntPtr nativeRegisteredWaitHandle =
+ RegisterWaitForSingleObjectNative(
+ waitObject,
+ registeredWaitHandle.Callback,
+ (uint)registeredWaitHandle.TimeoutDurationMs,
+ !registeredWaitHandle.Repeating,
+ registeredWaitHandle);
+ registeredWaitHandle.SetNativeRegisteredWaitHandle(nativeRegisteredWaitHandle);
}
+
return registeredWaitHandle;
}
+ internal static void UnsafeQueueWaitCompletion(CompleteWaitThreadPoolWorkItem completeWaitWorkItem)
+ {
+ Debug.Assert(UsePortableThreadPool);
+
+#if TARGET_WINDOWS // the IO completion thread pool is currently only available on Windows
+ QueueWaitCompletionNative(completeWaitWorkItem);
+#else
+ UnsafeQueueUserWorkItemInternal(completeWaitWorkItem, preferLocal: false);
+#endif
+ }
+
+#if TARGET_WINDOWS // the IO completion thread pool is currently only available on Windows
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern void QueueWaitCompletionNative(CompleteWaitThreadPoolWorkItem completeWaitWorkItem);
+#endif
+
+ internal static void RequestWorkerThread()
+ {
+ if (UsePortableThreadPool)
+ {
+ PortableThreadPool.ThreadPoolInstance.RequestWorker();
+ return;
+ }
+
+ RequestWorkerThreadNative();
+ }
+
[DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
- internal static extern Interop.BOOL RequestWorkerThread();
+ private static extern Interop.BOOL RequestWorkerThreadNative();
+
+ // Entry point from unmanaged code
+ private static void EnsureGateThreadRunning()
+ {
+ Debug.Assert(UsePortableThreadPool);
+ PortableThreadPool.EnsureGateThreadRunning();
+ }
+
+ ///
+ /// Called from the gate thread periodically to perform runtime-specific gate activities
+ ///
+ /// CPU utilization as a percentage since the last call
+ /// True if the runtime still needs to perform gate activities, false otherwise
+ internal static bool PerformRuntimeSpecificGateActivities(int cpuUtilization)
+ {
+ Debug.Assert(UsePortableThreadPool);
+ return PerformRuntimeSpecificGateActivitiesNative(cpuUtilization) != Interop.BOOL.FALSE;
+ }
+
+ [DllImport(RuntimeHelpers.QCall, CharSet = CharSet.Unicode)]
+ private static extern Interop.BOOL PerformRuntimeSpecificGateActivitiesNative(int cpuUtilization);
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern unsafe bool PostQueuedCompletionStatus(NativeOverlapped* overlapped);
@@ -303,6 +453,13 @@ bool compressStack
public static unsafe bool UnsafeQueueNativeOverlapped(NativeOverlapped* overlapped) =>
PostQueuedCompletionStatus(overlapped);
+ // Entry point from unmanaged code
+ private static void UnsafeQueueUnmanagedWorkItem(IntPtr callback, IntPtr state)
+ {
+ Debug.Assert(SupportsTimeSensitiveWorkItems);
+ UnsafeQueueTimeSensitiveWorkItemInternal(new UnmanagedThreadPoolWorkItem(callback, state));
+ }
+
// Native methods:
[MethodImpl(MethodImplOptions.InternalCall)]
@@ -320,22 +477,56 @@ public static unsafe bool UnsafeQueueNativeOverlapped(NativeOverlapped* overlapp
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern void GetAvailableThreadsNative(out int workerThreads, out int completionPortThreads);
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ internal static bool NotifyWorkItemComplete(object? threadLocalCompletionCountObject, int currentTimeMs)
+ {
+ if (UsePortableThreadPool)
+ {
+ return
+ PortableThreadPool.ThreadPoolInstance.NotifyWorkItemComplete(
+ threadLocalCompletionCountObject,
+ currentTimeMs);
+ }
+
+ return NotifyWorkItemCompleteNative();
+ }
+
[MethodImpl(MethodImplOptions.InternalCall)]
- internal static extern bool NotifyWorkItemComplete();
+ private static extern bool NotifyWorkItemCompleteNative();
+
+ internal static void ReportThreadStatus(bool isWorking)
+ {
+ if (UsePortableThreadPool)
+ {
+ PortableThreadPool.ThreadPoolInstance.ReportThreadStatus(isWorking);
+ return;
+ }
+
+ ReportThreadStatusNative(isWorking);
+ }
[MethodImpl(MethodImplOptions.InternalCall)]
- internal static extern void ReportThreadStatus(bool isWorking);
+ private static extern void ReportThreadStatusNative(bool isWorking);
internal static void NotifyWorkItemProgress()
{
+ if (UsePortableThreadPool)
+ {
+ PortableThreadPool.ThreadPoolInstance.NotifyWorkItemProgress();
+ return;
+ }
+
NotifyWorkItemProgressNative();
}
[MethodImpl(MethodImplOptions.InternalCall)]
- internal static extern void NotifyWorkItemProgressNative();
+ private static extern void NotifyWorkItemProgressNative();
+
+ internal static object? GetOrCreateThreadLocalCompletionCountObject() =>
+ UsePortableThreadPool ? PortableThreadPool.ThreadPoolInstance.GetOrCreateThreadLocalCompletionCountObject() : null;
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern bool GetEnableWorkerTracking();
+ private static extern bool GetEnableWorkerTrackingNative();
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern IntPtr RegisterWaitForSingleObjectNative(
@@ -352,6 +543,7 @@ public static bool BindHandle(IntPtr osHandle)
return BindIOCompletionCallbackNative(osHandle);
}
+ [SupportedOSPlatform("windows")]
public static bool BindHandle(SafeHandle osHandle)
{
if (osHandle == null)
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Type.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Type.CoreCLR.cs
index c81b37a4db72..7a39e6e5e8bd 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Type.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Type.CoreCLR.cs
@@ -4,6 +4,7 @@
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Runtime.CompilerServices;
+using System.Runtime.Versioning;
using StackCrawlMark = System.Threading.StackCrawlMark;
namespace System
@@ -80,32 +81,6 @@ public bool IsInterface
return TypeNameParser.GetType(typeName, assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark);
}
- ////////////////////////////////////////////////////////////////////////////////
- // This will return a class based upon the progID. This is provided for
- // COM classic support. Program ID's are not used in COM+ because they
- // have been superceded by namespace. (This routine is called this instead
- // of getClass() because of the name conflict with the first method above.)
- //
- // param progID: the progID of the class to retrieve
- // returns: the class object associated to the progID
- ////
- public static Type? GetTypeFromProgID(string progID, string? server, bool throwOnError)
- {
- return RuntimeType.GetTypeFromProgIDImpl(progID, server, throwOnError);
- }
-
- ////////////////////////////////////////////////////////////////////////////////
- // This will return a class based upon the CLSID. This is provided for
- // COM classic support.
- //
- // param CLSID: the CLSID of the class to retrieve
- // returns: the class object associated to the CLSID
- ////
- public static Type? GetTypeFromCLSID(Guid clsid, string? server, bool throwOnError)
- {
- return RuntimeType.GetTypeFromCLSIDImpl(clsid, server, throwOnError);
- }
-
internal virtual RuntimeTypeHandle GetTypeHandleInternal()
{
return TypeHandle;
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Utf8String.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Utf8String.CoreCLR.cs
index ce669f84ec9d..015f89ee16a0 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Utf8String.CoreCLR.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Utf8String.CoreCLR.cs
@@ -63,6 +63,8 @@ public sealed partial class Utf8String
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Utf8String(ReadOnlySpan value);
+#pragma warning disable CA1822 // Mark members as static
+
#if !CORECLR
static
#endif
@@ -262,6 +264,8 @@ private Utf8String Ctor(string value)
return Ctor(value.AsSpan());
}
+#pragma warning restore CA1822
+
/*
* METHODS
*/
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/ValueType.cs b/src/coreclr/src/System.Private.CoreLib/src/System/ValueType.cs
index 646a4792e9ab..72ffecfe902d 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/ValueType.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/ValueType.cs
@@ -20,7 +20,7 @@ namespace System
[System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
public abstract class ValueType
{
- [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2006:UnrecognizedReflectionPattern",
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern",
Justification = "Trimmed fields don't make a difference for equality")]
public override bool Equals(object? obj)
{
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/Variant.cs b/src/coreclr/src/System.Private.CoreLib/src/System/Variant.cs
index 8ab1589db965..0ac655757935 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/Variant.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/Variant.cs
@@ -279,6 +279,7 @@ public Variant(object? obj)
else if (obj is DispatchWrapper)
{
vt = VarEnum.VT_DISPATCH;
+ Debug.Assert(OperatingSystem.IsWindows());
obj = ((DispatchWrapper)obj).WrappedObject;
}
else if (obj is ErrorWrapper)
@@ -401,6 +402,7 @@ internal static void MarshalHelperCastVariant(object pValue, int vt, ref Variant
switch (vt)
{
case 9: /*VT_DISPATCH*/
+ Debug.Assert(OperatingSystem.IsWindows());
v = new Variant(new DispatchWrapper(pValue));
break;
@@ -442,7 +444,9 @@ internal static void MarshalHelperCastVariant(object pValue, int vt, ref Variant
6 => /*VT_CY*/ new Variant(new CurrencyWrapper(iv.ToDecimal(provider))),
7 => /*VT_DATE*/ new Variant(iv.ToDateTime(provider)),
8 => /*VT_BSTR*/ new Variant(iv.ToString(provider)),
+#pragma warning disable CA1416 // Validate platform compatibility
9 => /*VT_DISPATCH*/ new Variant(new DispatchWrapper((object)iv)),
+#pragma warning restore CA1416
10 => /*VT_ERROR*/ new Variant(new ErrorWrapper(iv.ToInt32(provider))),
11 => /*VT_BOOL*/ new Variant(iv.ToBoolean(provider)),
12 => /*VT_VARIANT*/ new Variant((object)iv),
diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/__ComObject.cs b/src/coreclr/src/System.Private.CoreLib/src/System/__ComObject.cs
index 9015a016a7e9..be3294ffdf6e 100644
--- a/src/coreclr/src/System.Private.CoreLib/src/System/__ComObject.cs
+++ b/src/coreclr/src/System.Private.CoreLib/src/System/__ComObject.cs
@@ -4,6 +4,7 @@
using System.Collections;
using System.Runtime.InteropServices;
using System.Reflection;
+using System.Runtime.Versioning;
namespace System
{
@@ -11,6 +12,7 @@ namespace System
/// __ComObject is the root class for all COM wrappers. This class defines only
/// the basics. This class is used for wrapping COM objects accessed from managed.
///
+ [SupportedOSPlatform("windows")]
internal class __ComObject : MarshalByRefObject
{
private Hashtable? m_ObjectToDataMap; // Do not rename (runtime relies on this name).
diff --git a/src/coreclr/src/ToolBox/SOS/CMakeLists.txt b/src/coreclr/src/ToolBox/SOS/CMakeLists.txt
index e8de02243283..1474c5466f0a 100644
--- a/src/coreclr/src/ToolBox/SOS/CMakeLists.txt
+++ b/src/coreclr/src/ToolBox/SOS/CMakeLists.txt
@@ -1,7 +1 @@
-if(CLR_CMAKE_TARGET_WIN32)
- if (CMAKE_GENERATOR MATCHES "Visual Studio .*")
- add_subdirectory(DacTableGen)
- endif()
-endif(CLR_CMAKE_TARGET_WIN32)
-
_install(FILES SOS_README.md DESTINATION .)
diff --git a/src/coreclr/src/ToolBox/SOS/DIALib/DIALib.il b/src/coreclr/src/ToolBox/SOS/DIALib/DIALib.il
new file mode 100644
index 000000000000..9fb4f1716957
--- /dev/null
+++ b/src/coreclr/src/ToolBox/SOS/DIALib/DIALib.il
@@ -0,0 +1,17245 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+// Metadata version: v4.0.30319
+.assembly extern mscorlib
+{
+ .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
+ .ver 4:0:0:0
+}
+.assembly DIALib
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.TypeLibVersionAttribute::.ctor(int32,
+ int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 31 30 36 31 37 33 41 30 2D 30 31 37 33 // ..$106173A0-0173
+ 2D 34 45 35 43 2D 38 34 45 37 2D 45 39 31 35 34 // -4E5C-84E7-E9154
+ 32 32 42 45 39 39 37 00 00 ) // 22BE997..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.ImportedFromTypeLibAttribute::.ctor(string) = ( 01 00 07 44 69 61 32 4C 69 62 00 00 ) // ...Dia2Lib..
+ .hash algorithm 0x00008004
+ .ver 2:0:0:0
+}
+.module DIALib.dll
+// MVID: {E5EE27AE-42FF-4EFB-B964-A21EE69EDB47}
+.imagebase 0x00400000
+.file alignment 0x00000200
+.stackreserve 0x00100000
+.subsystem 0x0003 // WINDOWS_CUI
+.corflags 0x00000001 // ILONLY
+// Image base: 0x05C30000
+
+
+// =============== CLASS MEMBERS DECLARATION ===================
+
+.class interface public abstract auto ansi import DIALib.IDiaDataSource
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 37 39 46 31 42 42 35 46 2D 42 36 36 45 // ..$79F1BB5F-B66E
+ 2D 34 38 45 35 2D 42 36 41 39 2D 31 35 34 35 43 // -48E5-B6A9-1545C
+ 33 32 33 43 41 33 44 00 00 ) // 323CA3D..
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_lastError() runtime managed internalcall
+ {
+ } // end of method IDiaDataSource::get_lastError
+
+ .method public hidebysig newslot abstract virtual
+ instance void loadDataFromPdb([in] string marshal( lpwstr) pdbPath) runtime managed internalcall
+ {
+ } // end of method IDiaDataSource::loadDataFromPdb
+
+ .method public hidebysig newslot abstract virtual
+ instance void loadAndValidateDataFromPdb([in] string marshal( lpwstr) pdbPath,
+ [in] valuetype [mscorlib]System.Guid& pcsig70,
+ [in] uint32 sig,
+ [in] uint32 age) runtime managed internalcall
+ {
+ } // end of method IDiaDataSource::loadAndValidateDataFromPdb
+
+ .method public hidebysig newslot abstract virtual
+ instance void loadDataForExe([in] string marshal( lpwstr) executable,
+ [in] string marshal( lpwstr) searchPath,
+ [in] object marshal( iunknown ) pCallback) runtime managed internalcall
+ {
+ } // end of method IDiaDataSource::loadDataForExe
+
+ .method public hidebysig newslot abstract virtual
+ instance void loadDataFromIStream([in] class DIALib.IStream marshal( interface ) pIStream) runtime managed internalcall
+ {
+ } // end of method IDiaDataSource::loadDataFromIStream
+
+ .method public hidebysig newslot abstract virtual
+ instance void openSession([out] class DIALib.IDiaSession& marshal( interface ) ppSession) runtime managed internalcall
+ {
+ } // end of method IDiaDataSource::openSession
+
+ .method public hidebysig newslot abstract virtual
+ instance void loadDataFromCodeViewInfo([in] string marshal( lpwstr) executable,
+ [in] string marshal( lpwstr) searchPath,
+ [in] uint32 cbCvInfo,
+ [in] uint8& pbCvInfo,
+ [in] object marshal( iunknown ) pCallback) runtime managed internalcall
+ {
+ } // end of method IDiaDataSource::loadDataFromCodeViewInfo
+
+ .method public hidebysig newslot abstract virtual
+ instance void loadDataFromMiscInfo([in] string marshal( lpwstr) executable,
+ [in] string marshal( lpwstr) searchPath,
+ [in] uint32 timeStampExe,
+ [in] uint32 timeStampDbg,
+ [in] uint32 sizeOfExe,
+ [in] uint32 cbMiscInfo,
+ [in] uint8& pbMiscInfo,
+ [in] object marshal( iunknown ) pCallback) runtime managed internalcall
+ {
+ } // end of method IDiaDataSource::loadDataFromMiscInfo
+
+ .property string lastError()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance string DIALib.IDiaDataSource::get_lastError()
+ } // end of property IDiaDataSource::lastError
+} // end of class DIALib.IDiaDataSource
+
+.class interface public abstract auto ansi import DIALib.DiaSource
+ implements DIALib.IDiaDataSource
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 37 39 46 31 42 42 35 46 2D 42 36 36 45 // ..$79F1BB5F-B66E
+ 2D 34 38 45 35 2D 42 36 41 39 2D 31 35 34 35 43 // -48E5-B6A9-1545C
+ 33 32 33 43 41 33 44 00 00 ) // 323CA3D..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.CoClassAttribute::.ctor(class [mscorlib]System.Type) = ( 01 00 15 44 49 41 4C 69 62 2E 44 69 61 53 6F 75 // ...DIALib.DiaSou
+ 72 63 65 43 6C 61 73 73 00 00 ) // rceClass..
+} // end of class DIALib.DiaSource
+
+.class public auto ansi import DIALib.DiaSourceClass
+ extends [mscorlib]System.Object
+ implements DIALib.IDiaDataSource,
+ DIALib.DiaSource
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.TypeLibTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.TypeLibTypeFlags) = ( 01 00 02 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 45 36 37 35 36 31 33 35 2D 31 45 36 35 // ..$E6756135-1E65
+ 2D 34 44 31 37 2D 38 35 37 36 2D 36 31 30 37 36 // -4D17-8576-61076
+ 31 33 39 38 43 33 43 00 00 ) // 1398C3C..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.ClassInterfaceAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ClassInterfaceType) = ( 01 00 00 00 00 00 00 00 )
+ .method public specialname rtspecialname
+ instance void .ctor() runtime managed internalcall
+ {
+ } // end of method DiaSourceClass::.ctor
+
+ .method public hidebysig newslot specialname virtual
+ instance string
+ marshal( bstr)
+ get_lastError() runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::get_lastError
+ } // end of method DiaSourceClass::get_lastError
+
+ .method public hidebysig newslot virtual
+ instance void loadDataFromPdb([in] string marshal( lpwstr) pdbPath) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataFromPdb
+ } // end of method DiaSourceClass::loadDataFromPdb
+
+ .method public hidebysig newslot virtual
+ instance void loadAndValidateDataFromPdb([in] string marshal( lpwstr) pdbPath,
+ [in] valuetype [mscorlib]System.Guid& pcsig70,
+ [in] uint32 sig,
+ [in] uint32 age) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadAndValidateDataFromPdb
+ } // end of method DiaSourceClass::loadAndValidateDataFromPdb
+
+ .method public hidebysig newslot virtual
+ instance void loadDataForExe([in] string marshal( lpwstr) executable,
+ [in] string marshal( lpwstr) searchPath,
+ [in] object marshal( iunknown ) pCallback) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataForExe
+ } // end of method DiaSourceClass::loadDataForExe
+
+ .method public hidebysig newslot virtual
+ instance void loadDataFromIStream([in] class DIALib.IStream marshal( interface ) pIStream) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataFromIStream
+ } // end of method DiaSourceClass::loadDataFromIStream
+
+ .method public hidebysig newslot virtual
+ instance void openSession([out] class DIALib.IDiaSession& marshal( interface ) ppSession) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::openSession
+ } // end of method DiaSourceClass::openSession
+
+ .method public hidebysig newslot virtual
+ instance void loadDataFromCodeViewInfo([in] string marshal( lpwstr) executable,
+ [in] string marshal( lpwstr) searchPath,
+ [in] uint32 cbCvInfo,
+ [in] uint8& pbCvInfo,
+ [in] object marshal( iunknown ) pCallback) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataFromCodeViewInfo
+ } // end of method DiaSourceClass::loadDataFromCodeViewInfo
+
+ .method public hidebysig newslot virtual
+ instance void loadDataFromMiscInfo([in] string marshal( lpwstr) executable,
+ [in] string marshal( lpwstr) searchPath,
+ [in] uint32 timeStampExe,
+ [in] uint32 timeStampDbg,
+ [in] uint32 sizeOfExe,
+ [in] uint32 cbMiscInfo,
+ [in] uint8& pbMiscInfo,
+ [in] object marshal( iunknown ) pCallback) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataFromMiscInfo
+ } // end of method DiaSourceClass::loadDataFromMiscInfo
+
+ .property string lastError()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance string DIALib.DiaSourceClass::get_lastError()
+ } // end of property DiaSourceClass::lastError
+} // end of class DIALib.DiaSourceClass
+
+.class interface public abstract auto ansi import DIALib.DiaSourceAlt
+ implements DIALib.IDiaDataSource
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.CoClassAttribute::.ctor(class [mscorlib]System.Type) = ( 01 00 18 44 49 41 4C 69 62 2E 44 69 61 53 6F 75 // ...DIALib.DiaSou
+ 72 63 65 41 6C 74 43 6C 61 73 73 00 00 ) // rceAltClass..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 37 39 46 31 42 42 35 46 2D 42 36 36 45 // ..$79F1BB5F-B66E
+ 2D 34 38 45 35 2D 42 36 41 39 2D 31 35 34 35 43 // -48E5-B6A9-1545C
+ 33 32 33 43 41 33 44 00 00 ) // 323CA3D..
+} // end of class DIALib.DiaSourceAlt
+
+.class public auto ansi import DIALib.DiaSourceAltClass
+ extends [mscorlib]System.Object
+ implements DIALib.IDiaDataSource,
+ DIALib.DiaSourceAlt
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.TypeLibTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.TypeLibTypeFlags) = ( 01 00 02 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.ClassInterfaceAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ClassInterfaceType) = ( 01 00 00 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 39 31 39 30 34 38 33 31 2D 34 39 43 41 // ..$91904831-49CA
+ 2D 34 37 36 36 2D 42 39 35 43 2D 32 35 33 39 37 // -4766-B95C-25397
+ 45 32 44 44 36 44 43 00 00 ) // E2DD6DC..
+ .method public specialname rtspecialname
+ instance void .ctor() runtime managed internalcall
+ {
+ } // end of method DiaSourceAltClass::.ctor
+
+ .method public hidebysig newslot specialname virtual
+ instance string
+ marshal( bstr)
+ get_lastError() runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::get_lastError
+ } // end of method DiaSourceAltClass::get_lastError
+
+ .method public hidebysig newslot virtual
+ instance void loadDataFromPdb([in] string marshal( lpwstr) pdbPath) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataFromPdb
+ } // end of method DiaSourceAltClass::loadDataFromPdb
+
+ .method public hidebysig newslot virtual
+ instance void loadAndValidateDataFromPdb([in] string marshal( lpwstr) pdbPath,
+ [in] valuetype [mscorlib]System.Guid& pcsig70,
+ [in] uint32 sig,
+ [in] uint32 age) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadAndValidateDataFromPdb
+ } // end of method DiaSourceAltClass::loadAndValidateDataFromPdb
+
+ .method public hidebysig newslot virtual
+ instance void loadDataForExe([in] string marshal( lpwstr) executable,
+ [in] string marshal( lpwstr) searchPath,
+ [in] object marshal( iunknown ) pCallback) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataForExe
+ } // end of method DiaSourceAltClass::loadDataForExe
+
+ .method public hidebysig newslot virtual
+ instance void loadDataFromIStream([in] class DIALib.IStream marshal( interface ) pIStream) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataFromIStream
+ } // end of method DiaSourceAltClass::loadDataFromIStream
+
+ .method public hidebysig newslot virtual
+ instance void openSession([out] class DIALib.IDiaSession& marshal( interface ) ppSession) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::openSession
+ } // end of method DiaSourceAltClass::openSession
+
+ .method public hidebysig newslot virtual
+ instance void loadDataFromCodeViewInfo([in] string marshal( lpwstr) executable,
+ [in] string marshal( lpwstr) searchPath,
+ [in] uint32 cbCvInfo,
+ [in] uint8& pbCvInfo,
+ [in] object marshal( iunknown ) pCallback) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataFromCodeViewInfo
+ } // end of method DiaSourceAltClass::loadDataFromCodeViewInfo
+
+ .method public hidebysig newslot virtual
+ instance void loadDataFromMiscInfo([in] string marshal( lpwstr) executable,
+ [in] string marshal( lpwstr) searchPath,
+ [in] uint32 timeStampExe,
+ [in] uint32 timeStampDbg,
+ [in] uint32 sizeOfExe,
+ [in] uint32 cbMiscInfo,
+ [in] uint8& pbMiscInfo,
+ [in] object marshal( iunknown ) pCallback) runtime managed internalcall
+ {
+ .override DIALib.IDiaDataSource::loadDataFromMiscInfo
+ } // end of method DiaSourceAltClass::loadDataFromMiscInfo
+
+ .property string lastError()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance string DIALib.DiaSourceAltClass::get_lastError()
+ } // end of property DiaSourceAltClass::lastError
+} // end of class DIALib.DiaSourceAltClass
+
+.class interface public abstract auto ansi import DIALib.IDiaStackWalker
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 35 34 38 35 32 31 36 42 2D 41 35 34 43 // ..$5485216B-A54C
+ 2D 34 36 39 46 2D 39 36 37 30 2D 35 32 42 32 34 // -469F-9670-52B24
+ 44 35 32 32 39 42 42 00 00 ) // D5229BB..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot abstract virtual
+ instance void getEnumFrames([in] class DIALib.IDiaStackWalkHelper marshal( interface ) pHelper,
+ [out] class DIALib.IDiaEnumStackFrames& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalker::getEnumFrames
+
+ .method public hidebysig newslot abstract virtual
+ instance void getEnumFrames2([in] valuetype DIALib.CV_CPU_TYPE_e cpuid,
+ [in] class DIALib.IDiaStackWalkHelper marshal( interface ) pHelper,
+ [out] class DIALib.IDiaEnumStackFrames& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalker::getEnumFrames2
+
+} // end of class DIALib.IDiaStackWalker
+
+.class interface public abstract auto ansi import DIALib.DiaStackWalker
+ implements DIALib.IDiaStackWalker
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.CoClassAttribute::.ctor(class [mscorlib]System.Type) = ( 01 00 1A 44 49 41 4C 69 62 2E 44 69 61 53 74 61 // ...DIALib.DiaSta
+ 63 6B 57 61 6C 6B 65 72 43 6C 61 73 73 00 00 ) // ckWalkerClass..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 35 34 38 35 32 31 36 42 2D 41 35 34 43 // ..$5485216B-A54C
+ 2D 34 36 39 46 2D 39 36 37 30 2D 35 32 42 32 34 // -469F-9670-52B24
+ 44 35 32 32 39 42 42 00 00 ) // D5229BB..
+} // end of class DIALib.DiaStackWalker
+
+.class public auto ansi import DIALib.DiaStackWalkerClass
+ extends [mscorlib]System.Object
+ implements DIALib.IDiaStackWalker,
+ DIALib.DiaStackWalker
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 43 45 34 41 38 35 44 42 2D 35 37 36 38 // ..$CE4A85DB-5768
+ 2D 34 37 35 42 2D 41 34 45 31 2D 43 30 42 43 41 // -475B-A4E1-C0BCA
+ 32 31 31 32 41 36 42 00 00 ) // 2112A6B..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.TypeLibTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.TypeLibTypeFlags) = ( 01 00 02 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.ClassInterfaceAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ClassInterfaceType) = ( 01 00 00 00 00 00 00 00 )
+ .method public specialname rtspecialname
+ instance void .ctor() runtime managed internalcall
+ {
+ } // end of method DiaStackWalkerClass::.ctor
+
+ .method public hidebysig newslot virtual
+ instance void getEnumFrames([in] class DIALib.IDiaStackWalkHelper marshal( interface ) pHelper,
+ [out] class DIALib.IDiaEnumStackFrames& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ .override DIALib.IDiaStackWalker::getEnumFrames
+ } // end of method DiaStackWalkerClass::getEnumFrames
+
+ .method public hidebysig newslot virtual
+ instance void getEnumFrames2([in] valuetype DIALib.CV_CPU_TYPE_e cpuid,
+ [in] class DIALib.IDiaStackWalkHelper marshal( interface ) pHelper,
+ [out] class DIALib.IDiaEnumStackFrames& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ .override DIALib.IDiaStackWalker::getEnumFrames2
+ } // end of method DiaStackWalkerClass::getEnumFrames2
+
+} // end of class DIALib.DiaStackWalkerClass
+
+.class interface public abstract auto ansi import DIALib.ISequentialStream
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 30 43 37 33 33 41 33 30 2D 32 41 31 43 // ..$0C733A30-2A1C
+ 2D 31 31 43 45 2D 41 44 45 35 2D 30 30 41 41 30 // -11CE-ADE5-00AA0
+ 30 34 34 37 37 33 44 00 00 ) // 044773D..
+ .method public hidebysig newslot abstract virtual
+ instance void RemoteRead([out] uint8& pv,
+ [in] uint32 cb,
+ [out] uint32& pcbRead) runtime managed internalcall
+ {
+ } // end of method ISequentialStream::RemoteRead
+
+ .method public hidebysig newslot abstract virtual
+ instance void RemoteWrite([in] uint8& pv,
+ [in] uint32 cb,
+ [out] uint32& pcbWritten) runtime managed internalcall
+ {
+ } // end of method ISequentialStream::RemoteWrite
+
+} // end of class DIALib.ISequentialStream
+
+.class interface public abstract auto ansi import DIALib.IStream
+ implements DIALib.ISequentialStream
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 30 30 30 30 30 30 30 43 2D 30 30 30 30 // ..$0000000C-0000
+ 2D 30 30 30 30 2D 43 30 30 30 2D 30 30 30 30 30 // -0000-C000-00000
+ 30 30 30 30 30 34 36 00 00 ) // 0000046..
+ .method public hidebysig newslot abstract virtual
+ instance void RemoteRead([out] uint8& pv,
+ [in] uint32 cb,
+ [out] uint32& pcbRead) runtime managed internalcall
+ {
+ } // end of method IStream::RemoteRead
+
+ .method public hidebysig newslot abstract virtual
+ instance void RemoteWrite([in] uint8& pv,
+ [in] uint32 cb,
+ [out] uint32& pcbWritten) runtime managed internalcall
+ {
+ } // end of method IStream::RemoteWrite
+
+ .method public hidebysig newslot abstract virtual
+ instance void RemoteSeek([in] valuetype DIALib._LARGE_INTEGER dlibMove,
+ [in] uint32 dwOrigin,
+ [out] valuetype DIALib._ULARGE_INTEGER& plibNewPosition) runtime managed internalcall
+ {
+ } // end of method IStream::RemoteSeek
+
+ .method public hidebysig newslot abstract virtual
+ instance void SetSize([in] valuetype DIALib._ULARGE_INTEGER libNewSize) runtime managed internalcall
+ {
+ } // end of method IStream::SetSize
+
+ .method public hidebysig newslot abstract virtual
+ instance void RemoteCopyTo([in] class DIALib.IStream marshal( interface ) pstm,
+ [in] valuetype DIALib._ULARGE_INTEGER cb,
+ [out] valuetype DIALib._ULARGE_INTEGER& pcbRead,
+ [out] valuetype DIALib._ULARGE_INTEGER& pcbWritten) runtime managed internalcall
+ {
+ } // end of method IStream::RemoteCopyTo
+
+ .method public hidebysig newslot abstract virtual
+ instance void Commit([in] uint32 grfCommitFlags) runtime managed internalcall
+ {
+ } // end of method IStream::Commit
+
+ .method public hidebysig newslot abstract virtual
+ instance void Revert() runtime managed internalcall
+ {
+ } // end of method IStream::Revert
+
+ .method public hidebysig newslot abstract virtual
+ instance void LockRegion([in] valuetype DIALib._ULARGE_INTEGER libOffset,
+ [in] valuetype DIALib._ULARGE_INTEGER cb,
+ [in] uint32 dwLockType) runtime managed internalcall
+ {
+ } // end of method IStream::LockRegion
+
+ .method public hidebysig newslot abstract virtual
+ instance void UnlockRegion([in] valuetype DIALib._ULARGE_INTEGER libOffset,
+ [in] valuetype DIALib._ULARGE_INTEGER cb,
+ [in] uint32 dwLockType) runtime managed internalcall
+ {
+ } // end of method IStream::UnlockRegion
+
+ .method public hidebysig newslot abstract virtual
+ instance void Stat([out] valuetype DIALib.tagSTATSTG& pstatstg,
+ [in] uint32 grfStatFlag) runtime managed internalcall
+ {
+ } // end of method IStream::Stat
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IStream& marshal( interface ) ppstm) runtime managed internalcall
+ {
+ } // end of method IStream::Clone
+
+} // end of class DIALib.IStream
+
+.class interface public abstract auto ansi import DIALib.IDiaSession
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 32 46 36 30 39 45 45 31 2D 44 31 43 38 // ..$2F609EE1-D1C8
+ 2D 34 45 32 34 2D 38 32 38 38 2D 33 33 32 36 42 // -4E24-8288-3326B
+ 41 44 43 44 32 31 31 00 00 ) // ADCD211..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_loadAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSession::get_loadAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance void set_loadAddress([in] uint64 pRetVal) runtime managed internalcall
+ {
+ } // end of method IDiaSession::set_loadAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_globalScope() runtime managed internalcall
+ {
+ } // end of method IDiaSession::get_globalScope
+
+ .method public hidebysig newslot abstract virtual
+ instance void getEnumTables([out] class DIALib.IDiaEnumTables& marshal( interface ) ppEnumTables) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getEnumTables
+
+ .method public hidebysig newslot abstract virtual
+ instance void getSymbolsByAddr([out] class DIALib.IDiaEnumSymbolsByAddr& marshal( interface ) ppEnumbyAddr) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getSymbolsByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildren([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findChildren
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenEx([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findChildrenEx
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByAddr([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findChildrenExByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByVA([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findChildrenExByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByRVA([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findChildrenExByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) ppSymbol) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findSymbolByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolByRVA([in] uint32 rva,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) ppSymbol) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findSymbolByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolByVA([in] uint64 va,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) ppSymbol) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findSymbolByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolByToken([in] uint32 token,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) ppSymbol) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findSymbolByToken
+
+ .method public hidebysig newslot abstract virtual
+ instance void symsAreEquiv([in] class DIALib.IDiaSymbol marshal( interface ) symbolA,
+ [in] class DIALib.IDiaSymbol marshal( interface ) symbolB) runtime managed internalcall
+ {
+ } // end of method IDiaSession::symsAreEquiv
+
+ .method public hidebysig newslot abstract virtual
+ instance void symbolById([in] uint32 id,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) ppSymbol) runtime managed internalcall
+ {
+ } // end of method IDiaSession::symbolById
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolByRVAEx([in] uint32 rva,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) ppSymbol,
+ [out] int32& displacement) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findSymbolByRVAEx
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolByVAEx([in] uint64 va,
+ [in] valuetype DIALib.SymTagEnum symTag,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) ppSymbol,
+ [out] int32& displacement) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findSymbolByVAEx
+
+ .method public hidebysig newslot abstract virtual
+ instance void findFile([in] class DIALib.IDiaSymbol marshal( interface ) pCompiland,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSourceFiles& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findFile
+
+ .method public hidebysig newslot abstract virtual
+ instance void findFileById([in] uint32 uniqueId,
+ [out] class DIALib.IDiaSourceFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findFileById
+
+ .method public hidebysig newslot abstract virtual
+ instance void findLines([in] class DIALib.IDiaSymbol marshal( interface ) compiland,
+ [in] class DIALib.IDiaSourceFile marshal( interface ) file,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findLines
+
+ .method public hidebysig newslot abstract virtual
+ instance void findLinesByAddr([in] uint32 seg,
+ [in] uint32 offset,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findLinesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findLinesByRVA([in] uint32 rva,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findLinesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findLinesByVA([in] uint64 va,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findLinesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findLinesByLinenum([in] class DIALib.IDiaSymbol marshal( interface ) compiland,
+ [in] class DIALib.IDiaSourceFile marshal( interface ) file,
+ [in] uint32 linenum,
+ [in] uint32 column,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findLinesByLinenum
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInjectedSource([in] string marshal( lpwstr) srcFile,
+ [out] class DIALib.IDiaEnumInjectedSources& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInjectedSource
+
+ .method public hidebysig newslot abstract virtual
+ instance void getEnumDebugStreams([out] class DIALib.IDiaEnumDebugStreams& marshal( interface ) ppEnumDebugStreams) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getEnumDebugStreams
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByAddr([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInlineFramesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByRVA([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInlineFramesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByVA([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInlineFramesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLines([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInlineeLines
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByAddr([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] uint32 isect,
+ [in] uint32 offset,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInlineeLinesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByRVA([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] uint32 rva,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInlineeLinesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByVA([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] uint64 va,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInlineeLinesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByLinenum([in] class DIALib.IDiaSymbol marshal( interface ) compiland,
+ [in] class DIALib.IDiaSourceFile marshal( interface ) file,
+ [in] uint32 linenum,
+ [in] uint32 column,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInlineeLinesByLinenum
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineesByName([in] string marshal( lpwstr) name,
+ [in] uint32 option,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInlineesByName
+
+ .method public hidebysig newslot abstract virtual
+ instance void findAcceleratorInlineeLinesByLinenum([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] class DIALib.IDiaSourceFile marshal( interface ) file,
+ [in] uint32 linenum,
+ [in] uint32 column,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findAcceleratorInlineeLinesByLinenum
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsForAcceleratorPointerTag([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] uint32 tagValue,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findSymbolsForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsByRVAForAcceleratorPointerTag([in] class DIALib.IDiaSymbol marshal( interface ) parent,
+ [in] uint32 tagValue,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findSymbolsByRVAForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void findAcceleratorInlineesByName([in] string marshal( lpwstr) name,
+ [in] uint32 option,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findAcceleratorInlineesByName
+
+ .method public hidebysig newslot abstract virtual
+ instance void addressForVA([in] uint64 va,
+ [out] uint32& pISect,
+ [out] uint32& pOffset) runtime managed internalcall
+ {
+ } // end of method IDiaSession::addressForVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void addressForRVA([in] uint32 rva,
+ [out] uint32& pISect,
+ [out] uint32& pOffset) runtime managed internalcall
+ {
+ } // end of method IDiaSession::addressForRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findILOffsetsByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findILOffsetsByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findILOffsetsByRVA([in] uint32 rva,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findILOffsetsByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findILOffsetsByVA([in] uint64 va,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findILOffsetsByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssemblyFiles([out] class DIALib.IDiaEnumInputAssemblyFiles& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInputAssemblyFiles
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssembly([in] uint32 index,
+ [out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInputAssembly
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssemblyById([in] uint32 uniqueId,
+ [out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInputAssemblyById
+
+ .method public hidebysig newslot abstract virtual
+ instance void getFuncMDTokenMapSize([out] uint32& pcb) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getFuncMDTokenMapSize
+
+ .method public hidebysig newslot abstract virtual
+ instance void getFuncMDTokenMap([in] uint32 cb,
+ [out] uint32& pcb,
+ [out] uint8& pb) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getFuncMDTokenMap
+
+ .method public hidebysig newslot abstract virtual
+ instance void getTypeMDTokenMapSize([out] uint32& pcb) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getTypeMDTokenMapSize
+
+ .method public hidebysig newslot abstract virtual
+ instance void getTypeMDTokenMap([in] uint32 cb,
+ [out] uint32& pcb,
+ [out] uint8& pb) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getTypeMDTokenMap
+
+ .method public hidebysig newslot abstract virtual
+ instance void getNumberOfFunctionFragments_VA([in] uint64 vaFunc,
+ [in] uint32 cbFunc,
+ [out] uint32& pNumFragments) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getNumberOfFunctionFragments_VA
+
+ .method public hidebysig newslot abstract virtual
+ instance void getNumberOfFunctionFragments_RVA([in] uint32 rvaFunc,
+ [in] uint32 cbFunc,
+ [out] uint32& pNumFragments) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getNumberOfFunctionFragments_RVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void getFunctionFragments_VA([in] uint64 vaFunc,
+ [in] uint32 cbFunc,
+ [in] uint32 cFragments,
+ [out] uint64& pVaFragment,
+ [out] uint32& pLenFragment) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getFunctionFragments_VA
+
+ .method public hidebysig newslot abstract virtual
+ instance void getFunctionFragments_RVA([in] uint32 rvaFunc,
+ [in] uint32 cbFunc,
+ [in] uint32 cFragments,
+ [out] uint32& pRvaFragment,
+ [out] uint32& pLenFragment) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getFunctionFragments_RVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void getExports([out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getExports
+
+ .method public hidebysig newslot abstract virtual
+ instance void getHeapAllocationSites([out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::getHeapAllocationSites
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssemblyFile([in] class DIALib.IDiaSymbol marshal( interface ) pSymbol,
+ [out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSession::findInputAssemblyFile
+
+ .property uint64 loadAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .set instance void DIALib.IDiaSession::set_loadAddress(uint64)
+ .get instance uint64 DIALib.IDiaSession::get_loadAddress()
+ } // end of property IDiaSession::loadAddress
+ .property class DIALib.IDiaSymbol globalScope()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSession::get_globalScope()
+ } // end of property IDiaSession::globalScope
+} // end of class DIALib.IDiaSession
+
+.class interface public abstract auto ansi import DIALib.IDiaStackWalkHelper
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 32 31 46 38 31 42 31 42 2D 43 35 42 42 // ..$21F81B1B-C5BB
+ 2D 34 32 41 33 2D 42 43 34 46 2D 43 43 42 41 41 // -42A3-BC4F-CCBAA
+ 37 35 42 39 46 31 39 00 00 ) // 75B9F19..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_registerValue([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::get_registerValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance void set_registerValue([in] uint32 index,
+ [in] uint64 pRetVal) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::set_registerValue
+
+ .method public hidebysig newslot abstract virtual
+ instance void readMemory([in] valuetype DIALib.MemoryTypeEnum 'type',
+ [in] uint64 va,
+ [in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::readMemory
+
+ .method public hidebysig newslot abstract virtual
+ instance void searchForReturnAddress([in] class DIALib.IDiaFrameData marshal( interface ) frame,
+ [out] uint64& returnAddress) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::searchForReturnAddress
+
+ .method public hidebysig newslot abstract virtual
+ instance void searchForReturnAddressStart([in] class DIALib.IDiaFrameData marshal( interface ) frame,
+ [in] uint64 startAddress,
+ [out] uint64& returnAddress) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::searchForReturnAddressStart
+
+ .method public hidebysig newslot abstract virtual
+ instance void frameForVA([in] uint64 va,
+ [out] class DIALib.IDiaFrameData& marshal( interface ) ppFrame) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::frameForVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void symbolForVA([in] uint64 va,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) ppSymbol) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::symbolForVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void pdataForVA([in] uint64 va,
+ [in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::pdataForVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void imageForVA([in] uint64 vaContext,
+ [out] uint64& pvaImageStart) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::imageForVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void addressForVA([in] uint64 va,
+ [out] uint32& pISect,
+ [out] uint32& pOffset) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::addressForVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void numberOfFunctionFragmentsForVA([in] uint64 vaFunc,
+ [in] uint32 cbFunc,
+ [out] uint32& pNumFragments) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::numberOfFunctionFragmentsForVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void functionFragmentsForVA([in] uint64 vaFunc,
+ [in] uint32 cbFunc,
+ [in] uint32 cFragments,
+ [out] uint64& pVaFragment,
+ [out] uint32& pLenFragment) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkHelper::functionFragmentsForVA
+
+ .property uint64 registerValue(uint32)
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaStackWalkHelper::get_registerValue(uint32)
+ .set instance void DIALib.IDiaStackWalkHelper::set_registerValue(uint32,
+ uint64)
+ } // end of property IDiaStackWalkHelper::registerValue
+} // end of class DIALib.IDiaStackWalkHelper
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumStackFrames
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 45 43 39 44 34 36 31 44 2D 43 45 37 34 // ..$EC9D461D-CE74
+ 2D 34 37 31 31 2D 41 30 32 30 2D 37 44 38 46 39 // -4711-A020-7D8F9
+ 41 31 44 44 32 35 35 00 00 ) // A1DD255..
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [out] class DIALib.IDiaStackFrame& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumStackFrames::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumStackFrames::Reset
+
+} // end of class DIALib.IDiaEnumStackFrames
+
+.class public auto ansi sealed DIALib.CV_CPU_TYPE_e
+ extends [mscorlib]System.Enum
+{
+ .field public specialname rtspecialname int32 value__
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_8080 = int32(0x00000000)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_8086 = int32(0x00000001)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_80286 = int32(0x00000002)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_80386 = int32(0x00000003)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_80486 = int32(0x00000004)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PENTIUM = int32(0x00000005)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PENTIUMII = int32(0x00000006)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PENTIUMPRO = int32(0x00000006)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PENTIUMIII = int32(0x00000007)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPS = int32(0x00000010)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPSR4000 = int32(0x00000010)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPS16 = int32(0x00000011)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPS32 = int32(0x00000012)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPS64 = int32(0x00000013)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPSI = int32(0x00000014)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPSII = int32(0x00000015)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPSIII = int32(0x00000016)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPSIV = int32(0x00000017)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_MIPSV = int32(0x00000018)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_M68000 = int32(0x00000020)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_M68010 = int32(0x00000021)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_M68020 = int32(0x00000022)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_M68030 = int32(0x00000023)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_M68040 = int32(0x00000024)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ALPHA = int32(0x00000030)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ALPHA_21064 = int32(0x00000030)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ALPHA_21164 = int32(0x00000031)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ALPHA_21164A = int32(0x00000032)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ALPHA_21264 = int32(0x00000033)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ALPHA_21364 = int32(0x00000034)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PPC601 = int32(0x00000040)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PPC603 = int32(0x00000041)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PPC604 = int32(0x00000042)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PPC620 = int32(0x00000043)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PPCFP = int32(0x00000044)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_PPCBE = int32(0x00000045)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_SH3 = int32(0x00000050)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_SH3E = int32(0x00000051)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_SH3DSP = int32(0x00000052)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_SH4 = int32(0x00000053)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_SHMEDIA = int32(0x00000054)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM3 = int32(0x00000060)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM4 = int32(0x00000061)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM4T = int32(0x00000062)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM5 = int32(0x00000063)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM5T = int32(0x00000064)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM6 = int32(0x00000065)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM_XMAC = int32(0x00000066)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM_WMMX = int32(0x00000067)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM7 = int32(0x00000068)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_OMNI = int32(0x00000070)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_IA64 = int32(0x00000080)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_IA64_1 = int32(0x00000080)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_IA64_2 = int32(0x00000081)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_CEE = int32(0x00000090)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_AM33 = int32(0x000000A0)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_M32R = int32(0x000000B0)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_TRICORE = int32(0x000000C0)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_X64 = int32(0x000000D0)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_AMD64 = int32(0x000000D0)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_EBC = int32(0x000000E0)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_THUMB = int32(0x000000F0)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARMNT = int32(0x000000F4)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM64 = int32(0x000000F6)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_HYBRID_X86_ARM64 = int32(0x000000F7)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM64EC = int32(0x000000F8)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_ARM64X = int32(0x000000F9)
+ .field public static literal valuetype DIALib.CV_CPU_TYPE_e CV_CFL_D3D11_SHADER = int32(0x00000100)
+} // end of class DIALib.CV_CPU_TYPE_e
+
+.class public sequential ansi sealed beforefieldinit DIALib._LARGE_INTEGER
+ extends [mscorlib]System.ValueType
+{
+ .pack 8
+ .size 0
+ .field public int64 QuadPart
+} // end of class DIALib._LARGE_INTEGER
+
+.class public sequential ansi sealed beforefieldinit DIALib._ULARGE_INTEGER
+ extends [mscorlib]System.ValueType
+{
+ .pack 8
+ .size 0
+ .field public uint64 QuadPart
+} // end of class DIALib._ULARGE_INTEGER
+
+.class public sequential ansi sealed beforefieldinit DIALib.tagSTATSTG
+ extends [mscorlib]System.ValueType
+{
+ .pack 8
+ .size 0
+ .field public marshal( lpwstr) string pwcsName
+ .field public uint32 'type'
+ .field public valuetype DIALib._ULARGE_INTEGER cbSize
+ .field public valuetype DIALib._FILETIME mtime
+ .field public valuetype DIALib._FILETIME ctime
+ .field public valuetype DIALib._FILETIME atime
+ .field public uint32 grfMode
+ .field public uint32 grfLocksSupported
+ .field public valuetype [mscorlib]System.Guid 'clsid'
+ .field public uint32 grfStateBits
+ .field public uint32 reserved
+} // end of class DIALib.tagSTATSTG
+
+.class public sequential ansi sealed beforefieldinit DIALib._FILETIME
+ extends [mscorlib]System.ValueType
+{
+ .pack 4
+ .size 0
+ .field public uint32 dwLowDateTime
+ .field public uint32 dwHighDateTime
+} // end of class DIALib._FILETIME
+
+.class interface public abstract auto ansi import DIALib.IDiaSymbol
+{
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 0A 73 79 6D 49 6E 64 65 78 49 64 00 00 ) // ...symIndexId..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 43 42 37 38 37 42 32 46 2D 42 44 36 43 // ..$CB787B2F-BD6C
+ 2D 34 36 33 35 2D 42 41 35 32 2D 39 33 33 31 32 // -4635-BA52-93312
+ 36 42 44 32 44 43 44 00 00 ) // 6BD2DCD..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symIndexId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_symIndexId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symTag() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_symTag
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_name() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_name
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lexicalParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_lexicalParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_classParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_classParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_type() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_type
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_dataKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_dataKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_locationType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_locationType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_addressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_addressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_relativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_virtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_virtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_registerId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_offset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_offset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_length() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_length
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_slot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_slot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_volatileType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_volatileType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_constType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_unalignedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_unalignedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_access() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_access
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_libraryName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_libraryName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_platform() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_platform
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_language() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_language
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_editAndContinueEnabled() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_editAndContinueEnabled
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_frontEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_frontEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_frontEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_backEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_backEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_backEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_sourceFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_sourceFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_unused() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_unused
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_thunkOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_thunkOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_thisAdjust() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_thisAdjust
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_virtualBaseOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtual() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_virtual
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intro() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_intro
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_pure() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_pure
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_callingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_callingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance object
+ marshal( struct)
+ get_value() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_value
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_baseType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_token() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_token
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_timeStamp() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_timeStamp
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance valuetype [mscorlib]System.Guid
+ get_guid() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_guid
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_symbolsFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_symbolsFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_reference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_reference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_count
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bitPosition() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_bitPosition
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_arrayIndexType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_arrayIndexType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_packed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_packed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constructor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_constructor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_overloadedOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_overloadedOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_nested() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_nested
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasNestedTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasNestedTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAssignmentOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasAssignmentOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasCastOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasCastOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_scoped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_scoped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_virtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_indirectVirtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_indirectVirtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBasePointerOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_virtualBasePointerOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualTableShape() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_virtualTableShape
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lexicalParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_lexicalParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_classParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_classParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_typeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_typeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_arrayIndexTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_arrayIndexTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualTableShapeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_virtualTableShapeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_code() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_code
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_function() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_function
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_managed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_managed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_msil() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_msil
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseDispIndex() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_virtualBaseDispIndex
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_undecoratedName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_undecoratedName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_age() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_age
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_signature() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_signature
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_compilerGenerated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_compilerGenerated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_addressTaken() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_addressTaken
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_rank() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_rank
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lowerBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_lowerBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_upperBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_upperBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lowerBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_lowerBoundId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_upperBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_upperBoundId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_dataBytes([in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_dataBytes
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildren([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findChildren
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenEx([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findChildrenEx
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByAddr([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findChildrenExByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findChildrenExByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByRVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findChildrenExByRVA
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_targetSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_targetOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_targetRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_targetVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_targetVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_machineType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_machineType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_oemId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_oemSymbolId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_types([in] uint32 cTypes,
+ [out] uint32& pcTypes,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) pTypes) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_types
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_typeIds([in] uint32 cTypeIds,
+ [out] uint32& pcTypeIds,
+ [out] uint32& pdwTypeIds) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_typeIds
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_objectPointerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_objectPointerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_udtKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_udtKind
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_undecoratedNameEx([in] uint32 undecorateOptions,
+ [out] string& marshal( bstr) name) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_undecoratedNameEx
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_noReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_customCallingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_customCallingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noInline() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_noInline
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_optimizedCodeDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_optimizedCodeDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_notReached() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_notReached
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_interruptReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_interruptReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_farReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_farReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStatic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isStatic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLTCG() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isLTCG
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isDataAligned() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isDataAligned
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSecurityChecks() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasSecurityChecks
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_compilerName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_compilerName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAlloca() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasAlloca
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSetJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasSetJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasLongJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasLongJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasInlAsm() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasInlAsm
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasSEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEHa() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasEHa
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isNaked() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isNaked
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAggregated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isAggregated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSplitted() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isSplitted
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_container() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_container
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_inlSpec() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_inlSpec
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noStackOrdering() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_noStackOrdering
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualBaseTableType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_virtualBaseTableType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasManagedCode() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasManagedCode
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHotpatchable() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isHotpatchable
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCVTCIL() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isCVTCIL
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMSILNetmodule() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isMSILNetmodule
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isCTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStripped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isStripped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_frontEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_backEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_wasInlined() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_wasInlined
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_strictGSCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_strictGSCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCxxReturnUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isCxxReturnUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isConstructorVirtualBase() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isConstructorVirtualBase
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_RValueReference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_RValueReference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_unmodifiedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_unmodifiedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_framePointerPresent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_framePointerPresent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSafeBuffers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isSafeBuffers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intrinsic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_intrinsic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_sealed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_sealed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaFloat() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hfaFloat
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaDouble() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hfaDouble
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_liveRangeStartAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_liveRangeStartAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_liveRangeStartRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_countLiveRanges() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_countLiveRanges
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_liveRangeLength() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_liveRangeLength
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_offsetInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_offsetInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_paramBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_paramBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_localBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_localBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLocationControlFlowDependent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isLocationControlFlowDependent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_stride() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_stride
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRows() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_numberOfRows
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfColumns() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_numberOfColumns
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMatrixRowMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isMatrixRowMajor
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_numericProperties([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pProperties) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_numericProperties
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_modifierValues([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint16& pModifiers) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_modifierValues
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isReturnValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isReturnValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedAway() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isOptimizedAway
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_builtInKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_builtInKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_registerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_baseDataSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_baseDataOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_textureSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_textureSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_samplerSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_samplerSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_uavSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_uavSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_sizeInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_sizeInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_memorySpaceKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_memorySpaceKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_unmodifiedTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_unmodifiedTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_subTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_subTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_subType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_subType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfModifiers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_numberOfModifiers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRegisterIndices() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_numberOfRegisterIndices
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHLSLData() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isHLSLData
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToDataMember() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isPointerToDataMember
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToMemberFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isPointerToMemberFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSingleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isSingleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMultipleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isMultipleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isVirtualInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isVirtualInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_restrictedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_restrictedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerBasedOnSymbolValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isPointerBasedOnSymbolValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_baseSymbol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_baseSymbol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_baseSymbolId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_objectFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_objectFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorGroupSharedLocal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isAcceleratorGroupSharedLocal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorPointerTagLiveRange() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isAcceleratorPointerTagLiveRange
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorStubFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isAcceleratorStubFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfAcceleratorPointerTags() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_numberOfAcceleratorPointerTags
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSdl() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isSdl
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isWinRTPointer() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isWinRTPointer
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isRefUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isRefUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isValueUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isValueUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isInterfaceUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isInterfaceUdt
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findInlineFramesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByRVA([in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findInlineFramesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByVA([in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findInlineFramesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLines([out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findInlineeLines
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findInlineeLinesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByRVA([in] uint32 rva,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findInlineeLinesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByVA([in] uint64 va,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findInlineeLinesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsForAcceleratorPointerTag([in] uint32 tagValue,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findSymbolsForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsByRVAForAcceleratorPointerTag([in] uint32 tagValue,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findSymbolsByRVAForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_acceleratorPointerTags([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pPointerTags) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_acceleratorPointerTags
+
+ .method public hidebysig newslot abstract virtual
+ instance void getSrcLineOnTypeDefn([out] class DIALib.IDiaLineNumber& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::getSrcLineOnTypeDefn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPGO() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isPGO
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasValidPGOCounts() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasValidPGOCounts
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedForSpeed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_isOptimizedForSpeed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEntryCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_PGOEntryCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEdgeCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_PGOEdgeCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_PGODynamicInstructionCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_PGODynamicInstructionCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_staticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_staticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_finalLiveStaticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_finalLiveStaticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_phaseName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_phaseName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasControlFlowCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_hasControlFlowCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constantExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_constantExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_dataExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_dataExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_privateExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_privateExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noNameExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_noNameExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportHasExplicitlyAssignedOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_exportHasExplicitlyAssignedOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportIsForwarder() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_exportIsForwarder
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_ordinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_ordinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frameSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_frameSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_exceptionHandlerAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_exceptionHandlerAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_exceptionHandlerRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_exceptionHandlerVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_exceptionHandlerVirtualAddress
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssemblyFile([out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::findInputAssemblyFile
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_characteristics() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_characteristics
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_coffGroup() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_coffGroup
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindID() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_bindID
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSpace() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_bindSpace
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol::get_bindSlot
+
+ .property uint32 symIndexId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_symIndexId()
+ } // end of property IDiaSymbol::symIndexId
+ .property uint32 symTag()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_symTag()
+ } // end of property IDiaSymbol::symTag
+ .property string name()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol::get_name()
+ } // end of property IDiaSymbol::name
+ .property class DIALib.IDiaSymbol lexicalParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_lexicalParent()
+ } // end of property IDiaSymbol::lexicalParent
+ .property class DIALib.IDiaSymbol classParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_classParent()
+ } // end of property IDiaSymbol::classParent
+ .property class DIALib.IDiaSymbol 'type'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_type()
+ } // end of property IDiaSymbol::'type'
+ .property uint32 dataKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_dataKind()
+ } // end of property IDiaSymbol::dataKind
+ .property uint32 locationType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 07 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_locationType()
+ } // end of property IDiaSymbol::locationType
+ .property uint32 addressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_addressSection()
+ } // end of property IDiaSymbol::addressSection
+ .property uint32 addressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_addressOffset()
+ } // end of property IDiaSymbol::addressOffset
+ .property uint32 relativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_relativeVirtualAddress()
+ } // end of property IDiaSymbol::relativeVirtualAddress
+ .property uint64 virtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol::get_virtualAddress()
+ } // end of property IDiaSymbol::virtualAddress
+ .property uint32 registerId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_registerId()
+ } // end of property IDiaSymbol::registerId
+ .property int32 offset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_offset()
+ } // end of property IDiaSymbol::offset
+ .property uint64 length()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol::get_length()
+ } // end of property IDiaSymbol::length
+ .property uint32 slot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_slot()
+ } // end of property IDiaSymbol::slot
+ .property int32 volatileType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 10 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_volatileType()
+ } // end of property IDiaSymbol::volatileType
+ .property int32 constType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 11 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_constType()
+ } // end of property IDiaSymbol::constType
+ .property int32 unalignedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 12 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_unalignedType()
+ } // end of property IDiaSymbol::unalignedType
+ .property uint32 access()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 13 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_access()
+ } // end of property IDiaSymbol::access
+ .property string libraryName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 14 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol::get_libraryName()
+ } // end of property IDiaSymbol::libraryName
+ .property uint32 platform()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 15 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_platform()
+ } // end of property IDiaSymbol::platform
+ .property uint32 language()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 16 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_language()
+ } // end of property IDiaSymbol::language
+ .property int32 editAndContinueEnabled()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 17 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_editAndContinueEnabled()
+ } // end of property IDiaSymbol::editAndContinueEnabled
+ .property uint32 frontEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 18 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_frontEndMajor()
+ } // end of property IDiaSymbol::frontEndMajor
+ .property uint32 frontEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 19 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_frontEndMinor()
+ } // end of property IDiaSymbol::frontEndMinor
+ .property uint32 frontEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_frontEndBuild()
+ } // end of property IDiaSymbol::frontEndBuild
+ .property uint32 backEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_backEndMajor()
+ } // end of property IDiaSymbol::backEndMajor
+ .property uint32 backEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_backEndMinor()
+ } // end of property IDiaSymbol::backEndMinor
+ .property uint32 backEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_backEndBuild()
+ } // end of property IDiaSymbol::backEndBuild
+ .property string sourceFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1E 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol::get_sourceFileName()
+ } // end of property IDiaSymbol::sourceFileName
+ .property string 'unused'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1F 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol::get_unused()
+ } // end of property IDiaSymbol::'unused'
+ .property uint32 thunkOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 20 00 00 00 00 00 ) // .. .....
+ .get instance uint32 DIALib.IDiaSymbol::get_thunkOrdinal()
+ } // end of property IDiaSymbol::thunkOrdinal
+ .property int32 thisAdjust()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 21 00 00 00 00 00 ) // ..!.....
+ .get instance int32 DIALib.IDiaSymbol::get_thisAdjust()
+ } // end of property IDiaSymbol::thisAdjust
+ .property uint32 virtualBaseOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 22 00 00 00 00 00 ) // ..".....
+ .get instance uint32 DIALib.IDiaSymbol::get_virtualBaseOffset()
+ } // end of property IDiaSymbol::virtualBaseOffset
+ .property int32 'virtual'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 23 00 00 00 00 00 ) // ..#.....
+ .get instance int32 DIALib.IDiaSymbol::get_virtual()
+ } // end of property IDiaSymbol::'virtual'
+ .property int32 intro()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 24 00 00 00 00 00 ) // ..$.....
+ .get instance int32 DIALib.IDiaSymbol::get_intro()
+ } // end of property IDiaSymbol::intro
+ .property int32 pure()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 25 00 00 00 00 00 ) // ..%.....
+ .get instance int32 DIALib.IDiaSymbol::get_pure()
+ } // end of property IDiaSymbol::pure
+ .property uint32 callingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 26 00 00 00 00 00 ) // ..&.....
+ .get instance uint32 DIALib.IDiaSymbol::get_callingConvention()
+ } // end of property IDiaSymbol::callingConvention
+ .property object 'value'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 27 00 00 00 00 00 ) // ..'.....
+ .get instance object DIALib.IDiaSymbol::get_value()
+ } // end of property IDiaSymbol::'value'
+ .property uint32 baseType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 28 00 00 00 00 00 ) // ..(.....
+ .get instance uint32 DIALib.IDiaSymbol::get_baseType()
+ } // end of property IDiaSymbol::baseType
+ .property uint32 token()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 29 00 00 00 00 00 ) // ..).....
+ .get instance uint32 DIALib.IDiaSymbol::get_token()
+ } // end of property IDiaSymbol::token
+ .property uint32 timeStamp()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2A 00 00 00 00 00 ) // ..*.....
+ .get instance uint32 DIALib.IDiaSymbol::get_timeStamp()
+ } // end of property IDiaSymbol::timeStamp
+ .property valuetype [mscorlib]System.Guid
+ guid()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2B 00 00 00 00 00 ) // ..+.....
+ .get instance valuetype [mscorlib]System.Guid DIALib.IDiaSymbol::get_guid()
+ } // end of property IDiaSymbol::guid
+ .property string symbolsFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2C 00 00 00 00 00 ) // ..,.....
+ .get instance string DIALib.IDiaSymbol::get_symbolsFileName()
+ } // end of property IDiaSymbol::symbolsFileName
+ .property int32 reference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2E 00 00 00 00 00 ) // ........
+ .get instance int32 DIALib.IDiaSymbol::get_reference()
+ } // end of property IDiaSymbol::reference
+ .property uint32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2F 00 00 00 00 00 ) // ../.....
+ .get instance uint32 DIALib.IDiaSymbol::get_count()
+ } // end of property IDiaSymbol::count
+ .property uint32 bitPosition()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 31 00 00 00 00 00 ) // ..1.....
+ .get instance uint32 DIALib.IDiaSymbol::get_bitPosition()
+ } // end of property IDiaSymbol::bitPosition
+ .property class DIALib.IDiaSymbol arrayIndexType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 32 00 00 00 00 00 ) // ..2.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_arrayIndexType()
+ } // end of property IDiaSymbol::arrayIndexType
+ .property int32 packed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 33 00 00 00 00 00 ) // ..3.....
+ .get instance int32 DIALib.IDiaSymbol::get_packed()
+ } // end of property IDiaSymbol::packed
+ .property int32 constructor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 34 00 00 00 00 00 ) // ..4.....
+ .get instance int32 DIALib.IDiaSymbol::get_constructor()
+ } // end of property IDiaSymbol::constructor
+ .property int32 overloadedOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 35 00 00 00 00 00 ) // ..5.....
+ .get instance int32 DIALib.IDiaSymbol::get_overloadedOperator()
+ } // end of property IDiaSymbol::overloadedOperator
+ .property int32 'nested'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 36 00 00 00 00 00 ) // ..6.....
+ .get instance int32 DIALib.IDiaSymbol::get_nested()
+ } // end of property IDiaSymbol::'nested'
+ .property int32 hasNestedTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 37 00 00 00 00 00 ) // ..7.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasNestedTypes()
+ } // end of property IDiaSymbol::hasNestedTypes
+ .property int32 hasAssignmentOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 38 00 00 00 00 00 ) // ..8.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasAssignmentOperator()
+ } // end of property IDiaSymbol::hasAssignmentOperator
+ .property int32 hasCastOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 39 00 00 00 00 00 ) // ..9.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasCastOperator()
+ } // end of property IDiaSymbol::hasCastOperator
+ .property int32 scoped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3A 00 00 00 00 00 ) // ..:.....
+ .get instance int32 DIALib.IDiaSymbol::get_scoped()
+ } // end of property IDiaSymbol::scoped
+ .property int32 virtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3B 00 00 00 00 00 ) // ..;.....
+ .get instance int32 DIALib.IDiaSymbol::get_virtualBaseClass()
+ } // end of property IDiaSymbol::virtualBaseClass
+ .property int32 indirectVirtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3C 00 00 00 00 00 ) // ..<.....
+ .get instance int32 DIALib.IDiaSymbol::get_indirectVirtualBaseClass()
+ } // end of property IDiaSymbol::indirectVirtualBaseClass
+ .property int32 virtualBasePointerOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3D 00 00 00 00 00 ) // ..=.....
+ .get instance int32 DIALib.IDiaSymbol::get_virtualBasePointerOffset()
+ } // end of property IDiaSymbol::virtualBasePointerOffset
+ .property class DIALib.IDiaSymbol virtualTableShape()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3E 00 00 00 00 00 ) // ..>.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_virtualTableShape()
+ } // end of property IDiaSymbol::virtualTableShape
+ .property uint32 lexicalParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 40 00 00 00 00 00 ) // ..@.....
+ .get instance uint32 DIALib.IDiaSymbol::get_lexicalParentId()
+ } // end of property IDiaSymbol::lexicalParentId
+ .property uint32 classParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 41 00 00 00 00 00 ) // ..A.....
+ .get instance uint32 DIALib.IDiaSymbol::get_classParentId()
+ } // end of property IDiaSymbol::classParentId
+ .property uint32 typeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 42 00 00 00 00 00 ) // ..B.....
+ .get instance uint32 DIALib.IDiaSymbol::get_typeId()
+ } // end of property IDiaSymbol::typeId
+ .property uint32 arrayIndexTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 43 00 00 00 00 00 ) // ..C.....
+ .get instance uint32 DIALib.IDiaSymbol::get_arrayIndexTypeId()
+ } // end of property IDiaSymbol::arrayIndexTypeId
+ .property uint32 virtualTableShapeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 44 00 00 00 00 00 ) // ..D.....
+ .get instance uint32 DIALib.IDiaSymbol::get_virtualTableShapeId()
+ } // end of property IDiaSymbol::virtualTableShapeId
+ .property int32 code()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 45 00 00 00 00 00 ) // ..E.....
+ .get instance int32 DIALib.IDiaSymbol::get_code()
+ } // end of property IDiaSymbol::code
+ .property int32 function()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 46 00 00 00 00 00 ) // ..F.....
+ .get instance int32 DIALib.IDiaSymbol::get_function()
+ } // end of property IDiaSymbol::function
+ .property int32 'managed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 47 00 00 00 00 00 ) // ..G.....
+ .get instance int32 DIALib.IDiaSymbol::get_managed()
+ } // end of property IDiaSymbol::'managed'
+ .property int32 msil()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 48 00 00 00 00 00 ) // ..H.....
+ .get instance int32 DIALib.IDiaSymbol::get_msil()
+ } // end of property IDiaSymbol::msil
+ .property uint32 virtualBaseDispIndex()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 49 00 00 00 00 00 ) // ..I.....
+ .get instance uint32 DIALib.IDiaSymbol::get_virtualBaseDispIndex()
+ } // end of property IDiaSymbol::virtualBaseDispIndex
+ .property string undecoratedName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4A 00 00 00 00 00 ) // ..J.....
+ .get instance string DIALib.IDiaSymbol::get_undecoratedName()
+ } // end of property IDiaSymbol::undecoratedName
+ .property uint32 age()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4B 00 00 00 00 00 ) // ..K.....
+ .get instance uint32 DIALib.IDiaSymbol::get_age()
+ } // end of property IDiaSymbol::age
+ .property uint32 signature()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4C 00 00 00 00 00 ) // ..L.....
+ .get instance uint32 DIALib.IDiaSymbol::get_signature()
+ } // end of property IDiaSymbol::signature
+ .property int32 compilerGenerated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4D 00 00 00 00 00 ) // ..M.....
+ .get instance int32 DIALib.IDiaSymbol::get_compilerGenerated()
+ } // end of property IDiaSymbol::compilerGenerated
+ .property int32 addressTaken()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4E 00 00 00 00 00 ) // ..N.....
+ .get instance int32 DIALib.IDiaSymbol::get_addressTaken()
+ } // end of property IDiaSymbol::addressTaken
+ .property uint32 rank()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4F 00 00 00 00 00 ) // ..O.....
+ .get instance uint32 DIALib.IDiaSymbol::get_rank()
+ } // end of property IDiaSymbol::rank
+ .property class DIALib.IDiaSymbol lowerBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 50 00 00 00 00 00 ) // ..P.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_lowerBound()
+ } // end of property IDiaSymbol::lowerBound
+ .property class DIALib.IDiaSymbol upperBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 51 00 00 00 00 00 ) // ..Q.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_upperBound()
+ } // end of property IDiaSymbol::upperBound
+ .property uint32 lowerBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 52 00 00 00 00 00 ) // ..R.....
+ .get instance uint32 DIALib.IDiaSymbol::get_lowerBoundId()
+ } // end of property IDiaSymbol::lowerBoundId
+ .property uint32 upperBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 53 00 00 00 00 00 ) // ..S.....
+ .get instance uint32 DIALib.IDiaSymbol::get_upperBoundId()
+ } // end of property IDiaSymbol::upperBoundId
+ .property uint32 targetSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 54 00 00 00 00 00 ) // ..T.....
+ .get instance uint32 DIALib.IDiaSymbol::get_targetSection()
+ } // end of property IDiaSymbol::targetSection
+ .property uint32 targetOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 55 00 00 00 00 00 ) // ..U.....
+ .get instance uint32 DIALib.IDiaSymbol::get_targetOffset()
+ } // end of property IDiaSymbol::targetOffset
+ .property uint32 targetRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 56 00 00 00 00 00 ) // ..V.....
+ .get instance uint32 DIALib.IDiaSymbol::get_targetRelativeVirtualAddress()
+ } // end of property IDiaSymbol::targetRelativeVirtualAddress
+ .property uint64 targetVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 57 00 00 00 00 00 ) // ..W.....
+ .get instance uint64 DIALib.IDiaSymbol::get_targetVirtualAddress()
+ } // end of property IDiaSymbol::targetVirtualAddress
+ .property uint32 machineType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 58 00 00 00 00 00 ) // ..X.....
+ .get instance uint32 DIALib.IDiaSymbol::get_machineType()
+ } // end of property IDiaSymbol::machineType
+ .property uint32 oemId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 59 00 00 00 00 00 ) // ..Y.....
+ .get instance uint32 DIALib.IDiaSymbol::get_oemId()
+ } // end of property IDiaSymbol::oemId
+ .property uint32 oemSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5A 00 00 00 00 00 ) // ..Z.....
+ .get instance uint32 DIALib.IDiaSymbol::get_oemSymbolId()
+ } // end of property IDiaSymbol::oemSymbolId
+ .property class DIALib.IDiaSymbol objectPointerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5B 00 00 00 00 00 ) // ..[.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_objectPointerType()
+ } // end of property IDiaSymbol::objectPointerType
+ .property uint32 udtKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5C 00 00 00 00 00 ) // ..\.....
+ .get instance uint32 DIALib.IDiaSymbol::get_udtKind()
+ } // end of property IDiaSymbol::udtKind
+ .property int32 noReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5D 00 00 00 00 00 ) // ..].....
+ .get instance int32 DIALib.IDiaSymbol::get_noReturn()
+ } // end of property IDiaSymbol::noReturn
+ .property int32 customCallingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5E 00 00 00 00 00 ) // ..^.....
+ .get instance int32 DIALib.IDiaSymbol::get_customCallingConvention()
+ } // end of property IDiaSymbol::customCallingConvention
+ .property int32 noInline()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5F 00 00 00 00 00 ) // .._.....
+ .get instance int32 DIALib.IDiaSymbol::get_noInline()
+ } // end of property IDiaSymbol::noInline
+ .property int32 optimizedCodeDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 60 00 00 00 00 00 ) // ..`.....
+ .get instance int32 DIALib.IDiaSymbol::get_optimizedCodeDebugInfo()
+ } // end of property IDiaSymbol::optimizedCodeDebugInfo
+ .property int32 notReached()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 61 00 00 00 00 00 ) // ..a.....
+ .get instance int32 DIALib.IDiaSymbol::get_notReached()
+ } // end of property IDiaSymbol::notReached
+ .property int32 interruptReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 62 00 00 00 00 00 ) // ..b.....
+ .get instance int32 DIALib.IDiaSymbol::get_interruptReturn()
+ } // end of property IDiaSymbol::interruptReturn
+ .property int32 farReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 63 00 00 00 00 00 ) // ..c.....
+ .get instance int32 DIALib.IDiaSymbol::get_farReturn()
+ } // end of property IDiaSymbol::farReturn
+ .property int32 isStatic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 64 00 00 00 00 00 ) // ..d.....
+ .get instance int32 DIALib.IDiaSymbol::get_isStatic()
+ } // end of property IDiaSymbol::isStatic
+ .property int32 hasDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 65 00 00 00 00 00 ) // ..e.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasDebugInfo()
+ } // end of property IDiaSymbol::hasDebugInfo
+ .property int32 isLTCG()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 66 00 00 00 00 00 ) // ..f.....
+ .get instance int32 DIALib.IDiaSymbol::get_isLTCG()
+ } // end of property IDiaSymbol::isLTCG
+ .property int32 isDataAligned()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 67 00 00 00 00 00 ) // ..g.....
+ .get instance int32 DIALib.IDiaSymbol::get_isDataAligned()
+ } // end of property IDiaSymbol::isDataAligned
+ .property int32 hasSecurityChecks()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 68 00 00 00 00 00 ) // ..h.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasSecurityChecks()
+ } // end of property IDiaSymbol::hasSecurityChecks
+ .property string compilerName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 69 00 00 00 00 00 ) // ..i.....
+ .get instance string DIALib.IDiaSymbol::get_compilerName()
+ } // end of property IDiaSymbol::compilerName
+ .property int32 hasAlloca()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6A 00 00 00 00 00 ) // ..j.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasAlloca()
+ } // end of property IDiaSymbol::hasAlloca
+ .property int32 hasSetJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6B 00 00 00 00 00 ) // ..k.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasSetJump()
+ } // end of property IDiaSymbol::hasSetJump
+ .property int32 hasLongJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6C 00 00 00 00 00 ) // ..l.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasLongJump()
+ } // end of property IDiaSymbol::hasLongJump
+ .property int32 hasInlAsm()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6D 00 00 00 00 00 ) // ..m.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasInlAsm()
+ } // end of property IDiaSymbol::hasInlAsm
+ .property int32 hasEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6E 00 00 00 00 00 ) // ..n.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasEH()
+ } // end of property IDiaSymbol::hasEH
+ .property int32 hasSEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6F 00 00 00 00 00 ) // ..o.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasSEH()
+ } // end of property IDiaSymbol::hasSEH
+ .property int32 hasEHa()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 70 00 00 00 00 00 ) // ..p.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasEHa()
+ } // end of property IDiaSymbol::hasEHa
+ .property int32 isNaked()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 71 00 00 00 00 00 ) // ..q.....
+ .get instance int32 DIALib.IDiaSymbol::get_isNaked()
+ } // end of property IDiaSymbol::isNaked
+ .property int32 isAggregated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 72 00 00 00 00 00 ) // ..r.....
+ .get instance int32 DIALib.IDiaSymbol::get_isAggregated()
+ } // end of property IDiaSymbol::isAggregated
+ .property int32 isSplitted()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 73 00 00 00 00 00 ) // ..s.....
+ .get instance int32 DIALib.IDiaSymbol::get_isSplitted()
+ } // end of property IDiaSymbol::isSplitted
+ .property class DIALib.IDiaSymbol container()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 74 00 00 00 00 00 ) // ..t.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_container()
+ } // end of property IDiaSymbol::container
+ .property int32 inlSpec()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 75 00 00 00 00 00 ) // ..u.....
+ .get instance int32 DIALib.IDiaSymbol::get_inlSpec()
+ } // end of property IDiaSymbol::inlSpec
+ .property int32 noStackOrdering()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 76 00 00 00 00 00 ) // ..v.....
+ .get instance int32 DIALib.IDiaSymbol::get_noStackOrdering()
+ } // end of property IDiaSymbol::noStackOrdering
+ .property class DIALib.IDiaSymbol virtualBaseTableType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 77 00 00 00 00 00 ) // ..w.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_virtualBaseTableType()
+ } // end of property IDiaSymbol::virtualBaseTableType
+ .property int32 hasManagedCode()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 78 00 00 00 00 00 ) // ..x.....
+ .get instance int32 DIALib.IDiaSymbol::get_hasManagedCode()
+ } // end of property IDiaSymbol::hasManagedCode
+ .property int32 isHotpatchable()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 79 00 00 00 00 00 ) // ..y.....
+ .get instance int32 DIALib.IDiaSymbol::get_isHotpatchable()
+ } // end of property IDiaSymbol::isHotpatchable
+ .property int32 isCVTCIL()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7A 00 00 00 00 00 ) // ..z.....
+ .get instance int32 DIALib.IDiaSymbol::get_isCVTCIL()
+ } // end of property IDiaSymbol::isCVTCIL
+ .property int32 isMSILNetmodule()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7B 00 00 00 00 00 ) // ..{.....
+ .get instance int32 DIALib.IDiaSymbol::get_isMSILNetmodule()
+ } // end of property IDiaSymbol::isMSILNetmodule
+ .property int32 isCTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7C 00 00 00 00 00 ) // ..|.....
+ .get instance int32 DIALib.IDiaSymbol::get_isCTypes()
+ } // end of property IDiaSymbol::isCTypes
+ .property int32 isStripped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7D 00 00 00 00 00 ) // ..}.....
+ .get instance int32 DIALib.IDiaSymbol::get_isStripped()
+ } // end of property IDiaSymbol::isStripped
+ .property uint32 frontEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7E 00 00 00 00 00 ) // ..~.....
+ .get instance uint32 DIALib.IDiaSymbol::get_frontEndQFE()
+ } // end of property IDiaSymbol::frontEndQFE
+ .property uint32 backEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_backEndQFE()
+ } // end of property IDiaSymbol::backEndQFE
+ .property int32 wasInlined()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 80 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_wasInlined()
+ } // end of property IDiaSymbol::wasInlined
+ .property int32 strictGSCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 81 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_strictGSCheck()
+ } // end of property IDiaSymbol::strictGSCheck
+ .property int32 isCxxReturnUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 82 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isCxxReturnUdt()
+ } // end of property IDiaSymbol::isCxxReturnUdt
+ .property int32 isConstructorVirtualBase()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 83 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isConstructorVirtualBase()
+ } // end of property IDiaSymbol::isConstructorVirtualBase
+ .property int32 RValueReference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 84 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_RValueReference()
+ } // end of property IDiaSymbol::RValueReference
+ .property class DIALib.IDiaSymbol unmodifiedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 85 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_unmodifiedType()
+ } // end of property IDiaSymbol::unmodifiedType
+ .property int32 framePointerPresent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 86 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_framePointerPresent()
+ } // end of property IDiaSymbol::framePointerPresent
+ .property int32 isSafeBuffers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 87 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isSafeBuffers()
+ } // end of property IDiaSymbol::isSafeBuffers
+ .property int32 intrinsic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 88 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_intrinsic()
+ } // end of property IDiaSymbol::intrinsic
+ .property int32 'sealed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 89 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_sealed()
+ } // end of property IDiaSymbol::'sealed'
+ .property int32 hfaFloat()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_hfaFloat()
+ } // end of property IDiaSymbol::hfaFloat
+ .property int32 hfaDouble()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8B 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_hfaDouble()
+ } // end of property IDiaSymbol::hfaDouble
+ .property uint32 liveRangeStartAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_liveRangeStartAddressSection()
+ } // end of property IDiaSymbol::liveRangeStartAddressSection
+ .property uint32 liveRangeStartAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_liveRangeStartAddressOffset()
+ } // end of property IDiaSymbol::liveRangeStartAddressOffset
+ .property uint32 liveRangeStartRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_liveRangeStartRelativeVirtualAddress()
+ } // end of property IDiaSymbol::liveRangeStartRelativeVirtualAddress
+ .property uint32 countLiveRanges()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_countLiveRanges()
+ } // end of property IDiaSymbol::countLiveRanges
+ .property uint64 liveRangeLength()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 90 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol::get_liveRangeLength()
+ } // end of property IDiaSymbol::liveRangeLength
+ .property uint32 offsetInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 91 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_offsetInUdt()
+ } // end of property IDiaSymbol::offsetInUdt
+ .property uint32 paramBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 92 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_paramBasePointerRegisterId()
+ } // end of property IDiaSymbol::paramBasePointerRegisterId
+ .property uint32 localBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 93 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_localBasePointerRegisterId()
+ } // end of property IDiaSymbol::localBasePointerRegisterId
+ .property int32 isLocationControlFlowDependent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 94 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isLocationControlFlowDependent()
+ } // end of property IDiaSymbol::isLocationControlFlowDependent
+ .property uint32 stride()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 95 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_stride()
+ } // end of property IDiaSymbol::stride
+ .property uint32 numberOfRows()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 96 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_numberOfRows()
+ } // end of property IDiaSymbol::numberOfRows
+ .property uint32 numberOfColumns()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 97 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_numberOfColumns()
+ } // end of property IDiaSymbol::numberOfColumns
+ .property int32 isMatrixRowMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 98 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isMatrixRowMajor()
+ } // end of property IDiaSymbol::isMatrixRowMajor
+ .property int32 isReturnValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 99 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isReturnValue()
+ } // end of property IDiaSymbol::isReturnValue
+ .property int32 isOptimizedAway()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isOptimizedAway()
+ } // end of property IDiaSymbol::isOptimizedAway
+ .property uint32 builtInKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_builtInKind()
+ } // end of property IDiaSymbol::builtInKind
+ .property uint32 registerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_registerType()
+ } // end of property IDiaSymbol::registerType
+ .property uint32 baseDataSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_baseDataSlot()
+ } // end of property IDiaSymbol::baseDataSlot
+ .property uint32 baseDataOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_baseDataOffset()
+ } // end of property IDiaSymbol::baseDataOffset
+ .property uint32 textureSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_textureSlot()
+ } // end of property IDiaSymbol::textureSlot
+ .property uint32 samplerSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_samplerSlot()
+ } // end of property IDiaSymbol::samplerSlot
+ .property uint32 uavSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_uavSlot()
+ } // end of property IDiaSymbol::uavSlot
+ .property uint32 sizeInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_sizeInUdt()
+ } // end of property IDiaSymbol::sizeInUdt
+ .property uint32 memorySpaceKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_memorySpaceKind()
+ } // end of property IDiaSymbol::memorySpaceKind
+ .property uint32 unmodifiedTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_unmodifiedTypeId()
+ } // end of property IDiaSymbol::unmodifiedTypeId
+ .property uint32 subTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_subTypeId()
+ } // end of property IDiaSymbol::subTypeId
+ .property class DIALib.IDiaSymbol subType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A6 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_subType()
+ } // end of property IDiaSymbol::subType
+ .property uint32 numberOfModifiers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_numberOfModifiers()
+ } // end of property IDiaSymbol::numberOfModifiers
+ .property uint32 numberOfRegisterIndices()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A8 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_numberOfRegisterIndices()
+ } // end of property IDiaSymbol::numberOfRegisterIndices
+ .property int32 isHLSLData()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isHLSLData()
+ } // end of property IDiaSymbol::isHLSLData
+ .property int32 isPointerToDataMember()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isPointerToDataMember()
+ } // end of property IDiaSymbol::isPointerToDataMember
+ .property int32 isPointerToMemberFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isPointerToMemberFunction()
+ } // end of property IDiaSymbol::isPointerToMemberFunction
+ .property int32 isSingleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isSingleInheritance()
+ } // end of property IDiaSymbol::isSingleInheritance
+ .property int32 isMultipleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isMultipleInheritance()
+ } // end of property IDiaSymbol::isMultipleInheritance
+ .property int32 isVirtualInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isVirtualInheritance()
+ } // end of property IDiaSymbol::isVirtualInheritance
+ .property int32 restrictedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_restrictedType()
+ } // end of property IDiaSymbol::restrictedType
+ .property int32 isPointerBasedOnSymbolValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B0 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isPointerBasedOnSymbolValue()
+ } // end of property IDiaSymbol::isPointerBasedOnSymbolValue
+ .property class DIALib.IDiaSymbol baseSymbol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B1 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_baseSymbol()
+ } // end of property IDiaSymbol::baseSymbol
+ .property uint32 baseSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_baseSymbolId()
+ } // end of property IDiaSymbol::baseSymbolId
+ .property string objectFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B3 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol::get_objectFileName()
+ } // end of property IDiaSymbol::objectFileName
+ .property int32 isAcceleratorGroupSharedLocal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B4 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isAcceleratorGroupSharedLocal()
+ } // end of property IDiaSymbol::isAcceleratorGroupSharedLocal
+ .property int32 isAcceleratorPointerTagLiveRange()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B5 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isAcceleratorPointerTagLiveRange()
+ } // end of property IDiaSymbol::isAcceleratorPointerTagLiveRange
+ .property int32 isAcceleratorStubFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isAcceleratorStubFunction()
+ } // end of property IDiaSymbol::isAcceleratorStubFunction
+ .property uint32 numberOfAcceleratorPointerTags()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_numberOfAcceleratorPointerTags()
+ } // end of property IDiaSymbol::numberOfAcceleratorPointerTags
+ .property int32 isSdl()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isSdl()
+ } // end of property IDiaSymbol::isSdl
+ .property int32 isWinRTPointer()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isWinRTPointer()
+ } // end of property IDiaSymbol::isWinRTPointer
+ .property int32 isRefUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isRefUdt()
+ } // end of property IDiaSymbol::isRefUdt
+ .property int32 isValueUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isValueUdt()
+ } // end of property IDiaSymbol::isValueUdt
+ .property int32 isInterfaceUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isInterfaceUdt()
+ } // end of property IDiaSymbol::isInterfaceUdt
+ .property int32 isPGO()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isPGO()
+ } // end of property IDiaSymbol::isPGO
+ .property int32 hasValidPGOCounts()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_hasValidPGOCounts()
+ } // end of property IDiaSymbol::hasValidPGOCounts
+ .property int32 isOptimizedForSpeed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_isOptimizedForSpeed()
+ } // end of property IDiaSymbol::isOptimizedForSpeed
+ .property uint32 PGOEntryCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_PGOEntryCount()
+ } // end of property IDiaSymbol::PGOEntryCount
+ .property uint32 PGOEdgeCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_PGOEdgeCount()
+ } // end of property IDiaSymbol::PGOEdgeCount
+ .property uint64 PGODynamicInstructionCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol::get_PGODynamicInstructionCount()
+ } // end of property IDiaSymbol::PGODynamicInstructionCount
+ .property uint32 staticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_staticSize()
+ } // end of property IDiaSymbol::staticSize
+ .property uint32 finalLiveStaticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_finalLiveStaticSize()
+ } // end of property IDiaSymbol::finalLiveStaticSize
+ .property string phaseName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C5 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol::get_phaseName()
+ } // end of property IDiaSymbol::phaseName
+ .property int32 hasControlFlowCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_hasControlFlowCheck()
+ } // end of property IDiaSymbol::hasControlFlowCheck
+ .property int32 constantExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C7 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_constantExport()
+ } // end of property IDiaSymbol::constantExport
+ .property int32 dataExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_dataExport()
+ } // end of property IDiaSymbol::dataExport
+ .property int32 privateExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_privateExport()
+ } // end of property IDiaSymbol::privateExport
+ .property int32 noNameExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_noNameExport()
+ } // end of property IDiaSymbol::noNameExport
+ .property int32 exportHasExplicitlyAssignedOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_exportHasExplicitlyAssignedOrdinal()
+ } // end of property IDiaSymbol::exportHasExplicitlyAssignedOrdinal
+ .property int32 exportIsForwarder()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol::get_exportIsForwarder()
+ } // end of property IDiaSymbol::exportIsForwarder
+ .property uint32 ordinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CD 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_ordinal()
+ } // end of property IDiaSymbol::ordinal
+ .property uint32 frameSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CE 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_frameSize()
+ } // end of property IDiaSymbol::frameSize
+ .property uint32 exceptionHandlerAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CF 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_exceptionHandlerAddressSection()
+ } // end of property IDiaSymbol::exceptionHandlerAddressSection
+ .property uint32 exceptionHandlerAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_exceptionHandlerAddressOffset()
+ } // end of property IDiaSymbol::exceptionHandlerAddressOffset
+ .property uint32 exceptionHandlerRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_exceptionHandlerRelativeVirtualAddress()
+ } // end of property IDiaSymbol::exceptionHandlerRelativeVirtualAddress
+ .property uint64 exceptionHandlerVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol::get_exceptionHandlerVirtualAddress()
+ } // end of property IDiaSymbol::exceptionHandlerVirtualAddress
+ .property uint32 characteristics()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_characteristics()
+ } // end of property IDiaSymbol::characteristics
+ .property class DIALib.IDiaSymbol coffGroup()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D4 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol::get_coffGroup()
+ } // end of property IDiaSymbol::coffGroup
+ .property uint32 bindID()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_bindID()
+ } // end of property IDiaSymbol::bindID
+ .property uint32 bindSpace()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D6 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_bindSpace()
+ } // end of property IDiaSymbol::bindSpace
+ .property uint32 bindSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol::get_bindSlot()
+ } // end of property IDiaSymbol::bindSlot
+} // end of class DIALib.IDiaSymbol
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumTables
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 43 36 35 43 32 42 30 41 2D 31 31 35 30 // ..$C65C2B0A-1150
+ 2D 34 44 37 41 2D 41 46 43 43 2D 45 30 35 42 46 // -4D7A-AFCC-E05BF
+ 33 44 45 45 38 31 45 00 00 ) // 3DEE81E..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaEnumTables::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaEnumTables::get_count
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaTable
+ marshal( interface )
+ Item([in] object marshal( struct) index) runtime managed internalcall
+ {
+ } // end of method IDiaEnumTables::Item
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next(uint32 celt,
+ class DIALib.IDiaTable& marshal( interface ) rgelt,
+ uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumTables::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaEnumTables::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumTables::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumTables& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumTables::Clone
+
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaEnumTables::get_count()
+ } // end of property IDiaEnumTables::count
+} // end of class DIALib.IDiaEnumTables
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumSymbolsByAddr
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 36 32 34 42 37 44 39 43 2D 32 34 45 41 // ..$624B7D9C-24EA
+ 2D 34 34 32 31 2D 39 44 30 36 2D 33 42 35 37 37 // -4421-9D06-3B577
+ 34 37 31 43 31 46 41 00 00 ) // 471C1FA..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ symbolByAddr([in] uint32 isect,
+ [in] uint32 offset) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbolsByAddr::symbolByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ symbolByRVA([in] uint32 relativeVirtualAddress) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbolsByAddr::symbolByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ symbolByVA([in] uint64 virtualAddress) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbolsByAddr::symbolByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbolsByAddr::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Prev([in] uint32 celt,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbolsByAddr::Prev
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumSymbolsByAddr& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbolsByAddr::Clone
+
+} // end of class DIALib.IDiaEnumSymbolsByAddr
+
+.class public auto ansi sealed DIALib.SymTagEnum
+ extends [mscorlib]System.Enum
+{
+ .field public specialname rtspecialname int32 value__
+ .field public static literal valuetype DIALib.SymTagEnum SymTagNull = int32(0x00000000)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagExe = int32(0x00000001)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagCompiland = int32(0x00000002)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagCompilandDetails = int32(0x00000003)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagCompilandEnv = int32(0x00000004)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagFunction = int32(0x00000005)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagBlock = int32(0x00000006)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagData = int32(0x00000007)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagAnnotation = int32(0x00000008)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagLabel = int32(0x00000009)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagPublicSymbol = int32(0x0000000A)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagUDT = int32(0x0000000B)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagEnum = int32(0x0000000C)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagFunctionType = int32(0x0000000D)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagPointerType = int32(0x0000000E)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagArrayType = int32(0x0000000F)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagBaseType = int32(0x00000010)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagTypedef = int32(0x00000011)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagBaseClass = int32(0x00000012)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagFriend = int32(0x00000013)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagFunctionArgType = int32(0x00000014)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagFuncDebugStart = int32(0x00000015)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagFuncDebugEnd = int32(0x00000016)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagUsingNamespace = int32(0x00000017)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagVTableShape = int32(0x00000018)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagVTable = int32(0x00000019)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagCustom = int32(0x0000001A)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagThunk = int32(0x0000001B)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagCustomType = int32(0x0000001C)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagManagedType = int32(0x0000001D)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagDimension = int32(0x0000001E)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagCallSite = int32(0x0000001F)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagInlineSite = int32(0x00000020)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagBaseInterface = int32(0x00000021)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagVectorType = int32(0x00000022)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagMatrixType = int32(0x00000023)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagHLSLType = int32(0x00000024)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagCaller = int32(0x00000025)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagCallee = int32(0x00000026)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagExport = int32(0x00000027)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagHeapAllocationSite = int32(0x00000028)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagCoffGroup = int32(0x00000029)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagInlinee = int32(0x0000002A)
+ .field public static literal valuetype DIALib.SymTagEnum SymTagMax = int32(0x0000002B)
+} // end of class DIALib.SymTagEnum
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumSymbols
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 43 41 42 37 32 43 34 38 2D 34 34 33 42 // ..$CAB72C48-443B
+ 2D 34 38 46 35 2D 39 42 30 42 2D 34 32 46 30 38 // -48F5-9B0B-42F08
+ 32 30 41 42 32 39 41 00 00 ) // 20AB29A..
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbols::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbols::get_count
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ Item([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbols::Item
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbols::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbols::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbols::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSymbols::Clone
+
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaEnumSymbols::get_count()
+ } // end of property IDiaEnumSymbols::count
+} // end of class DIALib.IDiaEnumSymbols
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumSourceFiles
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 31 30 46 33 44 42 44 39 2D 36 36 34 46 // ..$10F3DBD9-664F
+ 2D 34 34 36 39 2D 42 38 30 38 2D 39 34 37 31 43 // -4469-B808-9471C
+ 37 41 35 30 35 33 38 00 00 ) // 7A50538..
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaEnumSourceFiles::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaEnumSourceFiles::get_count
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaSourceFile
+ marshal( interface )
+ Item([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSourceFiles::Item
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [out] class DIALib.IDiaSourceFile& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSourceFiles::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSourceFiles::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumSourceFiles::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumSourceFiles& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSourceFiles::Clone
+
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaEnumSourceFiles::get_count()
+ } // end of property IDiaEnumSourceFiles::count
+} // end of class DIALib.IDiaEnumSourceFiles
+
+.class interface public abstract auto ansi import DIALib.IDiaSourceFile
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 41 32 45 46 35 33 35 33 2D 46 35 41 38 // ..$A2EF5353-F5A8
+ 2D 34 45 42 33 2D 39 30 44 32 2D 43 42 35 32 36 // -4EB3-90D2-CB526
+ 41 43 42 33 43 44 44 00 00 ) // ACB3CDD..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_uniqueId() runtime managed internalcall
+ {
+ } // end of method IDiaSourceFile::get_uniqueId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_fileName() runtime managed internalcall
+ {
+ } // end of method IDiaSourceFile::get_fileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_checksumType() runtime managed internalcall
+ {
+ } // end of method IDiaSourceFile::get_checksumType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaEnumSymbols
+ marshal( interface )
+ get_compilands() runtime managed internalcall
+ {
+ } // end of method IDiaSourceFile::get_compilands
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_checksum([in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaSourceFile::get_checksum
+
+ .property uint32 uniqueId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSourceFile::get_uniqueId()
+ } // end of property IDiaSourceFile::uniqueId
+ .property string fileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSourceFile::get_fileName()
+ } // end of property IDiaSourceFile::fileName
+ .property uint32 checksumType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSourceFile::get_checksumType()
+ } // end of property IDiaSourceFile::checksumType
+ .property class DIALib.IDiaEnumSymbols compilands()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance class DIALib.IDiaEnumSymbols DIALib.IDiaSourceFile::get_compilands()
+ } // end of property IDiaSourceFile::compilands
+} // end of class DIALib.IDiaSourceFile
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumLineNumbers
+{
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 46 45 33 30 45 38 37 38 2D 35 34 41 43 // ..$FE30E878-54AC
+ 2D 34 34 46 31 2D 38 31 42 41 2D 33 39 44 45 39 // -44F1-81BA-39DE9
+ 34 30 46 36 30 35 32 00 00 ) // 40F6052..
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaEnumLineNumbers::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaEnumLineNumbers::get_count
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaLineNumber
+ marshal( interface )
+ Item([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaEnumLineNumbers::Item
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [out] class DIALib.IDiaLineNumber& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumLineNumbers::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaEnumLineNumbers::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumLineNumbers::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumLineNumbers::Clone
+
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaEnumLineNumbers::get_count()
+ } // end of property IDiaEnumLineNumbers::count
+} // end of class DIALib.IDiaEnumLineNumbers
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumInjectedSources
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 44 35 36 31 32 35 37 33 2D 36 39 32 35 // ..$D5612573-6925
+ 2D 34 34 36 38 2D 38 38 38 33 2D 39 38 43 44 45 // -4468-8883-98CDE
+ 43 38 43 33 38 34 41 00 00 ) // C8C384A..
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaEnumInjectedSources::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaEnumInjectedSources::get_count
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaInjectedSource
+ marshal( interface )
+ Item([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaEnumInjectedSources::Item
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [out] class DIALib.IDiaInjectedSource& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumInjectedSources::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaEnumInjectedSources::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumInjectedSources::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumInjectedSources& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumInjectedSources::Clone
+
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaEnumInjectedSources::get_count()
+ } // end of property IDiaEnumInjectedSources::count
+} // end of class DIALib.IDiaEnumInjectedSources
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumDebugStreams
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 30 38 43 42 42 34 31 45 2D 34 37 41 36 // ..$08CBB41E-47A6
+ 2D 34 46 38 37 2D 39 32 46 31 2D 31 43 39 43 38 // -4F87-92F1-1C9C8
+ 37 43 45 44 30 34 34 00 00 ) // 7CED044..
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreams::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreams::get_count
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaEnumDebugStreamData
+ marshal( interface )
+ Item([in] object marshal( struct) index) runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreams::Item
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [out] class DIALib.IDiaEnumDebugStreamData& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreams::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreams::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreams::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumDebugStreams& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreams::Clone
+
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaEnumDebugStreams::get_count()
+ } // end of property IDiaEnumDebugStreams::count
+} // end of class DIALib.IDiaEnumDebugStreams
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumInputAssemblyFiles
+{
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 31 43 37 46 46 36 35 33 2D 35 31 46 37 // ..$1C7FF653-51F7
+ 2D 34 35 37 45 2D 38 34 31 39 2D 42 32 30 46 35 // -457E-8419-B20F5
+ 37 45 46 37 45 34 44 00 00 ) // 7EF7E4D..
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaEnumInputAssemblyFiles::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaEnumInputAssemblyFiles::get_count
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaInputAssemblyFile
+ marshal( interface )
+ Item([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaEnumInputAssemblyFiles::Item
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumInputAssemblyFiles::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaEnumInputAssemblyFiles::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumInputAssemblyFiles::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumInputAssemblyFiles& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumInputAssemblyFiles::Clone
+
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaEnumInputAssemblyFiles::get_count()
+ } // end of property IDiaEnumInputAssemblyFiles::count
+} // end of class DIALib.IDiaEnumInputAssemblyFiles
+
+.class interface public abstract auto ansi import DIALib.IDiaInputAssemblyFile
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 33 42 46 45 35 36 42 30 2D 33 39 30 43 // ..$3BFE56B0-390C
+ 2D 34 38 36 33 2D 39 34 33 30 2D 31 46 33 44 30 // -4863-9430-1F3D0
+ 38 33 42 37 36 38 34 00 00 ) // 83B7684..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_uniqueId() runtime managed internalcall
+ {
+ } // end of method IDiaInputAssemblyFile::get_uniqueId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_index() runtime managed internalcall
+ {
+ } // end of method IDiaInputAssemblyFile::get_index
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_timeStamp() runtime managed internalcall
+ {
+ } // end of method IDiaInputAssemblyFile::get_timeStamp
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_pdbAvailableAtILMerge() runtime managed internalcall
+ {
+ } // end of method IDiaInputAssemblyFile::get_pdbAvailableAtILMerge
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_fileName() runtime managed internalcall
+ {
+ } // end of method IDiaInputAssemblyFile::get_fileName
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_version([in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaInputAssemblyFile::get_version
+
+ .property uint32 uniqueId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaInputAssemblyFile::get_uniqueId()
+ } // end of property IDiaInputAssemblyFile::uniqueId
+ .property uint32 index()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaInputAssemblyFile::get_index()
+ } // end of property IDiaInputAssemblyFile::index
+ .property uint32 timeStamp()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaInputAssemblyFile::get_timeStamp()
+ } // end of property IDiaInputAssemblyFile::timeStamp
+ .property int32 pdbAvailableAtILMerge()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaInputAssemblyFile::get_pdbAvailableAtILMerge()
+ } // end of property IDiaInputAssemblyFile::pdbAvailableAtILMerge
+ .property string fileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance string DIALib.IDiaInputAssemblyFile::get_fileName()
+ } // end of property IDiaInputAssemblyFile::fileName
+} // end of class DIALib.IDiaInputAssemblyFile
+
+.class interface public abstract auto ansi import DIALib.IDiaLineNumber
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 42 33 38 38 45 42 31 34 2D 42 45 34 44 // ..$B388EB14-BE4D
+ 2D 34 32 31 44 2D 41 38 41 31 2D 36 43 46 37 41 // -421D-A8A1-6CF7A
+ 42 30 35 37 30 38 36 00 00 ) // B057086..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_compiland() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_compiland
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSourceFile
+ marshal( interface )
+ get_sourceFile() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_sourceFile
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lineNumber() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_lineNumber
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lineNumberEnd() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_lineNumberEnd
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_columnNumber() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_columnNumber
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_columnNumberEnd() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_columnNumberEnd
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressSection() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_addressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_addressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_relativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_virtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_virtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_length() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_length
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_sourceFileId() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_sourceFileId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_statement() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_statement
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_compilandId() runtime managed internalcall
+ {
+ } // end of method IDiaLineNumber::get_compilandId
+
+ .property class DIALib.IDiaSymbol compiland()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaLineNumber::get_compiland()
+ } // end of property IDiaLineNumber::compiland
+ .property class DIALib.IDiaSourceFile sourceFile()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSourceFile DIALib.IDiaLineNumber::get_sourceFile()
+ } // end of property IDiaLineNumber::sourceFile
+ .property uint32 lineNumber()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_lineNumber()
+ } // end of property IDiaLineNumber::lineNumber
+ .property uint32 lineNumberEnd()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_lineNumberEnd()
+ } // end of property IDiaLineNumber::lineNumberEnd
+ .property uint32 columnNumber()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_columnNumber()
+ } // end of property IDiaLineNumber::columnNumber
+ .property uint32 columnNumberEnd()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_columnNumberEnd()
+ } // end of property IDiaLineNumber::columnNumberEnd
+ .property uint32 addressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 07 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_addressSection()
+ } // end of property IDiaLineNumber::addressSection
+ .property uint32 addressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_addressOffset()
+ } // end of property IDiaLineNumber::addressOffset
+ .property uint32 relativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_relativeVirtualAddress()
+ } // end of property IDiaLineNumber::relativeVirtualAddress
+ .property uint64 virtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaLineNumber::get_virtualAddress()
+ } // end of property IDiaLineNumber::virtualAddress
+ .property uint32 length()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_length()
+ } // end of property IDiaLineNumber::length
+ .property uint32 sourceFileId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_sourceFileId()
+ } // end of property IDiaLineNumber::sourceFileId
+ .property int32 statement()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaLineNumber::get_statement()
+ } // end of property IDiaLineNumber::statement
+ .property uint32 compilandId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaLineNumber::get_compilandId()
+ } // end of property IDiaLineNumber::compilandId
+} // end of class DIALib.IDiaLineNumber
+
+.class interface public abstract auto ansi import DIALib.IEnumUnknown
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 30 30 30 30 30 31 30 30 2D 30 30 30 30 // ..$00000100-0000
+ 2D 30 30 30 30 2D 43 30 30 30 2D 30 30 30 30 30 // -0000-C000-00000
+ 30 30 30 30 30 34 36 00 00 ) // 0000046..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot abstract virtual
+ instance void RemoteNext([in] uint32 celt,
+ [out] object& marshal( iunknown ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IEnumUnknown::RemoteNext
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IEnumUnknown::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IEnumUnknown::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IEnumUnknown& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IEnumUnknown::Clone
+
+} // end of class DIALib.IEnumUnknown
+
+.class interface public abstract auto ansi import DIALib.IDiaTable
+ implements DIALib.IEnumUnknown
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 34 41 35 39 46 42 37 37 2D 41 42 41 43 // ..$4A59FB77-ABAC
+ 2D 34 36 39 42 2D 41 33 30 42 2D 39 45 43 43 38 // -469B-A30B-9ECC8
+ 35 42 46 45 46 31 34 00 00 ) // 5BFEF14..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .method public hidebysig newslot abstract virtual
+ instance void RemoteNext([in] uint32 celt,
+ [out] object& marshal( iunknown ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaTable::RemoteNext
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaTable::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaTable::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IEnumUnknown& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaTable::Clone
+
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaTable::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_name() runtime managed internalcall
+ {
+ } // end of method IDiaTable::get_name
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaTable::get_count
+
+ .method public hidebysig newslot abstract virtual
+ instance object
+ marshal( iunknown )
+ Item([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaTable::Item
+
+ .property string name()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance string DIALib.IDiaTable::get_name()
+ } // end of property IDiaTable::name
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaTable::get_count()
+ } // end of property IDiaTable::count
+} // end of class DIALib.IDiaTable
+
+.class interface public abstract auto ansi import DIALib.IDiaInjectedSource
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 41 45 36 30 35 43 44 43 2D 38 31 30 35 // ..$AE605CDC-8105
+ 2D 34 41 32 33 2D 42 37 31 30 2D 33 32 35 39 46 // -4A23-B710-3259F
+ 31 45 32 36 31 31 32 00 00 ) // 1E26112..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_crc() runtime managed internalcall
+ {
+ } // end of method IDiaInjectedSource::get_crc
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_length() runtime managed internalcall
+ {
+ } // end of method IDiaInjectedSource::get_length
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_fileName() runtime managed internalcall
+ {
+ } // end of method IDiaInjectedSource::get_fileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_objectFileName() runtime managed internalcall
+ {
+ } // end of method IDiaInjectedSource::get_objectFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_virtualFilename() runtime managed internalcall
+ {
+ } // end of method IDiaInjectedSource::get_virtualFilename
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_sourceCompression() runtime managed internalcall
+ {
+ } // end of method IDiaInjectedSource::get_sourceCompression
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_source([in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaInjectedSource::get_source
+
+ .property uint32 crc()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaInjectedSource::get_crc()
+ } // end of property IDiaInjectedSource::crc
+ .property uint64 length()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaInjectedSource::get_length()
+ } // end of property IDiaInjectedSource::length
+ .property string fileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance string DIALib.IDiaInjectedSource::get_fileName()
+ } // end of property IDiaInjectedSource::fileName
+ .property string objectFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance string DIALib.IDiaInjectedSource::get_objectFileName()
+ } // end of property IDiaInjectedSource::objectFileName
+ .property string virtualFilename()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance string DIALib.IDiaInjectedSource::get_virtualFilename()
+ } // end of property IDiaInjectedSource::virtualFilename
+ .property uint32 sourceCompression()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaInjectedSource::get_sourceCompression()
+ } // end of property IDiaInjectedSource::sourceCompression
+} // end of class DIALib.IDiaInjectedSource
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumDebugStreamData
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 34 38 36 39 34 33 45 38 2D 44 31 38 37 // ..$486943E8-D187
+ 2D 34 41 36 42 2D 41 33 43 34 2D 32 39 31 32 35 // -4A6B-A3C4-29125
+ 39 46 46 46 36 30 44 00 00 ) // 9FFF60D..
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreamData::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreamData::get_count
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_name() runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreamData::get_name
+
+ .method public hidebysig newslot abstract virtual
+ instance void Item([in] uint32 index,
+ [in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreamData::Item
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreamData::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreamData::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreamData::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumDebugStreamData& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumDebugStreamData::Clone
+
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaEnumDebugStreamData::get_count()
+ } // end of property IDiaEnumDebugStreamData::count
+ .property string name()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance string DIALib.IDiaEnumDebugStreamData::get_name()
+ } // end of property IDiaEnumDebugStreamData::name
+} // end of class DIALib.IDiaEnumDebugStreamData
+
+.class public auto ansi sealed DIALib.MemoryTypeEnum
+ extends [mscorlib]System.Enum
+{
+ .field public specialname rtspecialname int32 value__
+ .field public static literal valuetype DIALib.MemoryTypeEnum MemTypeCode = int32(0x00000000)
+ .field public static literal valuetype DIALib.MemoryTypeEnum MemTypeData = int32(0x00000001)
+ .field public static literal valuetype DIALib.MemoryTypeEnum MemTypeStack = int32(0x00000002)
+ .field public static literal valuetype DIALib.MemoryTypeEnum MemTypeCodeOnHeap = int32(0x00000003)
+ .field public static literal valuetype DIALib.MemoryTypeEnum MemTypeAny = int32(0xFFFFFFFF)
+} // end of class DIALib.MemoryTypeEnum
+
+.class interface public abstract auto ansi import DIALib.IDiaFrameData
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 41 33 39 31 38 34 42 37 2D 36 41 33 36 // ..$A39184B7-6A36
+ 2D 34 32 44 45 2D 38 45 45 43 2D 37 44 46 39 46 // -42DE-8EEC-7DF9F
+ 33 46 35 39 46 33 33 00 00 ) // 3F59F33..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressSection() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_addressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_addressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_relativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_virtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_virtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lengthBlock() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_lengthBlock
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lengthLocals() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_lengthLocals
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lengthParams() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_lengthParams
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_maxStack() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_maxStack
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lengthProlog() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_lengthProlog
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lengthSavedRegisters() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_lengthSavedRegisters
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_program() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_program
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_systemExceptionHandling() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_systemExceptionHandling
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_cplusplusExceptionHandling() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_cplusplusExceptionHandling
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_functionStart() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_functionStart
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_allocatesBasePointer() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_allocatesBasePointer
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_type() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_type
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaFrameData
+ marshal( interface )
+ get_functionParent() runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::get_functionParent
+
+ .method public hidebysig newslot abstract virtual
+ instance void execute(class DIALib.IDiaStackWalkFrame marshal( interface ) frame) runtime managed internalcall
+ {
+ } // end of method IDiaFrameData::execute
+
+ .property uint32 addressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_addressSection()
+ } // end of property IDiaFrameData::addressSection
+ .property uint32 addressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_addressOffset()
+ } // end of property IDiaFrameData::addressOffset
+ .property uint32 relativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_relativeVirtualAddress()
+ } // end of property IDiaFrameData::relativeVirtualAddress
+ .property uint64 virtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaFrameData::get_virtualAddress()
+ } // end of property IDiaFrameData::virtualAddress
+ .property uint32 lengthBlock()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_lengthBlock()
+ } // end of property IDiaFrameData::lengthBlock
+ .property uint32 lengthLocals()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 07 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_lengthLocals()
+ } // end of property IDiaFrameData::lengthLocals
+ .property uint32 lengthParams()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_lengthParams()
+ } // end of property IDiaFrameData::lengthParams
+ .property uint32 maxStack()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_maxStack()
+ } // end of property IDiaFrameData::maxStack
+ .property uint32 lengthProlog()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_lengthProlog()
+ } // end of property IDiaFrameData::lengthProlog
+ .property uint32 lengthSavedRegisters()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_lengthSavedRegisters()
+ } // end of property IDiaFrameData::lengthSavedRegisters
+ .property string program()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance string DIALib.IDiaFrameData::get_program()
+ } // end of property IDiaFrameData::program
+ .property int32 systemExceptionHandling()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaFrameData::get_systemExceptionHandling()
+ } // end of property IDiaFrameData::systemExceptionHandling
+ .property int32 cplusplusExceptionHandling()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaFrameData::get_cplusplusExceptionHandling()
+ } // end of property IDiaFrameData::cplusplusExceptionHandling
+ .property int32 functionStart()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0F 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaFrameData::get_functionStart()
+ } // end of property IDiaFrameData::functionStart
+ .property int32 allocatesBasePointer()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 10 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaFrameData::get_allocatesBasePointer()
+ } // end of property IDiaFrameData::allocatesBasePointer
+ .property uint32 'type'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 11 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaFrameData::get_type()
+ } // end of property IDiaFrameData::'type'
+ .property class DIALib.IDiaFrameData functionParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 12 00 00 00 00 00 )
+ .get instance class DIALib.IDiaFrameData DIALib.IDiaFrameData::get_functionParent()
+ } // end of property IDiaFrameData::functionParent
+} // end of class DIALib.IDiaFrameData
+
+.class interface public abstract auto ansi import DIALib.IDiaStackWalkFrame
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 30 37 43 35 39 30 43 31 2D 34 33 38 44 // ..$07C590C1-438D
+ 2D 34 46 34 37 2D 42 44 43 44 2D 34 33 39 37 42 // -4F47-BDCD-4397B
+ 43 38 31 41 44 37 35 00 00 ) // C81AD75..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_registerValue([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkFrame::get_registerValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance void set_registerValue([in] uint32 index,
+ [in] uint64 pRetVal) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkFrame::set_registerValue
+
+ .method public hidebysig newslot abstract virtual
+ instance void readMemory([in] valuetype DIALib.MemoryTypeEnum 'type',
+ [in] uint64 va,
+ [in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkFrame::readMemory
+
+ .method public hidebysig newslot abstract virtual
+ instance void searchForReturnAddress([in] class DIALib.IDiaFrameData marshal( interface ) frame,
+ [out] uint64& returnAddress) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkFrame::searchForReturnAddress
+
+ .method public hidebysig newslot abstract virtual
+ instance void searchForReturnAddressStart([in] class DIALib.IDiaFrameData marshal( interface ) frame,
+ [in] uint64 startAddress,
+ [out] uint64& returnAddress) runtime managed internalcall
+ {
+ } // end of method IDiaStackWalkFrame::searchForReturnAddressStart
+
+ .property uint64 registerValue(uint32)
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .set instance void DIALib.IDiaStackWalkFrame::set_registerValue(uint32,
+ uint64)
+ .get instance uint64 DIALib.IDiaStackWalkFrame::get_registerValue(uint32)
+ } // end of property IDiaStackWalkFrame::registerValue
+} // end of class DIALib.IDiaStackWalkFrame
+
+.class interface public abstract auto ansi import DIALib.IDiaStackFrame
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 35 45 44 42 43 39 36 44 2D 43 44 44 36 // ..$5EDBC96D-CDD6
+ 2D 34 37 39 32 2D 41 46 42 45 2D 43 43 38 39 30 // -4792-AFBE-CC890
+ 30 37 44 39 36 31 30 00 00 ) // 07D9610..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_type() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_type
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_base() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_base
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_size() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_size
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_returnAddress() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_returnAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_localsBase() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_localsBase
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lengthLocals() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_lengthLocals
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lengthParams() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_lengthParams
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lengthProlog() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_lengthProlog
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lengthSavedRegisters() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_lengthSavedRegisters
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_systemExceptionHandling() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_systemExceptionHandling
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_cplusplusExceptionHandling() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_cplusplusExceptionHandling
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_functionStart() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_functionStart
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_allocatesBasePointer() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_allocatesBasePointer
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_maxStack() runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_maxStack
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_registerValue([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaStackFrame::get_registerValue
+
+ .property uint32 'type'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaStackFrame::get_type()
+ } // end of property IDiaStackFrame::'type'
+ .property uint64 base()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaStackFrame::get_base()
+ } // end of property IDiaStackFrame::base
+ .property uint32 size()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaStackFrame::get_size()
+ } // end of property IDiaStackFrame::size
+ .property uint64 returnAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaStackFrame::get_returnAddress()
+ } // end of property IDiaStackFrame::returnAddress
+ .property uint64 localsBase()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaStackFrame::get_localsBase()
+ } // end of property IDiaStackFrame::localsBase
+ .property uint32 lengthLocals()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaStackFrame::get_lengthLocals()
+ } // end of property IDiaStackFrame::lengthLocals
+ .property uint32 lengthParams()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 07 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaStackFrame::get_lengthParams()
+ } // end of property IDiaStackFrame::lengthParams
+ .property uint32 lengthProlog()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaStackFrame::get_lengthProlog()
+ } // end of property IDiaStackFrame::lengthProlog
+ .property uint32 lengthSavedRegisters()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaStackFrame::get_lengthSavedRegisters()
+ } // end of property IDiaStackFrame::lengthSavedRegisters
+ .property int32 systemExceptionHandling()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaStackFrame::get_systemExceptionHandling()
+ } // end of property IDiaStackFrame::systemExceptionHandling
+ .property int32 cplusplusExceptionHandling()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaStackFrame::get_cplusplusExceptionHandling()
+ } // end of property IDiaStackFrame::cplusplusExceptionHandling
+ .property int32 functionStart()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaStackFrame::get_functionStart()
+ } // end of property IDiaStackFrame::functionStart
+ .property int32 allocatesBasePointer()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaStackFrame::get_allocatesBasePointer()
+ } // end of property IDiaStackFrame::allocatesBasePointer
+ .property uint32 maxStack()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaStackFrame::get_maxStack()
+ } // end of property IDiaStackFrame::maxStack
+ .property uint64 registerValue(uint32)
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0F 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaStackFrame::get_registerValue(uint32)
+ } // end of property IDiaStackFrame::registerValue
+} // end of class DIALib.IDiaStackFrame
+
+.class interface public abstract auto ansi import DIALib.IDiaSectionContrib
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 30 43 46 34 42 36 30 45 2D 33 35 42 31 // ..$0CF4B60E-35B1
+ 2D 34 43 36 43 2D 42 44 44 38 2D 38 35 34 42 39 // -4C6C-BDD8-854B9
+ 43 38 45 33 38 35 37 00 00 ) // C8E3857..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_compiland() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_compiland
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_addressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_addressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_relativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_virtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_virtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_length() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_length
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_notPaged() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_notPaged
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_code() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_code
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_initializedData() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_initializedData
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_uninitializedData() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_uninitializedData
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_remove() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_remove
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_comdat() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_comdat
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_discardable() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_discardable
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_notCached() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_notCached
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_share() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_share
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_execute() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_execute
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_read() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_read
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_write() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_write
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_dataCrc() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_dataCrc
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relocationsCrc() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_relocationsCrc
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_compilandId() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_compilandId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_code16bit() runtime managed internalcall
+ {
+ } // end of method IDiaSectionContrib::get_code16bit
+
+ .property class DIALib.IDiaSymbol compiland()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSectionContrib::get_compiland()
+ } // end of property IDiaSectionContrib::compiland
+ .property uint32 addressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSectionContrib::get_addressSection()
+ } // end of property IDiaSectionContrib::addressSection
+ .property uint32 addressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSectionContrib::get_addressOffset()
+ } // end of property IDiaSectionContrib::addressOffset
+ .property uint32 relativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSectionContrib::get_relativeVirtualAddress()
+ } // end of property IDiaSectionContrib::relativeVirtualAddress
+ .property uint64 virtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSectionContrib::get_virtualAddress()
+ } // end of property IDiaSectionContrib::virtualAddress
+ .property uint32 length()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSectionContrib::get_length()
+ } // end of property IDiaSectionContrib::length
+ .property int32 notPaged()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_notPaged()
+ } // end of property IDiaSectionContrib::notPaged
+ .property int32 code()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_code()
+ } // end of property IDiaSectionContrib::code
+ .property int32 initializedData()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_initializedData()
+ } // end of property IDiaSectionContrib::initializedData
+ .property int32 uninitializedData()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_uninitializedData()
+ } // end of property IDiaSectionContrib::uninitializedData
+ .property int32 remove()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_remove()
+ } // end of property IDiaSectionContrib::remove
+ .property int32 comdat()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_comdat()
+ } // end of property IDiaSectionContrib::comdat
+ .property int32 discardable()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_discardable()
+ } // end of property IDiaSectionContrib::discardable
+ .property int32 notCached()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0F 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_notCached()
+ } // end of property IDiaSectionContrib::notCached
+ .property int32 share()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 10 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_share()
+ } // end of property IDiaSectionContrib::share
+ .property int32 execute()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 11 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_execute()
+ } // end of property IDiaSectionContrib::execute
+ .property int32 read()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 12 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_read()
+ } // end of property IDiaSectionContrib::read
+ .property int32 write()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 13 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_write()
+ } // end of property IDiaSectionContrib::write
+ .property uint32 dataCrc()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 14 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSectionContrib::get_dataCrc()
+ } // end of property IDiaSectionContrib::dataCrc
+ .property uint32 relocationsCrc()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 15 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSectionContrib::get_relocationsCrc()
+ } // end of property IDiaSectionContrib::relocationsCrc
+ .property uint32 compilandId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 16 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSectionContrib::get_compilandId()
+ } // end of property IDiaSectionContrib::compilandId
+ .property int32 code16bit()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 17 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSectionContrib::get_code16bit()
+ } // end of property IDiaSectionContrib::code16bit
+} // end of class DIALib.IDiaSectionContrib
+
+.class interface public abstract auto ansi import DIALib.IDiaEnumSectionContribs
+{
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 04 49 74 65 6D 00 00 ) // ...Item..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 31 39 39 34 44 45 42 32 2D 32 43 38 32 // ..$1994DEB2-2C82
+ 2D 34 42 31 44 2D 41 35 37 46 2D 41 46 46 34 32 // -4B1D-A57F-AFF42
+ 34 44 35 34 41 36 38 00 00 ) // 4D54A68..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot abstract virtual
+ instance class [mscorlib]System.Collections.IEnumerator
+ marshal( custom ("System.Runtime.InteropServices.CustomMarshalers.EnumeratorToEnumVariantMarshaler, CustomMarshalers, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",""))
+ GetEnumerator() runtime managed internalcall
+ {
+ } // end of method IDiaEnumSectionContribs::GetEnumerator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaEnumSectionContribs::get_count
+
+ .method public hidebysig newslot abstract virtual
+ instance class DIALib.IDiaSectionContrib
+ marshal( interface )
+ Item([in] uint32 index) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSectionContribs::Item
+
+ .method public hidebysig newslot abstract virtual
+ instance void Next([in] uint32 celt,
+ [out] class DIALib.IDiaSectionContrib& marshal( interface ) rgelt,
+ [out] uint32& pceltFetched) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSectionContribs::Next
+
+ .method public hidebysig newslot abstract virtual
+ instance void Skip([in] uint32 celt) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSectionContribs::Skip
+
+ .method public hidebysig newslot abstract virtual
+ instance void Reset() runtime managed internalcall
+ {
+ } // end of method IDiaEnumSectionContribs::Reset
+
+ .method public hidebysig newslot abstract virtual
+ instance void Clone([out] class DIALib.IDiaEnumSectionContribs& marshal( interface ) ppenum) runtime managed internalcall
+ {
+ } // end of method IDiaEnumSectionContribs::Clone
+
+ .property int32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaEnumSectionContribs::get_count()
+ } // end of property IDiaEnumSectionContribs::count
+} // end of class DIALib.IDiaEnumSectionContribs
+
+.class interface public abstract auto ansi import DIALib.IDiaSymbol2
+ implements DIALib.IDiaSymbol
+{
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 0A 73 79 6D 49 6E 64 65 78 49 64 00 00 ) // ...symIndexId..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 36 31 31 45 38 36 43 44 2D 42 37 44 31 // ..$611E86CD-B7D1
+ 2D 34 35 34 36 2D 38 41 31 35 2D 30 37 30 45 32 // -4546-8A15-070E2
+ 42 30 37 41 34 32 37 00 00 ) // B07A427..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symIndexId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_symIndexId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symTag() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_symTag
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_name() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_name
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lexicalParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_lexicalParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_classParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_classParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_type() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_type
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_dataKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_dataKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_locationType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_locationType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_addressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_addressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_relativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_virtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_virtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_registerId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_offset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_offset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_length() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_length
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_slot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_slot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_volatileType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_volatileType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_constType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_unalignedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_unalignedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_access() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_access
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_libraryName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_libraryName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_platform() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_platform
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_language() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_language
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_editAndContinueEnabled() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_editAndContinueEnabled
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_frontEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_frontEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_frontEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_backEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_backEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_backEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_sourceFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_sourceFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_unused() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_unused
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_thunkOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_thunkOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_thisAdjust() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_thisAdjust
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_virtualBaseOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtual() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_virtual
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intro() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_intro
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_pure() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_pure
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_callingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_callingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance object
+ marshal( struct)
+ get_value() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_value
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_baseType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_token() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_token
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_timeStamp() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_timeStamp
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance valuetype [mscorlib]System.Guid
+ get_guid() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_guid
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_symbolsFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_symbolsFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_reference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_reference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_count
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bitPosition() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_bitPosition
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_arrayIndexType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_arrayIndexType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_packed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_packed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constructor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_constructor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_overloadedOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_overloadedOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_nested() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_nested
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasNestedTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasNestedTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAssignmentOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasAssignmentOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasCastOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasCastOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_scoped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_scoped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_virtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_indirectVirtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_indirectVirtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBasePointerOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_virtualBasePointerOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualTableShape() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_virtualTableShape
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lexicalParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_lexicalParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_classParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_classParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_typeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_typeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_arrayIndexTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_arrayIndexTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualTableShapeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_virtualTableShapeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_code() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_code
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_function() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_function
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_managed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_managed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_msil() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_msil
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseDispIndex() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_virtualBaseDispIndex
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_undecoratedName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_undecoratedName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_age() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_age
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_signature() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_signature
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_compilerGenerated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_compilerGenerated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_addressTaken() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_addressTaken
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_rank() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_rank
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lowerBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_lowerBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_upperBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_upperBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lowerBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_lowerBoundId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_upperBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_upperBoundId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_dataBytes([in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_dataBytes
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildren([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findChildren
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenEx([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findChildrenEx
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByAddr([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findChildrenExByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findChildrenExByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByRVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findChildrenExByRVA
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_targetSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_targetOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_targetRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_targetVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_targetVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_machineType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_machineType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_oemId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_oemSymbolId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_types([in] uint32 cTypes,
+ [out] uint32& pcTypes,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) pTypes) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_types
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_typeIds([in] uint32 cTypeIds,
+ [out] uint32& pcTypeIds,
+ [out] uint32& pdwTypeIds) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_typeIds
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_objectPointerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_objectPointerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_udtKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_udtKind
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_undecoratedNameEx([in] uint32 undecorateOptions,
+ [out] string& marshal( bstr) name) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_undecoratedNameEx
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_noReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_customCallingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_customCallingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noInline() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_noInline
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_optimizedCodeDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_optimizedCodeDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_notReached() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_notReached
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_interruptReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_interruptReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_farReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_farReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStatic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isStatic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLTCG() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isLTCG
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isDataAligned() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isDataAligned
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSecurityChecks() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasSecurityChecks
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_compilerName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_compilerName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAlloca() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasAlloca
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSetJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasSetJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasLongJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasLongJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasInlAsm() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasInlAsm
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasSEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEHa() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasEHa
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isNaked() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isNaked
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAggregated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isAggregated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSplitted() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isSplitted
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_container() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_container
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_inlSpec() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_inlSpec
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noStackOrdering() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_noStackOrdering
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualBaseTableType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_virtualBaseTableType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasManagedCode() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasManagedCode
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHotpatchable() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isHotpatchable
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCVTCIL() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isCVTCIL
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMSILNetmodule() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isMSILNetmodule
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isCTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStripped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isStripped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_frontEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_backEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_wasInlined() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_wasInlined
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_strictGSCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_strictGSCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCxxReturnUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isCxxReturnUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isConstructorVirtualBase() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isConstructorVirtualBase
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_RValueReference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_RValueReference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_unmodifiedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_unmodifiedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_framePointerPresent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_framePointerPresent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSafeBuffers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isSafeBuffers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intrinsic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_intrinsic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_sealed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_sealed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaFloat() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hfaFloat
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaDouble() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hfaDouble
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_liveRangeStartAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_liveRangeStartAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_liveRangeStartRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_countLiveRanges() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_countLiveRanges
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_liveRangeLength() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_liveRangeLength
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_offsetInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_offsetInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_paramBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_paramBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_localBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_localBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLocationControlFlowDependent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isLocationControlFlowDependent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_stride() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_stride
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRows() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_numberOfRows
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfColumns() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_numberOfColumns
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMatrixRowMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isMatrixRowMajor
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_numericProperties([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pProperties) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_numericProperties
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_modifierValues([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint16& pModifiers) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_modifierValues
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isReturnValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isReturnValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedAway() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isOptimizedAway
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_builtInKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_builtInKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_registerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_baseDataSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_baseDataOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_textureSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_textureSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_samplerSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_samplerSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_uavSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_uavSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_sizeInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_sizeInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_memorySpaceKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_memorySpaceKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_unmodifiedTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_unmodifiedTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_subTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_subTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_subType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_subType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfModifiers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_numberOfModifiers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRegisterIndices() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_numberOfRegisterIndices
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHLSLData() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isHLSLData
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToDataMember() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isPointerToDataMember
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToMemberFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isPointerToMemberFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSingleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isSingleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMultipleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isMultipleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isVirtualInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isVirtualInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_restrictedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_restrictedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerBasedOnSymbolValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isPointerBasedOnSymbolValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_baseSymbol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_baseSymbol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_baseSymbolId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_objectFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_objectFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorGroupSharedLocal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isAcceleratorGroupSharedLocal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorPointerTagLiveRange() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isAcceleratorPointerTagLiveRange
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorStubFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isAcceleratorStubFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfAcceleratorPointerTags() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_numberOfAcceleratorPointerTags
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSdl() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isSdl
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isWinRTPointer() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isWinRTPointer
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isRefUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isRefUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isValueUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isValueUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isInterfaceUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isInterfaceUdt
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findInlineFramesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByRVA([in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findInlineFramesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByVA([in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findInlineFramesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLines([out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findInlineeLines
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findInlineeLinesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByRVA([in] uint32 rva,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findInlineeLinesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByVA([in] uint64 va,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findInlineeLinesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsForAcceleratorPointerTag([in] uint32 tagValue,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findSymbolsForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsByRVAForAcceleratorPointerTag([in] uint32 tagValue,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findSymbolsByRVAForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_acceleratorPointerTags([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pPointerTags) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_acceleratorPointerTags
+
+ .method public hidebysig newslot abstract virtual
+ instance void getSrcLineOnTypeDefn([out] class DIALib.IDiaLineNumber& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::getSrcLineOnTypeDefn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPGO() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isPGO
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasValidPGOCounts() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasValidPGOCounts
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedForSpeed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isOptimizedForSpeed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEntryCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_PGOEntryCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEdgeCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_PGOEdgeCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_PGODynamicInstructionCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_PGODynamicInstructionCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_staticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_staticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_finalLiveStaticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_finalLiveStaticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_phaseName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_phaseName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasControlFlowCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_hasControlFlowCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constantExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_constantExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_dataExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_dataExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_privateExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_privateExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noNameExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_noNameExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportHasExplicitlyAssignedOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_exportHasExplicitlyAssignedOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportIsForwarder() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_exportIsForwarder
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_ordinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_ordinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frameSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_frameSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_exceptionHandlerAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_exceptionHandlerAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_exceptionHandlerRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_exceptionHandlerVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_exceptionHandlerVirtualAddress
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssemblyFile([out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::findInputAssemblyFile
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_characteristics() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_characteristics
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_coffGroup() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_coffGroup
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindID() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_bindID
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSpace() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_bindSpace
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_bindSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isObjCClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCCategory() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isObjCCategory
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCProtocol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol2::get_isObjCProtocol
+
+ .property uint32 symIndexId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_symIndexId()
+ } // end of property IDiaSymbol2::symIndexId
+ .property uint32 symTag()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_symTag()
+ } // end of property IDiaSymbol2::symTag
+ .property string name()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol2::get_name()
+ } // end of property IDiaSymbol2::name
+ .property class DIALib.IDiaSymbol lexicalParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_lexicalParent()
+ } // end of property IDiaSymbol2::lexicalParent
+ .property class DIALib.IDiaSymbol classParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_classParent()
+ } // end of property IDiaSymbol2::classParent
+ .property class DIALib.IDiaSymbol 'type'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_type()
+ } // end of property IDiaSymbol2::'type'
+ .property uint32 dataKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_dataKind()
+ } // end of property IDiaSymbol2::dataKind
+ .property uint32 locationType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 07 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_locationType()
+ } // end of property IDiaSymbol2::locationType
+ .property uint32 addressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_addressSection()
+ } // end of property IDiaSymbol2::addressSection
+ .property uint32 addressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_addressOffset()
+ } // end of property IDiaSymbol2::addressOffset
+ .property uint32 relativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_relativeVirtualAddress()
+ } // end of property IDiaSymbol2::relativeVirtualAddress
+ .property uint64 virtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol2::get_virtualAddress()
+ } // end of property IDiaSymbol2::virtualAddress
+ .property uint32 registerId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_registerId()
+ } // end of property IDiaSymbol2::registerId
+ .property int32 offset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_offset()
+ } // end of property IDiaSymbol2::offset
+ .property uint64 length()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol2::get_length()
+ } // end of property IDiaSymbol2::length
+ .property uint32 slot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_slot()
+ } // end of property IDiaSymbol2::slot
+ .property int32 volatileType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 10 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_volatileType()
+ } // end of property IDiaSymbol2::volatileType
+ .property int32 constType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 11 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_constType()
+ } // end of property IDiaSymbol2::constType
+ .property int32 unalignedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 12 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_unalignedType()
+ } // end of property IDiaSymbol2::unalignedType
+ .property uint32 access()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 13 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_access()
+ } // end of property IDiaSymbol2::access
+ .property string libraryName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 14 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol2::get_libraryName()
+ } // end of property IDiaSymbol2::libraryName
+ .property uint32 platform()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 15 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_platform()
+ } // end of property IDiaSymbol2::platform
+ .property uint32 language()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 16 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_language()
+ } // end of property IDiaSymbol2::language
+ .property int32 editAndContinueEnabled()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 17 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_editAndContinueEnabled()
+ } // end of property IDiaSymbol2::editAndContinueEnabled
+ .property uint32 frontEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 18 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_frontEndMajor()
+ } // end of property IDiaSymbol2::frontEndMajor
+ .property uint32 frontEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 19 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_frontEndMinor()
+ } // end of property IDiaSymbol2::frontEndMinor
+ .property uint32 frontEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_frontEndBuild()
+ } // end of property IDiaSymbol2::frontEndBuild
+ .property uint32 backEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_backEndMajor()
+ } // end of property IDiaSymbol2::backEndMajor
+ .property uint32 backEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_backEndMinor()
+ } // end of property IDiaSymbol2::backEndMinor
+ .property uint32 backEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_backEndBuild()
+ } // end of property IDiaSymbol2::backEndBuild
+ .property string sourceFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1E 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol2::get_sourceFileName()
+ } // end of property IDiaSymbol2::sourceFileName
+ .property string 'unused'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1F 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol2::get_unused()
+ } // end of property IDiaSymbol2::'unused'
+ .property uint32 thunkOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 20 00 00 00 00 00 ) // .. .....
+ .get instance uint32 DIALib.IDiaSymbol2::get_thunkOrdinal()
+ } // end of property IDiaSymbol2::thunkOrdinal
+ .property int32 thisAdjust()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 21 00 00 00 00 00 ) // ..!.....
+ .get instance int32 DIALib.IDiaSymbol2::get_thisAdjust()
+ } // end of property IDiaSymbol2::thisAdjust
+ .property uint32 virtualBaseOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 22 00 00 00 00 00 ) // ..".....
+ .get instance uint32 DIALib.IDiaSymbol2::get_virtualBaseOffset()
+ } // end of property IDiaSymbol2::virtualBaseOffset
+ .property int32 'virtual'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 23 00 00 00 00 00 ) // ..#.....
+ .get instance int32 DIALib.IDiaSymbol2::get_virtual()
+ } // end of property IDiaSymbol2::'virtual'
+ .property int32 intro()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 24 00 00 00 00 00 ) // ..$.....
+ .get instance int32 DIALib.IDiaSymbol2::get_intro()
+ } // end of property IDiaSymbol2::intro
+ .property int32 pure()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 25 00 00 00 00 00 ) // ..%.....
+ .get instance int32 DIALib.IDiaSymbol2::get_pure()
+ } // end of property IDiaSymbol2::pure
+ .property uint32 callingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 26 00 00 00 00 00 ) // ..&.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_callingConvention()
+ } // end of property IDiaSymbol2::callingConvention
+ .property object 'value'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 27 00 00 00 00 00 ) // ..'.....
+ .get instance object DIALib.IDiaSymbol2::get_value()
+ } // end of property IDiaSymbol2::'value'
+ .property uint32 baseType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 28 00 00 00 00 00 ) // ..(.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_baseType()
+ } // end of property IDiaSymbol2::baseType
+ .property uint32 token()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 29 00 00 00 00 00 ) // ..).....
+ .get instance uint32 DIALib.IDiaSymbol2::get_token()
+ } // end of property IDiaSymbol2::token
+ .property uint32 timeStamp()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2A 00 00 00 00 00 ) // ..*.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_timeStamp()
+ } // end of property IDiaSymbol2::timeStamp
+ .property valuetype [mscorlib]System.Guid
+ guid()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2B 00 00 00 00 00 ) // ..+.....
+ .get instance valuetype [mscorlib]System.Guid DIALib.IDiaSymbol2::get_guid()
+ } // end of property IDiaSymbol2::guid
+ .property string symbolsFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2C 00 00 00 00 00 ) // ..,.....
+ .get instance string DIALib.IDiaSymbol2::get_symbolsFileName()
+ } // end of property IDiaSymbol2::symbolsFileName
+ .property int32 reference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2E 00 00 00 00 00 ) // ........
+ .get instance int32 DIALib.IDiaSymbol2::get_reference()
+ } // end of property IDiaSymbol2::reference
+ .property uint32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2F 00 00 00 00 00 ) // ../.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_count()
+ } // end of property IDiaSymbol2::count
+ .property uint32 bitPosition()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 31 00 00 00 00 00 ) // ..1.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_bitPosition()
+ } // end of property IDiaSymbol2::bitPosition
+ .property class DIALib.IDiaSymbol arrayIndexType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 32 00 00 00 00 00 ) // ..2.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_arrayIndexType()
+ } // end of property IDiaSymbol2::arrayIndexType
+ .property int32 packed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 33 00 00 00 00 00 ) // ..3.....
+ .get instance int32 DIALib.IDiaSymbol2::get_packed()
+ } // end of property IDiaSymbol2::packed
+ .property int32 constructor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 34 00 00 00 00 00 ) // ..4.....
+ .get instance int32 DIALib.IDiaSymbol2::get_constructor()
+ } // end of property IDiaSymbol2::constructor
+ .property int32 overloadedOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 35 00 00 00 00 00 ) // ..5.....
+ .get instance int32 DIALib.IDiaSymbol2::get_overloadedOperator()
+ } // end of property IDiaSymbol2::overloadedOperator
+ .property int32 'nested'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 36 00 00 00 00 00 ) // ..6.....
+ .get instance int32 DIALib.IDiaSymbol2::get_nested()
+ } // end of property IDiaSymbol2::'nested'
+ .property int32 hasNestedTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 37 00 00 00 00 00 ) // ..7.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasNestedTypes()
+ } // end of property IDiaSymbol2::hasNestedTypes
+ .property int32 hasAssignmentOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 38 00 00 00 00 00 ) // ..8.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasAssignmentOperator()
+ } // end of property IDiaSymbol2::hasAssignmentOperator
+ .property int32 hasCastOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 39 00 00 00 00 00 ) // ..9.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasCastOperator()
+ } // end of property IDiaSymbol2::hasCastOperator
+ .property int32 scoped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3A 00 00 00 00 00 ) // ..:.....
+ .get instance int32 DIALib.IDiaSymbol2::get_scoped()
+ } // end of property IDiaSymbol2::scoped
+ .property int32 virtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3B 00 00 00 00 00 ) // ..;.....
+ .get instance int32 DIALib.IDiaSymbol2::get_virtualBaseClass()
+ } // end of property IDiaSymbol2::virtualBaseClass
+ .property int32 indirectVirtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3C 00 00 00 00 00 ) // ..<.....
+ .get instance int32 DIALib.IDiaSymbol2::get_indirectVirtualBaseClass()
+ } // end of property IDiaSymbol2::indirectVirtualBaseClass
+ .property int32 virtualBasePointerOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3D 00 00 00 00 00 ) // ..=.....
+ .get instance int32 DIALib.IDiaSymbol2::get_virtualBasePointerOffset()
+ } // end of property IDiaSymbol2::virtualBasePointerOffset
+ .property class DIALib.IDiaSymbol virtualTableShape()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3E 00 00 00 00 00 ) // ..>.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_virtualTableShape()
+ } // end of property IDiaSymbol2::virtualTableShape
+ .property uint32 lexicalParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 40 00 00 00 00 00 ) // ..@.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_lexicalParentId()
+ } // end of property IDiaSymbol2::lexicalParentId
+ .property uint32 classParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 41 00 00 00 00 00 ) // ..A.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_classParentId()
+ } // end of property IDiaSymbol2::classParentId
+ .property uint32 typeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 42 00 00 00 00 00 ) // ..B.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_typeId()
+ } // end of property IDiaSymbol2::typeId
+ .property uint32 arrayIndexTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 43 00 00 00 00 00 ) // ..C.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_arrayIndexTypeId()
+ } // end of property IDiaSymbol2::arrayIndexTypeId
+ .property uint32 virtualTableShapeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 44 00 00 00 00 00 ) // ..D.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_virtualTableShapeId()
+ } // end of property IDiaSymbol2::virtualTableShapeId
+ .property int32 code()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 45 00 00 00 00 00 ) // ..E.....
+ .get instance int32 DIALib.IDiaSymbol2::get_code()
+ } // end of property IDiaSymbol2::code
+ .property int32 function()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 46 00 00 00 00 00 ) // ..F.....
+ .get instance int32 DIALib.IDiaSymbol2::get_function()
+ } // end of property IDiaSymbol2::function
+ .property int32 'managed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 47 00 00 00 00 00 ) // ..G.....
+ .get instance int32 DIALib.IDiaSymbol2::get_managed()
+ } // end of property IDiaSymbol2::'managed'
+ .property int32 msil()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 48 00 00 00 00 00 ) // ..H.....
+ .get instance int32 DIALib.IDiaSymbol2::get_msil()
+ } // end of property IDiaSymbol2::msil
+ .property uint32 virtualBaseDispIndex()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 49 00 00 00 00 00 ) // ..I.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_virtualBaseDispIndex()
+ } // end of property IDiaSymbol2::virtualBaseDispIndex
+ .property string undecoratedName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4A 00 00 00 00 00 ) // ..J.....
+ .get instance string DIALib.IDiaSymbol2::get_undecoratedName()
+ } // end of property IDiaSymbol2::undecoratedName
+ .property uint32 age()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4B 00 00 00 00 00 ) // ..K.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_age()
+ } // end of property IDiaSymbol2::age
+ .property uint32 signature()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4C 00 00 00 00 00 ) // ..L.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_signature()
+ } // end of property IDiaSymbol2::signature
+ .property int32 compilerGenerated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4D 00 00 00 00 00 ) // ..M.....
+ .get instance int32 DIALib.IDiaSymbol2::get_compilerGenerated()
+ } // end of property IDiaSymbol2::compilerGenerated
+ .property int32 addressTaken()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4E 00 00 00 00 00 ) // ..N.....
+ .get instance int32 DIALib.IDiaSymbol2::get_addressTaken()
+ } // end of property IDiaSymbol2::addressTaken
+ .property uint32 rank()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4F 00 00 00 00 00 ) // ..O.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_rank()
+ } // end of property IDiaSymbol2::rank
+ .property class DIALib.IDiaSymbol lowerBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 50 00 00 00 00 00 ) // ..P.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_lowerBound()
+ } // end of property IDiaSymbol2::lowerBound
+ .property class DIALib.IDiaSymbol upperBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 51 00 00 00 00 00 ) // ..Q.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_upperBound()
+ } // end of property IDiaSymbol2::upperBound
+ .property uint32 lowerBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 52 00 00 00 00 00 ) // ..R.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_lowerBoundId()
+ } // end of property IDiaSymbol2::lowerBoundId
+ .property uint32 upperBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 53 00 00 00 00 00 ) // ..S.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_upperBoundId()
+ } // end of property IDiaSymbol2::upperBoundId
+ .property uint32 targetSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 54 00 00 00 00 00 ) // ..T.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_targetSection()
+ } // end of property IDiaSymbol2::targetSection
+ .property uint32 targetOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 55 00 00 00 00 00 ) // ..U.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_targetOffset()
+ } // end of property IDiaSymbol2::targetOffset
+ .property uint32 targetRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 56 00 00 00 00 00 ) // ..V.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_targetRelativeVirtualAddress()
+ } // end of property IDiaSymbol2::targetRelativeVirtualAddress
+ .property uint64 targetVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 57 00 00 00 00 00 ) // ..W.....
+ .get instance uint64 DIALib.IDiaSymbol2::get_targetVirtualAddress()
+ } // end of property IDiaSymbol2::targetVirtualAddress
+ .property uint32 machineType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 58 00 00 00 00 00 ) // ..X.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_machineType()
+ } // end of property IDiaSymbol2::machineType
+ .property uint32 oemId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 59 00 00 00 00 00 ) // ..Y.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_oemId()
+ } // end of property IDiaSymbol2::oemId
+ .property uint32 oemSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5A 00 00 00 00 00 ) // ..Z.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_oemSymbolId()
+ } // end of property IDiaSymbol2::oemSymbolId
+ .property class DIALib.IDiaSymbol objectPointerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5B 00 00 00 00 00 ) // ..[.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_objectPointerType()
+ } // end of property IDiaSymbol2::objectPointerType
+ .property uint32 udtKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5C 00 00 00 00 00 ) // ..\.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_udtKind()
+ } // end of property IDiaSymbol2::udtKind
+ .property int32 noReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5D 00 00 00 00 00 ) // ..].....
+ .get instance int32 DIALib.IDiaSymbol2::get_noReturn()
+ } // end of property IDiaSymbol2::noReturn
+ .property int32 customCallingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5E 00 00 00 00 00 ) // ..^.....
+ .get instance int32 DIALib.IDiaSymbol2::get_customCallingConvention()
+ } // end of property IDiaSymbol2::customCallingConvention
+ .property int32 noInline()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5F 00 00 00 00 00 ) // .._.....
+ .get instance int32 DIALib.IDiaSymbol2::get_noInline()
+ } // end of property IDiaSymbol2::noInline
+ .property int32 optimizedCodeDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 60 00 00 00 00 00 ) // ..`.....
+ .get instance int32 DIALib.IDiaSymbol2::get_optimizedCodeDebugInfo()
+ } // end of property IDiaSymbol2::optimizedCodeDebugInfo
+ .property int32 notReached()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 61 00 00 00 00 00 ) // ..a.....
+ .get instance int32 DIALib.IDiaSymbol2::get_notReached()
+ } // end of property IDiaSymbol2::notReached
+ .property int32 interruptReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 62 00 00 00 00 00 ) // ..b.....
+ .get instance int32 DIALib.IDiaSymbol2::get_interruptReturn()
+ } // end of property IDiaSymbol2::interruptReturn
+ .property int32 farReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 63 00 00 00 00 00 ) // ..c.....
+ .get instance int32 DIALib.IDiaSymbol2::get_farReturn()
+ } // end of property IDiaSymbol2::farReturn
+ .property int32 isStatic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 64 00 00 00 00 00 ) // ..d.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isStatic()
+ } // end of property IDiaSymbol2::isStatic
+ .property int32 hasDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 65 00 00 00 00 00 ) // ..e.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasDebugInfo()
+ } // end of property IDiaSymbol2::hasDebugInfo
+ .property int32 isLTCG()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 66 00 00 00 00 00 ) // ..f.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isLTCG()
+ } // end of property IDiaSymbol2::isLTCG
+ .property int32 isDataAligned()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 67 00 00 00 00 00 ) // ..g.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isDataAligned()
+ } // end of property IDiaSymbol2::isDataAligned
+ .property int32 hasSecurityChecks()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 68 00 00 00 00 00 ) // ..h.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasSecurityChecks()
+ } // end of property IDiaSymbol2::hasSecurityChecks
+ .property string compilerName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 69 00 00 00 00 00 ) // ..i.....
+ .get instance string DIALib.IDiaSymbol2::get_compilerName()
+ } // end of property IDiaSymbol2::compilerName
+ .property int32 hasAlloca()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6A 00 00 00 00 00 ) // ..j.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasAlloca()
+ } // end of property IDiaSymbol2::hasAlloca
+ .property int32 hasSetJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6B 00 00 00 00 00 ) // ..k.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasSetJump()
+ } // end of property IDiaSymbol2::hasSetJump
+ .property int32 hasLongJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6C 00 00 00 00 00 ) // ..l.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasLongJump()
+ } // end of property IDiaSymbol2::hasLongJump
+ .property int32 hasInlAsm()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6D 00 00 00 00 00 ) // ..m.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasInlAsm()
+ } // end of property IDiaSymbol2::hasInlAsm
+ .property int32 hasEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6E 00 00 00 00 00 ) // ..n.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasEH()
+ } // end of property IDiaSymbol2::hasEH
+ .property int32 hasSEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6F 00 00 00 00 00 ) // ..o.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasSEH()
+ } // end of property IDiaSymbol2::hasSEH
+ .property int32 hasEHa()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 70 00 00 00 00 00 ) // ..p.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasEHa()
+ } // end of property IDiaSymbol2::hasEHa
+ .property int32 isNaked()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 71 00 00 00 00 00 ) // ..q.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isNaked()
+ } // end of property IDiaSymbol2::isNaked
+ .property int32 isAggregated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 72 00 00 00 00 00 ) // ..r.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isAggregated()
+ } // end of property IDiaSymbol2::isAggregated
+ .property int32 isSplitted()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 73 00 00 00 00 00 ) // ..s.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isSplitted()
+ } // end of property IDiaSymbol2::isSplitted
+ .property class DIALib.IDiaSymbol container()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 74 00 00 00 00 00 ) // ..t.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_container()
+ } // end of property IDiaSymbol2::container
+ .property int32 inlSpec()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 75 00 00 00 00 00 ) // ..u.....
+ .get instance int32 DIALib.IDiaSymbol2::get_inlSpec()
+ } // end of property IDiaSymbol2::inlSpec
+ .property int32 noStackOrdering()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 76 00 00 00 00 00 ) // ..v.....
+ .get instance int32 DIALib.IDiaSymbol2::get_noStackOrdering()
+ } // end of property IDiaSymbol2::noStackOrdering
+ .property class DIALib.IDiaSymbol virtualBaseTableType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 77 00 00 00 00 00 ) // ..w.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_virtualBaseTableType()
+ } // end of property IDiaSymbol2::virtualBaseTableType
+ .property int32 hasManagedCode()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 78 00 00 00 00 00 ) // ..x.....
+ .get instance int32 DIALib.IDiaSymbol2::get_hasManagedCode()
+ } // end of property IDiaSymbol2::hasManagedCode
+ .property int32 isHotpatchable()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 79 00 00 00 00 00 ) // ..y.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isHotpatchable()
+ } // end of property IDiaSymbol2::isHotpatchable
+ .property int32 isCVTCIL()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7A 00 00 00 00 00 ) // ..z.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isCVTCIL()
+ } // end of property IDiaSymbol2::isCVTCIL
+ .property int32 isMSILNetmodule()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7B 00 00 00 00 00 ) // ..{.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isMSILNetmodule()
+ } // end of property IDiaSymbol2::isMSILNetmodule
+ .property int32 isCTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7C 00 00 00 00 00 ) // ..|.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isCTypes()
+ } // end of property IDiaSymbol2::isCTypes
+ .property int32 isStripped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7D 00 00 00 00 00 ) // ..}.....
+ .get instance int32 DIALib.IDiaSymbol2::get_isStripped()
+ } // end of property IDiaSymbol2::isStripped
+ .property uint32 frontEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7E 00 00 00 00 00 ) // ..~.....
+ .get instance uint32 DIALib.IDiaSymbol2::get_frontEndQFE()
+ } // end of property IDiaSymbol2::frontEndQFE
+ .property uint32 backEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_backEndQFE()
+ } // end of property IDiaSymbol2::backEndQFE
+ .property int32 wasInlined()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 80 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_wasInlined()
+ } // end of property IDiaSymbol2::wasInlined
+ .property int32 strictGSCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 81 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_strictGSCheck()
+ } // end of property IDiaSymbol2::strictGSCheck
+ .property int32 isCxxReturnUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 82 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isCxxReturnUdt()
+ } // end of property IDiaSymbol2::isCxxReturnUdt
+ .property int32 isConstructorVirtualBase()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 83 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isConstructorVirtualBase()
+ } // end of property IDiaSymbol2::isConstructorVirtualBase
+ .property int32 RValueReference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 84 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_RValueReference()
+ } // end of property IDiaSymbol2::RValueReference
+ .property class DIALib.IDiaSymbol unmodifiedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 85 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_unmodifiedType()
+ } // end of property IDiaSymbol2::unmodifiedType
+ .property int32 framePointerPresent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 86 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_framePointerPresent()
+ } // end of property IDiaSymbol2::framePointerPresent
+ .property int32 isSafeBuffers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 87 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isSafeBuffers()
+ } // end of property IDiaSymbol2::isSafeBuffers
+ .property int32 intrinsic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 88 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_intrinsic()
+ } // end of property IDiaSymbol2::intrinsic
+ .property int32 'sealed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 89 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_sealed()
+ } // end of property IDiaSymbol2::'sealed'
+ .property int32 hfaFloat()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_hfaFloat()
+ } // end of property IDiaSymbol2::hfaFloat
+ .property int32 hfaDouble()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8B 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_hfaDouble()
+ } // end of property IDiaSymbol2::hfaDouble
+ .property uint32 liveRangeStartAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_liveRangeStartAddressSection()
+ } // end of property IDiaSymbol2::liveRangeStartAddressSection
+ .property uint32 liveRangeStartAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_liveRangeStartAddressOffset()
+ } // end of property IDiaSymbol2::liveRangeStartAddressOffset
+ .property uint32 liveRangeStartRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_liveRangeStartRelativeVirtualAddress()
+ } // end of property IDiaSymbol2::liveRangeStartRelativeVirtualAddress
+ .property uint32 countLiveRanges()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_countLiveRanges()
+ } // end of property IDiaSymbol2::countLiveRanges
+ .property uint64 liveRangeLength()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 90 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol2::get_liveRangeLength()
+ } // end of property IDiaSymbol2::liveRangeLength
+ .property uint32 offsetInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 91 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_offsetInUdt()
+ } // end of property IDiaSymbol2::offsetInUdt
+ .property uint32 paramBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 92 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_paramBasePointerRegisterId()
+ } // end of property IDiaSymbol2::paramBasePointerRegisterId
+ .property uint32 localBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 93 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_localBasePointerRegisterId()
+ } // end of property IDiaSymbol2::localBasePointerRegisterId
+ .property int32 isLocationControlFlowDependent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 94 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isLocationControlFlowDependent()
+ } // end of property IDiaSymbol2::isLocationControlFlowDependent
+ .property uint32 stride()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 95 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_stride()
+ } // end of property IDiaSymbol2::stride
+ .property uint32 numberOfRows()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 96 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_numberOfRows()
+ } // end of property IDiaSymbol2::numberOfRows
+ .property uint32 numberOfColumns()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 97 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_numberOfColumns()
+ } // end of property IDiaSymbol2::numberOfColumns
+ .property int32 isMatrixRowMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 98 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isMatrixRowMajor()
+ } // end of property IDiaSymbol2::isMatrixRowMajor
+ .property int32 isReturnValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 99 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isReturnValue()
+ } // end of property IDiaSymbol2::isReturnValue
+ .property int32 isOptimizedAway()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isOptimizedAway()
+ } // end of property IDiaSymbol2::isOptimizedAway
+ .property uint32 builtInKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_builtInKind()
+ } // end of property IDiaSymbol2::builtInKind
+ .property uint32 registerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_registerType()
+ } // end of property IDiaSymbol2::registerType
+ .property uint32 baseDataSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_baseDataSlot()
+ } // end of property IDiaSymbol2::baseDataSlot
+ .property uint32 baseDataOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_baseDataOffset()
+ } // end of property IDiaSymbol2::baseDataOffset
+ .property uint32 textureSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_textureSlot()
+ } // end of property IDiaSymbol2::textureSlot
+ .property uint32 samplerSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_samplerSlot()
+ } // end of property IDiaSymbol2::samplerSlot
+ .property uint32 uavSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_uavSlot()
+ } // end of property IDiaSymbol2::uavSlot
+ .property uint32 sizeInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_sizeInUdt()
+ } // end of property IDiaSymbol2::sizeInUdt
+ .property uint32 memorySpaceKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_memorySpaceKind()
+ } // end of property IDiaSymbol2::memorySpaceKind
+ .property uint32 unmodifiedTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_unmodifiedTypeId()
+ } // end of property IDiaSymbol2::unmodifiedTypeId
+ .property uint32 subTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_subTypeId()
+ } // end of property IDiaSymbol2::subTypeId
+ .property class DIALib.IDiaSymbol subType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A6 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_subType()
+ } // end of property IDiaSymbol2::subType
+ .property uint32 numberOfModifiers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_numberOfModifiers()
+ } // end of property IDiaSymbol2::numberOfModifiers
+ .property uint32 numberOfRegisterIndices()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A8 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_numberOfRegisterIndices()
+ } // end of property IDiaSymbol2::numberOfRegisterIndices
+ .property int32 isHLSLData()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isHLSLData()
+ } // end of property IDiaSymbol2::isHLSLData
+ .property int32 isPointerToDataMember()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isPointerToDataMember()
+ } // end of property IDiaSymbol2::isPointerToDataMember
+ .property int32 isPointerToMemberFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isPointerToMemberFunction()
+ } // end of property IDiaSymbol2::isPointerToMemberFunction
+ .property int32 isSingleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isSingleInheritance()
+ } // end of property IDiaSymbol2::isSingleInheritance
+ .property int32 isMultipleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isMultipleInheritance()
+ } // end of property IDiaSymbol2::isMultipleInheritance
+ .property int32 isVirtualInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isVirtualInheritance()
+ } // end of property IDiaSymbol2::isVirtualInheritance
+ .property int32 restrictedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_restrictedType()
+ } // end of property IDiaSymbol2::restrictedType
+ .property int32 isPointerBasedOnSymbolValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B0 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isPointerBasedOnSymbolValue()
+ } // end of property IDiaSymbol2::isPointerBasedOnSymbolValue
+ .property class DIALib.IDiaSymbol baseSymbol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B1 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_baseSymbol()
+ } // end of property IDiaSymbol2::baseSymbol
+ .property uint32 baseSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_baseSymbolId()
+ } // end of property IDiaSymbol2::baseSymbolId
+ .property string objectFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B3 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol2::get_objectFileName()
+ } // end of property IDiaSymbol2::objectFileName
+ .property int32 isAcceleratorGroupSharedLocal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B4 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isAcceleratorGroupSharedLocal()
+ } // end of property IDiaSymbol2::isAcceleratorGroupSharedLocal
+ .property int32 isAcceleratorPointerTagLiveRange()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B5 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isAcceleratorPointerTagLiveRange()
+ } // end of property IDiaSymbol2::isAcceleratorPointerTagLiveRange
+ .property int32 isAcceleratorStubFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isAcceleratorStubFunction()
+ } // end of property IDiaSymbol2::isAcceleratorStubFunction
+ .property uint32 numberOfAcceleratorPointerTags()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_numberOfAcceleratorPointerTags()
+ } // end of property IDiaSymbol2::numberOfAcceleratorPointerTags
+ .property int32 isSdl()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isSdl()
+ } // end of property IDiaSymbol2::isSdl
+ .property int32 isWinRTPointer()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isWinRTPointer()
+ } // end of property IDiaSymbol2::isWinRTPointer
+ .property int32 isRefUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isRefUdt()
+ } // end of property IDiaSymbol2::isRefUdt
+ .property int32 isValueUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isValueUdt()
+ } // end of property IDiaSymbol2::isValueUdt
+ .property int32 isInterfaceUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isInterfaceUdt()
+ } // end of property IDiaSymbol2::isInterfaceUdt
+ .property int32 isPGO()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isPGO()
+ } // end of property IDiaSymbol2::isPGO
+ .property int32 hasValidPGOCounts()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_hasValidPGOCounts()
+ } // end of property IDiaSymbol2::hasValidPGOCounts
+ .property int32 isOptimizedForSpeed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isOptimizedForSpeed()
+ } // end of property IDiaSymbol2::isOptimizedForSpeed
+ .property uint32 PGOEntryCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_PGOEntryCount()
+ } // end of property IDiaSymbol2::PGOEntryCount
+ .property uint32 PGOEdgeCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_PGOEdgeCount()
+ } // end of property IDiaSymbol2::PGOEdgeCount
+ .property uint64 PGODynamicInstructionCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol2::get_PGODynamicInstructionCount()
+ } // end of property IDiaSymbol2::PGODynamicInstructionCount
+ .property uint32 staticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_staticSize()
+ } // end of property IDiaSymbol2::staticSize
+ .property uint32 finalLiveStaticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_finalLiveStaticSize()
+ } // end of property IDiaSymbol2::finalLiveStaticSize
+ .property string phaseName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C5 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol2::get_phaseName()
+ } // end of property IDiaSymbol2::phaseName
+ .property int32 hasControlFlowCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_hasControlFlowCheck()
+ } // end of property IDiaSymbol2::hasControlFlowCheck
+ .property int32 constantExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C7 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_constantExport()
+ } // end of property IDiaSymbol2::constantExport
+ .property int32 dataExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_dataExport()
+ } // end of property IDiaSymbol2::dataExport
+ .property int32 privateExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_privateExport()
+ } // end of property IDiaSymbol2::privateExport
+ .property int32 noNameExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_noNameExport()
+ } // end of property IDiaSymbol2::noNameExport
+ .property int32 exportHasExplicitlyAssignedOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_exportHasExplicitlyAssignedOrdinal()
+ } // end of property IDiaSymbol2::exportHasExplicitlyAssignedOrdinal
+ .property int32 exportIsForwarder()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_exportIsForwarder()
+ } // end of property IDiaSymbol2::exportIsForwarder
+ .property uint32 ordinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CD 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_ordinal()
+ } // end of property IDiaSymbol2::ordinal
+ .property uint32 frameSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CE 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_frameSize()
+ } // end of property IDiaSymbol2::frameSize
+ .property uint32 exceptionHandlerAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CF 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_exceptionHandlerAddressSection()
+ } // end of property IDiaSymbol2::exceptionHandlerAddressSection
+ .property uint32 exceptionHandlerAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_exceptionHandlerAddressOffset()
+ } // end of property IDiaSymbol2::exceptionHandlerAddressOffset
+ .property uint32 exceptionHandlerRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_exceptionHandlerRelativeVirtualAddress()
+ } // end of property IDiaSymbol2::exceptionHandlerRelativeVirtualAddress
+ .property uint64 exceptionHandlerVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol2::get_exceptionHandlerVirtualAddress()
+ } // end of property IDiaSymbol2::exceptionHandlerVirtualAddress
+ .property uint32 characteristics()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_characteristics()
+ } // end of property IDiaSymbol2::characteristics
+ .property class DIALib.IDiaSymbol coffGroup()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D4 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol2::get_coffGroup()
+ } // end of property IDiaSymbol2::coffGroup
+ .property uint32 bindID()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_bindID()
+ } // end of property IDiaSymbol2::bindID
+ .property uint32 bindSpace()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D6 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_bindSpace()
+ } // end of property IDiaSymbol2::bindSpace
+ .property uint32 bindSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol2::get_bindSlot()
+ } // end of property IDiaSymbol2::bindSlot
+ .property int32 isObjCClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isObjCClass()
+ } // end of property IDiaSymbol2::isObjCClass
+ .property int32 isObjCCategory()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isObjCCategory()
+ } // end of property IDiaSymbol2::isObjCCategory
+ .property int32 isObjCProtocol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol2::get_isObjCProtocol()
+ } // end of property IDiaSymbol2::isObjCProtocol
+} // end of class DIALib.IDiaSymbol2
+
+.class interface public abstract auto ansi import DIALib.IDiaSymbol3
+ implements DIALib.IDiaSymbol2
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 39 39 42 36 36 35 46 37 2D 43 31 42 32 // ..$99B665F7-C1B2
+ 2D 34 39 44 33 2D 38 39 42 32 2D 41 33 38 34 33 // -49D3-89B2-A3843
+ 36 31 41 43 41 42 35 00 00 ) // 61ACAB5..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 0A 73 79 6D 49 6E 64 65 78 49 64 00 00 ) // ...symIndexId..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symIndexId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_symIndexId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symTag() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_symTag
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_name() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_name
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lexicalParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_lexicalParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_classParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_classParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_type() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_type
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_dataKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_dataKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_locationType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_locationType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_addressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_addressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_relativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_virtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_virtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_registerId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_offset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_offset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_length() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_length
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_slot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_slot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_volatileType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_volatileType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_constType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_unalignedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_unalignedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_access() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_access
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_libraryName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_libraryName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_platform() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_platform
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_language() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_language
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_editAndContinueEnabled() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_editAndContinueEnabled
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_frontEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_frontEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_frontEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_backEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_backEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_backEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_sourceFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_sourceFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_unused() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_unused
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_thunkOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_thunkOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_thisAdjust() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_thisAdjust
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_virtualBaseOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtual() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_virtual
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intro() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_intro
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_pure() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_pure
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_callingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_callingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance object
+ marshal( struct)
+ get_value() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_value
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_baseType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_token() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_token
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_timeStamp() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_timeStamp
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance valuetype [mscorlib]System.Guid
+ get_guid() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_guid
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_symbolsFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_symbolsFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_reference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_reference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_count
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bitPosition() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_bitPosition
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_arrayIndexType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_arrayIndexType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_packed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_packed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constructor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_constructor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_overloadedOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_overloadedOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_nested() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_nested
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasNestedTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasNestedTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAssignmentOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasAssignmentOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasCastOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasCastOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_scoped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_scoped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_virtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_indirectVirtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_indirectVirtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBasePointerOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_virtualBasePointerOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualTableShape() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_virtualTableShape
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lexicalParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_lexicalParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_classParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_classParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_typeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_typeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_arrayIndexTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_arrayIndexTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualTableShapeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_virtualTableShapeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_code() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_code
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_function() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_function
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_managed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_managed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_msil() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_msil
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseDispIndex() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_virtualBaseDispIndex
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_undecoratedName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_undecoratedName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_age() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_age
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_signature() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_signature
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_compilerGenerated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_compilerGenerated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_addressTaken() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_addressTaken
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_rank() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_rank
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lowerBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_lowerBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_upperBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_upperBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lowerBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_lowerBoundId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_upperBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_upperBoundId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_dataBytes([in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_dataBytes
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildren([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findChildren
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenEx([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findChildrenEx
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByAddr([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findChildrenExByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findChildrenExByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByRVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findChildrenExByRVA
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_targetSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_targetOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_targetRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_targetVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_targetVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_machineType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_machineType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_oemId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_oemSymbolId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_types([in] uint32 cTypes,
+ [out] uint32& pcTypes,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) pTypes) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_types
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_typeIds([in] uint32 cTypeIds,
+ [out] uint32& pcTypeIds,
+ [out] uint32& pdwTypeIds) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_typeIds
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_objectPointerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_objectPointerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_udtKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_udtKind
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_undecoratedNameEx([in] uint32 undecorateOptions,
+ [out] string& marshal( bstr) name) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_undecoratedNameEx
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_noReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_customCallingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_customCallingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noInline() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_noInline
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_optimizedCodeDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_optimizedCodeDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_notReached() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_notReached
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_interruptReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_interruptReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_farReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_farReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStatic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isStatic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLTCG() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isLTCG
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isDataAligned() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isDataAligned
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSecurityChecks() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasSecurityChecks
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_compilerName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_compilerName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAlloca() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasAlloca
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSetJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasSetJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasLongJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasLongJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasInlAsm() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasInlAsm
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasSEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEHa() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasEHa
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isNaked() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isNaked
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAggregated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isAggregated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSplitted() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isSplitted
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_container() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_container
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_inlSpec() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_inlSpec
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noStackOrdering() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_noStackOrdering
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualBaseTableType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_virtualBaseTableType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasManagedCode() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasManagedCode
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHotpatchable() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isHotpatchable
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCVTCIL() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isCVTCIL
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMSILNetmodule() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isMSILNetmodule
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isCTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStripped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isStripped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_frontEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_backEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_wasInlined() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_wasInlined
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_strictGSCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_strictGSCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCxxReturnUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isCxxReturnUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isConstructorVirtualBase() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isConstructorVirtualBase
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_RValueReference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_RValueReference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_unmodifiedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_unmodifiedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_framePointerPresent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_framePointerPresent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSafeBuffers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isSafeBuffers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intrinsic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_intrinsic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_sealed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_sealed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaFloat() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hfaFloat
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaDouble() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hfaDouble
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_liveRangeStartAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_liveRangeStartAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_liveRangeStartRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_countLiveRanges() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_countLiveRanges
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_liveRangeLength() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_liveRangeLength
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_offsetInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_offsetInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_paramBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_paramBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_localBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_localBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLocationControlFlowDependent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isLocationControlFlowDependent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_stride() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_stride
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRows() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_numberOfRows
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfColumns() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_numberOfColumns
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMatrixRowMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isMatrixRowMajor
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_numericProperties([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pProperties) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_numericProperties
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_modifierValues([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint16& pModifiers) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_modifierValues
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isReturnValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isReturnValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedAway() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isOptimizedAway
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_builtInKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_builtInKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_registerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_baseDataSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_baseDataOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_textureSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_textureSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_samplerSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_samplerSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_uavSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_uavSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_sizeInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_sizeInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_memorySpaceKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_memorySpaceKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_unmodifiedTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_unmodifiedTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_subTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_subTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_subType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_subType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfModifiers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_numberOfModifiers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRegisterIndices() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_numberOfRegisterIndices
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHLSLData() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isHLSLData
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToDataMember() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isPointerToDataMember
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToMemberFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isPointerToMemberFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSingleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isSingleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMultipleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isMultipleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isVirtualInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isVirtualInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_restrictedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_restrictedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerBasedOnSymbolValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isPointerBasedOnSymbolValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_baseSymbol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_baseSymbol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_baseSymbolId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_objectFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_objectFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorGroupSharedLocal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isAcceleratorGroupSharedLocal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorPointerTagLiveRange() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isAcceleratorPointerTagLiveRange
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorStubFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isAcceleratorStubFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfAcceleratorPointerTags() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_numberOfAcceleratorPointerTags
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSdl() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isSdl
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isWinRTPointer() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isWinRTPointer
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isRefUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isRefUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isValueUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isValueUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isInterfaceUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isInterfaceUdt
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findInlineFramesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByRVA([in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findInlineFramesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByVA([in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findInlineFramesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLines([out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findInlineeLines
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findInlineeLinesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByRVA([in] uint32 rva,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findInlineeLinesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByVA([in] uint64 va,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findInlineeLinesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsForAcceleratorPointerTag([in] uint32 tagValue,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findSymbolsForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsByRVAForAcceleratorPointerTag([in] uint32 tagValue,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findSymbolsByRVAForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_acceleratorPointerTags([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pPointerTags) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_acceleratorPointerTags
+
+ .method public hidebysig newslot abstract virtual
+ instance void getSrcLineOnTypeDefn([out] class DIALib.IDiaLineNumber& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::getSrcLineOnTypeDefn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPGO() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isPGO
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasValidPGOCounts() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasValidPGOCounts
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedForSpeed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isOptimizedForSpeed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEntryCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_PGOEntryCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEdgeCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_PGOEdgeCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_PGODynamicInstructionCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_PGODynamicInstructionCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_staticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_staticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_finalLiveStaticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_finalLiveStaticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_phaseName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_phaseName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasControlFlowCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_hasControlFlowCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constantExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_constantExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_dataExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_dataExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_privateExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_privateExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noNameExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_noNameExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportHasExplicitlyAssignedOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_exportHasExplicitlyAssignedOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportIsForwarder() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_exportIsForwarder
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_ordinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_ordinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frameSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_frameSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_exceptionHandlerAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_exceptionHandlerAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_exceptionHandlerRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_exceptionHandlerVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_exceptionHandlerVirtualAddress
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssemblyFile([out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::findInputAssemblyFile
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_characteristics() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_characteristics
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_coffGroup() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_coffGroup
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindID() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_bindID
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSpace() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_bindSpace
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_bindSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isObjCClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCCategory() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isObjCCategory
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCProtocol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_isObjCProtocol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_inlinee() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_inlinee
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_inlineeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol3::get_inlineeId
+
+ .property uint32 symIndexId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_symIndexId()
+ } // end of property IDiaSymbol3::symIndexId
+ .property uint32 symTag()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_symTag()
+ } // end of property IDiaSymbol3::symTag
+ .property string name()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol3::get_name()
+ } // end of property IDiaSymbol3::name
+ .property class DIALib.IDiaSymbol lexicalParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_lexicalParent()
+ } // end of property IDiaSymbol3::lexicalParent
+ .property class DIALib.IDiaSymbol classParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_classParent()
+ } // end of property IDiaSymbol3::classParent
+ .property class DIALib.IDiaSymbol 'type'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_type()
+ } // end of property IDiaSymbol3::'type'
+ .property uint32 dataKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_dataKind()
+ } // end of property IDiaSymbol3::dataKind
+ .property uint32 locationType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 07 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_locationType()
+ } // end of property IDiaSymbol3::locationType
+ .property uint32 addressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_addressSection()
+ } // end of property IDiaSymbol3::addressSection
+ .property uint32 addressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_addressOffset()
+ } // end of property IDiaSymbol3::addressOffset
+ .property uint32 relativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_relativeVirtualAddress()
+ } // end of property IDiaSymbol3::relativeVirtualAddress
+ .property uint64 virtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol3::get_virtualAddress()
+ } // end of property IDiaSymbol3::virtualAddress
+ .property uint32 registerId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_registerId()
+ } // end of property IDiaSymbol3::registerId
+ .property int32 offset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_offset()
+ } // end of property IDiaSymbol3::offset
+ .property uint64 length()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol3::get_length()
+ } // end of property IDiaSymbol3::length
+ .property uint32 slot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_slot()
+ } // end of property IDiaSymbol3::slot
+ .property int32 volatileType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 10 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_volatileType()
+ } // end of property IDiaSymbol3::volatileType
+ .property int32 constType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 11 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_constType()
+ } // end of property IDiaSymbol3::constType
+ .property int32 unalignedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 12 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_unalignedType()
+ } // end of property IDiaSymbol3::unalignedType
+ .property uint32 access()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 13 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_access()
+ } // end of property IDiaSymbol3::access
+ .property string libraryName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 14 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol3::get_libraryName()
+ } // end of property IDiaSymbol3::libraryName
+ .property uint32 platform()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 15 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_platform()
+ } // end of property IDiaSymbol3::platform
+ .property uint32 language()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 16 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_language()
+ } // end of property IDiaSymbol3::language
+ .property int32 editAndContinueEnabled()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 17 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_editAndContinueEnabled()
+ } // end of property IDiaSymbol3::editAndContinueEnabled
+ .property uint32 frontEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 18 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_frontEndMajor()
+ } // end of property IDiaSymbol3::frontEndMajor
+ .property uint32 frontEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 19 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_frontEndMinor()
+ } // end of property IDiaSymbol3::frontEndMinor
+ .property uint32 frontEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_frontEndBuild()
+ } // end of property IDiaSymbol3::frontEndBuild
+ .property uint32 backEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_backEndMajor()
+ } // end of property IDiaSymbol3::backEndMajor
+ .property uint32 backEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_backEndMinor()
+ } // end of property IDiaSymbol3::backEndMinor
+ .property uint32 backEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_backEndBuild()
+ } // end of property IDiaSymbol3::backEndBuild
+ .property string sourceFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1E 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol3::get_sourceFileName()
+ } // end of property IDiaSymbol3::sourceFileName
+ .property string 'unused'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1F 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol3::get_unused()
+ } // end of property IDiaSymbol3::'unused'
+ .property uint32 thunkOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 20 00 00 00 00 00 ) // .. .....
+ .get instance uint32 DIALib.IDiaSymbol3::get_thunkOrdinal()
+ } // end of property IDiaSymbol3::thunkOrdinal
+ .property int32 thisAdjust()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 21 00 00 00 00 00 ) // ..!.....
+ .get instance int32 DIALib.IDiaSymbol3::get_thisAdjust()
+ } // end of property IDiaSymbol3::thisAdjust
+ .property uint32 virtualBaseOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 22 00 00 00 00 00 ) // ..".....
+ .get instance uint32 DIALib.IDiaSymbol3::get_virtualBaseOffset()
+ } // end of property IDiaSymbol3::virtualBaseOffset
+ .property int32 'virtual'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 23 00 00 00 00 00 ) // ..#.....
+ .get instance int32 DIALib.IDiaSymbol3::get_virtual()
+ } // end of property IDiaSymbol3::'virtual'
+ .property int32 intro()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 24 00 00 00 00 00 ) // ..$.....
+ .get instance int32 DIALib.IDiaSymbol3::get_intro()
+ } // end of property IDiaSymbol3::intro
+ .property int32 pure()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 25 00 00 00 00 00 ) // ..%.....
+ .get instance int32 DIALib.IDiaSymbol3::get_pure()
+ } // end of property IDiaSymbol3::pure
+ .property uint32 callingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 26 00 00 00 00 00 ) // ..&.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_callingConvention()
+ } // end of property IDiaSymbol3::callingConvention
+ .property object 'value'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 27 00 00 00 00 00 ) // ..'.....
+ .get instance object DIALib.IDiaSymbol3::get_value()
+ } // end of property IDiaSymbol3::'value'
+ .property uint32 baseType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 28 00 00 00 00 00 ) // ..(.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_baseType()
+ } // end of property IDiaSymbol3::baseType
+ .property uint32 token()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 29 00 00 00 00 00 ) // ..).....
+ .get instance uint32 DIALib.IDiaSymbol3::get_token()
+ } // end of property IDiaSymbol3::token
+ .property uint32 timeStamp()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2A 00 00 00 00 00 ) // ..*.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_timeStamp()
+ } // end of property IDiaSymbol3::timeStamp
+ .property valuetype [mscorlib]System.Guid
+ guid()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2B 00 00 00 00 00 ) // ..+.....
+ .get instance valuetype [mscorlib]System.Guid DIALib.IDiaSymbol3::get_guid()
+ } // end of property IDiaSymbol3::guid
+ .property string symbolsFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2C 00 00 00 00 00 ) // ..,.....
+ .get instance string DIALib.IDiaSymbol3::get_symbolsFileName()
+ } // end of property IDiaSymbol3::symbolsFileName
+ .property int32 reference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2E 00 00 00 00 00 ) // ........
+ .get instance int32 DIALib.IDiaSymbol3::get_reference()
+ } // end of property IDiaSymbol3::reference
+ .property uint32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2F 00 00 00 00 00 ) // ../.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_count()
+ } // end of property IDiaSymbol3::count
+ .property uint32 bitPosition()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 31 00 00 00 00 00 ) // ..1.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_bitPosition()
+ } // end of property IDiaSymbol3::bitPosition
+ .property class DIALib.IDiaSymbol arrayIndexType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 32 00 00 00 00 00 ) // ..2.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_arrayIndexType()
+ } // end of property IDiaSymbol3::arrayIndexType
+ .property int32 packed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 33 00 00 00 00 00 ) // ..3.....
+ .get instance int32 DIALib.IDiaSymbol3::get_packed()
+ } // end of property IDiaSymbol3::packed
+ .property int32 constructor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 34 00 00 00 00 00 ) // ..4.....
+ .get instance int32 DIALib.IDiaSymbol3::get_constructor()
+ } // end of property IDiaSymbol3::constructor
+ .property int32 overloadedOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 35 00 00 00 00 00 ) // ..5.....
+ .get instance int32 DIALib.IDiaSymbol3::get_overloadedOperator()
+ } // end of property IDiaSymbol3::overloadedOperator
+ .property int32 'nested'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 36 00 00 00 00 00 ) // ..6.....
+ .get instance int32 DIALib.IDiaSymbol3::get_nested()
+ } // end of property IDiaSymbol3::'nested'
+ .property int32 hasNestedTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 37 00 00 00 00 00 ) // ..7.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasNestedTypes()
+ } // end of property IDiaSymbol3::hasNestedTypes
+ .property int32 hasAssignmentOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 38 00 00 00 00 00 ) // ..8.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasAssignmentOperator()
+ } // end of property IDiaSymbol3::hasAssignmentOperator
+ .property int32 hasCastOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 39 00 00 00 00 00 ) // ..9.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasCastOperator()
+ } // end of property IDiaSymbol3::hasCastOperator
+ .property int32 scoped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3A 00 00 00 00 00 ) // ..:.....
+ .get instance int32 DIALib.IDiaSymbol3::get_scoped()
+ } // end of property IDiaSymbol3::scoped
+ .property int32 virtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3B 00 00 00 00 00 ) // ..;.....
+ .get instance int32 DIALib.IDiaSymbol3::get_virtualBaseClass()
+ } // end of property IDiaSymbol3::virtualBaseClass
+ .property int32 indirectVirtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3C 00 00 00 00 00 ) // ..<.....
+ .get instance int32 DIALib.IDiaSymbol3::get_indirectVirtualBaseClass()
+ } // end of property IDiaSymbol3::indirectVirtualBaseClass
+ .property int32 virtualBasePointerOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3D 00 00 00 00 00 ) // ..=.....
+ .get instance int32 DIALib.IDiaSymbol3::get_virtualBasePointerOffset()
+ } // end of property IDiaSymbol3::virtualBasePointerOffset
+ .property class DIALib.IDiaSymbol virtualTableShape()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3E 00 00 00 00 00 ) // ..>.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_virtualTableShape()
+ } // end of property IDiaSymbol3::virtualTableShape
+ .property uint32 lexicalParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 40 00 00 00 00 00 ) // ..@.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_lexicalParentId()
+ } // end of property IDiaSymbol3::lexicalParentId
+ .property uint32 classParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 41 00 00 00 00 00 ) // ..A.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_classParentId()
+ } // end of property IDiaSymbol3::classParentId
+ .property uint32 typeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 42 00 00 00 00 00 ) // ..B.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_typeId()
+ } // end of property IDiaSymbol3::typeId
+ .property uint32 arrayIndexTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 43 00 00 00 00 00 ) // ..C.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_arrayIndexTypeId()
+ } // end of property IDiaSymbol3::arrayIndexTypeId
+ .property uint32 virtualTableShapeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 44 00 00 00 00 00 ) // ..D.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_virtualTableShapeId()
+ } // end of property IDiaSymbol3::virtualTableShapeId
+ .property int32 code()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 45 00 00 00 00 00 ) // ..E.....
+ .get instance int32 DIALib.IDiaSymbol3::get_code()
+ } // end of property IDiaSymbol3::code
+ .property int32 function()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 46 00 00 00 00 00 ) // ..F.....
+ .get instance int32 DIALib.IDiaSymbol3::get_function()
+ } // end of property IDiaSymbol3::function
+ .property int32 'managed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 47 00 00 00 00 00 ) // ..G.....
+ .get instance int32 DIALib.IDiaSymbol3::get_managed()
+ } // end of property IDiaSymbol3::'managed'
+ .property int32 msil()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 48 00 00 00 00 00 ) // ..H.....
+ .get instance int32 DIALib.IDiaSymbol3::get_msil()
+ } // end of property IDiaSymbol3::msil
+ .property uint32 virtualBaseDispIndex()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 49 00 00 00 00 00 ) // ..I.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_virtualBaseDispIndex()
+ } // end of property IDiaSymbol3::virtualBaseDispIndex
+ .property string undecoratedName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4A 00 00 00 00 00 ) // ..J.....
+ .get instance string DIALib.IDiaSymbol3::get_undecoratedName()
+ } // end of property IDiaSymbol3::undecoratedName
+ .property uint32 age()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4B 00 00 00 00 00 ) // ..K.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_age()
+ } // end of property IDiaSymbol3::age
+ .property uint32 signature()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4C 00 00 00 00 00 ) // ..L.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_signature()
+ } // end of property IDiaSymbol3::signature
+ .property int32 compilerGenerated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4D 00 00 00 00 00 ) // ..M.....
+ .get instance int32 DIALib.IDiaSymbol3::get_compilerGenerated()
+ } // end of property IDiaSymbol3::compilerGenerated
+ .property int32 addressTaken()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4E 00 00 00 00 00 ) // ..N.....
+ .get instance int32 DIALib.IDiaSymbol3::get_addressTaken()
+ } // end of property IDiaSymbol3::addressTaken
+ .property uint32 rank()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4F 00 00 00 00 00 ) // ..O.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_rank()
+ } // end of property IDiaSymbol3::rank
+ .property class DIALib.IDiaSymbol lowerBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 50 00 00 00 00 00 ) // ..P.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_lowerBound()
+ } // end of property IDiaSymbol3::lowerBound
+ .property class DIALib.IDiaSymbol upperBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 51 00 00 00 00 00 ) // ..Q.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_upperBound()
+ } // end of property IDiaSymbol3::upperBound
+ .property uint32 lowerBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 52 00 00 00 00 00 ) // ..R.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_lowerBoundId()
+ } // end of property IDiaSymbol3::lowerBoundId
+ .property uint32 upperBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 53 00 00 00 00 00 ) // ..S.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_upperBoundId()
+ } // end of property IDiaSymbol3::upperBoundId
+ .property uint32 targetSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 54 00 00 00 00 00 ) // ..T.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_targetSection()
+ } // end of property IDiaSymbol3::targetSection
+ .property uint32 targetOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 55 00 00 00 00 00 ) // ..U.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_targetOffset()
+ } // end of property IDiaSymbol3::targetOffset
+ .property uint32 targetRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 56 00 00 00 00 00 ) // ..V.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_targetRelativeVirtualAddress()
+ } // end of property IDiaSymbol3::targetRelativeVirtualAddress
+ .property uint64 targetVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 57 00 00 00 00 00 ) // ..W.....
+ .get instance uint64 DIALib.IDiaSymbol3::get_targetVirtualAddress()
+ } // end of property IDiaSymbol3::targetVirtualAddress
+ .property uint32 machineType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 58 00 00 00 00 00 ) // ..X.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_machineType()
+ } // end of property IDiaSymbol3::machineType
+ .property uint32 oemId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 59 00 00 00 00 00 ) // ..Y.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_oemId()
+ } // end of property IDiaSymbol3::oemId
+ .property uint32 oemSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5A 00 00 00 00 00 ) // ..Z.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_oemSymbolId()
+ } // end of property IDiaSymbol3::oemSymbolId
+ .property class DIALib.IDiaSymbol objectPointerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5B 00 00 00 00 00 ) // ..[.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_objectPointerType()
+ } // end of property IDiaSymbol3::objectPointerType
+ .property uint32 udtKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5C 00 00 00 00 00 ) // ..\.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_udtKind()
+ } // end of property IDiaSymbol3::udtKind
+ .property int32 noReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5D 00 00 00 00 00 ) // ..].....
+ .get instance int32 DIALib.IDiaSymbol3::get_noReturn()
+ } // end of property IDiaSymbol3::noReturn
+ .property int32 customCallingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5E 00 00 00 00 00 ) // ..^.....
+ .get instance int32 DIALib.IDiaSymbol3::get_customCallingConvention()
+ } // end of property IDiaSymbol3::customCallingConvention
+ .property int32 noInline()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5F 00 00 00 00 00 ) // .._.....
+ .get instance int32 DIALib.IDiaSymbol3::get_noInline()
+ } // end of property IDiaSymbol3::noInline
+ .property int32 optimizedCodeDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 60 00 00 00 00 00 ) // ..`.....
+ .get instance int32 DIALib.IDiaSymbol3::get_optimizedCodeDebugInfo()
+ } // end of property IDiaSymbol3::optimizedCodeDebugInfo
+ .property int32 notReached()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 61 00 00 00 00 00 ) // ..a.....
+ .get instance int32 DIALib.IDiaSymbol3::get_notReached()
+ } // end of property IDiaSymbol3::notReached
+ .property int32 interruptReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 62 00 00 00 00 00 ) // ..b.....
+ .get instance int32 DIALib.IDiaSymbol3::get_interruptReturn()
+ } // end of property IDiaSymbol3::interruptReturn
+ .property int32 farReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 63 00 00 00 00 00 ) // ..c.....
+ .get instance int32 DIALib.IDiaSymbol3::get_farReturn()
+ } // end of property IDiaSymbol3::farReturn
+ .property int32 isStatic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 64 00 00 00 00 00 ) // ..d.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isStatic()
+ } // end of property IDiaSymbol3::isStatic
+ .property int32 hasDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 65 00 00 00 00 00 ) // ..e.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasDebugInfo()
+ } // end of property IDiaSymbol3::hasDebugInfo
+ .property int32 isLTCG()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 66 00 00 00 00 00 ) // ..f.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isLTCG()
+ } // end of property IDiaSymbol3::isLTCG
+ .property int32 isDataAligned()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 67 00 00 00 00 00 ) // ..g.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isDataAligned()
+ } // end of property IDiaSymbol3::isDataAligned
+ .property int32 hasSecurityChecks()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 68 00 00 00 00 00 ) // ..h.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasSecurityChecks()
+ } // end of property IDiaSymbol3::hasSecurityChecks
+ .property string compilerName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 69 00 00 00 00 00 ) // ..i.....
+ .get instance string DIALib.IDiaSymbol3::get_compilerName()
+ } // end of property IDiaSymbol3::compilerName
+ .property int32 hasAlloca()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6A 00 00 00 00 00 ) // ..j.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasAlloca()
+ } // end of property IDiaSymbol3::hasAlloca
+ .property int32 hasSetJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6B 00 00 00 00 00 ) // ..k.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasSetJump()
+ } // end of property IDiaSymbol3::hasSetJump
+ .property int32 hasLongJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6C 00 00 00 00 00 ) // ..l.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasLongJump()
+ } // end of property IDiaSymbol3::hasLongJump
+ .property int32 hasInlAsm()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6D 00 00 00 00 00 ) // ..m.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasInlAsm()
+ } // end of property IDiaSymbol3::hasInlAsm
+ .property int32 hasEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6E 00 00 00 00 00 ) // ..n.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasEH()
+ } // end of property IDiaSymbol3::hasEH
+ .property int32 hasSEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6F 00 00 00 00 00 ) // ..o.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasSEH()
+ } // end of property IDiaSymbol3::hasSEH
+ .property int32 hasEHa()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 70 00 00 00 00 00 ) // ..p.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasEHa()
+ } // end of property IDiaSymbol3::hasEHa
+ .property int32 isNaked()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 71 00 00 00 00 00 ) // ..q.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isNaked()
+ } // end of property IDiaSymbol3::isNaked
+ .property int32 isAggregated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 72 00 00 00 00 00 ) // ..r.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isAggregated()
+ } // end of property IDiaSymbol3::isAggregated
+ .property int32 isSplitted()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 73 00 00 00 00 00 ) // ..s.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isSplitted()
+ } // end of property IDiaSymbol3::isSplitted
+ .property class DIALib.IDiaSymbol container()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 74 00 00 00 00 00 ) // ..t.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_container()
+ } // end of property IDiaSymbol3::container
+ .property int32 inlSpec()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 75 00 00 00 00 00 ) // ..u.....
+ .get instance int32 DIALib.IDiaSymbol3::get_inlSpec()
+ } // end of property IDiaSymbol3::inlSpec
+ .property int32 noStackOrdering()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 76 00 00 00 00 00 ) // ..v.....
+ .get instance int32 DIALib.IDiaSymbol3::get_noStackOrdering()
+ } // end of property IDiaSymbol3::noStackOrdering
+ .property class DIALib.IDiaSymbol virtualBaseTableType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 77 00 00 00 00 00 ) // ..w.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_virtualBaseTableType()
+ } // end of property IDiaSymbol3::virtualBaseTableType
+ .property int32 hasManagedCode()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 78 00 00 00 00 00 ) // ..x.....
+ .get instance int32 DIALib.IDiaSymbol3::get_hasManagedCode()
+ } // end of property IDiaSymbol3::hasManagedCode
+ .property int32 isHotpatchable()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 79 00 00 00 00 00 ) // ..y.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isHotpatchable()
+ } // end of property IDiaSymbol3::isHotpatchable
+ .property int32 isCVTCIL()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7A 00 00 00 00 00 ) // ..z.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isCVTCIL()
+ } // end of property IDiaSymbol3::isCVTCIL
+ .property int32 isMSILNetmodule()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7B 00 00 00 00 00 ) // ..{.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isMSILNetmodule()
+ } // end of property IDiaSymbol3::isMSILNetmodule
+ .property int32 isCTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7C 00 00 00 00 00 ) // ..|.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isCTypes()
+ } // end of property IDiaSymbol3::isCTypes
+ .property int32 isStripped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7D 00 00 00 00 00 ) // ..}.....
+ .get instance int32 DIALib.IDiaSymbol3::get_isStripped()
+ } // end of property IDiaSymbol3::isStripped
+ .property uint32 frontEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7E 00 00 00 00 00 ) // ..~.....
+ .get instance uint32 DIALib.IDiaSymbol3::get_frontEndQFE()
+ } // end of property IDiaSymbol3::frontEndQFE
+ .property uint32 backEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_backEndQFE()
+ } // end of property IDiaSymbol3::backEndQFE
+ .property int32 wasInlined()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 80 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_wasInlined()
+ } // end of property IDiaSymbol3::wasInlined
+ .property int32 strictGSCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 81 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_strictGSCheck()
+ } // end of property IDiaSymbol3::strictGSCheck
+ .property int32 isCxxReturnUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 82 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isCxxReturnUdt()
+ } // end of property IDiaSymbol3::isCxxReturnUdt
+ .property int32 isConstructorVirtualBase()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 83 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isConstructorVirtualBase()
+ } // end of property IDiaSymbol3::isConstructorVirtualBase
+ .property int32 RValueReference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 84 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_RValueReference()
+ } // end of property IDiaSymbol3::RValueReference
+ .property class DIALib.IDiaSymbol unmodifiedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 85 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_unmodifiedType()
+ } // end of property IDiaSymbol3::unmodifiedType
+ .property int32 framePointerPresent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 86 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_framePointerPresent()
+ } // end of property IDiaSymbol3::framePointerPresent
+ .property int32 isSafeBuffers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 87 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isSafeBuffers()
+ } // end of property IDiaSymbol3::isSafeBuffers
+ .property int32 intrinsic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 88 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_intrinsic()
+ } // end of property IDiaSymbol3::intrinsic
+ .property int32 'sealed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 89 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_sealed()
+ } // end of property IDiaSymbol3::'sealed'
+ .property int32 hfaFloat()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_hfaFloat()
+ } // end of property IDiaSymbol3::hfaFloat
+ .property int32 hfaDouble()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8B 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_hfaDouble()
+ } // end of property IDiaSymbol3::hfaDouble
+ .property uint32 liveRangeStartAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_liveRangeStartAddressSection()
+ } // end of property IDiaSymbol3::liveRangeStartAddressSection
+ .property uint32 liveRangeStartAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_liveRangeStartAddressOffset()
+ } // end of property IDiaSymbol3::liveRangeStartAddressOffset
+ .property uint32 liveRangeStartRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_liveRangeStartRelativeVirtualAddress()
+ } // end of property IDiaSymbol3::liveRangeStartRelativeVirtualAddress
+ .property uint32 countLiveRanges()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_countLiveRanges()
+ } // end of property IDiaSymbol3::countLiveRanges
+ .property uint64 liveRangeLength()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 90 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol3::get_liveRangeLength()
+ } // end of property IDiaSymbol3::liveRangeLength
+ .property uint32 offsetInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 91 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_offsetInUdt()
+ } // end of property IDiaSymbol3::offsetInUdt
+ .property uint32 paramBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 92 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_paramBasePointerRegisterId()
+ } // end of property IDiaSymbol3::paramBasePointerRegisterId
+ .property uint32 localBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 93 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_localBasePointerRegisterId()
+ } // end of property IDiaSymbol3::localBasePointerRegisterId
+ .property int32 isLocationControlFlowDependent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 94 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isLocationControlFlowDependent()
+ } // end of property IDiaSymbol3::isLocationControlFlowDependent
+ .property uint32 stride()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 95 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_stride()
+ } // end of property IDiaSymbol3::stride
+ .property uint32 numberOfRows()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 96 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_numberOfRows()
+ } // end of property IDiaSymbol3::numberOfRows
+ .property uint32 numberOfColumns()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 97 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_numberOfColumns()
+ } // end of property IDiaSymbol3::numberOfColumns
+ .property int32 isMatrixRowMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 98 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isMatrixRowMajor()
+ } // end of property IDiaSymbol3::isMatrixRowMajor
+ .property int32 isReturnValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 99 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isReturnValue()
+ } // end of property IDiaSymbol3::isReturnValue
+ .property int32 isOptimizedAway()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isOptimizedAway()
+ } // end of property IDiaSymbol3::isOptimizedAway
+ .property uint32 builtInKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_builtInKind()
+ } // end of property IDiaSymbol3::builtInKind
+ .property uint32 registerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_registerType()
+ } // end of property IDiaSymbol3::registerType
+ .property uint32 baseDataSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_baseDataSlot()
+ } // end of property IDiaSymbol3::baseDataSlot
+ .property uint32 baseDataOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_baseDataOffset()
+ } // end of property IDiaSymbol3::baseDataOffset
+ .property uint32 textureSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_textureSlot()
+ } // end of property IDiaSymbol3::textureSlot
+ .property uint32 samplerSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_samplerSlot()
+ } // end of property IDiaSymbol3::samplerSlot
+ .property uint32 uavSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_uavSlot()
+ } // end of property IDiaSymbol3::uavSlot
+ .property uint32 sizeInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_sizeInUdt()
+ } // end of property IDiaSymbol3::sizeInUdt
+ .property uint32 memorySpaceKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_memorySpaceKind()
+ } // end of property IDiaSymbol3::memorySpaceKind
+ .property uint32 unmodifiedTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_unmodifiedTypeId()
+ } // end of property IDiaSymbol3::unmodifiedTypeId
+ .property uint32 subTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_subTypeId()
+ } // end of property IDiaSymbol3::subTypeId
+ .property class DIALib.IDiaSymbol subType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A6 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_subType()
+ } // end of property IDiaSymbol3::subType
+ .property uint32 numberOfModifiers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_numberOfModifiers()
+ } // end of property IDiaSymbol3::numberOfModifiers
+ .property uint32 numberOfRegisterIndices()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A8 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_numberOfRegisterIndices()
+ } // end of property IDiaSymbol3::numberOfRegisterIndices
+ .property int32 isHLSLData()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isHLSLData()
+ } // end of property IDiaSymbol3::isHLSLData
+ .property int32 isPointerToDataMember()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isPointerToDataMember()
+ } // end of property IDiaSymbol3::isPointerToDataMember
+ .property int32 isPointerToMemberFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isPointerToMemberFunction()
+ } // end of property IDiaSymbol3::isPointerToMemberFunction
+ .property int32 isSingleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isSingleInheritance()
+ } // end of property IDiaSymbol3::isSingleInheritance
+ .property int32 isMultipleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isMultipleInheritance()
+ } // end of property IDiaSymbol3::isMultipleInheritance
+ .property int32 isVirtualInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isVirtualInheritance()
+ } // end of property IDiaSymbol3::isVirtualInheritance
+ .property int32 restrictedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_restrictedType()
+ } // end of property IDiaSymbol3::restrictedType
+ .property int32 isPointerBasedOnSymbolValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B0 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isPointerBasedOnSymbolValue()
+ } // end of property IDiaSymbol3::isPointerBasedOnSymbolValue
+ .property class DIALib.IDiaSymbol baseSymbol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B1 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_baseSymbol()
+ } // end of property IDiaSymbol3::baseSymbol
+ .property uint32 baseSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_baseSymbolId()
+ } // end of property IDiaSymbol3::baseSymbolId
+ .property string objectFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B3 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol3::get_objectFileName()
+ } // end of property IDiaSymbol3::objectFileName
+ .property int32 isAcceleratorGroupSharedLocal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B4 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isAcceleratorGroupSharedLocal()
+ } // end of property IDiaSymbol3::isAcceleratorGroupSharedLocal
+ .property int32 isAcceleratorPointerTagLiveRange()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B5 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isAcceleratorPointerTagLiveRange()
+ } // end of property IDiaSymbol3::isAcceleratorPointerTagLiveRange
+ .property int32 isAcceleratorStubFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isAcceleratorStubFunction()
+ } // end of property IDiaSymbol3::isAcceleratorStubFunction
+ .property uint32 numberOfAcceleratorPointerTags()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_numberOfAcceleratorPointerTags()
+ } // end of property IDiaSymbol3::numberOfAcceleratorPointerTags
+ .property int32 isSdl()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isSdl()
+ } // end of property IDiaSymbol3::isSdl
+ .property int32 isWinRTPointer()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isWinRTPointer()
+ } // end of property IDiaSymbol3::isWinRTPointer
+ .property int32 isRefUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isRefUdt()
+ } // end of property IDiaSymbol3::isRefUdt
+ .property int32 isValueUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isValueUdt()
+ } // end of property IDiaSymbol3::isValueUdt
+ .property int32 isInterfaceUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isInterfaceUdt()
+ } // end of property IDiaSymbol3::isInterfaceUdt
+ .property int32 isPGO()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isPGO()
+ } // end of property IDiaSymbol3::isPGO
+ .property int32 hasValidPGOCounts()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_hasValidPGOCounts()
+ } // end of property IDiaSymbol3::hasValidPGOCounts
+ .property int32 isOptimizedForSpeed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isOptimizedForSpeed()
+ } // end of property IDiaSymbol3::isOptimizedForSpeed
+ .property uint32 PGOEntryCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_PGOEntryCount()
+ } // end of property IDiaSymbol3::PGOEntryCount
+ .property uint32 PGOEdgeCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_PGOEdgeCount()
+ } // end of property IDiaSymbol3::PGOEdgeCount
+ .property uint64 PGODynamicInstructionCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol3::get_PGODynamicInstructionCount()
+ } // end of property IDiaSymbol3::PGODynamicInstructionCount
+ .property uint32 staticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_staticSize()
+ } // end of property IDiaSymbol3::staticSize
+ .property uint32 finalLiveStaticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_finalLiveStaticSize()
+ } // end of property IDiaSymbol3::finalLiveStaticSize
+ .property string phaseName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C5 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol3::get_phaseName()
+ } // end of property IDiaSymbol3::phaseName
+ .property int32 hasControlFlowCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_hasControlFlowCheck()
+ } // end of property IDiaSymbol3::hasControlFlowCheck
+ .property int32 constantExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C7 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_constantExport()
+ } // end of property IDiaSymbol3::constantExport
+ .property int32 dataExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_dataExport()
+ } // end of property IDiaSymbol3::dataExport
+ .property int32 privateExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_privateExport()
+ } // end of property IDiaSymbol3::privateExport
+ .property int32 noNameExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_noNameExport()
+ } // end of property IDiaSymbol3::noNameExport
+ .property int32 exportHasExplicitlyAssignedOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_exportHasExplicitlyAssignedOrdinal()
+ } // end of property IDiaSymbol3::exportHasExplicitlyAssignedOrdinal
+ .property int32 exportIsForwarder()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_exportIsForwarder()
+ } // end of property IDiaSymbol3::exportIsForwarder
+ .property uint32 ordinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CD 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_ordinal()
+ } // end of property IDiaSymbol3::ordinal
+ .property uint32 frameSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CE 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_frameSize()
+ } // end of property IDiaSymbol3::frameSize
+ .property uint32 exceptionHandlerAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CF 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_exceptionHandlerAddressSection()
+ } // end of property IDiaSymbol3::exceptionHandlerAddressSection
+ .property uint32 exceptionHandlerAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_exceptionHandlerAddressOffset()
+ } // end of property IDiaSymbol3::exceptionHandlerAddressOffset
+ .property uint32 exceptionHandlerRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_exceptionHandlerRelativeVirtualAddress()
+ } // end of property IDiaSymbol3::exceptionHandlerRelativeVirtualAddress
+ .property uint64 exceptionHandlerVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol3::get_exceptionHandlerVirtualAddress()
+ } // end of property IDiaSymbol3::exceptionHandlerVirtualAddress
+ .property uint32 characteristics()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_characteristics()
+ } // end of property IDiaSymbol3::characteristics
+ .property class DIALib.IDiaSymbol coffGroup()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D4 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_coffGroup()
+ } // end of property IDiaSymbol3::coffGroup
+ .property uint32 bindID()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_bindID()
+ } // end of property IDiaSymbol3::bindID
+ .property uint32 bindSpace()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D6 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_bindSpace()
+ } // end of property IDiaSymbol3::bindSpace
+ .property uint32 bindSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_bindSlot()
+ } // end of property IDiaSymbol3::bindSlot
+ .property int32 isObjCClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isObjCClass()
+ } // end of property IDiaSymbol3::isObjCClass
+ .property int32 isObjCCategory()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isObjCCategory()
+ } // end of property IDiaSymbol3::isObjCCategory
+ .property int32 isObjCProtocol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol3::get_isObjCProtocol()
+ } // end of property IDiaSymbol3::isObjCProtocol
+ .property class DIALib.IDiaSymbol inlinee()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DB 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol3::get_inlinee()
+ } // end of property IDiaSymbol3::inlinee
+ .property uint32 inlineeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DC 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol3::get_inlineeId()
+ } // end of property IDiaSymbol3::inlineeId
+} // end of class DIALib.IDiaSymbol3
+
+.class interface public abstract auto ansi import DIALib.IDiaSymbol4
+ implements DIALib.IDiaSymbol3
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 0A 73 79 6D 49 6E 64 65 78 49 64 00 00 ) // ...symIndexId..
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 42 46 36 43 38 38 41 37 2D 45 39 44 36 // ..$BF6C88A7-E9D6
+ 2D 34 33 34 36 2D 39 39 41 31 2D 44 30 35 33 44 // -4346-99A1-D053D
+ 45 35 41 37 38 30 38 00 00 ) // E5A7808..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symIndexId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_symIndexId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symTag() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_symTag
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_name() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_name
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lexicalParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_lexicalParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_classParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_classParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_type() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_type
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_dataKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_dataKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_locationType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_locationType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_addressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_addressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_relativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_virtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_virtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_registerId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_offset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_offset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_length() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_length
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_slot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_slot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_volatileType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_volatileType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_constType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_unalignedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_unalignedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_access() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_access
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_libraryName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_libraryName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_platform() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_platform
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_language() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_language
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_editAndContinueEnabled() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_editAndContinueEnabled
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_frontEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_frontEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_frontEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_backEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_backEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_backEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_sourceFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_sourceFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_unused() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_unused
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_thunkOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_thunkOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_thisAdjust() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_thisAdjust
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_virtualBaseOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtual() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_virtual
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intro() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_intro
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_pure() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_pure
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_callingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_callingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance object
+ marshal( struct)
+ get_value() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_value
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_baseType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_token() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_token
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_timeStamp() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_timeStamp
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance valuetype [mscorlib]System.Guid
+ get_guid() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_guid
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_symbolsFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_symbolsFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_reference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_reference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_count
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bitPosition() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_bitPosition
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_arrayIndexType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_arrayIndexType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_packed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_packed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constructor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_constructor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_overloadedOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_overloadedOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_nested() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_nested
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasNestedTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasNestedTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAssignmentOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasAssignmentOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasCastOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasCastOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_scoped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_scoped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_virtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_indirectVirtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_indirectVirtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBasePointerOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_virtualBasePointerOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualTableShape() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_virtualTableShape
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lexicalParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_lexicalParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_classParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_classParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_typeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_typeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_arrayIndexTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_arrayIndexTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualTableShapeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_virtualTableShapeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_code() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_code
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_function() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_function
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_managed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_managed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_msil() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_msil
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseDispIndex() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_virtualBaseDispIndex
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_undecoratedName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_undecoratedName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_age() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_age
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_signature() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_signature
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_compilerGenerated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_compilerGenerated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_addressTaken() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_addressTaken
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_rank() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_rank
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lowerBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_lowerBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_upperBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_upperBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lowerBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_lowerBoundId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_upperBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_upperBoundId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_dataBytes([in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_dataBytes
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildren([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findChildren
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenEx([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findChildrenEx
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByAddr([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findChildrenExByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findChildrenExByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByRVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findChildrenExByRVA
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_targetSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_targetOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_targetRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_targetVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_targetVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_machineType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_machineType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_oemId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_oemSymbolId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_types([in] uint32 cTypes,
+ [out] uint32& pcTypes,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) pTypes) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_types
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_typeIds([in] uint32 cTypeIds,
+ [out] uint32& pcTypeIds,
+ [out] uint32& pdwTypeIds) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_typeIds
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_objectPointerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_objectPointerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_udtKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_udtKind
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_undecoratedNameEx([in] uint32 undecorateOptions,
+ [out] string& marshal( bstr) name) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_undecoratedNameEx
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_noReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_customCallingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_customCallingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noInline() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_noInline
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_optimizedCodeDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_optimizedCodeDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_notReached() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_notReached
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_interruptReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_interruptReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_farReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_farReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStatic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isStatic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLTCG() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isLTCG
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isDataAligned() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isDataAligned
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSecurityChecks() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasSecurityChecks
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_compilerName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_compilerName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAlloca() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasAlloca
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSetJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasSetJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasLongJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasLongJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasInlAsm() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasInlAsm
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasSEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEHa() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasEHa
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isNaked() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isNaked
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAggregated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isAggregated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSplitted() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isSplitted
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_container() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_container
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_inlSpec() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_inlSpec
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noStackOrdering() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_noStackOrdering
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualBaseTableType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_virtualBaseTableType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasManagedCode() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasManagedCode
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHotpatchable() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isHotpatchable
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCVTCIL() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isCVTCIL
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMSILNetmodule() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isMSILNetmodule
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isCTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStripped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isStripped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_frontEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_backEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_wasInlined() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_wasInlined
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_strictGSCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_strictGSCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCxxReturnUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isCxxReturnUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isConstructorVirtualBase() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isConstructorVirtualBase
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_RValueReference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_RValueReference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_unmodifiedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_unmodifiedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_framePointerPresent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_framePointerPresent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSafeBuffers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isSafeBuffers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intrinsic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_intrinsic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_sealed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_sealed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaFloat() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hfaFloat
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaDouble() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hfaDouble
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_liveRangeStartAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_liveRangeStartAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_liveRangeStartRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_countLiveRanges() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_countLiveRanges
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_liveRangeLength() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_liveRangeLength
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_offsetInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_offsetInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_paramBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_paramBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_localBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_localBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLocationControlFlowDependent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isLocationControlFlowDependent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_stride() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_stride
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRows() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_numberOfRows
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfColumns() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_numberOfColumns
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMatrixRowMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isMatrixRowMajor
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_numericProperties([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pProperties) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_numericProperties
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_modifierValues([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint16& pModifiers) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_modifierValues
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isReturnValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isReturnValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedAway() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isOptimizedAway
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_builtInKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_builtInKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_registerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_baseDataSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_baseDataOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_textureSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_textureSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_samplerSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_samplerSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_uavSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_uavSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_sizeInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_sizeInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_memorySpaceKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_memorySpaceKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_unmodifiedTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_unmodifiedTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_subTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_subTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_subType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_subType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfModifiers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_numberOfModifiers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRegisterIndices() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_numberOfRegisterIndices
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHLSLData() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isHLSLData
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToDataMember() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isPointerToDataMember
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToMemberFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isPointerToMemberFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSingleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isSingleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMultipleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isMultipleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isVirtualInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isVirtualInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_restrictedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_restrictedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerBasedOnSymbolValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isPointerBasedOnSymbolValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_baseSymbol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_baseSymbol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_baseSymbolId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_objectFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_objectFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorGroupSharedLocal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isAcceleratorGroupSharedLocal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorPointerTagLiveRange() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isAcceleratorPointerTagLiveRange
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorStubFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isAcceleratorStubFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfAcceleratorPointerTags() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_numberOfAcceleratorPointerTags
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSdl() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isSdl
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isWinRTPointer() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isWinRTPointer
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isRefUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isRefUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isValueUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isValueUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isInterfaceUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isInterfaceUdt
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findInlineFramesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByRVA([in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findInlineFramesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByVA([in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findInlineFramesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLines([out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findInlineeLines
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findInlineeLinesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByRVA([in] uint32 rva,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findInlineeLinesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByVA([in] uint64 va,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findInlineeLinesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsForAcceleratorPointerTag([in] uint32 tagValue,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findSymbolsForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsByRVAForAcceleratorPointerTag([in] uint32 tagValue,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findSymbolsByRVAForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_acceleratorPointerTags([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pPointerTags) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_acceleratorPointerTags
+
+ .method public hidebysig newslot abstract virtual
+ instance void getSrcLineOnTypeDefn([out] class DIALib.IDiaLineNumber& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::getSrcLineOnTypeDefn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPGO() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isPGO
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasValidPGOCounts() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasValidPGOCounts
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedForSpeed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isOptimizedForSpeed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEntryCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_PGOEntryCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEdgeCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_PGOEdgeCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_PGODynamicInstructionCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_PGODynamicInstructionCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_staticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_staticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_finalLiveStaticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_finalLiveStaticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_phaseName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_phaseName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasControlFlowCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_hasControlFlowCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constantExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_constantExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_dataExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_dataExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_privateExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_privateExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noNameExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_noNameExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportHasExplicitlyAssignedOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_exportHasExplicitlyAssignedOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportIsForwarder() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_exportIsForwarder
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_ordinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_ordinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frameSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_frameSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_exceptionHandlerAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_exceptionHandlerAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_exceptionHandlerRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_exceptionHandlerVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_exceptionHandlerVirtualAddress
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssemblyFile([out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::findInputAssemblyFile
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_characteristics() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_characteristics
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_coffGroup() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_coffGroup
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindID() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_bindID
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSpace() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_bindSpace
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_bindSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isObjCClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCCategory() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isObjCCategory
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCProtocol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_isObjCProtocol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_inlinee() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_inlinee
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_inlineeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_inlineeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noexcept() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol4::get_noexcept
+
+ .property uint32 symIndexId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_symIndexId()
+ } // end of property IDiaSymbol4::symIndexId
+ .property uint32 symTag()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_symTag()
+ } // end of property IDiaSymbol4::symTag
+ .property string name()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol4::get_name()
+ } // end of property IDiaSymbol4::name
+ .property class DIALib.IDiaSymbol lexicalParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_lexicalParent()
+ } // end of property IDiaSymbol4::lexicalParent
+ .property class DIALib.IDiaSymbol classParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_classParent()
+ } // end of property IDiaSymbol4::classParent
+ .property class DIALib.IDiaSymbol 'type'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_type()
+ } // end of property IDiaSymbol4::'type'
+ .property uint32 dataKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_dataKind()
+ } // end of property IDiaSymbol4::dataKind
+ .property uint32 locationType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 07 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_locationType()
+ } // end of property IDiaSymbol4::locationType
+ .property uint32 addressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_addressSection()
+ } // end of property IDiaSymbol4::addressSection
+ .property uint32 addressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_addressOffset()
+ } // end of property IDiaSymbol4::addressOffset
+ .property uint32 relativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_relativeVirtualAddress()
+ } // end of property IDiaSymbol4::relativeVirtualAddress
+ .property uint64 virtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol4::get_virtualAddress()
+ } // end of property IDiaSymbol4::virtualAddress
+ .property uint32 registerId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_registerId()
+ } // end of property IDiaSymbol4::registerId
+ .property int32 offset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_offset()
+ } // end of property IDiaSymbol4::offset
+ .property uint64 length()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol4::get_length()
+ } // end of property IDiaSymbol4::length
+ .property uint32 slot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_slot()
+ } // end of property IDiaSymbol4::slot
+ .property int32 volatileType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 10 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_volatileType()
+ } // end of property IDiaSymbol4::volatileType
+ .property int32 constType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 11 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_constType()
+ } // end of property IDiaSymbol4::constType
+ .property int32 unalignedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 12 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_unalignedType()
+ } // end of property IDiaSymbol4::unalignedType
+ .property uint32 access()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 13 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_access()
+ } // end of property IDiaSymbol4::access
+ .property string libraryName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 14 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol4::get_libraryName()
+ } // end of property IDiaSymbol4::libraryName
+ .property uint32 platform()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 15 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_platform()
+ } // end of property IDiaSymbol4::platform
+ .property uint32 language()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 16 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_language()
+ } // end of property IDiaSymbol4::language
+ .property int32 editAndContinueEnabled()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 17 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_editAndContinueEnabled()
+ } // end of property IDiaSymbol4::editAndContinueEnabled
+ .property uint32 frontEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 18 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_frontEndMajor()
+ } // end of property IDiaSymbol4::frontEndMajor
+ .property uint32 frontEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 19 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_frontEndMinor()
+ } // end of property IDiaSymbol4::frontEndMinor
+ .property uint32 frontEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_frontEndBuild()
+ } // end of property IDiaSymbol4::frontEndBuild
+ .property uint32 backEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_backEndMajor()
+ } // end of property IDiaSymbol4::backEndMajor
+ .property uint32 backEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_backEndMinor()
+ } // end of property IDiaSymbol4::backEndMinor
+ .property uint32 backEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_backEndBuild()
+ } // end of property IDiaSymbol4::backEndBuild
+ .property string sourceFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1E 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol4::get_sourceFileName()
+ } // end of property IDiaSymbol4::sourceFileName
+ .property string 'unused'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1F 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol4::get_unused()
+ } // end of property IDiaSymbol4::'unused'
+ .property uint32 thunkOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 20 00 00 00 00 00 ) // .. .....
+ .get instance uint32 DIALib.IDiaSymbol4::get_thunkOrdinal()
+ } // end of property IDiaSymbol4::thunkOrdinal
+ .property int32 thisAdjust()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 21 00 00 00 00 00 ) // ..!.....
+ .get instance int32 DIALib.IDiaSymbol4::get_thisAdjust()
+ } // end of property IDiaSymbol4::thisAdjust
+ .property uint32 virtualBaseOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 22 00 00 00 00 00 ) // ..".....
+ .get instance uint32 DIALib.IDiaSymbol4::get_virtualBaseOffset()
+ } // end of property IDiaSymbol4::virtualBaseOffset
+ .property int32 'virtual'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 23 00 00 00 00 00 ) // ..#.....
+ .get instance int32 DIALib.IDiaSymbol4::get_virtual()
+ } // end of property IDiaSymbol4::'virtual'
+ .property int32 intro()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 24 00 00 00 00 00 ) // ..$.....
+ .get instance int32 DIALib.IDiaSymbol4::get_intro()
+ } // end of property IDiaSymbol4::intro
+ .property int32 pure()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 25 00 00 00 00 00 ) // ..%.....
+ .get instance int32 DIALib.IDiaSymbol4::get_pure()
+ } // end of property IDiaSymbol4::pure
+ .property uint32 callingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 26 00 00 00 00 00 ) // ..&.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_callingConvention()
+ } // end of property IDiaSymbol4::callingConvention
+ .property object 'value'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 27 00 00 00 00 00 ) // ..'.....
+ .get instance object DIALib.IDiaSymbol4::get_value()
+ } // end of property IDiaSymbol4::'value'
+ .property uint32 baseType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 28 00 00 00 00 00 ) // ..(.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_baseType()
+ } // end of property IDiaSymbol4::baseType
+ .property uint32 token()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 29 00 00 00 00 00 ) // ..).....
+ .get instance uint32 DIALib.IDiaSymbol4::get_token()
+ } // end of property IDiaSymbol4::token
+ .property uint32 timeStamp()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2A 00 00 00 00 00 ) // ..*.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_timeStamp()
+ } // end of property IDiaSymbol4::timeStamp
+ .property valuetype [mscorlib]System.Guid
+ guid()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2B 00 00 00 00 00 ) // ..+.....
+ .get instance valuetype [mscorlib]System.Guid DIALib.IDiaSymbol4::get_guid()
+ } // end of property IDiaSymbol4::guid
+ .property string symbolsFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2C 00 00 00 00 00 ) // ..,.....
+ .get instance string DIALib.IDiaSymbol4::get_symbolsFileName()
+ } // end of property IDiaSymbol4::symbolsFileName
+ .property int32 reference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2E 00 00 00 00 00 ) // ........
+ .get instance int32 DIALib.IDiaSymbol4::get_reference()
+ } // end of property IDiaSymbol4::reference
+ .property uint32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2F 00 00 00 00 00 ) // ../.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_count()
+ } // end of property IDiaSymbol4::count
+ .property uint32 bitPosition()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 31 00 00 00 00 00 ) // ..1.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_bitPosition()
+ } // end of property IDiaSymbol4::bitPosition
+ .property class DIALib.IDiaSymbol arrayIndexType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 32 00 00 00 00 00 ) // ..2.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_arrayIndexType()
+ } // end of property IDiaSymbol4::arrayIndexType
+ .property int32 packed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 33 00 00 00 00 00 ) // ..3.....
+ .get instance int32 DIALib.IDiaSymbol4::get_packed()
+ } // end of property IDiaSymbol4::packed
+ .property int32 constructor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 34 00 00 00 00 00 ) // ..4.....
+ .get instance int32 DIALib.IDiaSymbol4::get_constructor()
+ } // end of property IDiaSymbol4::constructor
+ .property int32 overloadedOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 35 00 00 00 00 00 ) // ..5.....
+ .get instance int32 DIALib.IDiaSymbol4::get_overloadedOperator()
+ } // end of property IDiaSymbol4::overloadedOperator
+ .property int32 'nested'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 36 00 00 00 00 00 ) // ..6.....
+ .get instance int32 DIALib.IDiaSymbol4::get_nested()
+ } // end of property IDiaSymbol4::'nested'
+ .property int32 hasNestedTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 37 00 00 00 00 00 ) // ..7.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasNestedTypes()
+ } // end of property IDiaSymbol4::hasNestedTypes
+ .property int32 hasAssignmentOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 38 00 00 00 00 00 ) // ..8.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasAssignmentOperator()
+ } // end of property IDiaSymbol4::hasAssignmentOperator
+ .property int32 hasCastOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 39 00 00 00 00 00 ) // ..9.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasCastOperator()
+ } // end of property IDiaSymbol4::hasCastOperator
+ .property int32 scoped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3A 00 00 00 00 00 ) // ..:.....
+ .get instance int32 DIALib.IDiaSymbol4::get_scoped()
+ } // end of property IDiaSymbol4::scoped
+ .property int32 virtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3B 00 00 00 00 00 ) // ..;.....
+ .get instance int32 DIALib.IDiaSymbol4::get_virtualBaseClass()
+ } // end of property IDiaSymbol4::virtualBaseClass
+ .property int32 indirectVirtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3C 00 00 00 00 00 ) // ..<.....
+ .get instance int32 DIALib.IDiaSymbol4::get_indirectVirtualBaseClass()
+ } // end of property IDiaSymbol4::indirectVirtualBaseClass
+ .property int32 virtualBasePointerOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3D 00 00 00 00 00 ) // ..=.....
+ .get instance int32 DIALib.IDiaSymbol4::get_virtualBasePointerOffset()
+ } // end of property IDiaSymbol4::virtualBasePointerOffset
+ .property class DIALib.IDiaSymbol virtualTableShape()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3E 00 00 00 00 00 ) // ..>.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_virtualTableShape()
+ } // end of property IDiaSymbol4::virtualTableShape
+ .property uint32 lexicalParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 40 00 00 00 00 00 ) // ..@.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_lexicalParentId()
+ } // end of property IDiaSymbol4::lexicalParentId
+ .property uint32 classParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 41 00 00 00 00 00 ) // ..A.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_classParentId()
+ } // end of property IDiaSymbol4::classParentId
+ .property uint32 typeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 42 00 00 00 00 00 ) // ..B.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_typeId()
+ } // end of property IDiaSymbol4::typeId
+ .property uint32 arrayIndexTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 43 00 00 00 00 00 ) // ..C.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_arrayIndexTypeId()
+ } // end of property IDiaSymbol4::arrayIndexTypeId
+ .property uint32 virtualTableShapeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 44 00 00 00 00 00 ) // ..D.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_virtualTableShapeId()
+ } // end of property IDiaSymbol4::virtualTableShapeId
+ .property int32 code()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 45 00 00 00 00 00 ) // ..E.....
+ .get instance int32 DIALib.IDiaSymbol4::get_code()
+ } // end of property IDiaSymbol4::code
+ .property int32 function()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 46 00 00 00 00 00 ) // ..F.....
+ .get instance int32 DIALib.IDiaSymbol4::get_function()
+ } // end of property IDiaSymbol4::function
+ .property int32 'managed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 47 00 00 00 00 00 ) // ..G.....
+ .get instance int32 DIALib.IDiaSymbol4::get_managed()
+ } // end of property IDiaSymbol4::'managed'
+ .property int32 msil()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 48 00 00 00 00 00 ) // ..H.....
+ .get instance int32 DIALib.IDiaSymbol4::get_msil()
+ } // end of property IDiaSymbol4::msil
+ .property uint32 virtualBaseDispIndex()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 49 00 00 00 00 00 ) // ..I.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_virtualBaseDispIndex()
+ } // end of property IDiaSymbol4::virtualBaseDispIndex
+ .property string undecoratedName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4A 00 00 00 00 00 ) // ..J.....
+ .get instance string DIALib.IDiaSymbol4::get_undecoratedName()
+ } // end of property IDiaSymbol4::undecoratedName
+ .property uint32 age()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4B 00 00 00 00 00 ) // ..K.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_age()
+ } // end of property IDiaSymbol4::age
+ .property uint32 signature()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4C 00 00 00 00 00 ) // ..L.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_signature()
+ } // end of property IDiaSymbol4::signature
+ .property int32 compilerGenerated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4D 00 00 00 00 00 ) // ..M.....
+ .get instance int32 DIALib.IDiaSymbol4::get_compilerGenerated()
+ } // end of property IDiaSymbol4::compilerGenerated
+ .property int32 addressTaken()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4E 00 00 00 00 00 ) // ..N.....
+ .get instance int32 DIALib.IDiaSymbol4::get_addressTaken()
+ } // end of property IDiaSymbol4::addressTaken
+ .property uint32 rank()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4F 00 00 00 00 00 ) // ..O.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_rank()
+ } // end of property IDiaSymbol4::rank
+ .property class DIALib.IDiaSymbol lowerBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 50 00 00 00 00 00 ) // ..P.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_lowerBound()
+ } // end of property IDiaSymbol4::lowerBound
+ .property class DIALib.IDiaSymbol upperBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 51 00 00 00 00 00 ) // ..Q.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_upperBound()
+ } // end of property IDiaSymbol4::upperBound
+ .property uint32 lowerBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 52 00 00 00 00 00 ) // ..R.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_lowerBoundId()
+ } // end of property IDiaSymbol4::lowerBoundId
+ .property uint32 upperBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 53 00 00 00 00 00 ) // ..S.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_upperBoundId()
+ } // end of property IDiaSymbol4::upperBoundId
+ .property uint32 targetSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 54 00 00 00 00 00 ) // ..T.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_targetSection()
+ } // end of property IDiaSymbol4::targetSection
+ .property uint32 targetOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 55 00 00 00 00 00 ) // ..U.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_targetOffset()
+ } // end of property IDiaSymbol4::targetOffset
+ .property uint32 targetRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 56 00 00 00 00 00 ) // ..V.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_targetRelativeVirtualAddress()
+ } // end of property IDiaSymbol4::targetRelativeVirtualAddress
+ .property uint64 targetVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 57 00 00 00 00 00 ) // ..W.....
+ .get instance uint64 DIALib.IDiaSymbol4::get_targetVirtualAddress()
+ } // end of property IDiaSymbol4::targetVirtualAddress
+ .property uint32 machineType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 58 00 00 00 00 00 ) // ..X.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_machineType()
+ } // end of property IDiaSymbol4::machineType
+ .property uint32 oemId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 59 00 00 00 00 00 ) // ..Y.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_oemId()
+ } // end of property IDiaSymbol4::oemId
+ .property uint32 oemSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5A 00 00 00 00 00 ) // ..Z.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_oemSymbolId()
+ } // end of property IDiaSymbol4::oemSymbolId
+ .property class DIALib.IDiaSymbol objectPointerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5B 00 00 00 00 00 ) // ..[.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_objectPointerType()
+ } // end of property IDiaSymbol4::objectPointerType
+ .property uint32 udtKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5C 00 00 00 00 00 ) // ..\.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_udtKind()
+ } // end of property IDiaSymbol4::udtKind
+ .property int32 noReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5D 00 00 00 00 00 ) // ..].....
+ .get instance int32 DIALib.IDiaSymbol4::get_noReturn()
+ } // end of property IDiaSymbol4::noReturn
+ .property int32 customCallingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5E 00 00 00 00 00 ) // ..^.....
+ .get instance int32 DIALib.IDiaSymbol4::get_customCallingConvention()
+ } // end of property IDiaSymbol4::customCallingConvention
+ .property int32 noInline()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5F 00 00 00 00 00 ) // .._.....
+ .get instance int32 DIALib.IDiaSymbol4::get_noInline()
+ } // end of property IDiaSymbol4::noInline
+ .property int32 optimizedCodeDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 60 00 00 00 00 00 ) // ..`.....
+ .get instance int32 DIALib.IDiaSymbol4::get_optimizedCodeDebugInfo()
+ } // end of property IDiaSymbol4::optimizedCodeDebugInfo
+ .property int32 notReached()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 61 00 00 00 00 00 ) // ..a.....
+ .get instance int32 DIALib.IDiaSymbol4::get_notReached()
+ } // end of property IDiaSymbol4::notReached
+ .property int32 interruptReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 62 00 00 00 00 00 ) // ..b.....
+ .get instance int32 DIALib.IDiaSymbol4::get_interruptReturn()
+ } // end of property IDiaSymbol4::interruptReturn
+ .property int32 farReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 63 00 00 00 00 00 ) // ..c.....
+ .get instance int32 DIALib.IDiaSymbol4::get_farReturn()
+ } // end of property IDiaSymbol4::farReturn
+ .property int32 isStatic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 64 00 00 00 00 00 ) // ..d.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isStatic()
+ } // end of property IDiaSymbol4::isStatic
+ .property int32 hasDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 65 00 00 00 00 00 ) // ..e.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasDebugInfo()
+ } // end of property IDiaSymbol4::hasDebugInfo
+ .property int32 isLTCG()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 66 00 00 00 00 00 ) // ..f.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isLTCG()
+ } // end of property IDiaSymbol4::isLTCG
+ .property int32 isDataAligned()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 67 00 00 00 00 00 ) // ..g.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isDataAligned()
+ } // end of property IDiaSymbol4::isDataAligned
+ .property int32 hasSecurityChecks()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 68 00 00 00 00 00 ) // ..h.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasSecurityChecks()
+ } // end of property IDiaSymbol4::hasSecurityChecks
+ .property string compilerName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 69 00 00 00 00 00 ) // ..i.....
+ .get instance string DIALib.IDiaSymbol4::get_compilerName()
+ } // end of property IDiaSymbol4::compilerName
+ .property int32 hasAlloca()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6A 00 00 00 00 00 ) // ..j.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasAlloca()
+ } // end of property IDiaSymbol4::hasAlloca
+ .property int32 hasSetJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6B 00 00 00 00 00 ) // ..k.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasSetJump()
+ } // end of property IDiaSymbol4::hasSetJump
+ .property int32 hasLongJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6C 00 00 00 00 00 ) // ..l.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasLongJump()
+ } // end of property IDiaSymbol4::hasLongJump
+ .property int32 hasInlAsm()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6D 00 00 00 00 00 ) // ..m.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasInlAsm()
+ } // end of property IDiaSymbol4::hasInlAsm
+ .property int32 hasEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6E 00 00 00 00 00 ) // ..n.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasEH()
+ } // end of property IDiaSymbol4::hasEH
+ .property int32 hasSEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6F 00 00 00 00 00 ) // ..o.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasSEH()
+ } // end of property IDiaSymbol4::hasSEH
+ .property int32 hasEHa()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 70 00 00 00 00 00 ) // ..p.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasEHa()
+ } // end of property IDiaSymbol4::hasEHa
+ .property int32 isNaked()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 71 00 00 00 00 00 ) // ..q.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isNaked()
+ } // end of property IDiaSymbol4::isNaked
+ .property int32 isAggregated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 72 00 00 00 00 00 ) // ..r.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isAggregated()
+ } // end of property IDiaSymbol4::isAggregated
+ .property int32 isSplitted()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 73 00 00 00 00 00 ) // ..s.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isSplitted()
+ } // end of property IDiaSymbol4::isSplitted
+ .property class DIALib.IDiaSymbol container()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 74 00 00 00 00 00 ) // ..t.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_container()
+ } // end of property IDiaSymbol4::container
+ .property int32 inlSpec()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 75 00 00 00 00 00 ) // ..u.....
+ .get instance int32 DIALib.IDiaSymbol4::get_inlSpec()
+ } // end of property IDiaSymbol4::inlSpec
+ .property int32 noStackOrdering()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 76 00 00 00 00 00 ) // ..v.....
+ .get instance int32 DIALib.IDiaSymbol4::get_noStackOrdering()
+ } // end of property IDiaSymbol4::noStackOrdering
+ .property class DIALib.IDiaSymbol virtualBaseTableType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 77 00 00 00 00 00 ) // ..w.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_virtualBaseTableType()
+ } // end of property IDiaSymbol4::virtualBaseTableType
+ .property int32 hasManagedCode()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 78 00 00 00 00 00 ) // ..x.....
+ .get instance int32 DIALib.IDiaSymbol4::get_hasManagedCode()
+ } // end of property IDiaSymbol4::hasManagedCode
+ .property int32 isHotpatchable()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 79 00 00 00 00 00 ) // ..y.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isHotpatchable()
+ } // end of property IDiaSymbol4::isHotpatchable
+ .property int32 isCVTCIL()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7A 00 00 00 00 00 ) // ..z.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isCVTCIL()
+ } // end of property IDiaSymbol4::isCVTCIL
+ .property int32 isMSILNetmodule()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7B 00 00 00 00 00 ) // ..{.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isMSILNetmodule()
+ } // end of property IDiaSymbol4::isMSILNetmodule
+ .property int32 isCTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7C 00 00 00 00 00 ) // ..|.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isCTypes()
+ } // end of property IDiaSymbol4::isCTypes
+ .property int32 isStripped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7D 00 00 00 00 00 ) // ..}.....
+ .get instance int32 DIALib.IDiaSymbol4::get_isStripped()
+ } // end of property IDiaSymbol4::isStripped
+ .property uint32 frontEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7E 00 00 00 00 00 ) // ..~.....
+ .get instance uint32 DIALib.IDiaSymbol4::get_frontEndQFE()
+ } // end of property IDiaSymbol4::frontEndQFE
+ .property uint32 backEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_backEndQFE()
+ } // end of property IDiaSymbol4::backEndQFE
+ .property int32 wasInlined()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 80 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_wasInlined()
+ } // end of property IDiaSymbol4::wasInlined
+ .property int32 strictGSCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 81 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_strictGSCheck()
+ } // end of property IDiaSymbol4::strictGSCheck
+ .property int32 isCxxReturnUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 82 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isCxxReturnUdt()
+ } // end of property IDiaSymbol4::isCxxReturnUdt
+ .property int32 isConstructorVirtualBase()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 83 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isConstructorVirtualBase()
+ } // end of property IDiaSymbol4::isConstructorVirtualBase
+ .property int32 RValueReference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 84 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_RValueReference()
+ } // end of property IDiaSymbol4::RValueReference
+ .property class DIALib.IDiaSymbol unmodifiedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 85 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_unmodifiedType()
+ } // end of property IDiaSymbol4::unmodifiedType
+ .property int32 framePointerPresent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 86 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_framePointerPresent()
+ } // end of property IDiaSymbol4::framePointerPresent
+ .property int32 isSafeBuffers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 87 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isSafeBuffers()
+ } // end of property IDiaSymbol4::isSafeBuffers
+ .property int32 intrinsic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 88 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_intrinsic()
+ } // end of property IDiaSymbol4::intrinsic
+ .property int32 'sealed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 89 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_sealed()
+ } // end of property IDiaSymbol4::'sealed'
+ .property int32 hfaFloat()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_hfaFloat()
+ } // end of property IDiaSymbol4::hfaFloat
+ .property int32 hfaDouble()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8B 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_hfaDouble()
+ } // end of property IDiaSymbol4::hfaDouble
+ .property uint32 liveRangeStartAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_liveRangeStartAddressSection()
+ } // end of property IDiaSymbol4::liveRangeStartAddressSection
+ .property uint32 liveRangeStartAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_liveRangeStartAddressOffset()
+ } // end of property IDiaSymbol4::liveRangeStartAddressOffset
+ .property uint32 liveRangeStartRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_liveRangeStartRelativeVirtualAddress()
+ } // end of property IDiaSymbol4::liveRangeStartRelativeVirtualAddress
+ .property uint32 countLiveRanges()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_countLiveRanges()
+ } // end of property IDiaSymbol4::countLiveRanges
+ .property uint64 liveRangeLength()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 90 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol4::get_liveRangeLength()
+ } // end of property IDiaSymbol4::liveRangeLength
+ .property uint32 offsetInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 91 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_offsetInUdt()
+ } // end of property IDiaSymbol4::offsetInUdt
+ .property uint32 paramBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 92 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_paramBasePointerRegisterId()
+ } // end of property IDiaSymbol4::paramBasePointerRegisterId
+ .property uint32 localBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 93 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_localBasePointerRegisterId()
+ } // end of property IDiaSymbol4::localBasePointerRegisterId
+ .property int32 isLocationControlFlowDependent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 94 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isLocationControlFlowDependent()
+ } // end of property IDiaSymbol4::isLocationControlFlowDependent
+ .property uint32 stride()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 95 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_stride()
+ } // end of property IDiaSymbol4::stride
+ .property uint32 numberOfRows()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 96 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_numberOfRows()
+ } // end of property IDiaSymbol4::numberOfRows
+ .property uint32 numberOfColumns()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 97 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_numberOfColumns()
+ } // end of property IDiaSymbol4::numberOfColumns
+ .property int32 isMatrixRowMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 98 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isMatrixRowMajor()
+ } // end of property IDiaSymbol4::isMatrixRowMajor
+ .property int32 isReturnValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 99 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isReturnValue()
+ } // end of property IDiaSymbol4::isReturnValue
+ .property int32 isOptimizedAway()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isOptimizedAway()
+ } // end of property IDiaSymbol4::isOptimizedAway
+ .property uint32 builtInKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_builtInKind()
+ } // end of property IDiaSymbol4::builtInKind
+ .property uint32 registerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_registerType()
+ } // end of property IDiaSymbol4::registerType
+ .property uint32 baseDataSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_baseDataSlot()
+ } // end of property IDiaSymbol4::baseDataSlot
+ .property uint32 baseDataOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_baseDataOffset()
+ } // end of property IDiaSymbol4::baseDataOffset
+ .property uint32 textureSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_textureSlot()
+ } // end of property IDiaSymbol4::textureSlot
+ .property uint32 samplerSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_samplerSlot()
+ } // end of property IDiaSymbol4::samplerSlot
+ .property uint32 uavSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_uavSlot()
+ } // end of property IDiaSymbol4::uavSlot
+ .property uint32 sizeInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_sizeInUdt()
+ } // end of property IDiaSymbol4::sizeInUdt
+ .property uint32 memorySpaceKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_memorySpaceKind()
+ } // end of property IDiaSymbol4::memorySpaceKind
+ .property uint32 unmodifiedTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_unmodifiedTypeId()
+ } // end of property IDiaSymbol4::unmodifiedTypeId
+ .property uint32 subTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_subTypeId()
+ } // end of property IDiaSymbol4::subTypeId
+ .property class DIALib.IDiaSymbol subType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A6 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_subType()
+ } // end of property IDiaSymbol4::subType
+ .property uint32 numberOfModifiers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_numberOfModifiers()
+ } // end of property IDiaSymbol4::numberOfModifiers
+ .property uint32 numberOfRegisterIndices()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A8 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_numberOfRegisterIndices()
+ } // end of property IDiaSymbol4::numberOfRegisterIndices
+ .property int32 isHLSLData()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isHLSLData()
+ } // end of property IDiaSymbol4::isHLSLData
+ .property int32 isPointerToDataMember()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isPointerToDataMember()
+ } // end of property IDiaSymbol4::isPointerToDataMember
+ .property int32 isPointerToMemberFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isPointerToMemberFunction()
+ } // end of property IDiaSymbol4::isPointerToMemberFunction
+ .property int32 isSingleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isSingleInheritance()
+ } // end of property IDiaSymbol4::isSingleInheritance
+ .property int32 isMultipleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isMultipleInheritance()
+ } // end of property IDiaSymbol4::isMultipleInheritance
+ .property int32 isVirtualInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isVirtualInheritance()
+ } // end of property IDiaSymbol4::isVirtualInheritance
+ .property int32 restrictedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_restrictedType()
+ } // end of property IDiaSymbol4::restrictedType
+ .property int32 isPointerBasedOnSymbolValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B0 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isPointerBasedOnSymbolValue()
+ } // end of property IDiaSymbol4::isPointerBasedOnSymbolValue
+ .property class DIALib.IDiaSymbol baseSymbol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B1 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_baseSymbol()
+ } // end of property IDiaSymbol4::baseSymbol
+ .property uint32 baseSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_baseSymbolId()
+ } // end of property IDiaSymbol4::baseSymbolId
+ .property string objectFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B3 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol4::get_objectFileName()
+ } // end of property IDiaSymbol4::objectFileName
+ .property int32 isAcceleratorGroupSharedLocal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B4 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isAcceleratorGroupSharedLocal()
+ } // end of property IDiaSymbol4::isAcceleratorGroupSharedLocal
+ .property int32 isAcceleratorPointerTagLiveRange()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B5 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isAcceleratorPointerTagLiveRange()
+ } // end of property IDiaSymbol4::isAcceleratorPointerTagLiveRange
+ .property int32 isAcceleratorStubFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isAcceleratorStubFunction()
+ } // end of property IDiaSymbol4::isAcceleratorStubFunction
+ .property uint32 numberOfAcceleratorPointerTags()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_numberOfAcceleratorPointerTags()
+ } // end of property IDiaSymbol4::numberOfAcceleratorPointerTags
+ .property int32 isSdl()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isSdl()
+ } // end of property IDiaSymbol4::isSdl
+ .property int32 isWinRTPointer()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isWinRTPointer()
+ } // end of property IDiaSymbol4::isWinRTPointer
+ .property int32 isRefUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isRefUdt()
+ } // end of property IDiaSymbol4::isRefUdt
+ .property int32 isValueUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isValueUdt()
+ } // end of property IDiaSymbol4::isValueUdt
+ .property int32 isInterfaceUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isInterfaceUdt()
+ } // end of property IDiaSymbol4::isInterfaceUdt
+ .property int32 isPGO()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isPGO()
+ } // end of property IDiaSymbol4::isPGO
+ .property int32 hasValidPGOCounts()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_hasValidPGOCounts()
+ } // end of property IDiaSymbol4::hasValidPGOCounts
+ .property int32 isOptimizedForSpeed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isOptimizedForSpeed()
+ } // end of property IDiaSymbol4::isOptimizedForSpeed
+ .property uint32 PGOEntryCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_PGOEntryCount()
+ } // end of property IDiaSymbol4::PGOEntryCount
+ .property uint32 PGOEdgeCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_PGOEdgeCount()
+ } // end of property IDiaSymbol4::PGOEdgeCount
+ .property uint64 PGODynamicInstructionCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol4::get_PGODynamicInstructionCount()
+ } // end of property IDiaSymbol4::PGODynamicInstructionCount
+ .property uint32 staticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_staticSize()
+ } // end of property IDiaSymbol4::staticSize
+ .property uint32 finalLiveStaticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_finalLiveStaticSize()
+ } // end of property IDiaSymbol4::finalLiveStaticSize
+ .property string phaseName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C5 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol4::get_phaseName()
+ } // end of property IDiaSymbol4::phaseName
+ .property int32 hasControlFlowCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_hasControlFlowCheck()
+ } // end of property IDiaSymbol4::hasControlFlowCheck
+ .property int32 constantExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C7 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_constantExport()
+ } // end of property IDiaSymbol4::constantExport
+ .property int32 dataExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_dataExport()
+ } // end of property IDiaSymbol4::dataExport
+ .property int32 privateExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_privateExport()
+ } // end of property IDiaSymbol4::privateExport
+ .property int32 noNameExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_noNameExport()
+ } // end of property IDiaSymbol4::noNameExport
+ .property int32 exportHasExplicitlyAssignedOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_exportHasExplicitlyAssignedOrdinal()
+ } // end of property IDiaSymbol4::exportHasExplicitlyAssignedOrdinal
+ .property int32 exportIsForwarder()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_exportIsForwarder()
+ } // end of property IDiaSymbol4::exportIsForwarder
+ .property uint32 ordinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CD 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_ordinal()
+ } // end of property IDiaSymbol4::ordinal
+ .property uint32 frameSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CE 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_frameSize()
+ } // end of property IDiaSymbol4::frameSize
+ .property uint32 exceptionHandlerAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CF 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_exceptionHandlerAddressSection()
+ } // end of property IDiaSymbol4::exceptionHandlerAddressSection
+ .property uint32 exceptionHandlerAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_exceptionHandlerAddressOffset()
+ } // end of property IDiaSymbol4::exceptionHandlerAddressOffset
+ .property uint32 exceptionHandlerRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_exceptionHandlerRelativeVirtualAddress()
+ } // end of property IDiaSymbol4::exceptionHandlerRelativeVirtualAddress
+ .property uint64 exceptionHandlerVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol4::get_exceptionHandlerVirtualAddress()
+ } // end of property IDiaSymbol4::exceptionHandlerVirtualAddress
+ .property uint32 characteristics()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_characteristics()
+ } // end of property IDiaSymbol4::characteristics
+ .property class DIALib.IDiaSymbol coffGroup()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D4 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_coffGroup()
+ } // end of property IDiaSymbol4::coffGroup
+ .property uint32 bindID()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_bindID()
+ } // end of property IDiaSymbol4::bindID
+ .property uint32 bindSpace()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D6 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_bindSpace()
+ } // end of property IDiaSymbol4::bindSpace
+ .property uint32 bindSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_bindSlot()
+ } // end of property IDiaSymbol4::bindSlot
+ .property int32 isObjCClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isObjCClass()
+ } // end of property IDiaSymbol4::isObjCClass
+ .property int32 isObjCCategory()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isObjCCategory()
+ } // end of property IDiaSymbol4::isObjCCategory
+ .property int32 isObjCProtocol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_isObjCProtocol()
+ } // end of property IDiaSymbol4::isObjCProtocol
+ .property class DIALib.IDiaSymbol inlinee()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DB 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol4::get_inlinee()
+ } // end of property IDiaSymbol4::inlinee
+ .property uint32 inlineeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DC 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol4::get_inlineeId()
+ } // end of property IDiaSymbol4::inlineeId
+ .property int32 noexcept()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol4::get_noexcept()
+ } // end of property IDiaSymbol4::noexcept
+} // end of class DIALib.IDiaSymbol4
+
+.class interface public abstract auto ansi import DIALib.IDiaSymbol5
+ implements DIALib.IDiaSymbol4
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 41 42 45 32 44 45 30 30 2D 44 43 32 44 // ..$ABE2DE00-DC2D
+ 2D 34 37 39 33 2D 41 46 39 41 2D 45 46 31 44 39 // -4793-AF9A-EF1D9
+ 30 38 33 32 36 34 34 00 00 ) // 0832644..
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 0A 73 79 6D 49 6E 64 65 78 49 64 00 00 ) // ...symIndexId..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symIndexId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_symIndexId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symTag() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_symTag
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_name() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_name
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lexicalParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_lexicalParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_classParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_classParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_type() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_type
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_dataKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_dataKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_locationType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_locationType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_addressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_addressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_relativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_virtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_virtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_registerId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_offset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_offset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_length() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_length
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_slot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_slot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_volatileType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_volatileType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_constType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_unalignedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_unalignedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_access() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_access
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_libraryName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_libraryName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_platform() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_platform
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_language() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_language
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_editAndContinueEnabled() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_editAndContinueEnabled
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_frontEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_frontEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_frontEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_backEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_backEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_backEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_sourceFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_sourceFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_unused() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_unused
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_thunkOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_thunkOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_thisAdjust() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_thisAdjust
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_virtualBaseOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtual() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_virtual
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intro() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_intro
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_pure() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_pure
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_callingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_callingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance object
+ marshal( struct)
+ get_value() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_value
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_baseType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_token() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_token
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_timeStamp() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_timeStamp
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance valuetype [mscorlib]System.Guid
+ get_guid() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_guid
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_symbolsFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_symbolsFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_reference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_reference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_count
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bitPosition() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_bitPosition
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_arrayIndexType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_arrayIndexType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_packed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_packed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constructor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_constructor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_overloadedOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_overloadedOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_nested() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_nested
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasNestedTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasNestedTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAssignmentOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasAssignmentOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasCastOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasCastOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_scoped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_scoped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_virtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_indirectVirtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_indirectVirtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBasePointerOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_virtualBasePointerOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualTableShape() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_virtualTableShape
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lexicalParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_lexicalParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_classParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_classParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_typeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_typeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_arrayIndexTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_arrayIndexTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualTableShapeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_virtualTableShapeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_code() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_code
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_function() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_function
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_managed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_managed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_msil() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_msil
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseDispIndex() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_virtualBaseDispIndex
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_undecoratedName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_undecoratedName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_age() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_age
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_signature() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_signature
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_compilerGenerated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_compilerGenerated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_addressTaken() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_addressTaken
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_rank() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_rank
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lowerBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_lowerBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_upperBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_upperBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lowerBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_lowerBoundId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_upperBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_upperBoundId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_dataBytes([in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_dataBytes
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildren([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findChildren
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenEx([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findChildrenEx
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByAddr([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findChildrenExByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findChildrenExByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByRVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findChildrenExByRVA
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_targetSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_targetOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_targetRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_targetVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_targetVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_machineType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_machineType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_oemId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_oemSymbolId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_types([in] uint32 cTypes,
+ [out] uint32& pcTypes,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) pTypes) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_types
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_typeIds([in] uint32 cTypeIds,
+ [out] uint32& pcTypeIds,
+ [out] uint32& pdwTypeIds) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_typeIds
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_objectPointerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_objectPointerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_udtKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_udtKind
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_undecoratedNameEx([in] uint32 undecorateOptions,
+ [out] string& marshal( bstr) name) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_undecoratedNameEx
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_noReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_customCallingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_customCallingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noInline() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_noInline
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_optimizedCodeDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_optimizedCodeDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_notReached() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_notReached
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_interruptReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_interruptReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_farReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_farReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStatic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isStatic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLTCG() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isLTCG
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isDataAligned() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isDataAligned
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSecurityChecks() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasSecurityChecks
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_compilerName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_compilerName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAlloca() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasAlloca
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSetJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasSetJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasLongJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasLongJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasInlAsm() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasInlAsm
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasSEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEHa() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasEHa
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isNaked() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isNaked
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAggregated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isAggregated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSplitted() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isSplitted
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_container() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_container
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_inlSpec() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_inlSpec
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noStackOrdering() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_noStackOrdering
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualBaseTableType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_virtualBaseTableType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasManagedCode() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasManagedCode
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHotpatchable() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isHotpatchable
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCVTCIL() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isCVTCIL
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMSILNetmodule() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isMSILNetmodule
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isCTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStripped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isStripped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_frontEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_backEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_wasInlined() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_wasInlined
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_strictGSCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_strictGSCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCxxReturnUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isCxxReturnUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isConstructorVirtualBase() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isConstructorVirtualBase
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_RValueReference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_RValueReference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_unmodifiedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_unmodifiedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_framePointerPresent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_framePointerPresent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSafeBuffers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isSafeBuffers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intrinsic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_intrinsic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_sealed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_sealed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaFloat() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hfaFloat
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaDouble() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hfaDouble
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_liveRangeStartAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_liveRangeStartAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_liveRangeStartRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_countLiveRanges() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_countLiveRanges
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_liveRangeLength() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_liveRangeLength
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_offsetInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_offsetInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_paramBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_paramBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_localBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_localBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLocationControlFlowDependent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isLocationControlFlowDependent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_stride() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_stride
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRows() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_numberOfRows
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfColumns() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_numberOfColumns
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMatrixRowMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isMatrixRowMajor
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_numericProperties([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pProperties) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_numericProperties
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_modifierValues([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint16& pModifiers) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_modifierValues
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isReturnValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isReturnValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedAway() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isOptimizedAway
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_builtInKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_builtInKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_registerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_baseDataSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_baseDataOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_textureSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_textureSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_samplerSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_samplerSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_uavSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_uavSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_sizeInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_sizeInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_memorySpaceKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_memorySpaceKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_unmodifiedTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_unmodifiedTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_subTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_subTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_subType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_subType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfModifiers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_numberOfModifiers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRegisterIndices() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_numberOfRegisterIndices
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHLSLData() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isHLSLData
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToDataMember() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isPointerToDataMember
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToMemberFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isPointerToMemberFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSingleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isSingleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMultipleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isMultipleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isVirtualInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isVirtualInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_restrictedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_restrictedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerBasedOnSymbolValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isPointerBasedOnSymbolValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_baseSymbol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_baseSymbol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_baseSymbolId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_objectFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_objectFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorGroupSharedLocal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isAcceleratorGroupSharedLocal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorPointerTagLiveRange() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isAcceleratorPointerTagLiveRange
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorStubFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isAcceleratorStubFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfAcceleratorPointerTags() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_numberOfAcceleratorPointerTags
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSdl() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isSdl
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isWinRTPointer() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isWinRTPointer
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isRefUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isRefUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isValueUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isValueUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isInterfaceUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isInterfaceUdt
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findInlineFramesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByRVA([in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findInlineFramesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByVA([in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findInlineFramesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLines([out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findInlineeLines
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findInlineeLinesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByRVA([in] uint32 rva,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findInlineeLinesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByVA([in] uint64 va,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findInlineeLinesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsForAcceleratorPointerTag([in] uint32 tagValue,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findSymbolsForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsByRVAForAcceleratorPointerTag([in] uint32 tagValue,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findSymbolsByRVAForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_acceleratorPointerTags([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pPointerTags) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_acceleratorPointerTags
+
+ .method public hidebysig newslot abstract virtual
+ instance void getSrcLineOnTypeDefn([out] class DIALib.IDiaLineNumber& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::getSrcLineOnTypeDefn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPGO() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isPGO
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasValidPGOCounts() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasValidPGOCounts
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedForSpeed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isOptimizedForSpeed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEntryCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_PGOEntryCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEdgeCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_PGOEdgeCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_PGODynamicInstructionCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_PGODynamicInstructionCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_staticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_staticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_finalLiveStaticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_finalLiveStaticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_phaseName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_phaseName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasControlFlowCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasControlFlowCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constantExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_constantExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_dataExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_dataExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_privateExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_privateExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noNameExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_noNameExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportHasExplicitlyAssignedOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_exportHasExplicitlyAssignedOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportIsForwarder() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_exportIsForwarder
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_ordinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_ordinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frameSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_frameSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_exceptionHandlerAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_exceptionHandlerAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_exceptionHandlerRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_exceptionHandlerVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_exceptionHandlerVirtualAddress
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssemblyFile([out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::findInputAssemblyFile
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_characteristics() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_characteristics
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_coffGroup() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_coffGroup
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindID() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_bindID
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSpace() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_bindSpace
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_bindSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isObjCClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCCategory() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isObjCCategory
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCProtocol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_isObjCProtocol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_inlinee() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_inlinee
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_inlineeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_inlineeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noexcept() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_noexcept
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAbsoluteAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol5::get_hasAbsoluteAddress
+
+ .property uint32 symIndexId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_symIndexId()
+ } // end of property IDiaSymbol5::symIndexId
+ .property uint32 symTag()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_symTag()
+ } // end of property IDiaSymbol5::symTag
+ .property string name()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol5::get_name()
+ } // end of property IDiaSymbol5::name
+ .property class DIALib.IDiaSymbol lexicalParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_lexicalParent()
+ } // end of property IDiaSymbol5::lexicalParent
+ .property class DIALib.IDiaSymbol classParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_classParent()
+ } // end of property IDiaSymbol5::classParent
+ .property class DIALib.IDiaSymbol 'type'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_type()
+ } // end of property IDiaSymbol5::'type'
+ .property uint32 dataKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_dataKind()
+ } // end of property IDiaSymbol5::dataKind
+ .property uint32 locationType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 07 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_locationType()
+ } // end of property IDiaSymbol5::locationType
+ .property uint32 addressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_addressSection()
+ } // end of property IDiaSymbol5::addressSection
+ .property uint32 addressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_addressOffset()
+ } // end of property IDiaSymbol5::addressOffset
+ .property uint32 relativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_relativeVirtualAddress()
+ } // end of property IDiaSymbol5::relativeVirtualAddress
+ .property uint64 virtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol5::get_virtualAddress()
+ } // end of property IDiaSymbol5::virtualAddress
+ .property uint32 registerId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_registerId()
+ } // end of property IDiaSymbol5::registerId
+ .property int32 offset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_offset()
+ } // end of property IDiaSymbol5::offset
+ .property uint64 length()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol5::get_length()
+ } // end of property IDiaSymbol5::length
+ .property uint32 slot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_slot()
+ } // end of property IDiaSymbol5::slot
+ .property int32 volatileType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 10 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_volatileType()
+ } // end of property IDiaSymbol5::volatileType
+ .property int32 constType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 11 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_constType()
+ } // end of property IDiaSymbol5::constType
+ .property int32 unalignedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 12 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_unalignedType()
+ } // end of property IDiaSymbol5::unalignedType
+ .property uint32 access()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 13 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_access()
+ } // end of property IDiaSymbol5::access
+ .property string libraryName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 14 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol5::get_libraryName()
+ } // end of property IDiaSymbol5::libraryName
+ .property uint32 platform()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 15 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_platform()
+ } // end of property IDiaSymbol5::platform
+ .property uint32 language()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 16 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_language()
+ } // end of property IDiaSymbol5::language
+ .property int32 editAndContinueEnabled()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 17 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_editAndContinueEnabled()
+ } // end of property IDiaSymbol5::editAndContinueEnabled
+ .property uint32 frontEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 18 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_frontEndMajor()
+ } // end of property IDiaSymbol5::frontEndMajor
+ .property uint32 frontEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 19 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_frontEndMinor()
+ } // end of property IDiaSymbol5::frontEndMinor
+ .property uint32 frontEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_frontEndBuild()
+ } // end of property IDiaSymbol5::frontEndBuild
+ .property uint32 backEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_backEndMajor()
+ } // end of property IDiaSymbol5::backEndMajor
+ .property uint32 backEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_backEndMinor()
+ } // end of property IDiaSymbol5::backEndMinor
+ .property uint32 backEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_backEndBuild()
+ } // end of property IDiaSymbol5::backEndBuild
+ .property string sourceFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1E 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol5::get_sourceFileName()
+ } // end of property IDiaSymbol5::sourceFileName
+ .property string 'unused'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1F 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol5::get_unused()
+ } // end of property IDiaSymbol5::'unused'
+ .property uint32 thunkOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 20 00 00 00 00 00 ) // .. .....
+ .get instance uint32 DIALib.IDiaSymbol5::get_thunkOrdinal()
+ } // end of property IDiaSymbol5::thunkOrdinal
+ .property int32 thisAdjust()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 21 00 00 00 00 00 ) // ..!.....
+ .get instance int32 DIALib.IDiaSymbol5::get_thisAdjust()
+ } // end of property IDiaSymbol5::thisAdjust
+ .property uint32 virtualBaseOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 22 00 00 00 00 00 ) // ..".....
+ .get instance uint32 DIALib.IDiaSymbol5::get_virtualBaseOffset()
+ } // end of property IDiaSymbol5::virtualBaseOffset
+ .property int32 'virtual'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 23 00 00 00 00 00 ) // ..#.....
+ .get instance int32 DIALib.IDiaSymbol5::get_virtual()
+ } // end of property IDiaSymbol5::'virtual'
+ .property int32 intro()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 24 00 00 00 00 00 ) // ..$.....
+ .get instance int32 DIALib.IDiaSymbol5::get_intro()
+ } // end of property IDiaSymbol5::intro
+ .property int32 pure()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 25 00 00 00 00 00 ) // ..%.....
+ .get instance int32 DIALib.IDiaSymbol5::get_pure()
+ } // end of property IDiaSymbol5::pure
+ .property uint32 callingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 26 00 00 00 00 00 ) // ..&.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_callingConvention()
+ } // end of property IDiaSymbol5::callingConvention
+ .property object 'value'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 27 00 00 00 00 00 ) // ..'.....
+ .get instance object DIALib.IDiaSymbol5::get_value()
+ } // end of property IDiaSymbol5::'value'
+ .property uint32 baseType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 28 00 00 00 00 00 ) // ..(.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_baseType()
+ } // end of property IDiaSymbol5::baseType
+ .property uint32 token()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 29 00 00 00 00 00 ) // ..).....
+ .get instance uint32 DIALib.IDiaSymbol5::get_token()
+ } // end of property IDiaSymbol5::token
+ .property uint32 timeStamp()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2A 00 00 00 00 00 ) // ..*.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_timeStamp()
+ } // end of property IDiaSymbol5::timeStamp
+ .property valuetype [mscorlib]System.Guid
+ guid()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2B 00 00 00 00 00 ) // ..+.....
+ .get instance valuetype [mscorlib]System.Guid DIALib.IDiaSymbol5::get_guid()
+ } // end of property IDiaSymbol5::guid
+ .property string symbolsFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2C 00 00 00 00 00 ) // ..,.....
+ .get instance string DIALib.IDiaSymbol5::get_symbolsFileName()
+ } // end of property IDiaSymbol5::symbolsFileName
+ .property int32 reference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2E 00 00 00 00 00 ) // ........
+ .get instance int32 DIALib.IDiaSymbol5::get_reference()
+ } // end of property IDiaSymbol5::reference
+ .property uint32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2F 00 00 00 00 00 ) // ../.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_count()
+ } // end of property IDiaSymbol5::count
+ .property uint32 bitPosition()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 31 00 00 00 00 00 ) // ..1.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_bitPosition()
+ } // end of property IDiaSymbol5::bitPosition
+ .property class DIALib.IDiaSymbol arrayIndexType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 32 00 00 00 00 00 ) // ..2.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_arrayIndexType()
+ } // end of property IDiaSymbol5::arrayIndexType
+ .property int32 packed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 33 00 00 00 00 00 ) // ..3.....
+ .get instance int32 DIALib.IDiaSymbol5::get_packed()
+ } // end of property IDiaSymbol5::packed
+ .property int32 constructor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 34 00 00 00 00 00 ) // ..4.....
+ .get instance int32 DIALib.IDiaSymbol5::get_constructor()
+ } // end of property IDiaSymbol5::constructor
+ .property int32 overloadedOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 35 00 00 00 00 00 ) // ..5.....
+ .get instance int32 DIALib.IDiaSymbol5::get_overloadedOperator()
+ } // end of property IDiaSymbol5::overloadedOperator
+ .property int32 'nested'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 36 00 00 00 00 00 ) // ..6.....
+ .get instance int32 DIALib.IDiaSymbol5::get_nested()
+ } // end of property IDiaSymbol5::'nested'
+ .property int32 hasNestedTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 37 00 00 00 00 00 ) // ..7.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasNestedTypes()
+ } // end of property IDiaSymbol5::hasNestedTypes
+ .property int32 hasAssignmentOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 38 00 00 00 00 00 ) // ..8.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasAssignmentOperator()
+ } // end of property IDiaSymbol5::hasAssignmentOperator
+ .property int32 hasCastOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 39 00 00 00 00 00 ) // ..9.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasCastOperator()
+ } // end of property IDiaSymbol5::hasCastOperator
+ .property int32 scoped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3A 00 00 00 00 00 ) // ..:.....
+ .get instance int32 DIALib.IDiaSymbol5::get_scoped()
+ } // end of property IDiaSymbol5::scoped
+ .property int32 virtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3B 00 00 00 00 00 ) // ..;.....
+ .get instance int32 DIALib.IDiaSymbol5::get_virtualBaseClass()
+ } // end of property IDiaSymbol5::virtualBaseClass
+ .property int32 indirectVirtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3C 00 00 00 00 00 ) // ..<.....
+ .get instance int32 DIALib.IDiaSymbol5::get_indirectVirtualBaseClass()
+ } // end of property IDiaSymbol5::indirectVirtualBaseClass
+ .property int32 virtualBasePointerOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3D 00 00 00 00 00 ) // ..=.....
+ .get instance int32 DIALib.IDiaSymbol5::get_virtualBasePointerOffset()
+ } // end of property IDiaSymbol5::virtualBasePointerOffset
+ .property class DIALib.IDiaSymbol virtualTableShape()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3E 00 00 00 00 00 ) // ..>.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_virtualTableShape()
+ } // end of property IDiaSymbol5::virtualTableShape
+ .property uint32 lexicalParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 40 00 00 00 00 00 ) // ..@.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_lexicalParentId()
+ } // end of property IDiaSymbol5::lexicalParentId
+ .property uint32 classParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 41 00 00 00 00 00 ) // ..A.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_classParentId()
+ } // end of property IDiaSymbol5::classParentId
+ .property uint32 typeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 42 00 00 00 00 00 ) // ..B.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_typeId()
+ } // end of property IDiaSymbol5::typeId
+ .property uint32 arrayIndexTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 43 00 00 00 00 00 ) // ..C.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_arrayIndexTypeId()
+ } // end of property IDiaSymbol5::arrayIndexTypeId
+ .property uint32 virtualTableShapeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 44 00 00 00 00 00 ) // ..D.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_virtualTableShapeId()
+ } // end of property IDiaSymbol5::virtualTableShapeId
+ .property int32 code()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 45 00 00 00 00 00 ) // ..E.....
+ .get instance int32 DIALib.IDiaSymbol5::get_code()
+ } // end of property IDiaSymbol5::code
+ .property int32 function()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 46 00 00 00 00 00 ) // ..F.....
+ .get instance int32 DIALib.IDiaSymbol5::get_function()
+ } // end of property IDiaSymbol5::function
+ .property int32 'managed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 47 00 00 00 00 00 ) // ..G.....
+ .get instance int32 DIALib.IDiaSymbol5::get_managed()
+ } // end of property IDiaSymbol5::'managed'
+ .property int32 msil()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 48 00 00 00 00 00 ) // ..H.....
+ .get instance int32 DIALib.IDiaSymbol5::get_msil()
+ } // end of property IDiaSymbol5::msil
+ .property uint32 virtualBaseDispIndex()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 49 00 00 00 00 00 ) // ..I.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_virtualBaseDispIndex()
+ } // end of property IDiaSymbol5::virtualBaseDispIndex
+ .property string undecoratedName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4A 00 00 00 00 00 ) // ..J.....
+ .get instance string DIALib.IDiaSymbol5::get_undecoratedName()
+ } // end of property IDiaSymbol5::undecoratedName
+ .property uint32 age()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4B 00 00 00 00 00 ) // ..K.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_age()
+ } // end of property IDiaSymbol5::age
+ .property uint32 signature()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4C 00 00 00 00 00 ) // ..L.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_signature()
+ } // end of property IDiaSymbol5::signature
+ .property int32 compilerGenerated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4D 00 00 00 00 00 ) // ..M.....
+ .get instance int32 DIALib.IDiaSymbol5::get_compilerGenerated()
+ } // end of property IDiaSymbol5::compilerGenerated
+ .property int32 addressTaken()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4E 00 00 00 00 00 ) // ..N.....
+ .get instance int32 DIALib.IDiaSymbol5::get_addressTaken()
+ } // end of property IDiaSymbol5::addressTaken
+ .property uint32 rank()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4F 00 00 00 00 00 ) // ..O.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_rank()
+ } // end of property IDiaSymbol5::rank
+ .property class DIALib.IDiaSymbol lowerBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 50 00 00 00 00 00 ) // ..P.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_lowerBound()
+ } // end of property IDiaSymbol5::lowerBound
+ .property class DIALib.IDiaSymbol upperBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 51 00 00 00 00 00 ) // ..Q.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_upperBound()
+ } // end of property IDiaSymbol5::upperBound
+ .property uint32 lowerBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 52 00 00 00 00 00 ) // ..R.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_lowerBoundId()
+ } // end of property IDiaSymbol5::lowerBoundId
+ .property uint32 upperBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 53 00 00 00 00 00 ) // ..S.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_upperBoundId()
+ } // end of property IDiaSymbol5::upperBoundId
+ .property uint32 targetSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 54 00 00 00 00 00 ) // ..T.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_targetSection()
+ } // end of property IDiaSymbol5::targetSection
+ .property uint32 targetOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 55 00 00 00 00 00 ) // ..U.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_targetOffset()
+ } // end of property IDiaSymbol5::targetOffset
+ .property uint32 targetRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 56 00 00 00 00 00 ) // ..V.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_targetRelativeVirtualAddress()
+ } // end of property IDiaSymbol5::targetRelativeVirtualAddress
+ .property uint64 targetVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 57 00 00 00 00 00 ) // ..W.....
+ .get instance uint64 DIALib.IDiaSymbol5::get_targetVirtualAddress()
+ } // end of property IDiaSymbol5::targetVirtualAddress
+ .property uint32 machineType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 58 00 00 00 00 00 ) // ..X.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_machineType()
+ } // end of property IDiaSymbol5::machineType
+ .property uint32 oemId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 59 00 00 00 00 00 ) // ..Y.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_oemId()
+ } // end of property IDiaSymbol5::oemId
+ .property uint32 oemSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5A 00 00 00 00 00 ) // ..Z.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_oemSymbolId()
+ } // end of property IDiaSymbol5::oemSymbolId
+ .property class DIALib.IDiaSymbol objectPointerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5B 00 00 00 00 00 ) // ..[.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_objectPointerType()
+ } // end of property IDiaSymbol5::objectPointerType
+ .property uint32 udtKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5C 00 00 00 00 00 ) // ..\.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_udtKind()
+ } // end of property IDiaSymbol5::udtKind
+ .property int32 noReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5D 00 00 00 00 00 ) // ..].....
+ .get instance int32 DIALib.IDiaSymbol5::get_noReturn()
+ } // end of property IDiaSymbol5::noReturn
+ .property int32 customCallingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5E 00 00 00 00 00 ) // ..^.....
+ .get instance int32 DIALib.IDiaSymbol5::get_customCallingConvention()
+ } // end of property IDiaSymbol5::customCallingConvention
+ .property int32 noInline()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5F 00 00 00 00 00 ) // .._.....
+ .get instance int32 DIALib.IDiaSymbol5::get_noInline()
+ } // end of property IDiaSymbol5::noInline
+ .property int32 optimizedCodeDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 60 00 00 00 00 00 ) // ..`.....
+ .get instance int32 DIALib.IDiaSymbol5::get_optimizedCodeDebugInfo()
+ } // end of property IDiaSymbol5::optimizedCodeDebugInfo
+ .property int32 notReached()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 61 00 00 00 00 00 ) // ..a.....
+ .get instance int32 DIALib.IDiaSymbol5::get_notReached()
+ } // end of property IDiaSymbol5::notReached
+ .property int32 interruptReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 62 00 00 00 00 00 ) // ..b.....
+ .get instance int32 DIALib.IDiaSymbol5::get_interruptReturn()
+ } // end of property IDiaSymbol5::interruptReturn
+ .property int32 farReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 63 00 00 00 00 00 ) // ..c.....
+ .get instance int32 DIALib.IDiaSymbol5::get_farReturn()
+ } // end of property IDiaSymbol5::farReturn
+ .property int32 isStatic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 64 00 00 00 00 00 ) // ..d.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isStatic()
+ } // end of property IDiaSymbol5::isStatic
+ .property int32 hasDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 65 00 00 00 00 00 ) // ..e.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasDebugInfo()
+ } // end of property IDiaSymbol5::hasDebugInfo
+ .property int32 isLTCG()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 66 00 00 00 00 00 ) // ..f.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isLTCG()
+ } // end of property IDiaSymbol5::isLTCG
+ .property int32 isDataAligned()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 67 00 00 00 00 00 ) // ..g.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isDataAligned()
+ } // end of property IDiaSymbol5::isDataAligned
+ .property int32 hasSecurityChecks()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 68 00 00 00 00 00 ) // ..h.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasSecurityChecks()
+ } // end of property IDiaSymbol5::hasSecurityChecks
+ .property string compilerName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 69 00 00 00 00 00 ) // ..i.....
+ .get instance string DIALib.IDiaSymbol5::get_compilerName()
+ } // end of property IDiaSymbol5::compilerName
+ .property int32 hasAlloca()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6A 00 00 00 00 00 ) // ..j.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasAlloca()
+ } // end of property IDiaSymbol5::hasAlloca
+ .property int32 hasSetJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6B 00 00 00 00 00 ) // ..k.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasSetJump()
+ } // end of property IDiaSymbol5::hasSetJump
+ .property int32 hasLongJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6C 00 00 00 00 00 ) // ..l.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasLongJump()
+ } // end of property IDiaSymbol5::hasLongJump
+ .property int32 hasInlAsm()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6D 00 00 00 00 00 ) // ..m.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasInlAsm()
+ } // end of property IDiaSymbol5::hasInlAsm
+ .property int32 hasEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6E 00 00 00 00 00 ) // ..n.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasEH()
+ } // end of property IDiaSymbol5::hasEH
+ .property int32 hasSEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6F 00 00 00 00 00 ) // ..o.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasSEH()
+ } // end of property IDiaSymbol5::hasSEH
+ .property int32 hasEHa()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 70 00 00 00 00 00 ) // ..p.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasEHa()
+ } // end of property IDiaSymbol5::hasEHa
+ .property int32 isNaked()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 71 00 00 00 00 00 ) // ..q.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isNaked()
+ } // end of property IDiaSymbol5::isNaked
+ .property int32 isAggregated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 72 00 00 00 00 00 ) // ..r.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isAggregated()
+ } // end of property IDiaSymbol5::isAggregated
+ .property int32 isSplitted()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 73 00 00 00 00 00 ) // ..s.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isSplitted()
+ } // end of property IDiaSymbol5::isSplitted
+ .property class DIALib.IDiaSymbol container()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 74 00 00 00 00 00 ) // ..t.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_container()
+ } // end of property IDiaSymbol5::container
+ .property int32 inlSpec()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 75 00 00 00 00 00 ) // ..u.....
+ .get instance int32 DIALib.IDiaSymbol5::get_inlSpec()
+ } // end of property IDiaSymbol5::inlSpec
+ .property int32 noStackOrdering()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 76 00 00 00 00 00 ) // ..v.....
+ .get instance int32 DIALib.IDiaSymbol5::get_noStackOrdering()
+ } // end of property IDiaSymbol5::noStackOrdering
+ .property class DIALib.IDiaSymbol virtualBaseTableType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 77 00 00 00 00 00 ) // ..w.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_virtualBaseTableType()
+ } // end of property IDiaSymbol5::virtualBaseTableType
+ .property int32 hasManagedCode()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 78 00 00 00 00 00 ) // ..x.....
+ .get instance int32 DIALib.IDiaSymbol5::get_hasManagedCode()
+ } // end of property IDiaSymbol5::hasManagedCode
+ .property int32 isHotpatchable()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 79 00 00 00 00 00 ) // ..y.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isHotpatchable()
+ } // end of property IDiaSymbol5::isHotpatchable
+ .property int32 isCVTCIL()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7A 00 00 00 00 00 ) // ..z.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isCVTCIL()
+ } // end of property IDiaSymbol5::isCVTCIL
+ .property int32 isMSILNetmodule()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7B 00 00 00 00 00 ) // ..{.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isMSILNetmodule()
+ } // end of property IDiaSymbol5::isMSILNetmodule
+ .property int32 isCTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7C 00 00 00 00 00 ) // ..|.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isCTypes()
+ } // end of property IDiaSymbol5::isCTypes
+ .property int32 isStripped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7D 00 00 00 00 00 ) // ..}.....
+ .get instance int32 DIALib.IDiaSymbol5::get_isStripped()
+ } // end of property IDiaSymbol5::isStripped
+ .property uint32 frontEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7E 00 00 00 00 00 ) // ..~.....
+ .get instance uint32 DIALib.IDiaSymbol5::get_frontEndQFE()
+ } // end of property IDiaSymbol5::frontEndQFE
+ .property uint32 backEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_backEndQFE()
+ } // end of property IDiaSymbol5::backEndQFE
+ .property int32 wasInlined()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 80 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_wasInlined()
+ } // end of property IDiaSymbol5::wasInlined
+ .property int32 strictGSCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 81 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_strictGSCheck()
+ } // end of property IDiaSymbol5::strictGSCheck
+ .property int32 isCxxReturnUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 82 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isCxxReturnUdt()
+ } // end of property IDiaSymbol5::isCxxReturnUdt
+ .property int32 isConstructorVirtualBase()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 83 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isConstructorVirtualBase()
+ } // end of property IDiaSymbol5::isConstructorVirtualBase
+ .property int32 RValueReference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 84 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_RValueReference()
+ } // end of property IDiaSymbol5::RValueReference
+ .property class DIALib.IDiaSymbol unmodifiedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 85 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_unmodifiedType()
+ } // end of property IDiaSymbol5::unmodifiedType
+ .property int32 framePointerPresent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 86 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_framePointerPresent()
+ } // end of property IDiaSymbol5::framePointerPresent
+ .property int32 isSafeBuffers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 87 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isSafeBuffers()
+ } // end of property IDiaSymbol5::isSafeBuffers
+ .property int32 intrinsic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 88 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_intrinsic()
+ } // end of property IDiaSymbol5::intrinsic
+ .property int32 'sealed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 89 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_sealed()
+ } // end of property IDiaSymbol5::'sealed'
+ .property int32 hfaFloat()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_hfaFloat()
+ } // end of property IDiaSymbol5::hfaFloat
+ .property int32 hfaDouble()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8B 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_hfaDouble()
+ } // end of property IDiaSymbol5::hfaDouble
+ .property uint32 liveRangeStartAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_liveRangeStartAddressSection()
+ } // end of property IDiaSymbol5::liveRangeStartAddressSection
+ .property uint32 liveRangeStartAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_liveRangeStartAddressOffset()
+ } // end of property IDiaSymbol5::liveRangeStartAddressOffset
+ .property uint32 liveRangeStartRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_liveRangeStartRelativeVirtualAddress()
+ } // end of property IDiaSymbol5::liveRangeStartRelativeVirtualAddress
+ .property uint32 countLiveRanges()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_countLiveRanges()
+ } // end of property IDiaSymbol5::countLiveRanges
+ .property uint64 liveRangeLength()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 90 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol5::get_liveRangeLength()
+ } // end of property IDiaSymbol5::liveRangeLength
+ .property uint32 offsetInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 91 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_offsetInUdt()
+ } // end of property IDiaSymbol5::offsetInUdt
+ .property uint32 paramBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 92 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_paramBasePointerRegisterId()
+ } // end of property IDiaSymbol5::paramBasePointerRegisterId
+ .property uint32 localBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 93 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_localBasePointerRegisterId()
+ } // end of property IDiaSymbol5::localBasePointerRegisterId
+ .property int32 isLocationControlFlowDependent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 94 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isLocationControlFlowDependent()
+ } // end of property IDiaSymbol5::isLocationControlFlowDependent
+ .property uint32 stride()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 95 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_stride()
+ } // end of property IDiaSymbol5::stride
+ .property uint32 numberOfRows()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 96 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_numberOfRows()
+ } // end of property IDiaSymbol5::numberOfRows
+ .property uint32 numberOfColumns()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 97 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_numberOfColumns()
+ } // end of property IDiaSymbol5::numberOfColumns
+ .property int32 isMatrixRowMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 98 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isMatrixRowMajor()
+ } // end of property IDiaSymbol5::isMatrixRowMajor
+ .property int32 isReturnValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 99 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isReturnValue()
+ } // end of property IDiaSymbol5::isReturnValue
+ .property int32 isOptimizedAway()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isOptimizedAway()
+ } // end of property IDiaSymbol5::isOptimizedAway
+ .property uint32 builtInKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_builtInKind()
+ } // end of property IDiaSymbol5::builtInKind
+ .property uint32 registerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_registerType()
+ } // end of property IDiaSymbol5::registerType
+ .property uint32 baseDataSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_baseDataSlot()
+ } // end of property IDiaSymbol5::baseDataSlot
+ .property uint32 baseDataOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_baseDataOffset()
+ } // end of property IDiaSymbol5::baseDataOffset
+ .property uint32 textureSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_textureSlot()
+ } // end of property IDiaSymbol5::textureSlot
+ .property uint32 samplerSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_samplerSlot()
+ } // end of property IDiaSymbol5::samplerSlot
+ .property uint32 uavSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_uavSlot()
+ } // end of property IDiaSymbol5::uavSlot
+ .property uint32 sizeInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_sizeInUdt()
+ } // end of property IDiaSymbol5::sizeInUdt
+ .property uint32 memorySpaceKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_memorySpaceKind()
+ } // end of property IDiaSymbol5::memorySpaceKind
+ .property uint32 unmodifiedTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_unmodifiedTypeId()
+ } // end of property IDiaSymbol5::unmodifiedTypeId
+ .property uint32 subTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_subTypeId()
+ } // end of property IDiaSymbol5::subTypeId
+ .property class DIALib.IDiaSymbol subType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A6 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_subType()
+ } // end of property IDiaSymbol5::subType
+ .property uint32 numberOfModifiers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_numberOfModifiers()
+ } // end of property IDiaSymbol5::numberOfModifiers
+ .property uint32 numberOfRegisterIndices()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A8 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_numberOfRegisterIndices()
+ } // end of property IDiaSymbol5::numberOfRegisterIndices
+ .property int32 isHLSLData()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isHLSLData()
+ } // end of property IDiaSymbol5::isHLSLData
+ .property int32 isPointerToDataMember()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isPointerToDataMember()
+ } // end of property IDiaSymbol5::isPointerToDataMember
+ .property int32 isPointerToMemberFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isPointerToMemberFunction()
+ } // end of property IDiaSymbol5::isPointerToMemberFunction
+ .property int32 isSingleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isSingleInheritance()
+ } // end of property IDiaSymbol5::isSingleInheritance
+ .property int32 isMultipleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isMultipleInheritance()
+ } // end of property IDiaSymbol5::isMultipleInheritance
+ .property int32 isVirtualInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isVirtualInheritance()
+ } // end of property IDiaSymbol5::isVirtualInheritance
+ .property int32 restrictedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_restrictedType()
+ } // end of property IDiaSymbol5::restrictedType
+ .property int32 isPointerBasedOnSymbolValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B0 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isPointerBasedOnSymbolValue()
+ } // end of property IDiaSymbol5::isPointerBasedOnSymbolValue
+ .property class DIALib.IDiaSymbol baseSymbol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B1 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_baseSymbol()
+ } // end of property IDiaSymbol5::baseSymbol
+ .property uint32 baseSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_baseSymbolId()
+ } // end of property IDiaSymbol5::baseSymbolId
+ .property string objectFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B3 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol5::get_objectFileName()
+ } // end of property IDiaSymbol5::objectFileName
+ .property int32 isAcceleratorGroupSharedLocal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B4 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isAcceleratorGroupSharedLocal()
+ } // end of property IDiaSymbol5::isAcceleratorGroupSharedLocal
+ .property int32 isAcceleratorPointerTagLiveRange()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B5 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isAcceleratorPointerTagLiveRange()
+ } // end of property IDiaSymbol5::isAcceleratorPointerTagLiveRange
+ .property int32 isAcceleratorStubFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isAcceleratorStubFunction()
+ } // end of property IDiaSymbol5::isAcceleratorStubFunction
+ .property uint32 numberOfAcceleratorPointerTags()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_numberOfAcceleratorPointerTags()
+ } // end of property IDiaSymbol5::numberOfAcceleratorPointerTags
+ .property int32 isSdl()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isSdl()
+ } // end of property IDiaSymbol5::isSdl
+ .property int32 isWinRTPointer()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isWinRTPointer()
+ } // end of property IDiaSymbol5::isWinRTPointer
+ .property int32 isRefUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isRefUdt()
+ } // end of property IDiaSymbol5::isRefUdt
+ .property int32 isValueUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isValueUdt()
+ } // end of property IDiaSymbol5::isValueUdt
+ .property int32 isInterfaceUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isInterfaceUdt()
+ } // end of property IDiaSymbol5::isInterfaceUdt
+ .property int32 isPGO()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isPGO()
+ } // end of property IDiaSymbol5::isPGO
+ .property int32 hasValidPGOCounts()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_hasValidPGOCounts()
+ } // end of property IDiaSymbol5::hasValidPGOCounts
+ .property int32 isOptimizedForSpeed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isOptimizedForSpeed()
+ } // end of property IDiaSymbol5::isOptimizedForSpeed
+ .property uint32 PGOEntryCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_PGOEntryCount()
+ } // end of property IDiaSymbol5::PGOEntryCount
+ .property uint32 PGOEdgeCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_PGOEdgeCount()
+ } // end of property IDiaSymbol5::PGOEdgeCount
+ .property uint64 PGODynamicInstructionCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol5::get_PGODynamicInstructionCount()
+ } // end of property IDiaSymbol5::PGODynamicInstructionCount
+ .property uint32 staticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_staticSize()
+ } // end of property IDiaSymbol5::staticSize
+ .property uint32 finalLiveStaticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_finalLiveStaticSize()
+ } // end of property IDiaSymbol5::finalLiveStaticSize
+ .property string phaseName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C5 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol5::get_phaseName()
+ } // end of property IDiaSymbol5::phaseName
+ .property int32 hasControlFlowCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_hasControlFlowCheck()
+ } // end of property IDiaSymbol5::hasControlFlowCheck
+ .property int32 constantExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C7 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_constantExport()
+ } // end of property IDiaSymbol5::constantExport
+ .property int32 dataExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_dataExport()
+ } // end of property IDiaSymbol5::dataExport
+ .property int32 privateExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_privateExport()
+ } // end of property IDiaSymbol5::privateExport
+ .property int32 noNameExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_noNameExport()
+ } // end of property IDiaSymbol5::noNameExport
+ .property int32 exportHasExplicitlyAssignedOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_exportHasExplicitlyAssignedOrdinal()
+ } // end of property IDiaSymbol5::exportHasExplicitlyAssignedOrdinal
+ .property int32 exportIsForwarder()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_exportIsForwarder()
+ } // end of property IDiaSymbol5::exportIsForwarder
+ .property uint32 ordinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CD 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_ordinal()
+ } // end of property IDiaSymbol5::ordinal
+ .property uint32 frameSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CE 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_frameSize()
+ } // end of property IDiaSymbol5::frameSize
+ .property uint32 exceptionHandlerAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CF 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_exceptionHandlerAddressSection()
+ } // end of property IDiaSymbol5::exceptionHandlerAddressSection
+ .property uint32 exceptionHandlerAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_exceptionHandlerAddressOffset()
+ } // end of property IDiaSymbol5::exceptionHandlerAddressOffset
+ .property uint32 exceptionHandlerRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_exceptionHandlerRelativeVirtualAddress()
+ } // end of property IDiaSymbol5::exceptionHandlerRelativeVirtualAddress
+ .property uint64 exceptionHandlerVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol5::get_exceptionHandlerVirtualAddress()
+ } // end of property IDiaSymbol5::exceptionHandlerVirtualAddress
+ .property uint32 characteristics()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_characteristics()
+ } // end of property IDiaSymbol5::characteristics
+ .property class DIALib.IDiaSymbol coffGroup()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D4 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_coffGroup()
+ } // end of property IDiaSymbol5::coffGroup
+ .property uint32 bindID()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_bindID()
+ } // end of property IDiaSymbol5::bindID
+ .property uint32 bindSpace()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D6 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_bindSpace()
+ } // end of property IDiaSymbol5::bindSpace
+ .property uint32 bindSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_bindSlot()
+ } // end of property IDiaSymbol5::bindSlot
+ .property int32 isObjCClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isObjCClass()
+ } // end of property IDiaSymbol5::isObjCClass
+ .property int32 isObjCCategory()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isObjCCategory()
+ } // end of property IDiaSymbol5::isObjCCategory
+ .property int32 isObjCProtocol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_isObjCProtocol()
+ } // end of property IDiaSymbol5::isObjCProtocol
+ .property class DIALib.IDiaSymbol inlinee()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DB 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol5::get_inlinee()
+ } // end of property IDiaSymbol5::inlinee
+ .property uint32 inlineeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DC 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol5::get_inlineeId()
+ } // end of property IDiaSymbol5::inlineeId
+ .property int32 noexcept()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_noexcept()
+ } // end of property IDiaSymbol5::noexcept
+ .property int32 hasAbsoluteAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol5::get_hasAbsoluteAddress()
+ } // end of property IDiaSymbol5::hasAbsoluteAddress
+} // end of class DIALib.IDiaSymbol5
+
+.class interface public abstract auto ansi import DIALib.IDiaSymbol6
+ implements DIALib.IDiaSymbol5
+{
+ .custom instance void [mscorlib]System.Runtime.InteropServices.InterfaceTypeAttribute::.ctor(valuetype [mscorlib]System.Runtime.InteropServices.ComInterfaceType) = ( 01 00 01 00 00 00 00 00 )
+ .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 38 31 33 33 44 41 44 33 2D 37 35 46 45 // ..$8133DAD3-75FE
+ 2D 34 32 33 34 2D 41 43 37 45 2D 46 38 45 37 41 // -4234-AC7E-F8E7A
+ 31 44 33 43 42 42 33 00 00 ) // 1D3CBB3..
+ .custom instance void [mscorlib]System.Reflection.DefaultMemberAttribute::.ctor(string) = ( 01 00 0A 73 79 6D 49 6E 64 65 78 49 64 00 00 ) // ...symIndexId..
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symIndexId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_symIndexId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_symTag() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_symTag
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_name() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_name
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lexicalParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_lexicalParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_classParent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_classParent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_type() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_type
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_dataKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_dataKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_locationType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_locationType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_addressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_addressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_addressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_relativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_relativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_virtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_virtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_registerId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_offset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_offset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_length() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_length
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_slot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_slot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_volatileType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_volatileType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_constType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_unalignedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_unalignedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_access() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_access
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_libraryName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_libraryName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_platform() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_platform
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_language() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_language
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_editAndContinueEnabled() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_editAndContinueEnabled
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_frontEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_frontEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_frontEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_backEndMajor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndMinor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_backEndMinor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndBuild() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_backEndBuild
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_sourceFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_sourceFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_unused() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_unused
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_thunkOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_thunkOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_thisAdjust() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_thisAdjust
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_virtualBaseOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtual() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_virtual
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intro() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_intro
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_pure() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_pure
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_callingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_callingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance object
+ marshal( struct)
+ get_value() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_value
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_baseType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_token() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_token
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_timeStamp() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_timeStamp
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance valuetype [mscorlib]System.Guid
+ get_guid() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_guid
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_symbolsFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_symbolsFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_reference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_reference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_count() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_count
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bitPosition() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_bitPosition
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_arrayIndexType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_arrayIndexType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_packed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_packed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constructor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_constructor
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_overloadedOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_overloadedOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_nested() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_nested
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasNestedTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasNestedTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAssignmentOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasAssignmentOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasCastOperator() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasCastOperator
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_scoped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_scoped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_virtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_indirectVirtualBaseClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_indirectVirtualBaseClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_virtualBasePointerOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_virtualBasePointerOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualTableShape() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_virtualTableShape
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lexicalParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_lexicalParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_classParentId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_classParentId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_typeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_typeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_arrayIndexTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_arrayIndexTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualTableShapeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_virtualTableShapeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_code() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_code
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_function() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_function
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_managed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_managed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_msil() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_msil
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_virtualBaseDispIndex() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_virtualBaseDispIndex
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_undecoratedName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_undecoratedName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_age() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_age
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_signature() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_signature
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_compilerGenerated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_compilerGenerated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_addressTaken() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_addressTaken
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_rank() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_rank
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_lowerBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_lowerBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_upperBound() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_upperBound
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_lowerBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_lowerBoundId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_upperBoundId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_upperBoundId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_dataBytes([in] uint32 cbData,
+ [out] uint32& pcbData,
+ [out] uint8& pbData) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_dataBytes
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildren([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findChildren
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenEx([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findChildrenEx
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByAddr([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findChildrenExByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findChildrenExByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findChildrenExByRVA([in] valuetype DIALib.SymTagEnum symTag,
+ [in] string marshal( lpwstr) name,
+ [in] uint32 compareFlags,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findChildrenExByRVA
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_targetSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_targetOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_targetRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_targetRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_targetVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_targetVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_machineType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_machineType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_oemId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_oemSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_oemSymbolId
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_types([in] uint32 cTypes,
+ [out] uint32& pcTypes,
+ [out] class DIALib.IDiaSymbol& marshal( interface ) pTypes) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_types
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_typeIds([in] uint32 cTypeIds,
+ [out] uint32& pcTypeIds,
+ [out] uint32& pdwTypeIds) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_typeIds
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_objectPointerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_objectPointerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_udtKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_udtKind
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_undecoratedNameEx([in] uint32 undecorateOptions,
+ [out] string& marshal( bstr) name) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_undecoratedNameEx
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_noReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_customCallingConvention() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_customCallingConvention
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noInline() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_noInline
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_optimizedCodeDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_optimizedCodeDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_notReached() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_notReached
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_interruptReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_interruptReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_farReturn() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_farReturn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStatic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isStatic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasDebugInfo() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasDebugInfo
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLTCG() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isLTCG
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isDataAligned() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isDataAligned
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSecurityChecks() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasSecurityChecks
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_compilerName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_compilerName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAlloca() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasAlloca
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSetJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasSetJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasLongJump() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasLongJump
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasInlAsm() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasInlAsm
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasSEH() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasSEH
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasEHa() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasEHa
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isNaked() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isNaked
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAggregated() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isAggregated
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSplitted() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isSplitted
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_container() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_container
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_inlSpec() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_inlSpec
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noStackOrdering() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_noStackOrdering
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_virtualBaseTableType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_virtualBaseTableType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasManagedCode() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasManagedCode
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHotpatchable() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isHotpatchable
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCVTCIL() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isCVTCIL
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMSILNetmodule() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isMSILNetmodule
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCTypes() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isCTypes
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStripped() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isStripped
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frontEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_frontEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_backEndQFE() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_backEndQFE
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_wasInlined() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_wasInlined
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_strictGSCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_strictGSCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isCxxReturnUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isCxxReturnUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isConstructorVirtualBase() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isConstructorVirtualBase
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_RValueReference() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_RValueReference
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_unmodifiedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_unmodifiedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_framePointerPresent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_framePointerPresent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSafeBuffers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isSafeBuffers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_intrinsic() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_intrinsic
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_sealed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_sealed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaFloat() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hfaFloat
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hfaDouble() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hfaDouble
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_liveRangeStartAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_liveRangeStartAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_liveRangeStartRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_liveRangeStartRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_countLiveRanges() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_countLiveRanges
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_liveRangeLength() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_liveRangeLength
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_offsetInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_offsetInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_paramBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_paramBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_localBasePointerRegisterId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_localBasePointerRegisterId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isLocationControlFlowDependent() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isLocationControlFlowDependent
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_stride() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_stride
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRows() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_numberOfRows
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfColumns() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_numberOfColumns
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMatrixRowMajor() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isMatrixRowMajor
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_numericProperties([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pProperties) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_numericProperties
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_modifierValues([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint16& pModifiers) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_modifierValues
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isReturnValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isReturnValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedAway() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isOptimizedAway
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_builtInKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_builtInKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_registerType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_registerType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_baseDataSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseDataOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_baseDataOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_textureSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_textureSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_samplerSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_samplerSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_uavSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_uavSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_sizeInUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_sizeInUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_memorySpaceKind() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_memorySpaceKind
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_unmodifiedTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_unmodifiedTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_subTypeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_subTypeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_subType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_subType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfModifiers() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_numberOfModifiers
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfRegisterIndices() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_numberOfRegisterIndices
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isHLSLData() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isHLSLData
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToDataMember() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isPointerToDataMember
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerToMemberFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isPointerToMemberFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSingleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isSingleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isMultipleInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isMultipleInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isVirtualInheritance() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isVirtualInheritance
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_restrictedType() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_restrictedType
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPointerBasedOnSymbolValue() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isPointerBasedOnSymbolValue
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_baseSymbol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_baseSymbol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_baseSymbolId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_baseSymbolId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_objectFileName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_objectFileName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorGroupSharedLocal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isAcceleratorGroupSharedLocal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorPointerTagLiveRange() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isAcceleratorPointerTagLiveRange
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isAcceleratorStubFunction() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isAcceleratorStubFunction
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_numberOfAcceleratorPointerTags() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_numberOfAcceleratorPointerTags
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isSdl() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isSdl
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isWinRTPointer() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isWinRTPointer
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isRefUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isRefUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isValueUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isValueUdt
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isInterfaceUdt() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isInterfaceUdt
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findInlineFramesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByRVA([in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findInlineFramesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineFramesByVA([in] uint64 va,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findInlineFramesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLines([out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findInlineeLines
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByAddr([in] uint32 isect,
+ [in] uint32 offset,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findInlineeLinesByAddr
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByRVA([in] uint32 rva,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findInlineeLinesByRVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInlineeLinesByVA([in] uint64 va,
+ [in] uint32 length,
+ [out] class DIALib.IDiaEnumLineNumbers& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findInlineeLinesByVA
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsForAcceleratorPointerTag([in] uint32 tagValue,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findSymbolsForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void findSymbolsByRVAForAcceleratorPointerTag([in] uint32 tagValue,
+ [in] uint32 rva,
+ [out] class DIALib.IDiaEnumSymbols& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findSymbolsByRVAForAcceleratorPointerTag
+
+ .method public hidebysig newslot abstract virtual
+ instance void get_acceleratorPointerTags([in] uint32 cnt,
+ [out] uint32& pcnt,
+ [out] uint32& pPointerTags) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_acceleratorPointerTags
+
+ .method public hidebysig newslot abstract virtual
+ instance void getSrcLineOnTypeDefn([out] class DIALib.IDiaLineNumber& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::getSrcLineOnTypeDefn
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isPGO() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isPGO
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasValidPGOCounts() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasValidPGOCounts
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isOptimizedForSpeed() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isOptimizedForSpeed
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEntryCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_PGOEntryCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_PGOEdgeCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_PGOEdgeCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_PGODynamicInstructionCount() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_PGODynamicInstructionCount
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_staticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_staticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_finalLiveStaticSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_finalLiveStaticSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance string
+ marshal( bstr)
+ get_phaseName() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_phaseName
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasControlFlowCheck() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasControlFlowCheck
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_constantExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_constantExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_dataExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_dataExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_privateExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_privateExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noNameExport() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_noNameExport
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportHasExplicitlyAssignedOrdinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_exportHasExplicitlyAssignedOrdinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_exportIsForwarder() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_exportIsForwarder
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_ordinal() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_ordinal
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_frameSize() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_frameSize
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressSection() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_exceptionHandlerAddressSection
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerAddressOffset() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_exceptionHandlerAddressOffset
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_exceptionHandlerRelativeVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_exceptionHandlerRelativeVirtualAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint64 get_exceptionHandlerVirtualAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_exceptionHandlerVirtualAddress
+
+ .method public hidebysig newslot abstract virtual
+ instance void findInputAssemblyFile([out] class DIALib.IDiaInputAssemblyFile& marshal( interface ) ppResult) runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::findInputAssemblyFile
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_characteristics() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_characteristics
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_coffGroup() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_coffGroup
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindID() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_bindID
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSpace() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_bindSpace
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_bindSlot() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_bindSlot
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCClass() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isObjCClass
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCCategory() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isObjCCategory
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isObjCProtocol() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isObjCProtocol
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance class DIALib.IDiaSymbol
+ marshal( interface )
+ get_inlinee() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_inlinee
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance uint32 get_inlineeId() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_inlineeId
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_noexcept() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_noexcept
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_hasAbsoluteAddress() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_hasAbsoluteAddress
+
+ .method public hidebysig newslot specialname abstract virtual
+ instance int32 get_isStaticMemberFunc() runtime managed internalcall
+ {
+ } // end of method IDiaSymbol6::get_isStaticMemberFunc
+
+ .property uint32 symIndexId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 00 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_symIndexId()
+ } // end of property IDiaSymbol6::symIndexId
+ .property uint32 symTag()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 01 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_symTag()
+ } // end of property IDiaSymbol6::symTag
+ .property string name()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 02 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol6::get_name()
+ } // end of property IDiaSymbol6::name
+ .property class DIALib.IDiaSymbol lexicalParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 03 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_lexicalParent()
+ } // end of property IDiaSymbol6::lexicalParent
+ .property class DIALib.IDiaSymbol classParent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 04 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_classParent()
+ } // end of property IDiaSymbol6::classParent
+ .property class DIALib.IDiaSymbol 'type'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 05 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_type()
+ } // end of property IDiaSymbol6::'type'
+ .property uint32 dataKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 06 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_dataKind()
+ } // end of property IDiaSymbol6::dataKind
+ .property uint32 locationType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 07 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_locationType()
+ } // end of property IDiaSymbol6::locationType
+ .property uint32 addressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_addressSection()
+ } // end of property IDiaSymbol6::addressSection
+ .property uint32 addressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 09 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_addressOffset()
+ } // end of property IDiaSymbol6::addressOffset
+ .property uint32 relativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_relativeVirtualAddress()
+ } // end of property IDiaSymbol6::relativeVirtualAddress
+ .property uint64 virtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0B 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol6::get_virtualAddress()
+ } // end of property IDiaSymbol6::virtualAddress
+ .property uint32 registerId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_registerId()
+ } // end of property IDiaSymbol6::registerId
+ .property int32 offset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0D 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_offset()
+ } // end of property IDiaSymbol6::offset
+ .property uint64 length()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0E 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol6::get_length()
+ } // end of property IDiaSymbol6::length
+ .property uint32 slot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 0F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_slot()
+ } // end of property IDiaSymbol6::slot
+ .property int32 volatileType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 10 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_volatileType()
+ } // end of property IDiaSymbol6::volatileType
+ .property int32 constType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 11 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_constType()
+ } // end of property IDiaSymbol6::constType
+ .property int32 unalignedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 12 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_unalignedType()
+ } // end of property IDiaSymbol6::unalignedType
+ .property uint32 access()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 13 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_access()
+ } // end of property IDiaSymbol6::access
+ .property string libraryName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 14 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol6::get_libraryName()
+ } // end of property IDiaSymbol6::libraryName
+ .property uint32 platform()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 15 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_platform()
+ } // end of property IDiaSymbol6::platform
+ .property uint32 language()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 16 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_language()
+ } // end of property IDiaSymbol6::language
+ .property int32 editAndContinueEnabled()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 17 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_editAndContinueEnabled()
+ } // end of property IDiaSymbol6::editAndContinueEnabled
+ .property uint32 frontEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 18 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_frontEndMajor()
+ } // end of property IDiaSymbol6::frontEndMajor
+ .property uint32 frontEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 19 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_frontEndMinor()
+ } // end of property IDiaSymbol6::frontEndMinor
+ .property uint32 frontEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1A 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_frontEndBuild()
+ } // end of property IDiaSymbol6::frontEndBuild
+ .property uint32 backEndMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_backEndMajor()
+ } // end of property IDiaSymbol6::backEndMajor
+ .property uint32 backEndMinor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_backEndMinor()
+ } // end of property IDiaSymbol6::backEndMinor
+ .property uint32 backEndBuild()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_backEndBuild()
+ } // end of property IDiaSymbol6::backEndBuild
+ .property string sourceFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1E 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol6::get_sourceFileName()
+ } // end of property IDiaSymbol6::sourceFileName
+ .property string 'unused'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 1F 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol6::get_unused()
+ } // end of property IDiaSymbol6::'unused'
+ .property uint32 thunkOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 20 00 00 00 00 00 ) // .. .....
+ .get instance uint32 DIALib.IDiaSymbol6::get_thunkOrdinal()
+ } // end of property IDiaSymbol6::thunkOrdinal
+ .property int32 thisAdjust()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 21 00 00 00 00 00 ) // ..!.....
+ .get instance int32 DIALib.IDiaSymbol6::get_thisAdjust()
+ } // end of property IDiaSymbol6::thisAdjust
+ .property uint32 virtualBaseOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 22 00 00 00 00 00 ) // ..".....
+ .get instance uint32 DIALib.IDiaSymbol6::get_virtualBaseOffset()
+ } // end of property IDiaSymbol6::virtualBaseOffset
+ .property int32 'virtual'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 23 00 00 00 00 00 ) // ..#.....
+ .get instance int32 DIALib.IDiaSymbol6::get_virtual()
+ } // end of property IDiaSymbol6::'virtual'
+ .property int32 intro()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 24 00 00 00 00 00 ) // ..$.....
+ .get instance int32 DIALib.IDiaSymbol6::get_intro()
+ } // end of property IDiaSymbol6::intro
+ .property int32 pure()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 25 00 00 00 00 00 ) // ..%.....
+ .get instance int32 DIALib.IDiaSymbol6::get_pure()
+ } // end of property IDiaSymbol6::pure
+ .property uint32 callingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 26 00 00 00 00 00 ) // ..&.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_callingConvention()
+ } // end of property IDiaSymbol6::callingConvention
+ .property object 'value'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 27 00 00 00 00 00 ) // ..'.....
+ .get instance object DIALib.IDiaSymbol6::get_value()
+ } // end of property IDiaSymbol6::'value'
+ .property uint32 baseType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 28 00 00 00 00 00 ) // ..(.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_baseType()
+ } // end of property IDiaSymbol6::baseType
+ .property uint32 token()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 29 00 00 00 00 00 ) // ..).....
+ .get instance uint32 DIALib.IDiaSymbol6::get_token()
+ } // end of property IDiaSymbol6::token
+ .property uint32 timeStamp()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2A 00 00 00 00 00 ) // ..*.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_timeStamp()
+ } // end of property IDiaSymbol6::timeStamp
+ .property valuetype [mscorlib]System.Guid
+ guid()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2B 00 00 00 00 00 ) // ..+.....
+ .get instance valuetype [mscorlib]System.Guid DIALib.IDiaSymbol6::get_guid()
+ } // end of property IDiaSymbol6::guid
+ .property string symbolsFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2C 00 00 00 00 00 ) // ..,.....
+ .get instance string DIALib.IDiaSymbol6::get_symbolsFileName()
+ } // end of property IDiaSymbol6::symbolsFileName
+ .property int32 reference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2E 00 00 00 00 00 ) // ........
+ .get instance int32 DIALib.IDiaSymbol6::get_reference()
+ } // end of property IDiaSymbol6::reference
+ .property uint32 count()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 2F 00 00 00 00 00 ) // ../.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_count()
+ } // end of property IDiaSymbol6::count
+ .property uint32 bitPosition()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 31 00 00 00 00 00 ) // ..1.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_bitPosition()
+ } // end of property IDiaSymbol6::bitPosition
+ .property class DIALib.IDiaSymbol arrayIndexType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 32 00 00 00 00 00 ) // ..2.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_arrayIndexType()
+ } // end of property IDiaSymbol6::arrayIndexType
+ .property int32 packed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 33 00 00 00 00 00 ) // ..3.....
+ .get instance int32 DIALib.IDiaSymbol6::get_packed()
+ } // end of property IDiaSymbol6::packed
+ .property int32 constructor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 34 00 00 00 00 00 ) // ..4.....
+ .get instance int32 DIALib.IDiaSymbol6::get_constructor()
+ } // end of property IDiaSymbol6::constructor
+ .property int32 overloadedOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 35 00 00 00 00 00 ) // ..5.....
+ .get instance int32 DIALib.IDiaSymbol6::get_overloadedOperator()
+ } // end of property IDiaSymbol6::overloadedOperator
+ .property int32 'nested'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 36 00 00 00 00 00 ) // ..6.....
+ .get instance int32 DIALib.IDiaSymbol6::get_nested()
+ } // end of property IDiaSymbol6::'nested'
+ .property int32 hasNestedTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 37 00 00 00 00 00 ) // ..7.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasNestedTypes()
+ } // end of property IDiaSymbol6::hasNestedTypes
+ .property int32 hasAssignmentOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 38 00 00 00 00 00 ) // ..8.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasAssignmentOperator()
+ } // end of property IDiaSymbol6::hasAssignmentOperator
+ .property int32 hasCastOperator()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 39 00 00 00 00 00 ) // ..9.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasCastOperator()
+ } // end of property IDiaSymbol6::hasCastOperator
+ .property int32 scoped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3A 00 00 00 00 00 ) // ..:.....
+ .get instance int32 DIALib.IDiaSymbol6::get_scoped()
+ } // end of property IDiaSymbol6::scoped
+ .property int32 virtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3B 00 00 00 00 00 ) // ..;.....
+ .get instance int32 DIALib.IDiaSymbol6::get_virtualBaseClass()
+ } // end of property IDiaSymbol6::virtualBaseClass
+ .property int32 indirectVirtualBaseClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3C 00 00 00 00 00 ) // ..<.....
+ .get instance int32 DIALib.IDiaSymbol6::get_indirectVirtualBaseClass()
+ } // end of property IDiaSymbol6::indirectVirtualBaseClass
+ .property int32 virtualBasePointerOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3D 00 00 00 00 00 ) // ..=.....
+ .get instance int32 DIALib.IDiaSymbol6::get_virtualBasePointerOffset()
+ } // end of property IDiaSymbol6::virtualBasePointerOffset
+ .property class DIALib.IDiaSymbol virtualTableShape()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 3E 00 00 00 00 00 ) // ..>.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_virtualTableShape()
+ } // end of property IDiaSymbol6::virtualTableShape
+ .property uint32 lexicalParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 40 00 00 00 00 00 ) // ..@.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_lexicalParentId()
+ } // end of property IDiaSymbol6::lexicalParentId
+ .property uint32 classParentId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 41 00 00 00 00 00 ) // ..A.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_classParentId()
+ } // end of property IDiaSymbol6::classParentId
+ .property uint32 typeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 42 00 00 00 00 00 ) // ..B.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_typeId()
+ } // end of property IDiaSymbol6::typeId
+ .property uint32 arrayIndexTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 43 00 00 00 00 00 ) // ..C.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_arrayIndexTypeId()
+ } // end of property IDiaSymbol6::arrayIndexTypeId
+ .property uint32 virtualTableShapeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 44 00 00 00 00 00 ) // ..D.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_virtualTableShapeId()
+ } // end of property IDiaSymbol6::virtualTableShapeId
+ .property int32 code()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 45 00 00 00 00 00 ) // ..E.....
+ .get instance int32 DIALib.IDiaSymbol6::get_code()
+ } // end of property IDiaSymbol6::code
+ .property int32 function()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 46 00 00 00 00 00 ) // ..F.....
+ .get instance int32 DIALib.IDiaSymbol6::get_function()
+ } // end of property IDiaSymbol6::function
+ .property int32 'managed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 47 00 00 00 00 00 ) // ..G.....
+ .get instance int32 DIALib.IDiaSymbol6::get_managed()
+ } // end of property IDiaSymbol6::'managed'
+ .property int32 msil()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 48 00 00 00 00 00 ) // ..H.....
+ .get instance int32 DIALib.IDiaSymbol6::get_msil()
+ } // end of property IDiaSymbol6::msil
+ .property uint32 virtualBaseDispIndex()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 49 00 00 00 00 00 ) // ..I.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_virtualBaseDispIndex()
+ } // end of property IDiaSymbol6::virtualBaseDispIndex
+ .property string undecoratedName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4A 00 00 00 00 00 ) // ..J.....
+ .get instance string DIALib.IDiaSymbol6::get_undecoratedName()
+ } // end of property IDiaSymbol6::undecoratedName
+ .property uint32 age()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4B 00 00 00 00 00 ) // ..K.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_age()
+ } // end of property IDiaSymbol6::age
+ .property uint32 signature()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4C 00 00 00 00 00 ) // ..L.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_signature()
+ } // end of property IDiaSymbol6::signature
+ .property int32 compilerGenerated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4D 00 00 00 00 00 ) // ..M.....
+ .get instance int32 DIALib.IDiaSymbol6::get_compilerGenerated()
+ } // end of property IDiaSymbol6::compilerGenerated
+ .property int32 addressTaken()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4E 00 00 00 00 00 ) // ..N.....
+ .get instance int32 DIALib.IDiaSymbol6::get_addressTaken()
+ } // end of property IDiaSymbol6::addressTaken
+ .property uint32 rank()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 4F 00 00 00 00 00 ) // ..O.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_rank()
+ } // end of property IDiaSymbol6::rank
+ .property class DIALib.IDiaSymbol lowerBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 50 00 00 00 00 00 ) // ..P.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_lowerBound()
+ } // end of property IDiaSymbol6::lowerBound
+ .property class DIALib.IDiaSymbol upperBound()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 51 00 00 00 00 00 ) // ..Q.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_upperBound()
+ } // end of property IDiaSymbol6::upperBound
+ .property uint32 lowerBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 52 00 00 00 00 00 ) // ..R.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_lowerBoundId()
+ } // end of property IDiaSymbol6::lowerBoundId
+ .property uint32 upperBoundId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 53 00 00 00 00 00 ) // ..S.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_upperBoundId()
+ } // end of property IDiaSymbol6::upperBoundId
+ .property uint32 targetSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 54 00 00 00 00 00 ) // ..T.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_targetSection()
+ } // end of property IDiaSymbol6::targetSection
+ .property uint32 targetOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 55 00 00 00 00 00 ) // ..U.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_targetOffset()
+ } // end of property IDiaSymbol6::targetOffset
+ .property uint32 targetRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 56 00 00 00 00 00 ) // ..V.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_targetRelativeVirtualAddress()
+ } // end of property IDiaSymbol6::targetRelativeVirtualAddress
+ .property uint64 targetVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 57 00 00 00 00 00 ) // ..W.....
+ .get instance uint64 DIALib.IDiaSymbol6::get_targetVirtualAddress()
+ } // end of property IDiaSymbol6::targetVirtualAddress
+ .property uint32 machineType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 58 00 00 00 00 00 ) // ..X.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_machineType()
+ } // end of property IDiaSymbol6::machineType
+ .property uint32 oemId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 59 00 00 00 00 00 ) // ..Y.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_oemId()
+ } // end of property IDiaSymbol6::oemId
+ .property uint32 oemSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5A 00 00 00 00 00 ) // ..Z.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_oemSymbolId()
+ } // end of property IDiaSymbol6::oemSymbolId
+ .property class DIALib.IDiaSymbol objectPointerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5B 00 00 00 00 00 ) // ..[.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_objectPointerType()
+ } // end of property IDiaSymbol6::objectPointerType
+ .property uint32 udtKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5C 00 00 00 00 00 ) // ..\.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_udtKind()
+ } // end of property IDiaSymbol6::udtKind
+ .property int32 noReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5D 00 00 00 00 00 ) // ..].....
+ .get instance int32 DIALib.IDiaSymbol6::get_noReturn()
+ } // end of property IDiaSymbol6::noReturn
+ .property int32 customCallingConvention()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5E 00 00 00 00 00 ) // ..^.....
+ .get instance int32 DIALib.IDiaSymbol6::get_customCallingConvention()
+ } // end of property IDiaSymbol6::customCallingConvention
+ .property int32 noInline()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 5F 00 00 00 00 00 ) // .._.....
+ .get instance int32 DIALib.IDiaSymbol6::get_noInline()
+ } // end of property IDiaSymbol6::noInline
+ .property int32 optimizedCodeDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 60 00 00 00 00 00 ) // ..`.....
+ .get instance int32 DIALib.IDiaSymbol6::get_optimizedCodeDebugInfo()
+ } // end of property IDiaSymbol6::optimizedCodeDebugInfo
+ .property int32 notReached()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 61 00 00 00 00 00 ) // ..a.....
+ .get instance int32 DIALib.IDiaSymbol6::get_notReached()
+ } // end of property IDiaSymbol6::notReached
+ .property int32 interruptReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 62 00 00 00 00 00 ) // ..b.....
+ .get instance int32 DIALib.IDiaSymbol6::get_interruptReturn()
+ } // end of property IDiaSymbol6::interruptReturn
+ .property int32 farReturn()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 63 00 00 00 00 00 ) // ..c.....
+ .get instance int32 DIALib.IDiaSymbol6::get_farReturn()
+ } // end of property IDiaSymbol6::farReturn
+ .property int32 isStatic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 64 00 00 00 00 00 ) // ..d.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isStatic()
+ } // end of property IDiaSymbol6::isStatic
+ .property int32 hasDebugInfo()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 65 00 00 00 00 00 ) // ..e.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasDebugInfo()
+ } // end of property IDiaSymbol6::hasDebugInfo
+ .property int32 isLTCG()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 66 00 00 00 00 00 ) // ..f.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isLTCG()
+ } // end of property IDiaSymbol6::isLTCG
+ .property int32 isDataAligned()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 67 00 00 00 00 00 ) // ..g.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isDataAligned()
+ } // end of property IDiaSymbol6::isDataAligned
+ .property int32 hasSecurityChecks()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 68 00 00 00 00 00 ) // ..h.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasSecurityChecks()
+ } // end of property IDiaSymbol6::hasSecurityChecks
+ .property string compilerName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 69 00 00 00 00 00 ) // ..i.....
+ .get instance string DIALib.IDiaSymbol6::get_compilerName()
+ } // end of property IDiaSymbol6::compilerName
+ .property int32 hasAlloca()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6A 00 00 00 00 00 ) // ..j.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasAlloca()
+ } // end of property IDiaSymbol6::hasAlloca
+ .property int32 hasSetJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6B 00 00 00 00 00 ) // ..k.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasSetJump()
+ } // end of property IDiaSymbol6::hasSetJump
+ .property int32 hasLongJump()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6C 00 00 00 00 00 ) // ..l.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasLongJump()
+ } // end of property IDiaSymbol6::hasLongJump
+ .property int32 hasInlAsm()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6D 00 00 00 00 00 ) // ..m.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasInlAsm()
+ } // end of property IDiaSymbol6::hasInlAsm
+ .property int32 hasEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6E 00 00 00 00 00 ) // ..n.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasEH()
+ } // end of property IDiaSymbol6::hasEH
+ .property int32 hasSEH()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 6F 00 00 00 00 00 ) // ..o.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasSEH()
+ } // end of property IDiaSymbol6::hasSEH
+ .property int32 hasEHa()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 70 00 00 00 00 00 ) // ..p.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasEHa()
+ } // end of property IDiaSymbol6::hasEHa
+ .property int32 isNaked()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 71 00 00 00 00 00 ) // ..q.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isNaked()
+ } // end of property IDiaSymbol6::isNaked
+ .property int32 isAggregated()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 72 00 00 00 00 00 ) // ..r.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isAggregated()
+ } // end of property IDiaSymbol6::isAggregated
+ .property int32 isSplitted()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 73 00 00 00 00 00 ) // ..s.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isSplitted()
+ } // end of property IDiaSymbol6::isSplitted
+ .property class DIALib.IDiaSymbol container()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 74 00 00 00 00 00 ) // ..t.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_container()
+ } // end of property IDiaSymbol6::container
+ .property int32 inlSpec()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 75 00 00 00 00 00 ) // ..u.....
+ .get instance int32 DIALib.IDiaSymbol6::get_inlSpec()
+ } // end of property IDiaSymbol6::inlSpec
+ .property int32 noStackOrdering()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 76 00 00 00 00 00 ) // ..v.....
+ .get instance int32 DIALib.IDiaSymbol6::get_noStackOrdering()
+ } // end of property IDiaSymbol6::noStackOrdering
+ .property class DIALib.IDiaSymbol virtualBaseTableType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 77 00 00 00 00 00 ) // ..w.....
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_virtualBaseTableType()
+ } // end of property IDiaSymbol6::virtualBaseTableType
+ .property int32 hasManagedCode()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 78 00 00 00 00 00 ) // ..x.....
+ .get instance int32 DIALib.IDiaSymbol6::get_hasManagedCode()
+ } // end of property IDiaSymbol6::hasManagedCode
+ .property int32 isHotpatchable()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 79 00 00 00 00 00 ) // ..y.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isHotpatchable()
+ } // end of property IDiaSymbol6::isHotpatchable
+ .property int32 isCVTCIL()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7A 00 00 00 00 00 ) // ..z.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isCVTCIL()
+ } // end of property IDiaSymbol6::isCVTCIL
+ .property int32 isMSILNetmodule()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7B 00 00 00 00 00 ) // ..{.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isMSILNetmodule()
+ } // end of property IDiaSymbol6::isMSILNetmodule
+ .property int32 isCTypes()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7C 00 00 00 00 00 ) // ..|.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isCTypes()
+ } // end of property IDiaSymbol6::isCTypes
+ .property int32 isStripped()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7D 00 00 00 00 00 ) // ..}.....
+ .get instance int32 DIALib.IDiaSymbol6::get_isStripped()
+ } // end of property IDiaSymbol6::isStripped
+ .property uint32 frontEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7E 00 00 00 00 00 ) // ..~.....
+ .get instance uint32 DIALib.IDiaSymbol6::get_frontEndQFE()
+ } // end of property IDiaSymbol6::frontEndQFE
+ .property uint32 backEndQFE()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 7F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_backEndQFE()
+ } // end of property IDiaSymbol6::backEndQFE
+ .property int32 wasInlined()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 80 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_wasInlined()
+ } // end of property IDiaSymbol6::wasInlined
+ .property int32 strictGSCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 81 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_strictGSCheck()
+ } // end of property IDiaSymbol6::strictGSCheck
+ .property int32 isCxxReturnUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 82 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isCxxReturnUdt()
+ } // end of property IDiaSymbol6::isCxxReturnUdt
+ .property int32 isConstructorVirtualBase()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 83 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isConstructorVirtualBase()
+ } // end of property IDiaSymbol6::isConstructorVirtualBase
+ .property int32 RValueReference()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 84 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_RValueReference()
+ } // end of property IDiaSymbol6::RValueReference
+ .property class DIALib.IDiaSymbol unmodifiedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 85 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_unmodifiedType()
+ } // end of property IDiaSymbol6::unmodifiedType
+ .property int32 framePointerPresent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 86 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_framePointerPresent()
+ } // end of property IDiaSymbol6::framePointerPresent
+ .property int32 isSafeBuffers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 87 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isSafeBuffers()
+ } // end of property IDiaSymbol6::isSafeBuffers
+ .property int32 intrinsic()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 88 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_intrinsic()
+ } // end of property IDiaSymbol6::intrinsic
+ .property int32 'sealed'()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 89 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_sealed()
+ } // end of property IDiaSymbol6::'sealed'
+ .property int32 hfaFloat()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_hfaFloat()
+ } // end of property IDiaSymbol6::hfaFloat
+ .property int32 hfaDouble()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8B 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_hfaDouble()
+ } // end of property IDiaSymbol6::hfaDouble
+ .property uint32 liveRangeStartAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_liveRangeStartAddressSection()
+ } // end of property IDiaSymbol6::liveRangeStartAddressSection
+ .property uint32 liveRangeStartAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_liveRangeStartAddressOffset()
+ } // end of property IDiaSymbol6::liveRangeStartAddressOffset
+ .property uint32 liveRangeStartRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_liveRangeStartRelativeVirtualAddress()
+ } // end of property IDiaSymbol6::liveRangeStartRelativeVirtualAddress
+ .property uint32 countLiveRanges()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 8F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_countLiveRanges()
+ } // end of property IDiaSymbol6::countLiveRanges
+ .property uint64 liveRangeLength()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 90 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol6::get_liveRangeLength()
+ } // end of property IDiaSymbol6::liveRangeLength
+ .property uint32 offsetInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 91 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_offsetInUdt()
+ } // end of property IDiaSymbol6::offsetInUdt
+ .property uint32 paramBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 92 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_paramBasePointerRegisterId()
+ } // end of property IDiaSymbol6::paramBasePointerRegisterId
+ .property uint32 localBasePointerRegisterId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 93 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_localBasePointerRegisterId()
+ } // end of property IDiaSymbol6::localBasePointerRegisterId
+ .property int32 isLocationControlFlowDependent()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 94 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isLocationControlFlowDependent()
+ } // end of property IDiaSymbol6::isLocationControlFlowDependent
+ .property uint32 stride()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 95 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_stride()
+ } // end of property IDiaSymbol6::stride
+ .property uint32 numberOfRows()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 96 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_numberOfRows()
+ } // end of property IDiaSymbol6::numberOfRows
+ .property uint32 numberOfColumns()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 97 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_numberOfColumns()
+ } // end of property IDiaSymbol6::numberOfColumns
+ .property int32 isMatrixRowMajor()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 98 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isMatrixRowMajor()
+ } // end of property IDiaSymbol6::isMatrixRowMajor
+ .property int32 isReturnValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 99 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isReturnValue()
+ } // end of property IDiaSymbol6::isReturnValue
+ .property int32 isOptimizedAway()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9A 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isOptimizedAway()
+ } // end of property IDiaSymbol6::isOptimizedAway
+ .property uint32 builtInKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9B 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_builtInKind()
+ } // end of property IDiaSymbol6::builtInKind
+ .property uint32 registerType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9C 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_registerType()
+ } // end of property IDiaSymbol6::registerType
+ .property uint32 baseDataSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9D 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_baseDataSlot()
+ } // end of property IDiaSymbol6::baseDataSlot
+ .property uint32 baseDataOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9E 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_baseDataOffset()
+ } // end of property IDiaSymbol6::baseDataOffset
+ .property uint32 textureSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 9F 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_textureSlot()
+ } // end of property IDiaSymbol6::textureSlot
+ .property uint32 samplerSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_samplerSlot()
+ } // end of property IDiaSymbol6::samplerSlot
+ .property uint32 uavSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_uavSlot()
+ } // end of property IDiaSymbol6::uavSlot
+ .property uint32 sizeInUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_sizeInUdt()
+ } // end of property IDiaSymbol6::sizeInUdt
+ .property uint32 memorySpaceKind()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_memorySpaceKind()
+ } // end of property IDiaSymbol6::memorySpaceKind
+ .property uint32 unmodifiedTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_unmodifiedTypeId()
+ } // end of property IDiaSymbol6::unmodifiedTypeId
+ .property uint32 subTypeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_subTypeId()
+ } // end of property IDiaSymbol6::subTypeId
+ .property class DIALib.IDiaSymbol subType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A6 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_subType()
+ } // end of property IDiaSymbol6::subType
+ .property uint32 numberOfModifiers()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_numberOfModifiers()
+ } // end of property IDiaSymbol6::numberOfModifiers
+ .property uint32 numberOfRegisterIndices()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A8 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_numberOfRegisterIndices()
+ } // end of property IDiaSymbol6::numberOfRegisterIndices
+ .property int32 isHLSLData()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 A9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isHLSLData()
+ } // end of property IDiaSymbol6::isHLSLData
+ .property int32 isPointerToDataMember()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isPointerToDataMember()
+ } // end of property IDiaSymbol6::isPointerToDataMember
+ .property int32 isPointerToMemberFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isPointerToMemberFunction()
+ } // end of property IDiaSymbol6::isPointerToMemberFunction
+ .property int32 isSingleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isSingleInheritance()
+ } // end of property IDiaSymbol6::isSingleInheritance
+ .property int32 isMultipleInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isMultipleInheritance()
+ } // end of property IDiaSymbol6::isMultipleInheritance
+ .property int32 isVirtualInheritance()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isVirtualInheritance()
+ } // end of property IDiaSymbol6::isVirtualInheritance
+ .property int32 restrictedType()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 AF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_restrictedType()
+ } // end of property IDiaSymbol6::restrictedType
+ .property int32 isPointerBasedOnSymbolValue()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B0 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isPointerBasedOnSymbolValue()
+ } // end of property IDiaSymbol6::isPointerBasedOnSymbolValue
+ .property class DIALib.IDiaSymbol baseSymbol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B1 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_baseSymbol()
+ } // end of property IDiaSymbol6::baseSymbol
+ .property uint32 baseSymbolId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B2 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_baseSymbolId()
+ } // end of property IDiaSymbol6::baseSymbolId
+ .property string objectFileName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B3 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol6::get_objectFileName()
+ } // end of property IDiaSymbol6::objectFileName
+ .property int32 isAcceleratorGroupSharedLocal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B4 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isAcceleratorGroupSharedLocal()
+ } // end of property IDiaSymbol6::isAcceleratorGroupSharedLocal
+ .property int32 isAcceleratorPointerTagLiveRange()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B5 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isAcceleratorPointerTagLiveRange()
+ } // end of property IDiaSymbol6::isAcceleratorPointerTagLiveRange
+ .property int32 isAcceleratorStubFunction()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isAcceleratorStubFunction()
+ } // end of property IDiaSymbol6::isAcceleratorStubFunction
+ .property uint32 numberOfAcceleratorPointerTags()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_numberOfAcceleratorPointerTags()
+ } // end of property IDiaSymbol6::numberOfAcceleratorPointerTags
+ .property int32 isSdl()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isSdl()
+ } // end of property IDiaSymbol6::isSdl
+ .property int32 isWinRTPointer()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 B9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isWinRTPointer()
+ } // end of property IDiaSymbol6::isWinRTPointer
+ .property int32 isRefUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isRefUdt()
+ } // end of property IDiaSymbol6::isRefUdt
+ .property int32 isValueUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isValueUdt()
+ } // end of property IDiaSymbol6::isValueUdt
+ .property int32 isInterfaceUdt()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isInterfaceUdt()
+ } // end of property IDiaSymbol6::isInterfaceUdt
+ .property int32 isPGO()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isPGO()
+ } // end of property IDiaSymbol6::isPGO
+ .property int32 hasValidPGOCounts()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_hasValidPGOCounts()
+ } // end of property IDiaSymbol6::hasValidPGOCounts
+ .property int32 isOptimizedForSpeed()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 BF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isOptimizedForSpeed()
+ } // end of property IDiaSymbol6::isOptimizedForSpeed
+ .property uint32 PGOEntryCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_PGOEntryCount()
+ } // end of property IDiaSymbol6::PGOEntryCount
+ .property uint32 PGOEdgeCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_PGOEdgeCount()
+ } // end of property IDiaSymbol6::PGOEdgeCount
+ .property uint64 PGODynamicInstructionCount()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol6::get_PGODynamicInstructionCount()
+ } // end of property IDiaSymbol6::PGODynamicInstructionCount
+ .property uint32 staticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_staticSize()
+ } // end of property IDiaSymbol6::staticSize
+ .property uint32 finalLiveStaticSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C4 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_finalLiveStaticSize()
+ } // end of property IDiaSymbol6::finalLiveStaticSize
+ .property string phaseName()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C5 00 00 00 00 00 )
+ .get instance string DIALib.IDiaSymbol6::get_phaseName()
+ } // end of property IDiaSymbol6::phaseName
+ .property int32 hasControlFlowCheck()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C6 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_hasControlFlowCheck()
+ } // end of property IDiaSymbol6::hasControlFlowCheck
+ .property int32 constantExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C7 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_constantExport()
+ } // end of property IDiaSymbol6::constantExport
+ .property int32 dataExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_dataExport()
+ } // end of property IDiaSymbol6::dataExport
+ .property int32 privateExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 C9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_privateExport()
+ } // end of property IDiaSymbol6::privateExport
+ .property int32 noNameExport()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_noNameExport()
+ } // end of property IDiaSymbol6::noNameExport
+ .property int32 exportHasExplicitlyAssignedOrdinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CB 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_exportHasExplicitlyAssignedOrdinal()
+ } // end of property IDiaSymbol6::exportHasExplicitlyAssignedOrdinal
+ .property int32 exportIsForwarder()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CC 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_exportIsForwarder()
+ } // end of property IDiaSymbol6::exportIsForwarder
+ .property uint32 ordinal()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CD 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_ordinal()
+ } // end of property IDiaSymbol6::ordinal
+ .property uint32 frameSize()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CE 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_frameSize()
+ } // end of property IDiaSymbol6::frameSize
+ .property uint32 exceptionHandlerAddressSection()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 CF 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_exceptionHandlerAddressSection()
+ } // end of property IDiaSymbol6::exceptionHandlerAddressSection
+ .property uint32 exceptionHandlerAddressOffset()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D0 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_exceptionHandlerAddressOffset()
+ } // end of property IDiaSymbol6::exceptionHandlerAddressOffset
+ .property uint32 exceptionHandlerRelativeVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D1 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_exceptionHandlerRelativeVirtualAddress()
+ } // end of property IDiaSymbol6::exceptionHandlerRelativeVirtualAddress
+ .property uint64 exceptionHandlerVirtualAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D2 00 00 00 00 00 )
+ .get instance uint64 DIALib.IDiaSymbol6::get_exceptionHandlerVirtualAddress()
+ } // end of property IDiaSymbol6::exceptionHandlerVirtualAddress
+ .property uint32 characteristics()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D3 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_characteristics()
+ } // end of property IDiaSymbol6::characteristics
+ .property class DIALib.IDiaSymbol coffGroup()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D4 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_coffGroup()
+ } // end of property IDiaSymbol6::coffGroup
+ .property uint32 bindID()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D5 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_bindID()
+ } // end of property IDiaSymbol6::bindID
+ .property uint32 bindSpace()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D6 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_bindSpace()
+ } // end of property IDiaSymbol6::bindSpace
+ .property uint32 bindSlot()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D7 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_bindSlot()
+ } // end of property IDiaSymbol6::bindSlot
+ .property int32 isObjCClass()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D8 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isObjCClass()
+ } // end of property IDiaSymbol6::isObjCClass
+ .property int32 isObjCCategory()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 D9 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isObjCCategory()
+ } // end of property IDiaSymbol6::isObjCCategory
+ .property int32 isObjCProtocol()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DA 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isObjCProtocol()
+ } // end of property IDiaSymbol6::isObjCProtocol
+ .property class DIALib.IDiaSymbol inlinee()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DB 00 00 00 00 00 )
+ .get instance class DIALib.IDiaSymbol DIALib.IDiaSymbol6::get_inlinee()
+ } // end of property IDiaSymbol6::inlinee
+ .property uint32 inlineeId()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DC 00 00 00 00 00 )
+ .get instance uint32 DIALib.IDiaSymbol6::get_inlineeId()
+ } // end of property IDiaSymbol6::inlineeId
+ .property int32 noexcept()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DD 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_noexcept()
+ } // end of property IDiaSymbol6::noexcept
+ .property int32 hasAbsoluteAddress()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DE 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_hasAbsoluteAddress()
+ } // end of property IDiaSymbol6::hasAbsoluteAddress
+ .property int32 isStaticMemberFunc()
+ {
+ .custom instance void [mscorlib]System.Runtime.InteropServices.DispIdAttribute::.ctor(int32) = ( 01 00 DF 00 00 00 00 00 )
+ .get instance int32 DIALib.IDiaSymbol6::get_isStaticMemberFunc()
+ } // end of property IDiaSymbol6::isStaticMemberFunc
+} // end of class DIALib.IDiaSymbol6
+
+
+// =============================================================
+
+// *********** DISASSEMBLY COMPLETE ***********************
+// WARNING: Created Win32 resource file DIALib.res
diff --git a/src/coreclr/src/ToolBox/SOS/DIALib/DIALib.ilproj b/src/coreclr/src/ToolBox/SOS/DIALib/DIALib.ilproj
new file mode 100644
index 000000000000..0486489d2328
--- /dev/null
+++ b/src/coreclr/src/ToolBox/SOS/DIALib/DIALib.ilproj
@@ -0,0 +1,7 @@
+
+
+ $(NetCoreAppCurrent)
+ AnyCPU
+ false
+
+
\ No newline at end of file
diff --git a/src/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt b/src/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
deleted file mode 100644
index e3fc3ed9e3a5..000000000000
--- a/src/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-# Quick note: The CMake C# support is using the CSC bundled with the MSBuild that the native build runs on, not the one supplied by the local .NET SDK.
-
-project(DacTableGen LANGUAGES CSharp)
-
-file(TO_CMAKE_PATH "$ENV{VSInstallDir}\\DIA SDK" DIASDK_DIR)
-file(COPY "${DIASDK_DIR}/bin/msdia140.dll" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
-
-set (DIALib "${CMAKE_CURRENT_BINARY_DIR}/DIALib.dll")
-FIND_PROGRAM(TLBIMP tlbimp.exe)
-FIND_PROGRAM(MIDL midl.exe)
-add_custom_command(
- OUTPUT "${DIALib}"
- COMMAND ${MIDL} /I "${DIASDK_DIR}/include" "${DIASDK_DIR}/idl/dia2.idl" /tlb "${CMAKE_CURRENT_BINARY_DIR}/dia2.tlb"
- COMMAND ${TLBIMP} dia2.tlb /out:"${DIALib}"
-)
-add_custom_target(gen_dialib DEPENDS "${DIALib}")
-
-set(DACTABLEGEN_SOURCES
- cvconst.cs
- diautil.cs
- main.cs
- MapSymbolProvider.cs
-)
-# DacTableGen doesn't use the defines from the rest of the build tree, so clear all of the compile definitions
-set_directory_properties(PROPERTIES COMPILE_DEFINITIONS "")
-
-set(CMAKE_CSharp_FLAGS "/platform:anycpu32bitpreferred")
-add_executable(dactablegen ${DACTABLEGEN_SOURCES})
-add_dependencies(dactablegen gen_dialib)
-
-set_target_properties(dactablegen PROPERTIES VS_DOTNET_REFERENCES "System")
-set_target_properties(dactablegen PROPERTIES VS_DOTNET_REFERENCE_DIALib "${DIALib}")
diff --git a/src/coreclr/src/ToolBox/SOS/DacTableGen/DacTableGen.csproj b/src/coreclr/src/ToolBox/SOS/DacTableGen/DacTableGen.csproj
new file mode 100644
index 000000000000..9bba95a4e619
--- /dev/null
+++ b/src/coreclr/src/ToolBox/SOS/DacTableGen/DacTableGen.csproj
@@ -0,0 +1,35 @@
+
+
+ Exe
+ $(NetCoreAppCurrent)
+ AnyCPU
+ $(RuntimeBinDir)\DacTableGen
+ false
+ false
+
+
+
+
+
+
+
+
+ $([MSBuild]::NormalizePath('$(Pkgvswhere)','tools','vswhere.exe'))
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/coreclr/src/ToolBox/SOS/Directory.Build.props b/src/coreclr/src/ToolBox/SOS/Directory.Build.props
new file mode 100644
index 000000000000..93c2d4a55e7b
--- /dev/null
+++ b/src/coreclr/src/ToolBox/SOS/Directory.Build.props
@@ -0,0 +1,7 @@
+
+
+ AnyCPU
+
+
+
+
\ No newline at end of file
diff --git a/src/coreclr/src/ToolBox/superpmi/mcs/CMakeLists.txt b/src/coreclr/src/ToolBox/superpmi/mcs/CMakeLists.txt
index 7c82afea565f..8524fe8faec7 100644
--- a/src/coreclr/src/ToolBox/superpmi/mcs/CMakeLists.txt
+++ b/src/coreclr/src/ToolBox/superpmi/mcs/CMakeLists.txt
@@ -5,7 +5,7 @@ add_definitions(-DSELF_NO_HOST)
if(CLR_CMAKE_HOST_WIN32)
#use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
endif(CLR_CMAKE_HOST_WIN32)
include_directories(.)
@@ -24,6 +24,7 @@ set(MCS_SOURCES
verbildump.cpp
verbinteg.cpp
verbmerge.cpp
+ verbprintjiteeversion.cpp
verbremovedup.cpp
verbstat.cpp
verbstrip.cpp
@@ -48,7 +49,7 @@ set(MCS_SOURCES
_add_executable(mcs
${MCS_SOURCES}
)
-target_precompile_header(TARGET mcs HEADER standardpch.h)
+target_precompile_headers(mcs PRIVATE "$<$:standardpch.h>")
if(CLR_CMAKE_HOST_UNIX)
target_link_libraries(mcs
@@ -64,7 +65,7 @@ else()
${STATIC_MT_CPP_LIB}
)
- _install (FILES ${CMAKE_CURRENT_BINARY_DIR}/$/mcs.pdb DESTINATION PDB)
+ _install (FILES $ DESTINATION PDB)
endif(CLR_CMAKE_HOST_UNIX)
_install (TARGETS mcs DESTINATION .)
diff --git a/src/coreclr/src/ToolBox/superpmi/mcs/commandline.cpp b/src/coreclr/src/ToolBox/superpmi/mcs/commandline.cpp
index 30fff554ca69..58df7b3dec39 100644
--- a/src/coreclr/src/ToolBox/superpmi/mcs/commandline.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/mcs/commandline.cpp
@@ -96,6 +96,9 @@ void CommandLine::DumpHelp(const char* program)
printf(" e.g. -merge a.mch *.mc -recursive\n");
printf(" e.g. -merge a.mch *.mc -recursive -dedup -thin\n");
printf("\n");
+ printf(" -printJITEEVersion\n");
+ printf(" Print the JITEEVersion GUID with which this was built, in the form: a5eec3a4-4176-43a7-8c2b-a05b551d4f49\n");
+ printf("\n");
printf(" -removeDup inputfile outputfile\n");
printf(" Copy methodContexts from inputfile to outputfile, skipping duplicates.\n");
printf(" e.g. -removeDup a.mc b.mc\n");
@@ -245,6 +248,12 @@ bool CommandLine::Parse(int argc, char* argv[], /* OUT */ Options* o)
foundVerb = true;
o->actionMerge = true;
}
+ else if ((_strnicmp(&argv[i][1], "printjiteeversion", argLen) == 0))
+ {
+ tempLen = strlen(argv[i]);
+ foundVerb = true;
+ o->actionPrintJITEEVersion = true;
+ }
else if ((_strnicmp(&argv[i][1], "recursive", argLen) == 0))
{
tempLen = strlen(argv[i]);
@@ -593,6 +602,11 @@ bool CommandLine::Parse(int argc, char* argv[], /* OUT */ Options* o)
}
return true;
}
+ if (o->actionPrintJITEEVersion)
+ {
+ // No arguments to check
+ return true;
+ }
DumpHelp(argv[0]);
return false;
diff --git a/src/coreclr/src/ToolBox/superpmi/mcs/commandline.h b/src/coreclr/src/ToolBox/superpmi/mcs/commandline.h
index 4b18ae9eb156..b791b4c3bb8d 100644
--- a/src/coreclr/src/ToolBox/superpmi/mcs/commandline.h
+++ b/src/coreclr/src/ToolBox/superpmi/mcs/commandline.h
@@ -26,6 +26,7 @@ class CommandLine
, actionILDump(false)
, actionInteg(false)
, actionMerge(false)
+ , actionPrintJITEEVersion(false)
, actionRemoveDup(false)
, actionStat(false)
, actionStrip(false)
@@ -52,6 +53,7 @@ class CommandLine
bool actionILDump;
bool actionInteg;
bool actionMerge;
+ bool actionPrintJITEEVersion;
bool actionRemoveDup;
bool actionStat;
bool actionStrip;
diff --git a/src/coreclr/src/ToolBox/superpmi/mcs/mcs.cpp b/src/coreclr/src/ToolBox/superpmi/mcs/mcs.cpp
index 3c4e2dfb0d7b..52bc21f49bdf 100644
--- a/src/coreclr/src/ToolBox/superpmi/mcs/mcs.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/mcs/mcs.cpp
@@ -19,6 +19,7 @@
#include "verbconcat.h"
#include "verbmerge.h"
#include "verbstrip.h"
+#include "verbprintjiteeversion.h"
#include "logging.h"
int __cdecl main(int argc, char* argv[])
@@ -97,6 +98,10 @@ int __cdecl main(int argc, char* argv[])
{
exitCode = verbTOC::DoWork(o.nameOfFile1);
}
+ if (o.actionPrintJITEEVersion)
+ {
+ exitCode = verbPrintJITEEVersion::DoWork();
+ }
Logger::Shutdown();
return exitCode;
diff --git a/src/coreclr/src/ToolBox/superpmi/mcs/verbildump.cpp b/src/coreclr/src/ToolBox/superpmi/mcs/verbildump.cpp
index 5a41401cc53d..0af9a807cbf7 100644
--- a/src/coreclr/src/ToolBox/superpmi/mcs/verbildump.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/mcs/verbildump.cpp
@@ -893,6 +893,7 @@ void DumpILToConsoleBare(unsigned char* ilCode, int len)
LogError("unknown ilCode 0xfe%2x at offset %d in MethodGen::PrettyPrint", ilCode[i], i);
break;
}
+ break;
default:
LogError("unknown ilCode 0x%02x at offset %d in MethodGen::PrettyPrint", ilCode[i], i);
break;
diff --git a/src/coreclr/src/ToolBox/superpmi/mcs/verbprintjiteeversion.cpp b/src/coreclr/src/ToolBox/superpmi/mcs/verbprintjiteeversion.cpp
new file mode 100644
index 000000000000..318146aa3946
--- /dev/null
+++ b/src/coreclr/src/ToolBox/superpmi/mcs/verbprintjiteeversion.cpp
@@ -0,0 +1,34 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+#include "standardpch.h"
+#include "verbprintjiteeversion.h"
+#include "runtimedetails.h"
+
+// Print the GUID in format a5eec3a4-4176-43a7-8c2b-a05b551d4f49
+//
+// This is useful for tools that want to determine which MCH file to use for a
+// particular JIT: if the JIT and MCS are built from the same source tree, then
+// use this function to print out the JITEEVersion, and use that to determine
+// which MCH files to use.
+//
+int verbPrintJITEEVersion::DoWork()
+{
+ const GUID& g = JITEEVersionIdentifier;
+ printf("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
+ g.Data1,
+ g.Data2,
+ g.Data3,
+ g.Data4[0],
+ g.Data4[1],
+ g.Data4[2],
+ g.Data4[3],
+ g.Data4[4],
+ g.Data4[5],
+ g.Data4[6],
+ g.Data4[7]);
+
+ return 0;
+}
diff --git a/src/coreclr/src/ToolBox/superpmi/mcs/verbprintjiteeversion.h b/src/coreclr/src/ToolBox/superpmi/mcs/verbprintjiteeversion.h
new file mode 100644
index 000000000000..16a8197f6e5c
--- /dev/null
+++ b/src/coreclr/src/ToolBox/superpmi/mcs/verbprintjiteeversion.h
@@ -0,0 +1,18 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+//----------------------------------------------------------
+// verbPrintJITEEVersion.h - verb that prints the JITEEVersion GUID that this was built with
+//----------------------------------------------------------
+#ifndef _verbPrintJITEEVersion
+#define _verbPrintJITEEVersion
+
+class verbPrintJITEEVersion
+{
+public:
+ static int DoWork();
+};
+
+#endif
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.cpp
index e27491bbd5ee..f0ccdc46c754 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.cpp
@@ -796,6 +796,16 @@ void CompileResult::applyRelocs(unsigned char* block1, ULONG blocksize1, void* o
size_t address = section_begin + (size_t)fixupLocation - (size_t)originalAddr;
if ((section_begin <= address) && (address < section_end)) // A reloc for our section?
{
+#if defined(TARGET_AMD64)
+ // During an actual compile, recordRelocation() will be called before the compile
+ // is actually finished, and it will write the relative offset into the fixupLocation.
+ // Then, emitEndCodeGen() will patch forward jumps by subtracting any adjustment due
+ // to overestimation of instruction sizes. Because we're applying the relocs after the
+ // compile has finished, we need to reverse that: i.e. add in the (negative) adjustment
+ // that's now in the fixupLocation.
+ INT32 adjustment = *(INT32*)address;
+ delta += adjustment;
+#endif
LogDebug(" fixupLoc-%016llX (@%p) : %08X => %08X", fixupLocation, address, *(DWORD*)address,
delta);
*(DWORD*)address = (DWORD)delta;
@@ -885,9 +895,17 @@ void* CompileResult::repAddressMap(void* replayAddress)
{
if (AddressMap == nullptr)
return nullptr;
- Agnostic_AddressMap value;
- value = AddressMap->Get((DWORDLONG)replayAddress);
- return (void*)value.Address;
+
+ int index = AddressMap->GetIndex((DWORDLONG)replayAddress);
+
+ if (index != -1)
+ {
+ Agnostic_AddressMap value;
+ value = AddressMap->Get((DWORDLONG)replayAddress);
+ return (void*)value.Address;
+ }
+
+ return nullptr;
}
void* CompileResult::searchAddressMap(void* newAddress)
{
@@ -952,45 +970,12 @@ void CompileResult::dmpAllocUnwindInfo(DWORD key, const Agnostic_AllocUnwindInfo
value.pUnwindBlock_index, value.funcKind);
}
-void CompileResult::recAllocMethodBlockCounts(ULONG count, ICorJitInfo::BlockCounts** pBlockCounts, HRESULT result)
-{
- if (AllocMethodBlockCounts == nullptr)
- AllocMethodBlockCounts = new LightWeightMap();
-
- Agnostic_AllocMethodBlockCounts value;
-
- value.count = (DWORD)count;
- value.result = (DWORD)result;
- value.pBlockCounts_index =
- AllocMethodBlockCounts->AddBuffer((unsigned char*)*pBlockCounts, count * sizeof(ICorJitInfo::BlockCounts));
-
- AllocMethodBlockCounts->Add((DWORD)0, value);
-}
-void CompileResult::dmpAllocMethodBlockCounts(DWORD key, const Agnostic_AllocMethodBlockCounts& value)
-{
- printf("AllocMethodBlockCounts key %u, value cnt-%u ind-%u res-%08X", key, value.count, value.pBlockCounts_index,
- value.result);
-}
-HRESULT CompileResult::repAllocMethodBlockCounts(ULONG count, ICorJitInfo::BlockCounts** pBlockCounts)
-{
- Agnostic_AllocMethodBlockCounts value;
- value = AllocMethodBlockCounts->Get((DWORD)0);
-
- if (count != value.count)
- __debugbreak();
-
- HRESULT result = (HRESULT)value.result;
- *pBlockCounts = (ICorJitInfo::BlockCounts*)AllocMethodBlockCounts->GetBuffer(value.pBlockCounts_index);
- recAddressMap((void*)0x4242, (void*)*pBlockCounts, count * (sizeof(ICorJitInfo::BlockCounts)));
- return result;
-}
-
void CompileResult::recRecordCallSite(ULONG instrOffset, CORINFO_SIG_INFO* callSig, CORINFO_METHOD_HANDLE methodHandle)
{
repRecordCallSite(instrOffset, callSig, methodHandle);
}
-void CompileResult::dmpRecordCallSite(DWORD key, const Agnostic_RecordCallSite& value)
+void CompileResult::dmpRecordCallSiteWithSignature(DWORD key, const Agnostic_RecordCallSite& value) const
{
printf("RecordCallSite key %u, callSig{cc-%u rtc-%016llX rts-%016llX rt-%u flg-%u na-%u cc-%u ci-%u mc-%u mi-%u "
"sig-%u pSig-%u scp-%016llX tok-%08X} ftn-%016llX",
@@ -1001,16 +986,26 @@ void CompileResult::dmpRecordCallSite(DWORD key, const Agnostic_RecordCallSite&
value.callSig.token, value.methodHandle);
}
-void CompileResult::repRecordCallSite(ULONG instrOffset, CORINFO_SIG_INFO* callSig, CORINFO_METHOD_HANDLE methodHandle)
+void CompileResult::dmpRecordCallSiteWithoutSignature(DWORD key, DWORDLONG methodHandle) const
{
- if (RecordCallSite == nullptr)
- RecordCallSite = new LightWeightMap();
+ printf("RecordCallSite without call signature key %u, ftn-%016llX", key, methodHandle);
+}
- Agnostic_RecordCallSite value;
- ZeroMemory(&value, sizeof(Agnostic_RecordCallSite));
+void CompileResult::repRecordCallSite(ULONG instrOffset, CORINFO_SIG_INFO* callSig, CORINFO_METHOD_HANDLE methodHandle)
+{
+
+ if (RecordCallSiteWithSignature == nullptr)
+ {
+ // The most call site records have only `methodHandle`, so creating two separate maps give us better perfomance
+ // and smaller memory consumption. Note: we are not reading values from these maps during a normal replay.
+ RecordCallSiteWithSignature = new LightWeightMap();
+ RecordCallSiteWithoutSignature = new LightWeightMap();
+ }
if (callSig != nullptr)
{
+ Agnostic_RecordCallSite value;
+ ZeroMemory(&value, sizeof(Agnostic_RecordCallSite));
value.callSig.callConv = (DWORD)callSig->callConv;
value.callSig.retTypeClass = (DWORDLONG)callSig->retTypeClass;
value.callSig.retTypeSigClass = (DWORDLONG)callSig->retTypeSigClass;
@@ -1019,51 +1014,35 @@ void CompileResult::repRecordCallSite(ULONG instrOffset, CORINFO_SIG_INFO* callS
value.callSig.numArgs = (DWORD)callSig->numArgs;
value.callSig.sigInst_classInstCount = (DWORD)callSig->sigInst.classInstCount;
value.callSig.sigInst_classInst_Index =
- RecordCallSite->AddBuffer((unsigned char*)callSig->sigInst.classInst,
+ RecordCallSiteWithSignature->AddBuffer((unsigned char*)callSig->sigInst.classInst,
callSig->sigInst.classInstCount * 8); // porting issue
value.callSig.sigInst_methInstCount = (DWORD)callSig->sigInst.methInstCount;
value.callSig.sigInst_methInst_Index =
- RecordCallSite->AddBuffer((unsigned char*)callSig->sigInst.methInst,
+ RecordCallSiteWithSignature->AddBuffer((unsigned char*)callSig->sigInst.methInst,
callSig->sigInst.methInstCount * 8); // porting issue
value.callSig.args = (DWORDLONG)callSig->args;
value.callSig.cbSig = (DWORD)callSig->cbSig;
- value.callSig.pSig_Index = (DWORD)RecordCallSite->AddBuffer((unsigned char*)callSig->pSig, callSig->cbSig);
+ value.callSig.pSig_Index = (DWORD)RecordCallSiteWithSignature->AddBuffer((unsigned char*)callSig->pSig, callSig->cbSig);
value.callSig.scope = (DWORDLONG)callSig->scope;
value.callSig.token = (DWORD)callSig->token;
+ value.methodHandle = (DWORDLONG)methodHandle;
+ RecordCallSiteWithSignature->Add(instrOffset, value);
}
else
{
- value.callSig.callConv = (DWORD)-1;
- value.callSig.retTypeClass = (DWORDLONG)-1;
- value.callSig.retTypeSigClass = (DWORDLONG)-1;
- value.callSig.retType = (DWORD)-1;
- value.callSig.flags = (DWORD)-1;
- value.callSig.numArgs = (DWORD)-1;
- value.callSig.sigInst_classInstCount = (DWORD)-1;
- value.callSig.sigInst_classInst_Index = (DWORD)-1;
- value.callSig.sigInst_methInstCount = (DWORD)-1;
- value.callSig.sigInst_methInst_Index = (DWORD)-1;
- value.callSig.args = (DWORDLONG)-1;
- value.callSig.cbSig = (DWORD)-1;
- value.callSig.pSig_Index = (DWORD)-1;
- value.callSig.scope = (DWORDLONG)-1;
- value.callSig.token = (DWORD)-1;
+ RecordCallSiteWithoutSignature->Add(instrOffset, (DWORDLONG)methodHandle);
}
-
- value.methodHandle = (DWORDLONG)methodHandle;
-
- RecordCallSite->Add(instrOffset, value);
}
bool CompileResult::fndRecordCallSiteSigInfo(ULONG instrOffset, CORINFO_SIG_INFO* pCallSig)
{
- if (RecordCallSite == nullptr)
+ if (RecordCallSiteWithSignature == nullptr)
return false;
- if (RecordCallSite->GetIndex(instrOffset) == -1)
+ if (RecordCallSiteWithSignature->GetIndex(instrOffset) == -1)
return false;
- Agnostic_RecordCallSite value = RecordCallSite->Get(instrOffset);
+ Agnostic_RecordCallSite value = RecordCallSiteWithSignature->Get(instrOffset);
if (value.callSig.callConv == (DWORD)-1)
return false;
@@ -1076,12 +1055,12 @@ bool CompileResult::fndRecordCallSiteSigInfo(ULONG instrOffset, CORINFO_SIG_INFO
pCallSig->numArgs = (unsigned)value.callSig.numArgs;
pCallSig->sigInst.classInstCount = (unsigned)value.callSig.sigInst_classInstCount;
pCallSig->sigInst.classInst =
- (CORINFO_CLASS_HANDLE*)RecordCallSite->GetBuffer(value.callSig.sigInst_classInst_Index);
+ (CORINFO_CLASS_HANDLE*)RecordCallSiteWithSignature->GetBuffer(value.callSig.sigInst_classInst_Index);
pCallSig->sigInst.methInstCount = (unsigned)value.callSig.sigInst_methInstCount;
- pCallSig->sigInst.methInst = (CORINFO_CLASS_HANDLE*)RecordCallSite->GetBuffer(value.callSig.sigInst_methInst_Index);
+ pCallSig->sigInst.methInst = (CORINFO_CLASS_HANDLE*)RecordCallSiteWithSignature->GetBuffer(value.callSig.sigInst_methInst_Index);
pCallSig->args = (CORINFO_ARG_LIST_HANDLE)value.callSig.args;
pCallSig->cbSig = (unsigned int)value.callSig.cbSig;
- pCallSig->pSig = (PCCOR_SIGNATURE)RecordCallSite->GetBuffer(value.callSig.pSig_Index);
+ pCallSig->pSig = (PCCOR_SIGNATURE)RecordCallSiteWithSignature->GetBuffer(value.callSig.pSig_Index);
pCallSig->scope = (CORINFO_MODULE_HANDLE)value.callSig.scope;
pCallSig->token = (mdToken)value.callSig.token;
@@ -1090,14 +1069,16 @@ bool CompileResult::fndRecordCallSiteSigInfo(ULONG instrOffset, CORINFO_SIG_INFO
bool CompileResult::fndRecordCallSiteMethodHandle(ULONG instrOffset, CORINFO_METHOD_HANDLE* pMethodHandle)
{
- if (RecordCallSite == nullptr)
- return false;
-
- if (RecordCallSite->GetIndex(instrOffset) == -1)
- return false;
-
- Agnostic_RecordCallSite value = RecordCallSite->Get(instrOffset);
- *pMethodHandle = (CORINFO_METHOD_HANDLE)value.methodHandle;
-
- return true;
+
+ if (RecordCallSiteWithSignature != nullptr && RecordCallSiteWithSignature->GetIndex(instrOffset) != -1)
+ {
+ Agnostic_RecordCallSite value = RecordCallSiteWithSignature->Get(instrOffset);
+ *pMethodHandle = (CORINFO_METHOD_HANDLE)value.methodHandle;
+ }
+ else if (RecordCallSiteWithoutSignature != nullptr && RecordCallSiteWithoutSignature->GetIndex(instrOffset) != -1)
+ {
+ CORINFO_METHOD_HANDLE value = (CORINFO_METHOD_HANDLE)RecordCallSiteWithoutSignature->Get(instrOffset);
+ *pMethodHandle = value;
+ }
+ return false;
}
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.h b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.h
index 09ec839c4b52..7390611b6511 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.h
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/compileresult.h
@@ -166,12 +166,6 @@ class CompileResult
DWORD HandlerLength;
DWORD ClassToken; // one view of symetric union
};
- struct Agnostic_AllocMethodBlockCounts
- {
- DWORD count;
- DWORD pBlockCounts_index;
- DWORD result;
- };
struct Agnostic_CORINFO_SIG_INFO2
{
DWORD callConv;
@@ -328,12 +322,9 @@ class CompileResult
CorJitFuncKind funcKind);
void dmpAllocUnwindInfo(DWORD key, const Agnostic_AllocUnwindInfo& value);
- void recAllocMethodBlockCounts(ULONG count, ICorJitInfo::BlockCounts** pBlockCounts, HRESULT result);
- void dmpAllocMethodBlockCounts(DWORD key, const Agnostic_AllocMethodBlockCounts& value);
- HRESULT repAllocMethodBlockCounts(ULONG count, ICorJitInfo::BlockCounts** pBlockCounts);
-
void recRecordCallSite(ULONG instrOffset, CORINFO_SIG_INFO* callSig, CORINFO_METHOD_HANDLE methodHandle);
- void dmpRecordCallSite(DWORD key, const Agnostic_RecordCallSite& value);
+ void dmpRecordCallSiteWithSignature(DWORD key, const Agnostic_RecordCallSite& value) const;
+ void dmpRecordCallSiteWithoutSignature(DWORD key, DWORDLONG methodHandle) const;
void repRecordCallSite(ULONG instrOffset, CORINFO_SIG_INFO* callSig, CORINFO_METHOD_HANDLE methodHandle);
bool fndRecordCallSiteSigInfo(ULONG instrOffset, CORINFO_SIG_INFO* pCallSig);
bool fndRecordCallSiteMethodHandle(ULONG instrOffset, CORINFO_METHOD_HANDLE* pMethodHandle);
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/crlwmlist.h b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/crlwmlist.h
index b42077de7abe..d9146674464b 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/crlwmlist.h
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/crlwmlist.h
@@ -19,7 +19,6 @@
#endif
LWM(AddressMap, DWORDLONG, CompileResult::Agnostic_AddressMap)
-LWM(AllocMethodBlockCounts, DWORD, CompileResult::Agnostic_AllocMethodBlockCounts)
LWM(AllocGCInfo, DWORD, CompileResult::Agnostic_AllocGCInfo)
LWM(AllocMem, DWORD, CompileResult::Agnostic_AllocMemDetails)
DENSELWM(AllocUnwindInfo, CompileResult::Agnostic_AllocUnwindInfo)
@@ -30,7 +29,8 @@ LWM(CompileMethod, DWORD, CompileResult::Agnostic_CompileMethodResults)
DENSELWM(MessageLog, DWORD)
DENSELWM(MethodMustBeLoadedBeforeCodeIsRun, DWORDLONG)
DENSELWM(ProcessName, DWORD)
-LWM(RecordCallSite, DWORD, CompileResult::Agnostic_RecordCallSite)
+LWM(RecordCallSiteWithSignature, DWORD, CompileResult::Agnostic_RecordCallSite)
+LWM(RecordCallSiteWithoutSignature, DWORD, DWORDLONG)
DENSELWM(RecordRelocation, CompileResult::Agnostic_RecordRelocation)
DENSELWM(ReportFatalError, DWORD)
DENSELWM(ReportInliningDecision, CompileResult::Agnostic_ReportInliningDecision)
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/lightweightmap.h b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/lightweightmap.h
index 2a5594f81243..2cc65360a026 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/lightweightmap.h
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/lightweightmap.h
@@ -78,6 +78,33 @@ class LightWeightMapBuffer
return newOffset + sizeof(unsigned int);
}
+ const unsigned char* CreateBuffer(unsigned int len)
+ {
+ if (len == 0)
+ {
+ return nullptr;
+ }
+
+ if (locked)
+ {
+ LogError("Added item that extended the buffer after it was locked by a call to GetBuffer()");
+ __debugbreak();
+ }
+
+ unsigned int newbuffsize = bufferLength + sizeof(unsigned int) + len;
+ unsigned char* newbuffer = new unsigned char[newbuffsize];
+ unsigned int newOffset = bufferLength;
+ if (bufferLength > 0)
+ memcpy(newbuffer, buffer, bufferLength);
+ memset(newbuffer + bufferLength + sizeof(unsigned int), 0, len);
+ *((unsigned int*)(newbuffer + bufferLength)) = len;
+ bufferLength += sizeof(unsigned int) + len;
+ if (buffer != nullptr)
+ delete[] buffer;
+ buffer = newbuffer;
+ return buffer + newOffset + sizeof(unsigned int);
+ }
+
unsigned char* GetBuffer(unsigned int offset)
{
if (offset == (unsigned int)-1)
@@ -342,7 +369,14 @@ class LightWeightMap : public LightWeightMapBuffer
else if (res > 0)
last = mid - 1; // repeat search in bottom half.
else
+ {
+ int resItem = memcmp(&pItems[mid], &item, sizeof(_Item));
+ if (resItem != 0)
+ {
+ LogDebug("Tried to add a new value for an existing key, the new value was ignored");
+ }
return false; // found it. return position /////
+ }
}
insert = first;
if (insert != (unsigned int)first)
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/lwmlist.h b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/lwmlist.h
index 1922e7d0f5df..b9731198754a 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/lwmlist.h
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/lwmlist.h
@@ -18,6 +18,7 @@
#define DENSELWM(map, value) LWM(map, this_is_an_error, value)
#endif
+LWM(AllocMethodBlockCounts, DWORD, Agnostic_AllocMethodBlockCounts)
LWM(AppendClassName, Agnostic_AppendClassName, DWORD)
LWM(AreTypesEquivalent, DLDL, DWORD)
LWM(AsCorInfoType, DWORDLONG, DWORD)
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp
index d45c5e07942d..b2443351f856 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.cpp
@@ -47,6 +47,7 @@ MethodContext::MethodContext()
cr = new CompileResult();
index = -1;
+ isReadyToRunCompilation = ReadyToRunCompilation::Uninitialized;
}
MethodContext::~MethodContext()
@@ -1119,6 +1120,8 @@ void MethodContext::recGetJitFlags(CORJIT_FLAGS* jitFlags, DWORD sizeInBytes, DW
// zero.
GetJitFlags->Add((DWORD)0, value);
DEBUG_REC(dmpGetJitFlags((DWORD)0, value));
+ InitReadyToRunFlag(jitFlags);
+
}
void MethodContext::dmpGetJitFlags(DWORD key, DD value)
{
@@ -1132,6 +1135,7 @@ DWORD MethodContext::repGetJitFlags(CORJIT_FLAGS* jitFlags, DWORD sizeInBytes)
CORJIT_FLAGS* resultFlags = (CORJIT_FLAGS*)GetJitFlags->GetBuffer(value.A);
memcpy(jitFlags, resultFlags, value.B);
DEBUG_REP(dmpGetJitFlags((DWORD)0, value));
+ InitReadyToRunFlag(resultFlags);
return value.B;
}
@@ -2453,7 +2457,7 @@ bool MethodContext::repConvertPInvokeCalliToCall(CORINFO_RESOLVED_TOKEN* pResolv
key.B = (DWORD)pResolvedToken->token;
DWORDLONG value = ConvertPInvokeCalliToCall->Get(key);
- DEBUG_REP(dmpGetArgType(key, value));
+ DEBUG_REP(dmpConvertPInvokeCalliToCall(key, value));
pResolvedToken->hMethod = (CORINFO_METHOD_HANDLE)value;
return value != 0;
@@ -3060,7 +3064,7 @@ void MethodContext::recResolveVirtualMethod(CORINFO_METHOD_HANDLE virtMethod,
key.implementingClass = (DWORDLONG)implClass;
key.ownerType = (DWORDLONG)ownerType;
ResolveVirtualMethod->Add(key, (DWORDLONG)result);
- DEBUG_REC(dmpResolveVirtualMethod(key, result));
+ DEBUG_REC(dmpResolveVirtualMethod(key, (DWORDLONG)result));
}
void MethodContext::dmpResolveVirtualMethod(const Agnostic_ResolveVirtualMethod& key, DWORDLONG value)
@@ -3368,8 +3372,13 @@ void MethodContext::recGetFieldAddress(CORINFO_FIELD_HANDLE field, void** ppIndi
value.fieldValue = (DWORD)-1;
- // Make an attempt at stashing a copy of the value
- if (result > (void*)0xffff) // TODO-Cleanup: sometimes there is a field offset?
+ AssertCodeMsg(isReadyToRunCompilation != ReadyToRunCompilation::Uninitialized, EXCEPTIONCODE_MC,
+ "ReadyToRun flag should be initialized");
+
+ // Make an attempt at stashing a copy of the value, Jit can try to access
+ // a static readonly field value.
+ if (isReadyToRunCompilation == ReadyToRunCompilation::NotReadyToRun &&
+ result > (void*)0xffff)
{
DWORDLONG scratch = 0x4242424242424242;
switch (cit)
@@ -3408,8 +3417,9 @@ void MethodContext::recGetFieldAddress(CORINFO_FIELD_HANDLE field, void** ppIndi
value.fieldValue =
(DWORD)GetFieldAddress->AddBuffer((unsigned char*)result, sizeof(size_t),
true); // important to not merge two fields into one address
- GetFieldAddress->AddBuffer((unsigned char*)&scratch, sizeof(DWORD)); // Padding out the data so we can
- // read it back "safetly" on x64
+ GetFieldAddress->AddBuffer((unsigned char*)&scratch, sizeof(DWORD)); // Padding out the data so we
+ // can read it back "safetly"
+ // on x64
break;
default:
break;
@@ -3429,8 +3439,13 @@ void* MethodContext::repGetFieldAddress(CORINFO_FIELD_HANDLE field, void** ppInd
value = GetFieldAddress->Get((DWORDLONG)field);
+ AssertCodeMsg(isReadyToRunCompilation != ReadyToRunCompilation::Uninitialized,
+ EXCEPTIONCODE_MC, "isReadyToRunCompilation should be initialized");
+
if (ppIndirection != nullptr)
+ {
*ppIndirection = (void*)value.ppIndirection;
+ }
void* temp;
if (value.fieldValue != (DWORD)-1)
@@ -3439,7 +3454,9 @@ void* MethodContext::repGetFieldAddress(CORINFO_FIELD_HANDLE field, void** ppInd
cr->recAddressMap((void*)value.fieldAddress, temp, toCorInfoSize(repGetFieldType(field, nullptr, nullptr)));
}
else
+ {
temp = (void*)value.fieldAddress;
+ }
DEBUG_REP(dmpGetFieldAddress((DWORDLONG)field, value));
return temp;
@@ -3458,7 +3475,7 @@ void MethodContext::recGetStaticFieldCurrentClass(CORINFO_FIELD_HANDLE field,
value.isSpeculative = isSpeculative;
GetStaticFieldCurrentClass->Add((DWORDLONG)field, value);
- DEBUG_REC(dmpGetFieldAddress((DWORDLONG)field, value));
+ DEBUG_REC(dmpGetStaticFieldCurrentClass((DWORDLONG)field, value));
}
void MethodContext::dmpGetStaticFieldCurrentClass(DWORDLONG key, const Agnostic_GetStaticFieldCurrentClass& value)
{
@@ -3475,7 +3492,7 @@ CORINFO_CLASS_HANDLE MethodContext::repGetStaticFieldCurrentClass(CORINFO_FIELD_
}
CORINFO_CLASS_HANDLE result = (CORINFO_CLASS_HANDLE)value.classHandle;
- DEBUG_REP(dmpGetStaticFieldCurrentValue((DWORDLONG)field, value));
+ DEBUG_REP(dmpGetStaticFieldCurrentClass((DWORDLONG)field, value));
return result;
}
@@ -5133,6 +5150,50 @@ DWORD MethodContext::repGetFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE field, v
return (DWORD)value.B;
}
+
+void MethodContext::recAllocMethodBlockCounts(ULONG count, ICorJitInfo::BlockCounts** pBlockCounts, HRESULT result)
+{
+ if (AllocMethodBlockCounts == nullptr)
+ AllocMethodBlockCounts = new LightWeightMap();
+
+ Agnostic_AllocMethodBlockCounts value;
+
+ value.address = (DWORDLONG)*pBlockCounts;
+ value.count = (DWORD)count;
+ value.result = (DWORD)result;
+
+ AllocMethodBlockCounts->Add((DWORD)0, value);
+}
+void MethodContext::dmpAllocMethodBlockCounts(DWORD key, const Agnostic_AllocMethodBlockCounts& value)
+{
+ printf("AllocMethodBlockCounts key %u, value addr-%016llX cnt-%u res-%08X", key, value.address, value.count, value.result);
+}
+HRESULT MethodContext::repAllocMethodBlockCounts(ULONG count, ICorJitInfo::BlockCounts** pBlockCounts)
+{
+ Agnostic_AllocMethodBlockCounts value;
+ value = AllocMethodBlockCounts->Get((DWORD)0);
+
+ if (count != value.count)
+ {
+ LogWarning("AllocMethodBlockCount mismatch: record %d, replay %d", value.count, count);
+ }
+
+ HRESULT result = (HRESULT)value.result;
+
+ // Allocate a scratch buffer, linked to method context via AllocMethodBlockCounts, so it gets
+ // cleaned up when the method context does.
+ //
+ // We won't bother recording this via AddBuffer because currently SPMI will never look at it.
+ // But we need a writeable buffer because the jit will store IL offsets inside.
+ //
+ // Todo, perhaps: record the buffer as a compile result instead, and defer copying until
+ // jit completion so we can snapshot the offsets the jit writes.
+ //
+ *pBlockCounts = (ICorJitInfo::BlockCounts*)AllocMethodBlockCounts->CreateBuffer(count * sizeof(ICorJitInfo::BlockCounts));
+ cr->recAddressMap((void*)value.address, (void*)*pBlockCounts, count * (sizeof(ICorJitInfo::BlockCounts)));
+ return result;
+}
+
void MethodContext::recGetMethodBlockCounts(CORINFO_METHOD_HANDLE ftnHnd,
UINT32 * pCount,
ICorJitInfo::BlockCounts** pBlockCounts,
@@ -5226,6 +5287,7 @@ void MethodContext::recIsMoreSpecificType(CORINFO_CLASS_HANDLE cls1, CORINFO_CLA
key.B = (DWORDLONG)cls2;
IsMoreSpecificType->Add(key, (DWORD)result);
+ DEBUG_REC(dmpIsMoreSpecificType(key, (DWORD)result));
}
void MethodContext::dmpIsMoreSpecificType(DLDL key, DWORD value)
{
@@ -5233,6 +5295,9 @@ void MethodContext::dmpIsMoreSpecificType(DLDL key, DWORD value)
}
BOOL MethodContext::repIsMoreSpecificType(CORINFO_CLASS_HANDLE cls1, CORINFO_CLASS_HANDLE cls2)
{
+ AssertCodeMsg(IsMoreSpecificType != nullptr, EXCEPTIONCODE_MC, "Didn't find %016llX %016llX", (DWORDLONG)cls1,
+ (DWORDLONG)cls2);
+
DLDL key;
ZeroMemory(&key, sizeof(DLDL)); // We use the input structs as a key and use memcmp to compare.. so we need to zero
// out padding too
@@ -5246,6 +5311,7 @@ BOOL MethodContext::repIsMoreSpecificType(CORINFO_CLASS_HANDLE cls1, CORINFO_CLA
value = IsMoreSpecificType->Get(key);
+ DEBUG_REP(dmpIsMoreSpecificType(key, value));
return (BOOL)value;
}
@@ -6442,3 +6508,16 @@ bool MethodContext::IsStringContentEqual(LightWeightMap* prev, Lig
return (prev == curr);
}
}
+
+void MethodContext::InitReadyToRunFlag(const CORJIT_FLAGS* jitFlags)
+{
+ if (jitFlags->IsSet(CORJIT_FLAGS::CORJIT_FLAG_READYTORUN))
+ {
+ isReadyToRunCompilation = ReadyToRunCompilation::ReadyToRun;
+ }
+ else
+ {
+ isReadyToRunCompilation = ReadyToRunCompilation::NotReadyToRun;
+ }
+
+}
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.h b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.h
index 36c0fbb478bb..2b0e6a9b55be 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.h
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontext.h
@@ -422,6 +422,12 @@ class MethodContext
DWORDLONG method;
DWORDLONG delegateCls;
};
+ struct Agnostic_AllocMethodBlockCounts
+ {
+ DWORDLONG address;
+ DWORD count;
+ DWORD result;
+ };
struct Agnostic_GetMethodBlockCounts
{
DWORD count;
@@ -1168,6 +1174,10 @@ class MethodContext
void dmpGetFieldThreadLocalStoreID(DWORDLONG key, DLD value);
DWORD repGetFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE field, void** ppIndirection);
+ void recAllocMethodBlockCounts(ULONG count, ICorJitInfo::BlockCounts** pBlockCounts, HRESULT result);
+ void dmpAllocMethodBlockCounts(DWORD key, const Agnostic_AllocMethodBlockCounts& value);
+ HRESULT repAllocMethodBlockCounts(ULONG count, ICorJitInfo::BlockCounts** pBlockCounts);
+
void recGetMethodBlockCounts(CORINFO_METHOD_HANDLE ftnHnd,
UINT32 * pCount,
ICorJitInfo::BlockCounts** pBlockCounts,
@@ -1319,6 +1329,17 @@ class MethodContext
bool IsEnvironmentHeaderEqual(const Environment& prevEnv);
bool IsEnvironmentContentEqual(const Environment& prevEnv);
+ enum class ReadyToRunCompilation
+ {
+ Uninitialized,
+ ReadyToRun,
+ NotReadyToRun
+ };
+
+ ReadyToRunCompilation isReadyToRunCompilation;
+
+ void InitReadyToRunFlag(const CORJIT_FLAGS* jitFlags);
+
template
static bool AreLWMHeadersEqual(LightWeightMap* prev, LightWeightMap* curr);
static bool IsIntConfigContentEqual(LightWeightMap* prev,
@@ -1338,6 +1359,7 @@ class MethodContext
// *************************************************************************************
enum mcPackets
{
+ Packet_AllocMethodBlockCounts = 131,
Packet_AppendClassName = 149, // Added 8/6/2014 - needed for SIMD
Packet_AreTypesEquivalent = 1,
Packet_AsCorInfoType = 2,
@@ -1493,7 +1515,6 @@ enum mcPackets
Packet_ShouldEnforceCallvirtRestriction = 112, // Retired 2/18/2020
PacketCR_AddressMap = 113,
- PacketCR_AllocMethodBlockCounts = 131,
PacketCR_AllocGCInfo = 114,
PacketCR_AllocMem = 115,
PacketCR_AllocUnwindInfo = 132,
@@ -1515,7 +1536,9 @@ enum mcPackets
PacketCR_SetMethodAttribs = 129,
PacketCR_SetVars = 130,
PacketCR_SetPatchpointInfo = 176, // added 8/5/2019
- PacketCR_RecordCallSite = 146, // Added 10/28/2013 - to support indirect calls
+ PacketCR_RecordCallSite = 146, // Retired 9/13/2020
+ PacketCR_RecordCallSiteWithSignature = 179, // Added 9/13/2020
+ PacketCR_RecordCallSiteWithoutSignature = 180, // Added 9/13/2020
};
#endif
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontextreader.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontextreader.cpp
index 84fdd6ca2021..06a5826c1469 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontextreader.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/methodcontextreader.cpp
@@ -81,7 +81,7 @@ MethodContextReader::MethodContextReader(
, Offset(offset)
, Increment(increment)
{
- this->mutex = CreateMutexA(NULL, FALSE, nullptr);
+ this->mutex = CreateMutexW(NULL, FALSE, nullptr);
std::string tocFileName, mchFileName;
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/registertablexarch.h b/src/coreclr/src/ToolBox/superpmi/superpmi-shared/registertablexarch.h
deleted file mode 100644
index f6c177cd04cb..000000000000
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shared/registertablexarch.h
+++ /dev/null
@@ -1,124 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-//----------------------------------------------------------
-// RegisterTableXarch.h - X macro table for x86/AMD64 registers, for use with DISX86
-//----------------------------------------------------------
-
-#ifndef REGDEF
-#error Must define REGDEF macro before including this file
-#endif
-
-/*
-REGDEF(msdisID, name)
-*/
-
-// 32 bit general purpose registers
-REGDEF(DISX86::REGA::regaEax, "eax")
-REGDEF(DISX86::REGA::regaEcx, "ecx")
-REGDEF(DISX86::REGA::regaEdx, "edx")
-REGDEF(DISX86::REGA::regaEbx, "ebx")
-REGDEF(DISX86::REGA::regaEsp, "esp")
-REGDEF(DISX86::REGA::regaEbp, "ebp")
-REGDEF(DISX86::REGA::regaEsi, "esi")
-REGDEF(DISX86::REGA::regaEdi, "edi")
-REGDEF(DISX86::REGA::regaR8d, "r8d")
-REGDEF(DISX86::REGA::regaR9d, "r9d")
-REGDEF(DISX86::REGA::regaR10d, "r10d")
-REGDEF(DISX86::REGA::regaR11d, "r11d")
-REGDEF(DISX86::REGA::regaR12d, "r12d")
-REGDEF(DISX86::REGA::regaR13d, "r13d")
-REGDEF(DISX86::REGA::regaR14d, "r14d")
-REGDEF(DISX86::REGA::regaR15d, "r15d")
-
-// 64 bit general purpose registers
-REGDEF(DISX86::REGA::regaRax, "rax")
-REGDEF(DISX86::REGA::regaRcx, "rcx")
-REGDEF(DISX86::REGA::regaRdx, "rdx")
-REGDEF(DISX86::REGA::regaRbx, "rbx")
-REGDEF(DISX86::REGA::regaRsp, "rsp")
-REGDEF(DISX86::REGA::regaRbp, "rbp")
-REGDEF(DISX86::REGA::regaRsi, "rsi")
-REGDEF(DISX86::REGA::regaRdi, "rdi")
-REGDEF(DISX86::REGA::regaR8, "r8")
-REGDEF(DISX86::REGA::regaR9, "r9")
-REGDEF(DISX86::REGA::regaR10, "r10")
-REGDEF(DISX86::REGA::regaR11, "r11")
-REGDEF(DISX86::REGA::regaR12, "r12")
-REGDEF(DISX86::REGA::regaR13, "r13")
-REGDEF(DISX86::REGA::regaR14, "r14")
-REGDEF(DISX86::REGA::regaR15, "r15")
-
-// 16 bit general purpose registers
-REGDEF(DISX86::REGA::regaAx, "ax")
-REGDEF(DISX86::REGA::regaCx, "cx")
-REGDEF(DISX86::REGA::regaDx, "dx")
-REGDEF(DISX86::REGA::regaBx, "bx")
-REGDEF(DISX86::REGA::regaSp, "sp")
-REGDEF(DISX86::REGA::regaBp, "bp")
-REGDEF(DISX86::REGA::regaSi, "si")
-REGDEF(DISX86::REGA::regaDi, "di")
-REGDEF(DISX86::REGA::regaR8w, "r8w")
-REGDEF(DISX86::REGA::regaR9w, "r9w")
-REGDEF(DISX86::REGA::regaR10w, "r10w")
-REGDEF(DISX86::REGA::regaR11w, "r11w")
-REGDEF(DISX86::REGA::regaR12w, "r12w")
-REGDEF(DISX86::REGA::regaR13w, "r13w")
-REGDEF(DISX86::REGA::regaR14w, "r14w")
-REGDEF(DISX86::REGA::regaR15w, "r15w")
-
-// 8 bit general purpose registers
-REGDEF(DISX86::REGA::regaAl, "al")
-REGDEF(DISX86::REGA::regaCl, "cl")
-REGDEF(DISX86::REGA::regaDl, "dl")
-REGDEF(DISX86::REGA::regaBl, "bl")
-REGDEF(DISX86::REGA::regaSpl, "spl")
-REGDEF(DISX86::REGA::regaBpl, "bpl")
-REGDEF(DISX86::REGA::regaSil, "sil")
-REGDEF(DISX86::REGA::regaDil, "dil")
-REGDEF(DISX86::REGA::regaR8b, "r8b")
-REGDEF(DISX86::REGA::regaR9b, "r9b")
-REGDEF(DISX86::REGA::regaR10b, "r10b")
-REGDEF(DISX86::REGA::regaR11b, "r11b")
-REGDEF(DISX86::REGA::regaR12b, "r12b")
-REGDEF(DISX86::REGA::regaR13b, "r13b")
-REGDEF(DISX86::REGA::regaR14b, "r14b")
-REGDEF(DISX86::REGA::regaR15b, "r15b")
-
-// 8 bit general purpose registers
-REGDEF(DISX86::REGA::regaAh, "ah")
-REGDEF(DISX86::REGA::regaCh, "ch")
-REGDEF(DISX86::REGA::regaDh, "dh")
-REGDEF(DISX86::REGA::regaBh, "bh")
-
-// x87 floating point stack
-REGDEF(DISX86::REGA::regaSt0, "st0")
-REGDEF(DISX86::REGA::regaSt1, "st1")
-REGDEF(DISX86::REGA::regaSt2, "st2")
-REGDEF(DISX86::REGA::regaSt3, "st3")
-REGDEF(DISX86::REGA::regaSt4, "st4")
-REGDEF(DISX86::REGA::regaSt5, "st5")
-REGDEF(DISX86::REGA::regaSt6, "st6")
-REGDEF(DISX86::REGA::regaSt7, "st7")
-
-// XMM registers
-REGDEF(DISX86::REGA::regaXmm0, "xmm0")
-REGDEF(DISX86::REGA::regaXmm1, "xmm1")
-REGDEF(DISX86::REGA::regaXmm2, "xmm2")
-REGDEF(DISX86::REGA::regaXmm3, "xmm3")
-REGDEF(DISX86::REGA::regaXmm4, "xmm4")
-REGDEF(DISX86::REGA::regaXmm5, "xmm5")
-REGDEF(DISX86::REGA::regaXmm6, "xmm6")
-REGDEF(DISX86::REGA::regaXmm7, "xmm7")
-REGDEF(DISX86::REGA::regaXmm8, "xmm8")
-REGDEF(DISX86::REGA::regaXmm9, "xmm9")
-REGDEF(DISX86::REGA::regaXmm10, "xmm10")
-REGDEF(DISX86::REGA::regaXmm11, "xmm11")
-REGDEF(DISX86::REGA::regaXmm12, "xmm12")
-REGDEF(DISX86::REGA::regaXmm13, "xmm13")
-REGDEF(DISX86::REGA::regaXmm14, "xmm14")
-REGDEF(DISX86::REGA::regaXmm15, "xmm15")
-
-#undef REGDEF
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/CMakeLists.txt b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/CMakeLists.txt
index 5c7310f4e91e..b1b5c5696732 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/CMakeLists.txt
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/CMakeLists.txt
@@ -8,7 +8,7 @@ add_definitions(-DSELF_NO_HOST)
if(CLR_CMAKE_HOST_WIN32)
#use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
endif(CLR_CMAKE_HOST_WIN32)
include_directories(.)
@@ -44,7 +44,7 @@ _add_library(superpmi-shim-collector
${SUPERPMI_SHIM_COLLECTOR_SOURCES}
)
-target_precompile_header(TARGET superpmi-shim-collector HEADER standardpch.h)
+target_precompile_headers(superpmi-shim-collector PRIVATE "$<$:standardpch.h>")
if(CLR_CMAKE_HOST_UNIX)
target_link_libraries(superpmi-shim-collector
@@ -60,7 +60,7 @@ else()
${STATIC_MT_CPP_LIB}
)
- _install (FILES ${CMAKE_CURRENT_BINARY_DIR}/$/superpmi-shim-collector.pdb DESTINATION PDB)
+ _install (FILES $ DESTINATION PDB)
endif(CLR_CMAKE_HOST_UNIX)
_install (TARGETS superpmi-shim-collector DESTINATION .)
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitcompiler.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitcompiler.cpp
index e55e7093e52c..10bcb3c0a998 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitcompiler.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitcompiler.cpp
@@ -41,7 +41,6 @@ CorJitResult __stdcall interceptor_ICJC::compileMethod(ICorJitInfo*
our_ICorJitInfo.getBuiltinClass(CLASSID_FIELD_HANDLE);
our_ICorJitInfo.getBuiltinClass(CLASSID_METHOD_HANDLE);
our_ICorJitInfo.getBuiltinClass(CLASSID_STRING);
- our_ICorJitInfo.getBuiltinClass(CLASSID_ARGUMENT_HANDLE);
our_ICorJitInfo.getBuiltinClass(CLASSID_RUNTIME_TYPE);
#ifdef fatMC
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp
index f5b69299113e..bb1bba81f01d 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-collector/icorjitinfo.cpp
@@ -2030,7 +2030,7 @@ HRESULT interceptor_ICJI::allocMethodBlockCounts(UINT32 count, // The n
{
mc->cr->AddCall("allocMethodBlockCounts");
HRESULT result = original_ICorJitInfo->allocMethodBlockCounts(count, pBlockCounts);
- mc->cr->recAllocMethodBlockCounts(count, pBlockCounts, result);
+ mc->recAllocMethodBlockCounts(count, pBlockCounts, result);
return result;
}
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/CMakeLists.txt b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/CMakeLists.txt
index d3d9a5278677..0e65456fc5c2 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/CMakeLists.txt
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-counter/CMakeLists.txt
@@ -8,7 +8,7 @@ add_definitions(-DSELF_NO_HOST)
if(CLR_CMAKE_HOST_WIN32)
#use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
endif(CLR_CMAKE_HOST_WIN32)
include_directories(.)
@@ -46,7 +46,7 @@ _add_library(superpmi-shim-counter
${SUPERPMI_SHIM_COUNTER_SOURCES}
)
-target_precompile_header(TARGET superpmi-shim-counter HEADER standardpch.h)
+target_precompile_headers(superpmi-shim-counter PRIVATE "$<$:standardpch.h>")
if(CLR_CMAKE_HOST_UNIX)
target_link_libraries(superpmi-shim-counter
@@ -62,7 +62,7 @@ else()
${STATIC_MT_CPP_LIB}
)
- _install (FILES ${CMAKE_CURRENT_BINARY_DIR}/$/superpmi-shim-counter.pdb DESTINATION PDB)
+ _install (FILES $ DESTINATION PDB)
endif(CLR_CMAKE_HOST_UNIX)
_install (TARGETS superpmi-shim-counter DESTINATION .)
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/CMakeLists.txt b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/CMakeLists.txt
index cb4caded38d0..72fdf073a6d3 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/CMakeLists.txt
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi-shim-simple/CMakeLists.txt
@@ -8,7 +8,7 @@ add_definitions(-DSELF_NO_HOST)
if(CLR_CMAKE_HOST_WIN32)
#use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
endif(CLR_CMAKE_HOST_WIN32)
include_directories(.)
@@ -45,7 +45,7 @@ _add_library(superpmi-shim-simple
${SUPERPMI_SHIM_SIMPLE_SOURCES}
)
-target_precompile_header(TARGET superpmi-shim-simple HEADER standardpch.h)
+target_precompile_headers(superpmi-shim-simple PRIVATE "$<$:standardpch.h>")
if(CLR_CMAKE_HOST_UNIX)
target_link_libraries(superpmi-shim-simple
@@ -61,7 +61,7 @@ else()
${STATIC_MT_CPP_LIB}
)
- _install (FILES ${CMAKE_CURRENT_BINARY_DIR}/$/superpmi-shim-simple.pdb DESTINATION PDB)
+ _install (FILES $ DESTINATION PDB)
endif(CLR_CMAKE_HOST_UNIX)
_install (TARGETS superpmi-shim-simple DESTINATION .)
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi/CMakeLists.txt b/src/coreclr/src/ToolBox/superpmi/superpmi/CMakeLists.txt
index adc3cde6a178..3bc6ca865572 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi/CMakeLists.txt
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi/CMakeLists.txt
@@ -9,7 +9,7 @@ add_definitions(-DUSE_COREDISTOOLS)
if(CLR_CMAKE_HOST_WIN32)
#use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
endif(CLR_CMAKE_HOST_WIN32)
include_directories(.)
@@ -45,7 +45,7 @@ _add_executable(superpmi
${SUPERPMI_SOURCES}
)
-target_precompile_header(TARGET superpmi HEADER standardpch.h)
+target_precompile_headers(superpmi PRIVATE "$<$:standardpch.h>")
if(CLR_CMAKE_HOST_UNIX)
target_link_libraries(superpmi
@@ -62,7 +62,7 @@ else()
${STATIC_MT_CPP_LIB}
)
- _install (FILES ${CMAKE_CURRENT_BINARY_DIR}/$/superpmi.pdb DESTINATION PDB)
+ _install (FILES $ DESTINATION PDB)
endif(CLR_CMAKE_HOST_UNIX)
_install (TARGETS superpmi DESTINATION .)
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi/filecache.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi/filecache.cpp
deleted file mode 100644
index 0455fa9fe7a6..000000000000
--- a/src/coreclr/src/ToolBox/superpmi/superpmi/filecache.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-// TODO-Cleanup: this class is unused
-
-#include "standardpch.h"
-#include "filecache.h"
-
-#define FileCacheSize 0xFFFFFF // needs to be bigger than the biggest read request.
-
-HANDLE FileCache::cachedHandle;
-bool FileCache::openAsCache;
-BYTE* FileCache::rawBuff;
-unsigned int FileCache::offset;
-unsigned int FileCache::length;
-__int64 FileCache::fileoffset;
-
-HANDLE
-FileCache::CreateFileA(_In_ LPCSTR lpFileName,
- _In_ DWORD dwDesiredAccess,
- _In_ DWORD dwShareMode,
- _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- _In_ DWORD dwCreationDisposition,
- _In_ DWORD dwFlagsAndAttributes,
- _In_opt_ HANDLE hTemplateFile)
-{
- openAsCache = false;
- rawBuff = nullptr;
- offset = 0;
- length = 0;
-
- if ((dwShareMode & CACHE_THIS_FILE) == CACHE_THIS_FILE)
- {
- dwShareMode ^= CACHE_THIS_FILE;
- openAsCache = true;
- }
- HANDLE temp = ::CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition,
- dwFlagsAndAttributes, hTemplateFile);
- if (openAsCache)
- cachedHandle = temp; // yes yes.. this is unsafe.. but one accessor now is okay. bswhack
- return temp;
-}
-
-HANDLE
-FileCache::CreateFileW(_In_ LPCWSTR lpFileName,
- _In_ DWORD dwDesiredAccess,
- _In_ DWORD dwShareMode,
- _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- _In_ DWORD dwCreationDisposition,
- _In_ DWORD dwFlagsAndAttributes,
- _In_opt_ HANDLE hTemplateFile)
-{
- openAsCache = false;
- rawBuff = nullptr;
- offset = 0;
- length = 0;
- return ::CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition,
- dwFlagsAndAttributes, hTemplateFile);
-}
-
-// Somewhat sloppy quick copy... we don't treat lpNumberOfBytesRead etc correctly
-BOOL FileCache::ReadFile(_In_ HANDLE hFile,
- _Out_writes_bytes_to_opt_(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE)
- LPVOID lpBuffer,
- _In_ DWORD nNumberOfBytesToRead,
- _Out_opt_ LPDWORD lpNumberOfBytesRead,
- _Inout_opt_ LPOVERLAPPED lpOverlapped)
-{
- if (!openAsCache)
- return ::ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
- else
- {
- if (rawBuff == nullptr)
- {
- rawBuff = new BYTE[FileCacheSize];
- length = FileCacheSize;
- offset = FileCacheSize;
- }
- if (nNumberOfBytesToRead > FileCacheSize)
- {
- printf("ERROR: nNumberOfBytesToRead exceeds FileCacheSize %u > %u\n", nNumberOfBytesToRead, FileCacheSize);
- __debugbreak();
- }
- if ((offset + nNumberOfBytesToRead) > length)
- {
- memmove(rawBuff, &rawBuff[offset],
- length - offset); // Use memmove since we have overlapping regions more than half the time
- ::ReadFile(hFile, &rawBuff[length - offset], offset, lpNumberOfBytesRead, lpOverlapped);
- if (*lpNumberOfBytesRead == 0)
- __debugbreak();
- length -= offset - (*lpNumberOfBytesRead);
- LARGE_INTEGER DataTemp;
- LARGE_INTEGER zero;
- zero.QuadPart = 0;
- ::SetFilePointerEx(hFile, zero, &DataTemp, FILE_CURRENT);
- fileoffset = DataTemp.QuadPart;
-
- offset = 0;
- }
- memcpy(lpBuffer, &rawBuff[offset], nNumberOfBytesToRead);
- offset += nNumberOfBytesToRead;
- if (offset > FileCacheSize)
- __debugbreak();
- return true;
- }
-}
-
-BOOL FileCache::WriteFile(_In_ HANDLE hFile,
- _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer,
- _In_ DWORD nNumberOfBytesToWrite,
- _Out_opt_ LPDWORD lpNumberOfBytesWritten,
- _Inout_opt_ LPOVERLAPPED lpOverlapped)
-{
- if (!openAsCache)
- return ::WriteFile(hFile, lpBuffer, nNumberOfBytesToWrite, lpNumberOfBytesWritten, lpOverlapped);
- else
- {
- printf("ERROR: We only support one file open via the cache.\n");
- __debugbreak();
- return false;
- }
-}
-
-BOOL FileCache::CloseHandle(_In_ HANDLE hObject)
-{
- if (!openAsCache)
- return ::CloseHandle(hObject);
- else
- {
- if (rawBuff != nullptr)
- delete[] rawBuff;
- return ::CloseHandle(hObject);
- }
-}
-__int64 FileCache::GetFilePos(HANDLE hFile)
-{
- return (fileoffset - (__int64)length) + (__int64)offset;
-}
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi/filecache.h b/src/coreclr/src/ToolBox/superpmi/superpmi/filecache.h
deleted file mode 100644
index 876100ec6e49..000000000000
--- a/src/coreclr/src/ToolBox/superpmi/superpmi/filecache.h
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// Copyright (c) Microsoft. All rights reserved.
-// Licensed under the MIT license. See LICENSE file in the project root for full license information.
-//
-
-// TODO-Cleanup: this class is unused
-
-//----------------------------------------------------------
-// FileCache.h - very simple read ahead/ReadFile abstraction
-//----------------------------------------------------------
-#ifndef _FileCache
-#define _FileCache
-
-#define WIN32_LEAN_AND_MEAN
-#include
-
-#define CACHE_THIS_FILE 0xFF
-
-class FileCache
-{
-public:
- static HANDLE CreateFileA(_In_ LPCSTR lpFileName,
- _In_ DWORD dwDesiredAccess,
- _In_ DWORD dwShareMode,
- _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- _In_ DWORD dwCreationDisposition,
- _In_ DWORD dwFlagsAndAttributes,
- _In_opt_ HANDLE hTemplateFile);
-
- static HANDLE CreateFileW(_In_ LPCWSTR lpFileName,
- _In_ DWORD dwDesiredAccess,
- _In_ DWORD dwShareMode,
- _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- _In_ DWORD dwCreationDisposition,
- _In_ DWORD dwFlagsAndAttributes,
- _In_opt_ HANDLE hTemplateFile);
-
- static BOOL ReadFile(_In_ HANDLE hFile,
- _Out_writes_bytes_to_opt_(nNumberOfBytesToRead, *lpNumberOfBytesRead) __out_data_source(FILE)
- LPVOID lpBuffer,
- _In_ DWORD nNumberOfBytesToRead,
- _Out_opt_ LPDWORD lpNumberOfBytesRead,
- _Inout_opt_ LPOVERLAPPED lpOverlapped);
-
- static BOOL WriteFile(_In_ HANDLE hFile,
- _In_reads_bytes_opt_(nNumberOfBytesToWrite) LPCVOID lpBuffer,
- _In_ DWORD nNumberOfBytesToWrite,
- _Out_opt_ LPDWORD lpNumberOfBytesWritten,
- _Inout_opt_ LPOVERLAPPED lpOverlapped);
-
- static BOOL CloseHandle(_In_ HANDLE hObject);
-
- static __int64 GetFilePos(HANDLE hFile);
-
-private:
- static HANDLE cachedHandle;
- static bool openAsCache;
- static BYTE* rawBuff;
- static unsigned int offset;
- static unsigned int length;
- static __int64 fileoffset;
-};
-#endif
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp
index f0e2114d992c..6b8f4540a522 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi/icorjitinfo.cpp
@@ -1784,7 +1784,7 @@ HRESULT MyICJI::allocMethodBlockCounts(UINT32 count, // The number of b
BlockCounts** pBlockCounts)
{
jitInstance->mc->cr->AddCall("allocMethodBlockCounts");
- return jitInstance->mc->cr->repAllocMethodBlockCounts(count, pBlockCounts);
+ return jitInstance->mc->repAllocMethodBlockCounts(count, pBlockCounts);
}
// get profile information to be used for optimizing the current method. The format
diff --git a/src/coreclr/src/ToolBox/superpmi/superpmi/parallelsuperpmi.cpp b/src/coreclr/src/ToolBox/superpmi/superpmi/parallelsuperpmi.cpp
index 88dd861ee48e..d3ed43bf90e1 100644
--- a/src/coreclr/src/ToolBox/superpmi/superpmi/parallelsuperpmi.cpp
+++ b/src/coreclr/src/ToolBox/superpmi/superpmi/parallelsuperpmi.cpp
@@ -31,9 +31,18 @@ bool StartProcess(char* commandLine, HANDLE hStdOutput, HANDLE hStdError, HANDLE
ZeroMemory(&pi, sizeof(pi));
+#if TARGET_UNIX
+ const unsigned cmdLen = (unsigned)strlen(commandLine) + 1;
+ WCHAR* cmdLineW = new WCHAR[cmdLen];
+ MultiByteToWideChar(CP_UTF8, 0, commandLine, cmdLen, cmdLineW, cmdLen);
+#endif
// Start the child process.
if (!CreateProcess(NULL, // No module name (use command line)
+#if TARGET_UNIX
+ cmdLineW, // Command line
+#else
commandLine, // Command line
+#endif
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
TRUE, // Set handle inheritance to TRUE (required to use STARTF_USESTDHANDLES)
@@ -45,10 +54,17 @@ bool StartProcess(char* commandLine, HANDLE hStdOutput, HANDLE hStdError, HANDLE
{
LogError("CreateProcess failed (%d). CommandLine: %s", GetLastError(), commandLine);
*hProcess = INVALID_HANDLE_VALUE;
+#if TARGET_UNIX
+ delete[] cmdLineW;
+#endif
return false;
}
*hProcess = pi.hProcess;
+
+#if TARGET_UNIX
+ delete[] cmdLineW;
+#endif
return true;
}
@@ -382,7 +398,6 @@ char* ConstructChildProcessArgs(const CommandLine::Options& o)
ADDARG_STRING(o.reproName, "-reproName");
ADDARG_STRING(o.writeLogFile, "-writeLogFile");
ADDARG_STRING(o.methodStatsTypes, "-emitMethodStats");
- ADDARG_STRING(o.reproName, "-reproName");
ADDARG_STRING(o.hash, "-matchHash");
ADDARG_STRING(o.targetArchitecture, "-target");
ADDARG_STRING(o.compileList, "-compile");
diff --git a/src/coreclr/src/binder/CMakeLists.txt b/src/coreclr/src/binder/CMakeLists.txt
index 9c242ed1518d..208f1214dd0d 100644
--- a/src/coreclr/src/binder/CMakeLists.txt
+++ b/src/coreclr/src/binder/CMakeLists.txt
@@ -82,11 +82,13 @@ endif(CLR_CMAKE_TARGET_WIN32)
convert_to_absolute_path(BINDER_SOURCES ${BINDER_SOURCES})
convert_to_absolute_path(BINDER_CROSSGEN_SOURCES ${BINDER_CROSSGEN_SOURCES})
-add_library_clr(v3binder
+add_library_clr(v3binder_obj
OBJECT
${BINDER_SOURCES}
)
-add_dependencies(v3binder eventing_headers)
+add_dependencies(v3binder_obj eventing_headers)
+add_library(v3binder INTERFACE)
+target_sources(v3binder INTERFACE $)
add_library_clr(v3binder_crossgen
STATIC
diff --git a/src/coreclr/src/binder/applicationcontext.cpp b/src/coreclr/src/binder/applicationcontext.cpp
index d19029548541..f865b4240490 100644
--- a/src/coreclr/src/binder/applicationcontext.cpp
+++ b/src/coreclr/src/binder/applicationcontext.cpp
@@ -127,74 +127,6 @@ namespace BINDER_SPACE
return hr;
}
- HRESULT GetNextPath(SString& paths, SString::Iterator& startPos, SString& outPath)
- {
- HRESULT hr = S_OK;
-
- bool wrappedWithQuotes = false;
-
- // Skip any leading spaces or path separators
- while (paths.Skip(startPos, W(' ')) || paths.Skip(startPos, PATH_SEPARATOR_CHAR_W)) {}
-
- if (startPos == paths.End())
- {
- // No more paths in the string and we just skipped over some white space
- outPath.Set(W(""));
- return S_FALSE;
- }
-
- // Support paths being wrapped with quotations
- if (paths.Skip(startPos, W('\"')))
- {
- wrappedWithQuotes = true;
- }
-
- SString::Iterator iEnd = startPos; // Where current path ends
- SString::Iterator iNext; // Where next path starts
- if (wrappedWithQuotes)
- {
- if (paths.Find(iEnd, W('\"')))
- {
- iNext = iEnd;
- // Find where the next path starts - there should be a path separator right after the closing quotation mark
- if (paths.Find(iNext, PATH_SEPARATOR_CHAR_W))
- {
- iNext++;
- }
- else
- {
- iNext = paths.End();
- }
- }
- else
- {
- // There was no terminating quotation mark - that's bad
- GO_WITH_HRESULT(E_INVALIDARG);
- }
- }
- else if (paths.Find(iEnd, PATH_SEPARATOR_CHAR_W))
- {
- iNext = iEnd + 1;
- }
- else
- {
- iNext = iEnd = paths.End();
- }
-
- // Skip any trailing spaces
- while (iEnd[-1] == W(' '))
- {
- iEnd--;
- }
-
- _ASSERTE(startPos < iEnd);
-
- outPath.Set(paths, startPos, iEnd);
- startPos = iNext;
- Exit:
- return hr;
- }
-
HRESULT ApplicationContext::SetupBindingPaths(SString &sTrustedPlatformAssemblies,
SString &sPlatformResourceRoots,
SString &sAppPaths,
@@ -221,64 +153,15 @@ namespace BINDER_SPACE
for (SString::Iterator i = sTrustedPlatformAssemblies.Begin(); i != sTrustedPlatformAssemblies.End(); )
{
SString fileName;
+ SString simpleName;
+ bool isNativeImage = false;
HRESULT pathResult = S_OK;
- IF_FAIL_GO(pathResult = GetNextPath(sTrustedPlatformAssemblies, i, fileName));
+ IF_FAIL_GO(pathResult = GetNextTPAPath(sTrustedPlatformAssemblies, i, /*dllOnly*/ false, fileName, simpleName, isNativeImage));
if (pathResult == S_FALSE)
{
break;
}
-#ifndef CROSSGEN_COMPILE
- if (Path::IsRelative(fileName))
- {
- GO_WITH_HRESULT(E_INVALIDARG);
- }
-#endif
-
- // Find the beginning of the simple name
- SString::Iterator iSimpleNameStart = fileName.End();
-
- if (!fileName.FindBack(iSimpleNameStart, DIRECTORY_SEPARATOR_CHAR_W))
- {
- iSimpleNameStart = fileName.Begin();
- }
- else
- {
- // Advance past the directory separator to the first character of the file name
- iSimpleNameStart++;
- }
-
- if (iSimpleNameStart == fileName.End())
- {
- GO_WITH_HRESULT(E_INVALIDARG);
- }
-
- SString simpleName;
- bool isNativeImage = false;
-
- // GCC complains if we create SStrings inline as part of a function call
- SString sNiDll(W(".ni.dll"));
- SString sNiExe(W(".ni.exe"));
- SString sDll(W(".dll"));
- SString sExe(W(".exe"));
-
- if (fileName.EndsWithCaseInsensitive(sNiDll) ||
- fileName.EndsWithCaseInsensitive(sNiExe))
- {
- simpleName.Set(fileName, iSimpleNameStart, fileName.End() - 7);
- isNativeImage = true;
- }
- else if (fileName.EndsWithCaseInsensitive(sDll) ||
- fileName.EndsWithCaseInsensitive(sExe))
- {
- simpleName.Set(fileName, iSimpleNameStart, fileName.End() - 4);
- }
- else
- {
- // Invalid filename
- GO_WITH_HRESULT(E_INVALIDARG);
- }
-
const SimpleNameToFileNameMapEntry *pExistingEntry = m_pTrustedPlatformAssemblyMap->LookupPtr(simpleName.GetUnicode());
if (pExistingEntry != nullptr)
diff --git a/src/coreclr/src/binder/assemblybinder.cpp b/src/coreclr/src/binder/assemblybinder.cpp
index 5f13adc7b2c8..aa29465af824 100644
--- a/src/coreclr/src/binder/assemblybinder.cpp
+++ b/src/coreclr/src/binder/assemblybinder.cpp
@@ -22,6 +22,7 @@
#include "utils.hpp"
#include "variables.hpp"
#include "stringarraylist.h"
+#include "configuration.h"
#define APP_DOMAIN_LOCKED_UNLOCKED 0x02
#define APP_DOMAIN_LOCKED_CONTEXT 0x04
@@ -401,14 +402,59 @@ namespace BINDER_SPACE
sCoreLib.Set(systemDirectory);
CombinePath(sCoreLib, sCoreLibName, sCoreLib);
- IF_FAIL_GO(AssemblyBinder::GetAssembly(sCoreLib,
- TRUE /* fIsInGAC */,
- fBindToNativeImage,
- &pSystemAssembly,
- NULL /* szMDAssemblyPath */,
- bundleFileLocation));
+ hr = AssemblyBinder::GetAssembly(sCoreLib,
+ TRUE /* fIsInGAC */,
+ fBindToNativeImage,
+ &pSystemAssembly,
+ NULL /* szMDAssemblyPath */,
+ bundleFileLocation);
BinderTracing::PathProbed(sCoreLib, pathSource, hr);
+ if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))
+ {
+ // Try to find corelib in the TPA
+ StackSString sCoreLibSimpleName(CoreLibName_W);
+ StackSString sTrustedPlatformAssemblies = Configuration::GetKnobStringValue(W("TRUSTED_PLATFORM_ASSEMBLIES"));
+ sTrustedPlatformAssemblies.Normalize();
+
+ bool found = false;
+ for (SString::Iterator i = sTrustedPlatformAssemblies.Begin(); i != sTrustedPlatformAssemblies.End(); )
+ {
+ SString fileName;
+ SString simpleName;
+ bool isNativeImage = false;
+ HRESULT pathResult = S_OK;
+ IF_FAIL_GO(pathResult = GetNextTPAPath(sTrustedPlatformAssemblies, i, /*dllOnly*/ true, fileName, simpleName, isNativeImage));
+ if (pathResult == S_FALSE)
+ {
+ break;
+ }
+
+ if (simpleName.EqualsCaseInsensitive(sCoreLibSimpleName))
+ {
+ sCoreLib = fileName;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ GO_WITH_HRESULT(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));
+ }
+
+ hr = AssemblyBinder::GetAssembly(sCoreLib,
+ TRUE /* fIsInGAC */,
+ fBindToNativeImage,
+ &pSystemAssembly,
+ NULL /* szMDAssemblyPath */,
+ bundleFileLocation);
+
+ BinderTracing::PathProbed(sCoreLib, BinderTracing::PathSource::ApplicationAssemblies, hr);
+ }
+
+ IF_FAIL_GO(hr);
+
*ppSystemAssembly = pSystemAssembly.Extract();
Exit:
@@ -447,25 +493,25 @@ namespace BINDER_SPACE
// Satellite assembly's path:
// * Absolute path when looking for a file on disk
// * Bundle-relative path when looking within the single-file bundle.
- StackSString sMscorlibSatellite;
+ StackSString sCoreLibSatellite;
BinderTracing::PathSource pathSource = BinderTracing::PathSource::Bundle;
BundleFileLocation bundleFileLocation = Bundle::ProbeAppBundle(relativePath, /*pathIsBundleRelative */ true);
if (!bundleFileLocation.IsValid())
{
- sMscorlibSatellite.Set(systemDirectory);
+ sCoreLibSatellite.Set(systemDirectory);
pathSource = BinderTracing::PathSource::ApplicationAssemblies;
}
- CombinePath(sMscorlibSatellite, relativePath, sMscorlibSatellite);
+ CombinePath(sCoreLibSatellite, relativePath, sCoreLibSatellite);
ReleaseHolder pSystemAssembly;
- IF_FAIL_GO(AssemblyBinder::GetAssembly(sMscorlibSatellite,
+ IF_FAIL_GO(AssemblyBinder::GetAssembly(sCoreLibSatellite,
TRUE /* fIsInGAC */,
FALSE /* fExplicitBindToNativeImage */,
&pSystemAssembly,
NULL /* szMDAssemblyPath */,
bundleFileLocation));
- BinderTracing::PathProbed(sMscorlibSatellite, pathSource, hr);
+ BinderTracing::PathProbed(sCoreLibSatellite, pathSource, hr);
*ppSystemAssembly = pSystemAssembly.Extract();
diff --git a/src/coreclr/src/binder/assemblyname.cpp b/src/coreclr/src/binder/assemblyname.cpp
index b073dc66f88b..71e70283c0b3 100644
--- a/src/coreclr/src/binder/assemblyname.cpp
+++ b/src/coreclr/src/binder/assemblyname.cpp
@@ -315,10 +315,10 @@ namespace BINDER_SPACE
return ulRef;
}
- BOOL AssemblyName::IsMscorlib()
+ BOOL AssemblyName::IsCoreLib()
{
// TODO: Is this simple comparison enough?
- return EqualsCaseInsensitive(GetSimpleName(), g_BinderVariables->mscorlib);
+ return EqualsCaseInsensitive(GetSimpleName(), g_BinderVariables->corelib);
}
ULONG AssemblyName::Hash(DWORD dwIncludeFlags)
diff --git a/src/coreclr/src/binder/bindertracing.cpp b/src/coreclr/src/binder/bindertracing.cpp
index 2e5c83d7b09b..29ba819ee6c9 100644
--- a/src/coreclr/src/binder/bindertracing.cpp
+++ b/src/coreclr/src/binder/bindertracing.cpp
@@ -216,14 +216,14 @@ namespace BinderTracing
AssemblyBindOperation::~AssemblyBindOperation()
{
- if (!BinderTracing::IsEnabled() || ShouldIgnoreBind())
- return;
-
- // Make sure the bind request is populated. Tracing may have been enabled mid-bind.
- if (!m_populatedBindRequest)
- PopulateBindRequest(m_bindRequest);
+ if (BinderTracing::IsEnabled() && !ShouldIgnoreBind())
+ {
+ // Make sure the bind request is populated. Tracing may have been enabled mid-bind.
+ if (!m_populatedBindRequest)
+ PopulateBindRequest(m_bindRequest);
- FireAssemblyLoadStop(m_bindRequest, m_resultAssembly, m_cached);
+ FireAssemblyLoadStop(m_bindRequest, m_resultAssembly, m_cached);
+ }
if (m_resultAssembly != nullptr)
m_resultAssembly->Release();
@@ -246,7 +246,7 @@ namespace BinderTracing
// ActivityTracker or EventSource may have triggered the system satellite load.
// Don't track system satellite binding to avoid potential infinite recursion.
- m_ignoreBind = m_bindRequest.AssemblySpec->IsMscorlibSatellite();
+ m_ignoreBind = m_bindRequest.AssemblySpec->IsCoreLibSatellite();
m_checkedIgnoreBind = true;
return m_ignoreBind;
}
diff --git a/src/coreclr/src/binder/clrprivbinderassemblyloadcontext.cpp b/src/coreclr/src/binder/clrprivbinderassemblyloadcontext.cpp
index f492adfab28b..69d8d8337289 100644
--- a/src/coreclr/src/binder/clrprivbinderassemblyloadcontext.cpp
+++ b/src/coreclr/src/binder/clrprivbinderassemblyloadcontext.cpp
@@ -20,8 +20,8 @@ HRESULT CLRPrivBinderAssemblyLoadContext::BindAssemblyByNameWorker(BINDER_SPACE:
HRESULT hr = S_OK;
#ifdef _DEBUG
- // MSCORLIB should be bound using BindToSystem
- _ASSERTE(!pAssemblyName->IsMscorlib());
+ // CoreLib should be bound using BindToSystem
+ _ASSERTE(!pAssemblyName->IsCoreLib());
#endif
// Do we have the assembly already loaded in the context of the current binder?
@@ -145,7 +145,7 @@ HRESULT CLRPrivBinderAssemblyLoadContext::BindUsingPEImage( /* in */ PEImage *pP
// Disallow attempt to bind to the core library. Aside from that,
// the LoadContext can load any assembly (even if it was in a different LoadContext like TPA).
- if (pAssemblyName->IsMscorlib())
+ if (pAssemblyName->IsCoreLib())
{
IF_FAIL_GO(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));
}
diff --git a/src/coreclr/src/binder/clrprivbindercoreclr.cpp b/src/coreclr/src/binder/clrprivbindercoreclr.cpp
index 1045cb93e76d..571e127d7dab 100644
--- a/src/coreclr/src/binder/clrprivbindercoreclr.cpp
+++ b/src/coreclr/src/binder/clrprivbindercoreclr.cpp
@@ -20,8 +20,8 @@ HRESULT CLRPrivBinderCoreCLR::BindAssemblyByNameWorker(BINDER_SPACE::AssemblyNam
HRESULT hr = S_OK;
#ifdef _DEBUG
- // MSCORLIB should be bound using BindToSystem
- _ASSERTE(!pAssemblyName->IsMscorlib());
+ // CoreLib should be bound using BindToSystem
+ _ASSERTE(!pAssemblyName->IsCoreLib());
#endif
hr = AssemblyBinder::BindAssembly(&m_appContext,
@@ -49,76 +49,72 @@ HRESULT CLRPrivBinderCoreCLR::BindAssemblyByName(IAssemblyName *pIAssemblyNa
HRESULT hr = S_OK;
VALIDATE_ARG_RET(pIAssemblyName != nullptr && ppAssembly != nullptr);
- EX_TRY
- {
- *ppAssembly = nullptr;
+ *ppAssembly = nullptr;
- ReleaseHolder pCoreCLRFoundAssembly;
- ReleaseHolder pAssemblyName;
+ ReleaseHolder pCoreCLRFoundAssembly;
+ ReleaseHolder pAssemblyName;
- SAFE_NEW(pAssemblyName, AssemblyName);
- IF_FAIL_GO(pAssemblyName->Init(pIAssemblyName));
+ SAFE_NEW(pAssemblyName, AssemblyName);
+ IF_FAIL_GO(pAssemblyName->Init(pIAssemblyName));
- hr = BindAssemblyByNameWorker(pAssemblyName, &pCoreCLRFoundAssembly, false /* excludeAppPaths */);
+ hr = BindAssemblyByNameWorker(pAssemblyName, &pCoreCLRFoundAssembly, false /* excludeAppPaths */);
#if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE)
- if ((hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) ||
- (hr == FUSION_E_APP_DOMAIN_LOCKED) || (hr == FUSION_E_REF_DEF_MISMATCH))
+ if ((hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) ||
+ (hr == FUSION_E_APP_DOMAIN_LOCKED) || (hr == FUSION_E_REF_DEF_MISMATCH))
+ {
+ // If we are here, one of the following is possible:
+ //
+ // 1) The assembly has not been found in the current binder's application context (i.e. it has not already been loaded), OR
+ // 2) An assembly with the same simple name was already loaded in the context of the current binder but we ran into a Ref/Def
+ // mismatch (either due to version difference or strong-name difference).
+ //
+ // Attempt to resolve the assembly via managed ALC instance. This can either fail the bind or return reference to an existing
+ // assembly that has been loaded
+ INT_PTR pManagedAssemblyLoadContext = GetManagedAssemblyLoadContext();
+ if (pManagedAssemblyLoadContext == NULL)
{
- // If we are here, one of the following is possible:
- //
- // 1) The assembly has not been found in the current binder's application context (i.e. it has not already been loaded), OR
- // 2) An assembly with the same simple name was already loaded in the context of the current binder but we ran into a Ref/Def
- // mismatch (either due to version difference or strong-name difference).
- //
- // Attempt to resolve the assembly via managed ALC instance. This can either fail the bind or return reference to an existing
- // assembly that has been loaded
- INT_PTR pManagedAssemblyLoadContext = GetManagedAssemblyLoadContext();
- if (pManagedAssemblyLoadContext == NULL)
+ // For satellite assemblies, the managed ALC has additional resolution logic (defined by the runtime) which
+ // should be run even if the managed default ALC has not yet been used. (For non-satellite assemblies, any
+ // additional logic comes through a user-defined event handler which would have initialized the managed ALC,
+ // so if the managed ALC is not set yet, there is no additional logic to run)
+ SString &culture = pAssemblyName->GetCulture();
+ if (!culture.IsEmpty() && !culture.EqualsCaseInsensitive(g_BinderVariables->cultureNeutral))
{
- // For satellite assemblies, the managed ALC has additional resolution logic (defined by the runtime) which
- // should be run even if the managed default ALC has not yet been used. (For non-satellite assemblies, any
- // additional logic comes through a user-defined event handler which would have initialized the managed ALC,
- // so if the managed ALC is not set yet, there is no additional logic to run)
- SString &culture = pAssemblyName->GetCulture();
- if (!culture.IsEmpty() && !culture.EqualsCaseInsensitive(g_BinderVariables->cultureNeutral))
- {
- // Make sure the managed default ALC is initialized.
- GCX_COOP();
- PREPARE_NONVIRTUAL_CALLSITE(METHOD__ASSEMBLYLOADCONTEXT__INITIALIZE_DEFAULT_CONTEXT);
- DECLARE_ARGHOLDER_ARRAY(args, 0);
- CALL_MANAGED_METHOD_NORET(args)
-
- pManagedAssemblyLoadContext = GetManagedAssemblyLoadContext();
- _ASSERTE(pManagedAssemblyLoadContext != NULL);
- }
+ // Make sure the managed default ALC is initialized.
+ GCX_COOP();
+ PREPARE_NONVIRTUAL_CALLSITE(METHOD__ASSEMBLYLOADCONTEXT__INITIALIZE_DEFAULT_CONTEXT);
+ DECLARE_ARGHOLDER_ARRAY(args, 0);
+ CALL_MANAGED_METHOD_NORET(args)
+
+ pManagedAssemblyLoadContext = GetManagedAssemblyLoadContext();
+ _ASSERTE(pManagedAssemblyLoadContext != NULL);
}
+ }
- if (pManagedAssemblyLoadContext != NULL)
+ if (pManagedAssemblyLoadContext != NULL)
+ {
+ hr = AssemblyBinder::BindUsingHostAssemblyResolver(pManagedAssemblyLoadContext, pAssemblyName, pIAssemblyName,
+ NULL, &pCoreCLRFoundAssembly);
+ if (SUCCEEDED(hr))
{
- hr = AssemblyBinder::BindUsingHostAssemblyResolver(pManagedAssemblyLoadContext, pAssemblyName, pIAssemblyName,
- NULL, &pCoreCLRFoundAssembly);
- if (SUCCEEDED(hr))
+ // We maybe returned an assembly that was bound to a different AssemblyLoadContext instance.
+ // In such a case, we will not overwrite the binding context (which would be wrong since it would not
+ // be present in the cache of the current binding context).
+ if (pCoreCLRFoundAssembly->GetBinder() == NULL)
{
- // We maybe returned an assembly that was bound to a different AssemblyLoadContext instance.
- // In such a case, we will not overwrite the binding context (which would be wrong since it would not
- // be present in the cache of the current binding context).
- if (pCoreCLRFoundAssembly->GetBinder() == NULL)
- {
- pCoreCLRFoundAssembly->SetBinder(this);
- }
+ pCoreCLRFoundAssembly->SetBinder(this);
}
}
}
+ }
#endif // !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE)
- IF_FAIL_GO(hr);
+ IF_FAIL_GO(hr);
- *ppAssembly = pCoreCLRFoundAssembly.Extract();
+ *ppAssembly = pCoreCLRFoundAssembly.Extract();
Exit:;
- }
- EX_CATCH_HRESULT(hr);
return hr;
}
@@ -155,8 +151,8 @@ HRESULT CLRPrivBinderCoreCLR::BindUsingPEImage( /* in */ PEImage *pPEImage,
IF_FAIL_GO(HRESULT_FROM_WIN32(ERROR_BAD_FORMAT));
}
- // Easy out for mscorlib
- if (pAssemblyName->IsMscorlib())
+ // Easy out for CoreLib
+ if (pAssemblyName->IsCoreLib())
{
IF_FAIL_GO(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));
}
diff --git a/src/coreclr/src/binder/inc/assembly.hpp b/src/coreclr/src/binder/inc/assembly.hpp
index 9ad7d4226e8b..3f5fb87594e2 100644
--- a/src/coreclr/src/binder/inc/assembly.hpp
+++ b/src/coreclr/src/binder/inc/assembly.hpp
@@ -116,7 +116,7 @@ namespace BINDER_SPACE
#ifndef CROSSGEN_COMPILE
protected:
#endif
- // Asssembly Flags
+ // Assembly Flags
enum
{
FLAG_NONE = 0x00,
diff --git a/src/coreclr/src/binder/inc/assemblyname.hpp b/src/coreclr/src/binder/inc/assemblyname.hpp
index 38590e09f78a..fb66d9830e0a 100644
--- a/src/coreclr/src/binder/inc/assemblyname.hpp
+++ b/src/coreclr/src/binder/inc/assemblyname.hpp
@@ -65,7 +65,7 @@ namespace BINDER_SPACE
inline void SetHave(DWORD dwIdentityFlags);
- BOOL IsMscorlib();
+ BOOL IsCoreLib();
ULONG Hash(/* in */ DWORD dwIncludeFlags);
BOOL Equals(/* in */ AssemblyName *pAssemblyName,
diff --git a/src/coreclr/src/binder/inc/utils.hpp b/src/coreclr/src/binder/inc/utils.hpp
index 6108d3aea22c..1c8ea114f5e6 100644
--- a/src/coreclr/src/binder/inc/utils.hpp
+++ b/src/coreclr/src/binder/inc/utils.hpp
@@ -39,6 +39,9 @@ namespace BINDER_SPACE
SBuffer &publicKeyTokenBLOB);
BOOL IsFileNotFound(HRESULT hr);
+
+ HRESULT GetNextPath(SString& paths, SString::Iterator& startPos, SString& outPath);
+ HRESULT GetNextTPAPath(SString& paths, SString::Iterator& startPos, bool dllOnly, SString& outPath, SString& simpleName, bool& isNativeImage);
};
#endif
diff --git a/src/coreclr/src/binder/inc/variables.hpp b/src/coreclr/src/binder/inc/variables.hpp
index 50f392d0366e..d060a691bbec 100644
--- a/src/coreclr/src/binder/inc/variables.hpp
+++ b/src/coreclr/src/binder/inc/variables.hpp
@@ -31,7 +31,7 @@ namespace BINDER_SPACE
// AssemblyName string constants
SString cultureNeutral;
- SString mscorlib;
+ SString corelib;
};
extern Variables *g_BinderVariables;
diff --git a/src/coreclr/src/binder/utils.cpp b/src/coreclr/src/binder/utils.cpp
index c98d7f71bf83..21fc115a7766 100644
--- a/src/coreclr/src/binder/utils.cpp
+++ b/src/coreclr/src/binder/utils.cpp
@@ -15,6 +15,8 @@
#include "strongnameinternal.h"
#include "corpriv.h"
+#include "clr/fs/path.h"
+using namespace clr::fs;
namespace BINDER_SPACE
{
@@ -115,4 +117,139 @@ namespace BINDER_SPACE
{
return RuntimeFileNotFound(hr);
}
+
+ HRESULT GetNextPath(SString& paths, SString::Iterator& startPos, SString& outPath)
+ {
+ HRESULT hr = S_OK;
+
+ bool wrappedWithQuotes = false;
+
+ // Skip any leading spaces or path separators
+ while (paths.Skip(startPos, W(' ')) || paths.Skip(startPos, PATH_SEPARATOR_CHAR_W)) {}
+
+ if (startPos == paths.End())
+ {
+ // No more paths in the string and we just skipped over some white space
+ outPath.Set(W(""));
+ return S_FALSE;
+ }
+
+ // Support paths being wrapped with quotations
+ if (paths.Skip(startPos, W('\"')))
+ {
+ wrappedWithQuotes = true;
+ }
+
+ SString::Iterator iEnd = startPos; // Where current path ends
+ SString::Iterator iNext; // Where next path starts
+ if (wrappedWithQuotes)
+ {
+ if (paths.Find(iEnd, W('\"')))
+ {
+ iNext = iEnd;
+ // Find where the next path starts - there should be a path separator right after the closing quotation mark
+ if (paths.Find(iNext, PATH_SEPARATOR_CHAR_W))
+ {
+ iNext++;
+ }
+ else
+ {
+ iNext = paths.End();
+ }
+ }
+ else
+ {
+ // There was no terminating quotation mark - that's bad
+ GO_WITH_HRESULT(E_INVALIDARG);
+ }
+ }
+ else if (paths.Find(iEnd, PATH_SEPARATOR_CHAR_W))
+ {
+ iNext = iEnd + 1;
+ }
+ else
+ {
+ iNext = iEnd = paths.End();
+ }
+
+ // Skip any trailing spaces
+ while (iEnd[-1] == W(' '))
+ {
+ iEnd--;
+ }
+
+ _ASSERTE(startPos < iEnd);
+
+ outPath.Set(paths, startPos, iEnd);
+ startPos = iNext;
+ Exit:
+ return hr;
+ }
+
+ HRESULT GetNextTPAPath(SString& paths, SString::Iterator& startPos, bool dllOnly, SString& outPath, SString& simpleName, bool& isNativeImage)
+ {
+ HRESULT hr = S_OK;
+ isNativeImage = false;
+
+ HRESULT pathResult = S_OK;
+ IF_FAIL_GO(pathResult = GetNextPath(paths, startPos, outPath));
+ if (pathResult == S_FALSE)
+ {
+ return S_FALSE;
+ }
+
+#ifndef CROSSGEN_COMPILE
+ if (Path::IsRelative(outPath))
+ {
+ GO_WITH_HRESULT(E_INVALIDARG);
+ }
+#endif
+
+ {
+ // Find the beginning of the simple name
+ SString::Iterator iSimpleNameStart = outPath.End();
+
+ if (!outPath.FindBack(iSimpleNameStart, DIRECTORY_SEPARATOR_CHAR_W))
+ {
+ iSimpleNameStart = outPath.Begin();
+ }
+ else
+ {
+ // Advance past the directory separator to the first character of the file name
+ iSimpleNameStart++;
+ }
+
+ if (iSimpleNameStart == outPath.End())
+ {
+ GO_WITH_HRESULT(E_INVALIDARG);
+ }
+
+ // GCC complains if we create SStrings inline as part of a function call
+ SString sNiDll(W(".ni.dll"));
+ SString sNiExe(W(".ni.exe"));
+ SString sDll(W(".dll"));
+ SString sExe(W(".exe"));
+
+ if (!dllOnly && (outPath.EndsWithCaseInsensitive(sNiDll) ||
+ outPath.EndsWithCaseInsensitive(sNiExe)))
+ {
+ simpleName.Set(outPath, iSimpleNameStart, outPath.End() - 7);
+ isNativeImage = true;
+ }
+ else if (outPath.EndsWithCaseInsensitive(sDll) ||
+ (!dllOnly && outPath.EndsWithCaseInsensitive(sExe)))
+ {
+ simpleName.Set(outPath, iSimpleNameStart, outPath.End() - 4);
+ }
+ else
+ {
+ // Invalid filename
+ GO_WITH_HRESULT(E_INVALIDARG);
+ }
+ }
+
+ Exit:
+ return hr;
+ }
+
};
diff --git a/src/coreclr/src/binder/variables.cpp b/src/coreclr/src/binder/variables.cpp
index d9c3f672657d..fbdd106b4dd2 100644
--- a/src/coreclr/src/binder/variables.cpp
+++ b/src/coreclr/src/binder/variables.cpp
@@ -40,7 +40,7 @@ namespace BINDER_SPACE
// AssemblyName string constants
cultureNeutral.SetLiteral(W("neutral"));
- mscorlib.SetLiteral(CoreLibName_W);
+ corelib.SetLiteral(CoreLibName_W);
}
EX_CATCH_HRESULT(hr);
diff --git a/src/coreclr/src/classlibnative/bcltype/CMakeLists.txt b/src/coreclr/src/classlibnative/bcltype/CMakeLists.txt
index c3122ec12ec3..fdcf344c16ac 100644
--- a/src/coreclr/src/classlibnative/bcltype/CMakeLists.txt
+++ b/src/coreclr/src/classlibnative/bcltype/CMakeLists.txt
@@ -10,9 +10,11 @@ set(BCLTYPE_SOURCES
variant.cpp
)
-add_library_clr(bcltype
+add_library_clr(bcltype_obj
OBJECT
${BCLTYPE_SOURCES}
)
-add_dependencies(bcltype eventing_headers)
+add_dependencies(bcltype_obj eventing_headers)
+add_library(bcltype INTERFACE)
+target_sources(bcltype INTERFACE $)
diff --git a/src/coreclr/src/classlibnative/bcltype/objectnative.cpp b/src/coreclr/src/classlibnative/bcltype/objectnative.cpp
index efa76170bada..7af628a04e5c 100644
--- a/src/coreclr/src/classlibnative/bcltype/objectnative.cpp
+++ b/src/coreclr/src/classlibnative/bcltype/objectnative.cpp
@@ -254,7 +254,7 @@ FCIMPL1(Object*, ObjectNative::AllocateUninitializedClone, Object* pObjUNSAFE)
}
FCIMPLEND
-FCIMPL3(FC_BOOL_RET, ObjectNative::WaitTimeout, CLR_BOOL exitContext, INT32 Timeout, Object* pThisUNSAFE)
+FCIMPL2(FC_BOOL_RET, ObjectNative::WaitTimeout, INT32 Timeout, Object* pThisUNSAFE)
{
FCALL_CONTRACT;
@@ -262,13 +262,11 @@ FCIMPL3(FC_BOOL_RET, ObjectNative::WaitTimeout, CLR_BOOL exitContext, INT32 Time
OBJECTREF pThis = (OBJECTREF) pThisUNSAFE;
HELPER_METHOD_FRAME_BEGIN_RET_1(pThis);
- if (pThis == NULL)
- COMPlusThrow(kNullReferenceException, W("NullReference_This"));
-
- if ((Timeout < 0) && (Timeout != INFINITE_TIMEOUT))
- COMPlusThrowArgumentOutOfRange(W("millisecondsTimeout"), W("ArgumentOutOfRange_NeedNonNegNum"));
+ // Arguments validated on managed side
+ _ASSERTE(pThis != NULL);
+ _ASSERTE(Timeout >= INFINITE_TIMEOUT);
- retVal = pThis->Wait(Timeout, exitContext);
+ retVal = pThis->Wait(Timeout);
HELPER_METHOD_FRAME_END();
FC_RETURN_BOOL(retVal);
diff --git a/src/coreclr/src/classlibnative/bcltype/objectnative.h b/src/coreclr/src/classlibnative/bcltype/objectnative.h
index 4091f2faa8fd..cc084e4d3b51 100644
--- a/src/coreclr/src/classlibnative/bcltype/objectnative.h
+++ b/src/coreclr/src/classlibnative/bcltype/objectnative.h
@@ -33,7 +33,7 @@ class ObjectNative
static FCDECL2(FC_BOOL_RET, Equals, Object *pThisRef, Object *pCompareRef);
static FCDECL1(Object*, AllocateUninitializedClone, Object* pObjUNSAFE);
static FCDECL1(Object*, GetClass, Object* pThis);
- static FCDECL3(FC_BOOL_RET, WaitTimeout, CLR_BOOL exitContext, INT32 Timeout, Object* pThisUNSAFE);
+ static FCDECL2(FC_BOOL_RET, WaitTimeout, INT32 Timeout, Object* pThisUNSAFE);
static FCDECL1(void, Pulse, Object* pThisUNSAFE);
static FCDECL1(void, PulseAll, Object* pThisUNSAFE);
static FCDECL1(FC_BOOL_RET, IsLockHeld, Object* pThisUNSAFE);
diff --git a/src/coreclr/src/classlibnative/bcltype/system.cpp b/src/coreclr/src/classlibnative/bcltype/system.cpp
index c037236f6959..74623125fdf4 100644
--- a/src/coreclr/src/classlibnative/bcltype/system.cpp
+++ b/src/coreclr/src/classlibnative/bcltype/system.cpp
@@ -46,7 +46,7 @@ void WINAPI InitializeGetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime)
{
// GetSystemTimePreciseAsFileTime exists and we'd like to use it. However, on
// misconfigured systems, it's possible for the "precise" time to be inaccurate:
- // https://github.com/dotnet/coreclr/issues/14187
+ // https://github.com/dotnet/runtime/issues/9014
// If it's inaccurate, though, we expect it to be wildly inaccurate, so as a
// workaround/heuristic, we get both the "normal" and "precise" times, and as
// long as they're close, we use the precise one. This workaround can be removed
@@ -607,9 +607,17 @@ BOOL QCALLTYPE SystemNative::WinRTSupported()
#endif // FEATURE_COMINTEROP
+#if defined(TARGET_X86) || defined(TARGET_AMD64)
+void QCALLTYPE SystemNative::X86BaseCpuId(int cpuInfo[4], int functionId, int subFunctionId)
+{
+ QCALL_CONTRACT;
+ BEGIN_QCALL;
+ __cpuidex(cpuInfo, functionId, subFunctionId);
+ END_QCALL;
+}
-
+#endif // defined(TARGET_X86) || defined(TARGET_AMD64)
diff --git a/src/coreclr/src/classlibnative/bcltype/system.h b/src/coreclr/src/classlibnative/bcltype/system.h
index 20d357c17302..ff6720f0a8c0 100644
--- a/src/coreclr/src/classlibnative/bcltype/system.h
+++ b/src/coreclr/src/classlibnative/bcltype/system.h
@@ -81,6 +81,10 @@ class SystemNative
// Return a method info for the method were the exception was thrown
static FCDECL1(ReflectMethodObject*, GetMethodFromStackTrace, ArrayBase* pStackTraceUNSAFE);
+#if defined(TARGET_X86) || defined(TARGET_AMD64)
+ static void QCALLTYPE X86BaseCpuId(int cpuInfo[4], int functionId, int subFunctionId);
+#endif // defined(TARGET_X86) || defined(TARGET_AMD64)
+
private:
// Common processing code for FailFast
static void GenericFailFast(STRINGREF refMesgString, EXCEPTIONREF refExceptionForWatsonBucketing, UINT_PTR retAddress, UINT exitCode, STRINGREF errorSource);
diff --git a/src/coreclr/src/classlibnative/bcltype/varargsnative.cpp b/src/coreclr/src/classlibnative/bcltype/varargsnative.cpp
index fb2c1aefe3c7..55dd48bf280e 100644
--- a/src/coreclr/src/classlibnative/bcltype/varargsnative.cpp
+++ b/src/coreclr/src/classlibnative/bcltype/varargsnative.cpp
@@ -502,7 +502,7 @@ VarArgsNative::GetNextArgHelper(
value->data = (BYTE*)origArgPtr + (sizeof(void*)-1);
}
#endif
- value->type = MscorlibBinder::GetElementType(elemType);
+ value->type = CoreLibBinder::GetElementType(elemType);
break;
case ELEMENT_TYPE_I2:
@@ -513,7 +513,7 @@ VarArgsNative::GetNextArgHelper(
value->data = (BYTE*)origArgPtr + (sizeof(void*)-2);
}
#endif
- value->type = MscorlibBinder::GetElementType(elemType);
+ value->type = CoreLibBinder::GetElementType(elemType);
break;
case ELEMENT_TYPE_I4:
@@ -522,13 +522,13 @@ VarArgsNative::GetNextArgHelper(
case ELEMENT_TYPE_STRING:
case ELEMENT_TYPE_I:
case ELEMENT_TYPE_U:
- value->type = MscorlibBinder::GetElementType(elemType);
+ value->type = CoreLibBinder::GetElementType(elemType);
break;
case ELEMENT_TYPE_I8:
case ELEMENT_TYPE_U8:
case ELEMENT_TYPE_R8:
- value->type = MscorlibBinder::GetElementType(elemType);
+ value->type = CoreLibBinder::GetElementType(elemType);
#if !defined(HOST_64BIT) && (DATA_ALIGNMENT > 4)
if ( fData && origArgPtr == value->data ) {
// allocate an aligned copy of the value
@@ -575,7 +575,8 @@ VarArgsNative::GetNextArgHelper(
}
#endif
- // fall through
+ FALLTHROUGH;
+
case ELEMENT_TYPE_CLASS: {
value->type = data->SigPtr.GetTypeHandleThrowing(data->ArgCookie->pModule, &typeContext);
diff --git a/src/coreclr/src/classlibnative/float/CMakeLists.txt b/src/coreclr/src/classlibnative/float/CMakeLists.txt
index 2345ad0b9135..b2c47ea39b65 100644
--- a/src/coreclr/src/classlibnative/float/CMakeLists.txt
+++ b/src/coreclr/src/classlibnative/float/CMakeLists.txt
@@ -7,9 +7,12 @@ set(FLOAT_SOURCES
floatsingle.cpp
)
-add_library_clr(comfloat_wks
+add_library_clr(comfloat_wks_obj
OBJECT
${FLOAT_SOURCES}
)
-add_dependencies(comfloat_wks eventing_headers)
+add_dependencies(comfloat_wks_obj eventing_headers)
+
+add_library(comfloat_wks INTERFACE)
+target_sources(comfloat_wks INTERFACE $)
\ No newline at end of file
diff --git a/src/coreclr/src/classlibnative/float/floatdouble.cpp b/src/coreclr/src/classlibnative/float/floatdouble.cpp
index d3ef36c66a61..a2a00b0628bd 100644
--- a/src/coreclr/src/classlibnative/float/floatdouble.cpp
+++ b/src/coreclr/src/classlibnative/float/floatdouble.cpp
@@ -125,7 +125,7 @@ FCIMPLEND
#if defined(_MSC_VER) && defined(TARGET_AMD64)
// The /fp:fast form of `ceil` for AMD64 does not correctly handle: `-1.0 < value <= -0.0`
-// https://github.com/dotnet/coreclr/issues/19739
+// https://github.com/dotnet/runtime/issues/11003
#pragma float_control(push)
#pragma float_control(precise, on)
#endif
@@ -172,7 +172,7 @@ FCIMPLEND
#if defined(_MSC_VER) && defined(TARGET_X86)
// The /fp:fast form of `floor` for x86 does not correctly handle: `-0.0`
-// https://github.com/dotnet/coreclr/issues/19739
+// https://github.com/dotnet/runtime/issues/11003
#pragma float_control(push)
#pragma float_control(precise, on)
#endif
diff --git a/src/coreclr/src/classlibnative/float/floatsingle.cpp b/src/coreclr/src/classlibnative/float/floatsingle.cpp
index 781badfc1f8a..9972e17c6901 100644
--- a/src/coreclr/src/classlibnative/float/floatsingle.cpp
+++ b/src/coreclr/src/classlibnative/float/floatsingle.cpp
@@ -123,7 +123,7 @@ FCIMPLEND
#if defined(_MSC_VER) && defined(TARGET_AMD64)
// The /fp:fast form of `ceilf` for AMD64 does not correctly handle: `-1.0 < value <= -0.0`
-// https://github.com/dotnet/coreclr/issues/19739
+// https://github.com/dotnet/runtime/issues/11003
#pragma float_control(push)
#pragma float_control(precise, on)
#endif
diff --git a/src/coreclr/src/debug/createdump/CMakeLists.txt b/src/coreclr/src/debug/createdump/CMakeLists.txt
index d5137b0cf5f1..71b6083f9bcf 100644
--- a/src/coreclr/src/debug/createdump/CMakeLists.txt
+++ b/src/coreclr/src/debug/createdump/CMakeLists.txt
@@ -14,6 +14,7 @@ if(CLR_CMAKE_HOST_WIN32)
set(CREATEDUMP_SOURCES
main.cpp
+ dumpname.cpp
createdumpwindows.cpp
createdump.rc
)
@@ -28,6 +29,7 @@ if(CLR_CMAKE_HOST_WIN32)
advapi32.lib
version.lib
dbghelp.lib
+ ws2_32.lib
)
else(CLR_CMAKE_HOST_WIN32)
@@ -49,6 +51,7 @@ else(CLR_CMAKE_HOST_WIN32)
set(CREATEDUMP_SOURCES
main.cpp
+ dumpname.cpp
createdumpunix.cpp
crashinfo.cpp
threadinfo.cpp
@@ -83,4 +86,4 @@ endif(CLR_CMAKE_HOST_OSX)
endif(CLR_CMAKE_HOST_WIN32)
-install_clr(TARGETS createdump ADDITIONAL_DESTINATION sharedFramework)
+install_clr(TARGETS createdump ADDITIONAL_DESTINATIONS sharedFramework)
diff --git a/src/coreclr/src/debug/createdump/crashinfo.cpp b/src/coreclr/src/debug/createdump/crashinfo.cpp
index 612fafb7c34e..bccbb8553a91 100644
--- a/src/coreclr/src/debug/createdump/crashinfo.cpp
+++ b/src/coreclr/src/debug/createdump/crashinfo.cpp
@@ -306,23 +306,27 @@ CrashInfo::EnumerateManagedModules(IXCLRDataProcess* pClrDataProcess)
if (!moduleData.IsDynamic && moduleData.LoadedPEAddress != 0)
{
- ArrayHolder wszUnicodeName = new WCHAR[MAX_LONGPATH + 1];
+ ArrayHolder wszUnicodeName = new (std::nothrow) WCHAR[MAX_LONGPATH + 1];
+ if (wszUnicodeName == nullptr)
+ {
+ fprintf(stderr, "Allocating unicode module name FAILED\n");
+ result = false;
+ break;
+ }
if (SUCCEEDED(hr = pClrDataModule->GetFileName(MAX_LONGPATH, nullptr, wszUnicodeName)))
{
- // If the module file name isn't empty
- if (wszUnicodeName[0] != 0) {
- ArrayHolder pszName = new (std::nothrow) char[MAX_LONGPATH + 1];
- if (pszName == nullptr) {
- fprintf(stderr, "Allocating module name FAILED\n");
- result = false;
- break;
- }
- sprintf_s(pszName.GetPtr(), MAX_LONGPATH, "%S", (WCHAR*)wszUnicodeName);
- TRACE(" %s\n", pszName.GetPtr());
-
- // Change the module mapping name
- ReplaceModuleMapping(moduleData.LoadedPEAddress, moduleData.LoadedPESize, std::string(pszName.GetPtr()));
+ ArrayHolder pszName = new (std::nothrow) char[MAX_LONGPATH + 1];
+ if (pszName == nullptr)
+ {
+ fprintf(stderr, "Allocating ascii module name FAILED\n");
+ result = false;
+ break;
}
+ sprintf_s(pszName.GetPtr(), MAX_LONGPATH, "%S", (WCHAR*)wszUnicodeName);
+ TRACE(" %s\n", pszName.GetPtr());
+
+ // Change the module mapping name
+ ReplaceModuleMapping(moduleData.LoadedPEAddress, moduleData.LoadedPESize, std::string(pszName.GetPtr()));
}
else {
TRACE("\nModule.GetFileName FAILED %08x\n", hr);
@@ -368,16 +372,21 @@ CrashInfo::ReplaceModuleMapping(CLRDATA_ADDRESS baseAddress, ULONG64 size, const
{
uint64_t start = (uint64_t)baseAddress;
uint64_t end = ((baseAddress + size) + (PAGE_SIZE - 1)) & PAGE_MASK;
+ uint32_t flags = GetMemoryRegionFlags(start);
+
+ // Make sure that the page containing the PE header for the managed asseblies is in the dump
+ // especially on MacOS where they are added artificially.
+ MemoryRegion header(flags | MEMORY_REGION_FLAG_MEMORY_BACKED, start, start + PAGE_SIZE);
+ InsertMemoryRegion(header);
// Add or change the module mapping for this PE image. The managed assembly images may already
// be in the module mappings list but they may not have the full assembly name (like in .NET 2.0
// they have the name "/dev/zero"). On MacOS, the managed assembly modules have not been added.
- MemoryRegion search(0, start, start + PAGE_SIZE);
- const auto& found = m_moduleMappings.find(search);
+ const auto& found = m_moduleMappings.find(header);
if (found == m_moduleMappings.end())
{
// On MacOS the assemblies are always added.
- MemoryRegion newRegion(GetMemoryRegionFlags(start), start, end, 0, pszName);
+ MemoryRegion newRegion(flags, start, end, 0, pszName);
m_moduleMappings.insert(newRegion);
if (g_diagnostics) {
diff --git a/src/coreclr/src/debug/createdump/crashinfomac.cpp b/src/coreclr/src/debug/createdump/crashinfomac.cpp
index 033f98d29037..c4f55bb2dd49 100644
--- a/src/coreclr/src/debug/createdump/crashinfomac.cpp
+++ b/src/coreclr/src/debug/createdump/crashinfomac.cpp
@@ -24,49 +24,7 @@ void
CrashInfo::CleanupAndResumeProcess()
{
// Resume all the threads suspended in EnumerateAndSuspendThreads
- for (ThreadInfo* thread : m_threads)
- {
- ::thread_resume(thread->Port());
- }
-}
-
-static
-kern_return_t
-SuspendMachThread(thread_act_t thread, int tid)
-{
- kern_return_t result;
-
- while (true)
- {
- result = thread_suspend(thread);
- if (result != KERN_SUCCESS)
- {
- fprintf(stderr, "thread_suspend(%d) FAILED %x %s\n", tid, result, mach_error_string(result));
- break;
- }
-
- // Ensure that if the thread was running in the kernel, the kernel operation
- // is safely aborted so that it can be restarted later.
- result = thread_abort_safely(thread);
- if (result == KERN_SUCCESS)
- {
- break;
- }
- else
- {
- TRACE("thread_abort_safely(%d) FAILED %x %s\n", tid, result, mach_error_string(result));
- }
- // The thread was running in the kernel executing a non-atomic operation
- // that cannot be restarted, so we need to resume the thread and retry
- result = thread_resume(thread);
- if (result != KERN_SUCCESS)
- {
- fprintf(stderr, "thread_resume(%d) FAILED %x %s\n", tid, result, mach_error_string(result));
- break;
- }
- }
-
- return result;
+ ::task_resume(Task());
}
//
@@ -78,7 +36,14 @@ CrashInfo::EnumerateAndSuspendThreads()
thread_act_port_array_t threadList;
mach_msg_type_number_t threadCount;
- kern_return_t result = ::task_threads(Task(), &threadList, &threadCount);
+ kern_return_t result = ::task_suspend(Task());
+ if (result != KERN_SUCCESS)
+ {
+ fprintf(stderr, "task_suspend(%d) FAILED %x %s\n", m_pid, result, mach_error_string(result));
+ return false;
+ }
+
+ result = ::task_threads(Task(), &threadList, &threadCount);
if (result != KERN_SUCCESS)
{
fprintf(stderr, "task_threads(%d) FAILED %x %s\n", m_pid, result, mach_error_string(result));
@@ -102,11 +67,6 @@ CrashInfo::EnumerateAndSuspendThreads()
tid = tident.thread_id;
}
- result = SuspendMachThread(threadList[i], tid);
- if (result != KERN_SUCCESS)
- {
- return false;
- }
// Add to the list of threads
ThreadInfo* thread = new ThreadInfo(*this, tid, threadList[i]);
m_threads.push_back(thread);
@@ -148,7 +108,7 @@ CrashInfo::EnumerateMemoryRegions()
fprintf(stderr, "mach_vm_region_recurse for address %016llx %08llx FAILED %x %s\n", address, size, result, mach_error_string(result));
return false;
}
- TRACE("%016llx - %016llx (%06llx) %08llx %s %d %d %d %c%c%c\n",
+ TRACE("%016llx - %016llx (%06llx) %08llx %s %d %d %d %c%c%c %02x\n",
address,
address + size,
size / PAGE_SIZE,
@@ -159,14 +119,15 @@ CrashInfo::EnumerateMemoryRegions()
depth,
(info.protection & VM_PROT_READ) ? 'r' : '-',
(info.protection & VM_PROT_WRITE) ? 'w' : '-',
- (info.protection & VM_PROT_EXECUTE) ? 'x' : '-');
+ (info.protection & VM_PROT_EXECUTE) ? 'x' : '-',
+ info.protection);
if (info.is_submap) {
depth++;
}
else
{
- if (info.share_mode != SM_EMPTY && (info.protection & (VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE)) != 0)
+ if ((info.protection & (VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE)) != 0)
{
MemoryRegion memoryRegion(ConvertProtectionFlags(info.protection), address, address + size, info.offset);
m_allMemoryRegions.insert(memoryRegion);
@@ -242,33 +203,32 @@ CrashInfo::TryFindDyLinker(mach_vm_address_t address, mach_vm_size_t size, bool*
if (size > sizeof(mach_header_64))
{
- mach_header_64* header = nullptr;
- mach_msg_type_number_t read = 0;
- kern_return_t kresult = ::vm_read(Task(), address, sizeof(mach_header_64), (vm_offset_t*)&header, &read);
- if (kresult == KERN_SUCCESS)
- {
- if (header->magic == MH_MAGIC_64)
+ mach_header_64 header;
+ size_t read = 0;
+ if (ReadProcessMemory((void*)address, &header, sizeof(mach_header_64), &read))
+ {
+ if (header.magic == MH_MAGIC_64)
{
TRACE("TryFindDyLinker: found module header at %016llx %08llx ncmds %d sizeofcmds %08x type %02x\n",
address,
size,
- header->ncmds,
- header->sizeofcmds,
- header->filetype);
+ header.ncmds,
+ header.sizeofcmds,
+ header.filetype);
- if (header->filetype == MH_DYLINKER)
+ if (header.filetype == MH_DYLINKER)
{
TRACE("TryFindDyLinker: found dylinker\n");
*found = true;
// Enumerate all the modules in dyld's image cache. VisitModule is called for every module found.
- result = EnumerateModules(address, header);
+ result = EnumerateModules(address, &header);
}
}
}
- if (header != nullptr)
+ else
{
- ::vm_deallocate(Task(), (vm_address_t)header, sizeof(mach_header_64));
+ TRACE("TryFindDyLinker: ReadProcessMemory header at %p %d FAILED\n", address, read);
}
}
@@ -388,37 +348,35 @@ CrashInfo::ReadProcessMemory(void* address, void* buffer, size_t size, size_t* r
// and the size be a multiple of the page size. We can't differentiate
// between the cases in which that's required and those in which it
// isn't, so we do it all the time.
- int* addressAligned = (int*)((SIZE_T)address & ~(PAGE_SIZE - 1));
- ssize_t offset = ((SIZE_T)address & (PAGE_SIZE - 1));
+ vm_address_t addressAligned = (vm_address_t)address & ~(PAGE_SIZE - 1);
+ ssize_t offset = (ssize_t)address & (PAGE_SIZE - 1);
char *data = (char*)alloca(PAGE_SIZE);
ssize_t numberOfBytesRead = 0;
- ssize_t bytesToRead;
+ ssize_t bytesLeft = size;
- while (size > 0)
+ while (bytesLeft > 0)
{
- vm_size_t bytesRead;
-
- bytesToRead = PAGE_SIZE - offset;
- if (bytesToRead > size)
+ vm_size_t bytesRead = PAGE_SIZE;
+ kern_return_t result = ::vm_read_overwrite(Task(), addressAligned, PAGE_SIZE, (vm_address_t)data, &bytesRead);
+ if (result != KERN_SUCCESS || bytesRead != PAGE_SIZE)
{
- bytesToRead = size;
+ TRACE_VERBOSE("ReadProcessMemory(%p %d): vm_read_overwrite failed bytesLeft %d bytesRead %d from %p: %x %s\n",
+ address, size, bytesLeft, bytesRead, (void*)addressAligned, result, mach_error_string(result));
+ break;
}
- bytesRead = PAGE_SIZE;
- kern_return_t result = ::vm_read_overwrite(Task(), (vm_address_t)addressAligned, PAGE_SIZE, (vm_address_t)data, &bytesRead);
- if (result != KERN_SUCCESS || bytesRead != PAGE_SIZE)
+ ssize_t bytesToCopy = PAGE_SIZE - offset;
+ if (bytesToCopy > bytesLeft)
{
- TRACE_VERBOSE("vm_read_overwrite failed for %d bytes from %p: %x %s\n", PAGE_SIZE, (char *)addressAligned, result, mach_error_string(result));
- *read = 0;
- return false;
+ bytesToCopy = bytesLeft;
}
- memcpy((LPSTR)buffer + numberOfBytesRead, data + offset, bytesToRead);
- addressAligned = (int*)((char*)addressAligned + PAGE_SIZE);
- numberOfBytesRead += bytesToRead;
- size -= bytesToRead;
+ memcpy((LPSTR)buffer + numberOfBytesRead, data + offset, bytesToCopy);
+ addressAligned = addressAligned + PAGE_SIZE;
+ numberOfBytesRead += bytesToCopy;
+ bytesLeft -= bytesToCopy;
offset = 0;
}
*read = numberOfBytesRead;
- return true;
+ return size == 0 || numberOfBytesRead > 0;
}
// For src/inc/llvm/ELF.h
diff --git a/src/coreclr/src/debug/createdump/createdump.h b/src/coreclr/src/debug/createdump/createdump.h
index 234cf09033fb..41cb93414374 100644
--- a/src/coreclr/src/debug/createdump/createdump.h
+++ b/src/coreclr/src/debug/createdump/createdump.h
@@ -95,4 +95,6 @@ typedef int T_CONTEXT;
#define MAX_LONGPATH 1024
#endif
-bool CreateDump(const char* dumpPathTemplate, int pid, MINIDUMP_TYPE minidumpType);
+bool FormatDumpName(std::string& name, const char* pattern, const char* exename, int pid);
+bool CreateDump(const char* dumpPathTemplate, int pid, const char* dumpType, MINIDUMP_TYPE minidumpType);
+
diff --git a/src/coreclr/src/debug/createdump/createdumpunix.cpp b/src/coreclr/src/debug/createdump/createdumpunix.cpp
index 156b58da6a46..6ddc21a75c2a 100644
--- a/src/coreclr/src/debug/createdump/createdumpunix.cpp
+++ b/src/coreclr/src/debug/createdump/createdumpunix.cpp
@@ -7,10 +7,11 @@
// The Linux/MacOS create dump code
//
bool
-CreateDump(const char* dumpPath, int pid, MINIDUMP_TYPE minidumpType)
+CreateDump(const char* dumpPathTemplate, int pid, const char* dumpType, MINIDUMP_TYPE minidumpType)
{
ReleaseHolder crashInfo = new CrashInfo(pid);
DumpWriter dumpWriter(*crashInfo);
+ std::string dumpPath;
bool result = false;
// Initialize the crash info
@@ -18,7 +19,7 @@ CreateDump(const char* dumpPath, int pid, MINIDUMP_TYPE minidumpType)
{
goto exit;
}
- printf("Process %d %s\n", crashInfo->Pid(), crashInfo->Name().c_str());
+ printf("Gathering state for process %d %s\n", pid, crashInfo->Name().c_str());
// Suspend all the threads in the target process and build the list of threads
if (!crashInfo->EnumerateAndSuspendThreads())
@@ -30,7 +31,15 @@ CreateDump(const char* dumpPath, int pid, MINIDUMP_TYPE minidumpType)
{
goto exit;
}
- if (!dumpWriter.OpenDump(dumpPath))
+ // Format the dump pattern template now that the process name on MacOS has been obtained
+ if (!FormatDumpName(dumpPath, dumpPathTemplate, crashInfo->Name().c_str(), pid))
+ {
+ goto exit;
+ }
+ printf("Writing %s to file %s\n", dumpType, dumpPath.c_str());
+
+ // Write the actual dump file
+ if (!dumpWriter.OpenDump(dumpPath.c_str()))
{
goto exit;
}
diff --git a/src/coreclr/src/debug/createdump/createdumpwindows.cpp b/src/coreclr/src/debug/createdump/createdumpwindows.cpp
index 51c6dbe87a91..1eed949603ed 100644
--- a/src/coreclr/src/debug/createdump/createdumpwindows.cpp
+++ b/src/coreclr/src/debug/createdump/createdumpwindows.cpp
@@ -2,28 +2,42 @@
// The .NET Foundation licenses this file to you under the MIT license.
#include "createdump.h"
+#include "psapi.h"
//
// The Windows create dump code
//
bool
-CreateDump(const char* dumpPath, int pid, MINIDUMP_TYPE minidumpType)
+CreateDump(const char* dumpPathTemplate, int pid, const char* dumpType, MINIDUMP_TYPE minidumpType)
{
HANDLE hFile = INVALID_HANDLE_VALUE;
HANDLE hProcess = NULL;
bool result = false;
+ ArrayHolder pszName = new char[MAX_LONGPATH + 1];
+ std::string dumpPath;
+
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (hProcess == NULL)
{
fprintf(stderr, "Invalid process id '%d' error %d\n", pid, GetLastError());
goto exit;
}
+ if (GetModuleBaseNameA(hProcess, NULL, pszName, MAX_LONGPATH) <= 0)
+ {
+ fprintf(stderr, "Get process name FAILED %d\n", GetLastError());
+ goto exit;
+ }
+ if (!FormatDumpName(dumpPath, dumpPathTemplate, pszName, pid))
+ {
+ goto exit;
+ }
+ printf("Writing %s to file %s\n", dumpType, dumpPath.c_str());
- hFile = CreateFileA(dumpPath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+ hFile = CreateFileA(dumpPath.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
- fprintf(stderr, "Invalid dump path '%s' error %d\n", dumpPath, GetLastError());
+ fprintf(stderr, "Invalid dump path '%s' error %d\n", dumpPath.c_str(), GetLastError());
goto exit;
}
diff --git a/src/coreclr/src/debug/createdump/datatarget.cpp b/src/coreclr/src/debug/createdump/datatarget.cpp
index 9051426c6f6c..e5361ec5d423 100644
--- a/src/coreclr/src/debug/createdump/datatarget.cpp
+++ b/src/coreclr/src/debug/createdump/datatarget.cpp
@@ -127,6 +127,7 @@ DumpDataTarget::ReadVirtual(
size_t read = 0;
if (!m_crashInfo.ReadProcessMemory((void*)(ULONG_PTR)address, buffer, size, &read))
{
+ TRACE("DumpDataTarget::ReadVirtual %p %d FAILED\n", (void*)address, size);
*done = 0;
return E_FAIL;
}
diff --git a/src/coreclr/src/debug/createdump/dumpname.cpp b/src/coreclr/src/debug/createdump/dumpname.cpp
new file mode 100644
index 000000000000..751997c6755b
--- /dev/null
+++ b/src/coreclr/src/debug/createdump/dumpname.cpp
@@ -0,0 +1,124 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#include "createdump.h"
+#include
+#ifdef HOST_WINDOWS
+#include
+#endif
+
+//
+// Format the core dump name using a subset of the standard coredump pattern
+// defined here: https://man7.org/linux/man-pages/man5/core.5.html.
+//
+// Supported:
+//
+// %% A single % character.
+// %d PID of dumped process (for backwards createdump compatibility).
+// %p PID of dumped process.
+// %e The process executable filename.
+// %h Hostname return by gethostname().
+// %t Time of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).
+//
+// Unsupported:
+//
+// %c Core file size soft resource limit of crashing process.
+// %E Pathname of executable, with slashes ('/') replaced by exclamation marks ('!').
+// %g Numeric real GID of dumped process.
+// %i TID of thread that triggered core dump, as seen in the PID namespace in which the thread resides.
+// %I TID of thread that triggered core dump, as seen in the initial PID namespace.
+// %P PID of dumped process, as seen in the initial PID namespace.
+// %s Number of signal causing dump.
+// %u Numeric real UID of dumped process.
+//
+bool
+FormatDumpName(std::string& name, const char* pattern, const char* exename, int pid)
+{
+ const char* p = pattern;
+ if (*p == '|')
+ {
+ fprintf(stderr, "Pipe syntax in dump name not supported\n");
+ return false;
+ }
+
+#ifdef HOST_WINDOWS
+ WSAData wsadata;
+ int wsaerr = WSAStartup(1, &wsadata);
+#endif
+
+ while (*p)
+ {
+ if (*p != '%')
+ {
+ name.append(1, *p);
+ }
+ else
+ {
+ switch (*++p)
+ {
+ case '\0':
+ return true;
+
+ case '%':
+ name.append(1, '%');
+ break;
+
+ // process Id
+ case 'd':
+ case 'p':
+ name.append(std::to_string(pid));
+ break;
+
+ // time of dump
+ case 't':
+ time_t dumptime;
+ time(&dumptime);
+ name.append(std::to_string(dumptime));
+ break;
+
+ // hostname
+ case 'h': {
+ ArrayHolder buffer = new char[MAX_LONGPATH + 1];
+ if (gethostname(buffer, MAX_LONGPATH) != 0)
+ {
+ fprintf(stderr, "Could not get the host name for dump name: %d\n",
+#ifdef HOST_WINDOWS
+ WSAGetLastError());
+#else
+ errno);
+#endif
+ return false;
+ }
+ name.append(buffer);
+ break;
+ }
+
+ // executable file name
+ case 'e':
+ name.append(exename);
+ break;
+
+ // executable file path with / replaced with !
+ case 'E':
+ // signal number that caused the dump
+ case 's':
+ // gid
+ case 'g':
+ // coredump size limit
+ case 'c':
+ // the numeric real UID of dumped process
+ case 'u':
+ // thread id that triggered the dump
+ case 'i':
+ case 'I':
+ // pid of dumped process
+ case 'P':
+ default:
+ fprintf(stderr, "Invalid dump name format char '%c'\n", *p);
+ return false;
+ }
+ }
+ ++p;
+ }
+ return true;
+}
diff --git a/src/coreclr/src/debug/createdump/mac.h b/src/coreclr/src/debug/createdump/mac.h
index 16b198e93551..87745903ab18 100644
--- a/src/coreclr/src/debug/createdump/mac.h
+++ b/src/coreclr/src/debug/createdump/mac.h
@@ -68,6 +68,7 @@ typedef struct elf64_note {
Elf64_Word n_type; /* Content type */
} Elf64_Nhdr;
+#if defined(TARGET_AMD64)
struct user_fpregs_struct
{
unsigned short int cwd;
@@ -113,6 +114,25 @@ struct user_regs_struct
unsigned long long int fs;
unsigned long long int gs;
};
+#elif defined(TARGET_ARM64)
+struct user_fpsimd_struct
+{
+ uint64_t vregs[2*32];
+ uint32_t fpcr;
+ uint32_t fpsr;
+};
+
+struct user_regs_struct
+{
+ uint64_t regs[31];
+ uint64_t sp;
+ uint64_t pc;
+ uint32_t pstate;
+};
+#else
+#error Unexpected architecture
+#endif
+
typedef pid_t __pid_t;
diff --git a/src/coreclr/src/debug/createdump/main.cpp b/src/coreclr/src/debug/createdump/main.cpp
index 626175c2903c..4fde335b5aa1 100644
--- a/src/coreclr/src/debug/createdump/main.cpp
+++ b/src/coreclr/src/debug/createdump/main.cpp
@@ -5,14 +5,18 @@
#ifdef HOST_WINDOWS
#define DEFAULT_DUMP_PATH "%TEMP%\\"
-#define DEFAULT_DUMP_TEMPLATE "dump.%d.dmp"
+#define DEFAULT_DUMP_TEMPLATE "dump.%p.dmp"
#else
#define DEFAULT_DUMP_PATH "/tmp/"
-#define DEFAULT_DUMP_TEMPLATE "coredump.%d"
+#define DEFAULT_DUMP_TEMPLATE "coredump.%p"
#endif
const char* g_help = "createdump [options] pid\n"
-"-f, --name - dump path and file name. The pid can be placed in the name with %d. The default is '" DEFAULT_DUMP_PATH DEFAULT_DUMP_TEMPLATE "'\n"
+"-f, --name - dump path and file name. The default is '" DEFAULT_DUMP_PATH DEFAULT_DUMP_TEMPLATE "'. These specifiers are substituted with following values:\n"
+" %p PID of dumped process.\n"
+" %e The process executable filename.\n"
+" %h Hostname return by gethostname().\n"
+" %t Time of dump, expressed as seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).\n"
"-n, --normal - create minidump.\n"
"-h, --withheap - create minidump with heap (default).\n"
"-t, --triage - create triage minidump.\n"
@@ -21,8 +25,6 @@ const char* g_help = "createdump [options] pid\n"
bool g_diagnostics = false;
-bool CreateDump(const char* dumpPathTemplate, int pid, MINIDUMP_TYPE minidumpType);
-
//
// Main entry point
//
@@ -35,10 +37,20 @@ int __cdecl main(const int argc, const char* argv[])
MiniDumpWithFullMemoryInfo |
MiniDumpWithThreadInfo |
MiniDumpWithTokenInformation);
+ const char* dumpType = "minidump with heap";
const char* dumpPathTemplate = nullptr;
int exitCode = 0;
int pid = 0;
+#ifdef __APPLE__
+ char* enabled = getenv("COMPlus_DbgEnableElfDumpOnMacOS");
+ if (enabled == nullptr || strcmp(enabled, "1") != 0)
+ {
+ fprintf(stderr, "MachO coredumps are not supported. To enable ELF coredumps on MacOS, set the COMPlus_DbgEnableElfDumpOnMacOS environment variable to 1.\n");
+ return -1;
+ }
+#endif
+
#ifdef HOST_UNIX
exitCode = PAL_InitializeDLL();
if (exitCode != 0)
@@ -60,11 +72,15 @@ int __cdecl main(const int argc, const char* argv[])
}
else if ((strcmp(*argv, "-n") == 0) || (strcmp(*argv, "--normal") == 0))
{
+ dumpType = "minidump";
minidumpType = (MINIDUMP_TYPE)(MiniDumpNormal |
+ MiniDumpWithDataSegs |
+ MiniDumpWithHandleData |
MiniDumpWithThreadInfo);
}
else if ((strcmp(*argv, "-h") == 0) || (strcmp(*argv, "--withheap") == 0))
{
+ dumpType = "minidump with heap";
minidumpType = (MINIDUMP_TYPE)(MiniDumpWithPrivateReadWriteMemory |
MiniDumpWithDataSegs |
MiniDumpWithHandleData |
@@ -75,11 +91,16 @@ int __cdecl main(const int argc, const char* argv[])
}
else if ((strcmp(*argv, "-t") == 0) || (strcmp(*argv, "--triage") == 0))
{
+ dumpType = "triage minidump";
minidumpType = (MINIDUMP_TYPE)(MiniDumpFilterTriage |
+ MiniDumpWithDataSegs |
+ MiniDumpWithHandleData |
+ MiniDumpFilterModulePaths |
MiniDumpWithThreadInfo);
}
else if ((strcmp(*argv, "-u") == 0) || (strcmp(*argv, "--full") == 0))
{
+ dumpType = "full dump";
minidumpType = (MINIDUMP_TYPE)(MiniDumpWithFullMemory |
MiniDumpWithDataSegs |
MiniDumpWithHandleData |
@@ -102,7 +123,6 @@ int __cdecl main(const int argc, const char* argv[])
if (pid != 0)
{
ArrayHolder tmpPath = new char[MAX_LONGPATH];
- ArrayHolder dumpPath = new char[MAX_LONGPATH];
if (dumpPathTemplate == nullptr)
{
@@ -120,29 +140,7 @@ int __cdecl main(const int argc, const char* argv[])
dumpPathTemplate = tmpPath;
}
- snprintf(dumpPath, MAX_LONGPATH, dumpPathTemplate, pid);
-
- const char* dumpType = "minidump";
- switch (minidumpType)
- {
- case MiniDumpWithPrivateReadWriteMemory:
- dumpType = "minidump with heap";
- break;
-
- case MiniDumpFilterTriage:
- dumpType = "triage minidump";
- break;
-
- case MiniDumpWithFullMemory:
- dumpType = "full dump";
- break;
-
- default:
- break;
- }
- printf("Writing %s to file %s\n", dumpType, (char*)dumpPath);
-
- if (CreateDump(dumpPath, pid, minidumpType))
+ if (CreateDump(dumpPathTemplate, pid, dumpType, minidumpType))
{
printf("Dump successfully written\n");
}
@@ -150,6 +148,7 @@ int __cdecl main(const int argc, const char* argv[])
{
exitCode = -1;
}
+
fflush(stdout);
fflush(stderr);
}
diff --git a/src/coreclr/src/debug/createdump/memoryregion.h b/src/coreclr/src/debug/createdump/memoryregion.h
index c3085108ac7c..9176d3576eaf 100644
--- a/src/coreclr/src/debug/createdump/memoryregion.h
+++ b/src/coreclr/src/debug/createdump/memoryregion.h
@@ -1,7 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-#if defined(__arm__) || defined(__aarch64__)
+#if !defined(PAGE_SIZE) && (defined(__arm__) || defined(__aarch64__))
#define PAGE_SIZE sysconf(_SC_PAGESIZE)
#endif
@@ -124,7 +124,7 @@ struct MemoryRegion
void Trace() const
{
- TRACE("%" PRIA PRIx64 " - %" PRIA PRIx64 " (%06" PRId64 ") %" PRIA PRIx64 " %c%c%c%c%c%c %s\n",
+ TRACE("%" PRIA PRIx64 " - %" PRIA PRIx64 " (%06" PRIx64 ") %" PRIA PRIx64 " %c%c%c%c%c%c %02x %s\n",
m_startAddress,
m_endAddress,
Size() / PAGE_SIZE,
@@ -135,6 +135,7 @@ struct MemoryRegion
(m_flags & MEMORY_REGION_FLAG_SHARED) ? 's' : '-',
(m_flags & MEMORY_REGION_FLAG_PRIVATE) ? 'p' : '-',
(m_flags & MEMORY_REGION_FLAG_MEMORY_BACKED) ? 'b' : '-',
+ m_flags,
m_fileName.c_str());
}
};
diff --git a/src/coreclr/src/debug/createdump/threadinfo.cpp b/src/coreclr/src/debug/createdump/threadinfo.cpp
index f9fd7bbc5a9a..0a663707758f 100644
--- a/src/coreclr/src/debug/createdump/threadinfo.cpp
+++ b/src/coreclr/src/debug/createdump/threadinfo.cpp
@@ -43,8 +43,11 @@ void
ThreadInfo::UnwindNativeFrames(CONTEXT* pContext)
{
uint64_t previousSp = 0;
+ uint64_t previousIp = 0;
+ int ipMatchCount = 0;
- // For each native frame
+ // For each native frame, add a page around the IP and any unwind info not already
+ // added in VisitProgramHeader (Linux) and VisitSection (MacOS) to the dump.
while (true)
{
uint64_t ip = 0, sp = 0;
@@ -54,6 +57,24 @@ ThreadInfo::UnwindNativeFrames(CONTEXT* pContext)
if (ip == 0 || sp <= previousSp) {
break;
}
+ // Break out of the endless loop if the IP matches over a 1000 times. This is a fallback
+ // behavior of libunwind when the module the IP is in doesn't have unwind info and for
+ // simple stack overflows. The stack memory is added to the dump in GetThreadStack and
+ // it isn't necessary to add the same IP page over and over again. The only place this
+ // check won't catch is the stack overflow case that repeats a sequence of IPs over and
+ // over.
+ if (ip == previousIp)
+ {
+ if (ipMatchCount++ > 1000)
+ {
+ TRACE("Unwind: same ip %" PRIA PRIx64 " over 1000 times\n", ip);
+ break;
+ }
+ }
+ else
+ {
+ ipMatchCount = 0;
+ }
// Add two pages around the instruction pointer to the core dump
m_crashInfo.InsertMemoryRegion(ip - PAGE_SIZE, PAGE_SIZE * 2);
@@ -72,6 +93,7 @@ ThreadInfo::UnwindNativeFrames(CONTEXT* pContext)
break;
}
previousSp = sp;
+ previousIp = ip;
}
}
diff --git a/src/coreclr/src/debug/createdump/threadinfomac.cpp b/src/coreclr/src/debug/createdump/threadinfomac.cpp
index a33395f41dad..c9c8db8bb505 100644
--- a/src/coreclr/src/debug/createdump/threadinfomac.cpp
+++ b/src/coreclr/src/debug/createdump/threadinfomac.cpp
@@ -25,6 +25,7 @@ ThreadInfo::Initialize()
m_ppid = 0;
m_tgid = 0;
+#if defined(TARGET_AMD64)
x86_thread_state64_t state;
mach_msg_type_number_t stateCount = x86_THREAD_STATE64_COUNT;
kern_return_t result = ::thread_get_state(Port(), x86_THREAD_STATE64, (thread_state_t)&state, &stateCount);
@@ -88,6 +89,38 @@ ThreadInfo::Initialize()
memcpy(m_fpRegisters.st_space, &fpstate.__fpu_stmm0, sizeof(m_fpRegisters.st_space));
memcpy(m_fpRegisters.xmm_space, &fpstate.__fpu_xmm0, sizeof(m_fpRegisters.xmm_space));
+#elif defined(TARGET_ARM64)
+ arm_thread_state64_t state;
+ mach_msg_type_number_t stateCount = ARM_THREAD_STATE64_COUNT;
+ kern_return_t result = ::thread_get_state(Port(), ARM_THREAD_STATE64, (thread_state_t)&state, &stateCount);
+ if (result != KERN_SUCCESS)
+ {
+ fprintf(stderr, "thread_get_state(%x) FAILED %x %s\n", m_tid, result, mach_error_string(result));
+ return false;
+ }
+
+ memcpy(m_gpRegisters.regs, &state.__x, sizeof(state.__x));
+ m_gpRegisters.regs[29] = arm_thread_state64_get_fp(state);
+ m_gpRegisters.regs[30] = (uint64_t)arm_thread_state64_get_lr_fptr(state);
+
+ m_gpRegisters.sp = arm_thread_state64_get_sp(state);
+ m_gpRegisters.pc = (uint64_t)arm_thread_state64_get_pc_fptr(state);
+
+ arm_neon_state64_t fpstate;
+ stateCount = ARM_NEON_STATE64_COUNT;
+ result = ::thread_get_state(Port(), ARM_NEON_STATE64, (thread_state_t)&fpstate, &stateCount);
+ if (result != KERN_SUCCESS)
+ {
+ fprintf(stderr, "thread_get_state(%x) FAILED %x %s\n", m_tid, result, mach_error_string(result));
+ return false;
+ }
+
+ memcpy(m_fpRegisters.vregs, &fpstate.__v, sizeof(m_fpRegisters.vregs));
+ m_fpRegisters.fpsr = fpstate.__fpsr;
+ m_fpRegisters.fpcr = fpstate.__fpcr;
+#else
+#error Unexpected architecture
+#endif
return true;
}
diff --git a/src/coreclr/src/debug/daccess/CMakeLists.txt b/src/coreclr/src/debug/daccess/CMakeLists.txt
index b683d762885b..64aada0d827e 100644
--- a/src/coreclr/src/debug/daccess/CMakeLists.txt
+++ b/src/coreclr/src/debug/daccess/CMakeLists.txt
@@ -38,18 +38,21 @@ convert_to_absolute_path(DACCESS_SOURCES ${DACCESS_SOURCES})
add_library_clr(daccess ${DACCESS_SOURCES})
set_target_properties(daccess PROPERTIES DAC_COMPONENT TRUE)
-target_precompile_header(TARGET daccess HEADER stdafx.h)
+target_precompile_headers(daccess PRIVATE [["stdafx.h"]])
add_dependencies(daccess eventing_headers)
if(CLR_CMAKE_HOST_OSX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS)
add_definitions(-DUSE_DAC_TABLE_RVA)
+ set(args $<$>:--dynamic> $ ${GENERATED_INCLUDE_DIR}/dactablerva.h)
+
add_custom_command(
OUTPUT ${GENERATED_INCLUDE_DIR}/dactablerva.h
DEPENDS coreclr
VERBATIM
- COMMAND sh ${CLR_DIR}/src/pal/tools/gen-dactable-rva.sh $ ${GENERATED_INCLUDE_DIR}/dactablerva.h
+ COMMAND_EXPAND_LISTS
+ COMMAND sh ${CLR_DIR}/src/pal/tools/gen-dactable-rva.sh ${args}
COMMENT Generating ${GENERATED_INCLUDE_DIR}/dactablerva.h
)
diff --git a/src/coreclr/src/debug/daccess/daccess.cpp b/src/coreclr/src/debug/daccess/daccess.cpp
index e999ec866f7d..0344ddc1a3fb 100644
--- a/src/coreclr/src/debug/daccess/daccess.cpp
+++ b/src/coreclr/src/debug/daccess/daccess.cpp
@@ -3297,6 +3297,10 @@ ClrDataAccess::QueryInterface(THIS_
{
ifaceRet = static_cast(this);
}
+ else if (IsEqualIID(interfaceId, __uuidof(ISOSDacInterface10)))
+ {
+ ifaceRet = static_cast(this);
+ }
else
{
*iface = NULL;
@@ -6635,7 +6639,7 @@ bool ClrDataAccess::GetILImageNameFromNgenImage( LPCWSTR ilExtension,
if (wszFileExtension != 0)
{
LPWSTR wszNextFileExtension = wszFileExtension;
- // Find last occurence
+ // Find last occurrence
do
{
wszFileExtension = wszNextFileExtension;
diff --git a/src/coreclr/src/debug/daccess/dacdbiimpl.cpp b/src/coreclr/src/debug/daccess/dacdbiimpl.cpp
index 4bcd6f2ff4cb..51cb32072d3d 100644
--- a/src/coreclr/src/debug/daccess/dacdbiimpl.cpp
+++ b/src/coreclr/src/debug/daccess/dacdbiimpl.cpp
@@ -468,7 +468,7 @@ BOOL DacDbiInterfaceImpl::IsLeftSideInitialized()
}
-// Determines if a given adddress is a CLR stub.
+// Determines if a given address is a CLR stub.
BOOL DacDbiInterfaceImpl::IsTransitionStub(CORDB_ADDRESS address)
{
DD_ENTER_MAY_THROW;
@@ -2399,7 +2399,7 @@ TypeHandle DacDbiInterfaceImpl::FindLoadedElementType(CorElementType elementType
// Lookup operations run the class loader in non-load mode.
ENABLE_FORBID_GC_LOADER_USE_IN_THIS_SCOPE();
- MethodTable * pMethodTable = (&g_Mscorlib)->GetElementType(elementType);
+ MethodTable * pMethodTable = (&g_CoreLib)->GetElementType(elementType);
return TypeHandle(pMethodTable);
} // DacDbiInterfaceImpl::FindLoadedElementType
@@ -4272,6 +4272,30 @@ void DacDbiInterfaceImpl::GetModuleSimpleName(VMPTR_Module vmModule, IStringHold
IfFailThrow(pStrFilename->AssignCopy(convert.GetUnicode()));
}
+HRESULT DacDbiInterfaceImpl::IsModuleMapped(VMPTR_Module pModule, OUT BOOL *isModuleMapped)
+{
+ LOG((LF_CORDB, LL_INFO10000, "DDBII::IMM - TADDR 0x%x\n", pModule));
+ DD_ENTER_MAY_THROW;
+
+ HRESULT hr = S_FALSE;
+ PTR_Module pTargetModule = pModule.GetDacPtr();
+
+ EX_TRY
+ {
+ PTR_PEFile pPEFile = pTargetModule->GetFile();
+ _ASSERTE(pPEFile != NULL);
+
+ if (pPEFile->HasLoadedIL())
+ {
+ *isModuleMapped = pPEFile->GetLoadedIL()->IsMapped();
+ hr = S_OK;
+ }
+ }
+ EX_CATCH_HRESULT(hr);
+
+ return hr;
+}
+
// Helper to intialize a TargetBuffer from a MemoryRange
//
// Arguments:
@@ -5743,7 +5767,7 @@ void DacDbiInterfaceImpl::GetContext(VMPTR_Thread vmThread, DT_CONTEXT * pContex
if (pFilterContext == NULL)
{
// If the filter context is NULL, then we use the true context of the thread.
- pContextBuffer->ContextFlags = CONTEXT_ALL;
+ pContextBuffer->ContextFlags = DT_CONTEXT_ALL;
HRESULT hr = m_pTarget->GetThreadContext(pThread->GetOSThreadId(),
pContextBuffer->ContextFlags,
sizeof(*pContextBuffer),
@@ -7240,7 +7264,7 @@ HRESULT DacDbiInterfaceImpl::GetArrayLayout(COR_TYPEID id, COR_ARRAY_LAYOUT *pLa
if (mt->IsString())
{
COR_TYPEID token;
- token.token1 = MscorlibBinder::GetElementType(ELEMENT_TYPE_CHAR).GetAddr();
+ token.token1 = CoreLibBinder::GetElementType(ELEMENT_TYPE_CHAR).GetAddr();
token.token2 = 0;
pLayout->componentID = token;
diff --git a/src/coreclr/src/debug/daccess/dacdbiimpl.h b/src/coreclr/src/debug/daccess/dacdbiimpl.h
index 9178e7173626..e7a3dc9b3a09 100644
--- a/src/coreclr/src/debug/daccess/dacdbiimpl.h
+++ b/src/coreclr/src/debug/daccess/dacdbiimpl.h
@@ -363,6 +363,8 @@ class DacDbiInterfaceImpl :
HRESULT GetLoaderHeapMemoryRanges(OUT DacDbiArrayList * pRanges);
+ HRESULT IsModuleMapped(VMPTR_Module pModule, OUT BOOL *isModuleMapped);
+
// retrieves the list of COM interfaces implemented by vmObject, as it is known at
// the time of the call (the list may change as new interface types become available
// in the runtime)
@@ -731,7 +733,7 @@ class DacDbiInterfaceImpl :
void GetModuleForDomainFile(VMPTR_DomainFile vmDomainFile, OUT VMPTR_Module * pModule);
- // Yields true if the adddress is a CLR stub.
+ // Yields true if the address is a CLR stub.
BOOL IsTransitionStub(CORDB_ADDRESS address);
// Get the "type" of address.
diff --git a/src/coreclr/src/debug/daccess/dacimpl.h b/src/coreclr/src/debug/daccess/dacimpl.h
index c0809924bc3e..fdea07159d26 100644
--- a/src/coreclr/src/debug/daccess/dacimpl.h
+++ b/src/coreclr/src/debug/daccess/dacimpl.h
@@ -841,7 +841,8 @@ class ClrDataAccess
public ISOSDacInterface6,
public ISOSDacInterface7,
public ISOSDacInterface8,
- public ISOSDacInterface9
+ public ISOSDacInterface9,
+ public ISOSDacInterface10
{
public:
ClrDataAccess(ICorDebugDataTarget * pTarget, ICLRDataTarget * pLegacyTarget=0);
@@ -1209,6 +1210,12 @@ class ClrDataAccess
// ISOSDacInterface9
virtual HRESULT STDMETHODCALLTYPE GetBreakingChangeVersion(int* pVersion);
+ // ISOSDacInterface10
+ virtual HRESULT STDMETHODCALLTYPE GetObjectComWrappersData(CLRDATA_ADDRESS objAddr, CLRDATA_ADDRESS *rcw, unsigned int count, CLRDATA_ADDRESS *mowList, unsigned int *pNeeded);
+ virtual HRESULT STDMETHODCALLTYPE IsComWrappersCCW(CLRDATA_ADDRESS ccw, BOOL *isComWrappersCCW);
+ virtual HRESULT STDMETHODCALLTYPE GetComWrappersCCWData(CLRDATA_ADDRESS ccw, CLRDATA_ADDRESS *managedObject, int *refCount);
+ virtual HRESULT STDMETHODCALLTYPE IsComWrappersRCW(CLRDATA_ADDRESS rcw, BOOL *isComWrappersRCW);
+ virtual HRESULT STDMETHODCALLTYPE GetComWrappersRCWData(CLRDATA_ADDRESS rcw, CLRDATA_ADDRESS *identity);
//
// ClrDataAccess.
//
@@ -1475,6 +1482,9 @@ class ClrDataAccess
#endif
#ifdef FEATURE_COMWRAPPERS
+ BOOL DACGetComWrappersCCWVTableQIAddress(CLRDATA_ADDRESS ccwPtr, TADDR *vTableAddress, TADDR *qiAddress);
+ BOOL DACIsComWrappersCCW(CLRDATA_ADDRESS ccwPtr);
+ TADDR DACGetManagedObjectWrapperFromCCW(CLRDATA_ADDRESS ccwPtr);
HRESULT DACTryGetComWrappersObjectFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTREF* objRef);
#endif
@@ -4027,4 +4037,36 @@ extern unsigned __int64 g_nFindStackTotalTime;
#endif // #if defined(DAC_MEASURE_PERF)
+#ifdef FEATURE_COMWRAPPERS
+
+// Public contract for ExternalObjectContext, keep in sync with definition in
+// interoplibinterface.cpp
+struct ExternalObjectContextDACnterface
+{
+ PTR_VOID identity;
+ INT_PTR _padding1;
+ DWORD SyncBlockIndex;
+ INT64 _padding3;
+};
+
+typedef DPTR(ExternalObjectContextDACnterface) PTR_ExternalObjectContext;
+
+// Public contract for ManagedObjectWrapper, keep in sync with definition in
+// comwrappers.hpp
+struct ManagedObjectWrapperDACInterface
+{
+ PTR_VOID managedObject;
+ INT32 _padding1;
+ INT32 _padding2;
+ INT_PTR _padding3;
+ INT_PTR _padding4;
+ INT_PTR _padding6;
+ LONGLONG _refCount;
+ INT32 _padding7;
+};
+
+typedef DPTR(ManagedObjectWrapperDACInterface) PTR_ManagedObjectWrapper;
+
+#endif // FEATURE_COMWRAPPERS
+
#endif // #ifndef __DACIMPL_H__
diff --git a/src/coreclr/src/debug/daccess/enummem.cpp b/src/coreclr/src/debug/daccess/enummem.cpp
index 95909b89e3f8..d885ad3dd3bd 100644
--- a/src/coreclr/src/debug/daccess/enummem.cpp
+++ b/src/coreclr/src/debug/daccess/enummem.cpp
@@ -20,6 +20,11 @@
#include "binder.h"
#include "win32threadpool.h"
+#ifdef FEATURE_COMWRAPPERS
+#include
+#include
+#endif // FEATURE_COMWRAPPERS
+
extern HRESULT GetDacTableAddress(ICorDebugDataTarget* dataTarget, ULONG64 baseAddress, PULONG64 dacTableAddress);
#if defined(DAC_MEASURE_PERF)
@@ -276,7 +281,7 @@ HRESULT ClrDataAccess::EnumMemCLRStatic(IN CLRDataEnumMemoryFlags flags)
}
CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED( g_pEEDbgInterfaceImpl.EnumMem(); )
CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED( g_CORDebuggerControlFlags.EnumMem(); )
- CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED( g_Mscorlib.EnumMem(); )
+ CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED( g_CoreLib.EnumMem(); )
CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED( g_pPredefinedArrayTypes[ELEMENT_TYPE_OBJECT].EnumMemoryRegions(flags); )
CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED( StubManager::EnumMemoryRegions(flags); )
CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED( g_pFinalizerThread.EnumMem(); )
@@ -1056,10 +1061,10 @@ HRESULT ClrDataAccess::EnumMemDumpAllThreadsStack(CLRDataEnumMemoryFlags flags)
{
SUPPORTS_DAC;
-#ifdef FEATURE_COMINTEROP
+#if defined(FEATURE_COMINTEROP) || defined(FEATURE_COMWRAPPERS)
// Dump the exception object stored in the WinRT stowed exception
EnumMemStowedException(flags);
-#endif
+#endif // defined(FEATURE_COMINTEROP) || defined(FEATURE_COMWRAPPERS)
HRESULT status = S_OK;
TSIZE_T cbMemoryReported = m_cbMemoryReported;
@@ -1377,6 +1382,10 @@ HRESULT ClrDataAccess::EnumMemStowedException(CLRDataEnumMemoryFlags flags)
return S_OK;
}
+ // Make sure we include the whole stowed exception array so we can debug a stowed exception
+ // in a minidump
+ ReportMem(remoteStowedExceptionArray, stowedExceptionCount * sizeof(TADDR));
+
for (ULONG i = 0; i < stowedExceptionCount; ++i)
{
// Read the i-th stowed exception
@@ -1389,6 +1398,8 @@ HRESULT ClrDataAccess::EnumMemStowedException(CLRDataEnumMemoryFlags flags)
continue;
}
+ ReportMem(remoteStowedException, sizeof(STOWED_EXCEPTION_INFORMATION_HEADER));
+
// check if this is a v2 stowed exception
STOWED_EXCEPTION_INFORMATION_V2 stowedException = { 0 };
if (FAILED(m_pTarget->ReadVirtual(TO_CDADDR(remoteStowedException),
@@ -1399,6 +1410,8 @@ HRESULT ClrDataAccess::EnumMemStowedException(CLRDataEnumMemoryFlags flags)
continue;
}
+ ReportMem(remoteStowedException, sizeof(STOWED_EXCEPTION_INFORMATION_V2));
+
// Read the full v2 stowed exception and get the CCW pointer out of it
if (FAILED(m_pTarget->ReadVirtual(TO_CDADDR(remoteStowedException),
(PBYTE)&stowedException, sizeof(STOWED_EXCEPTION_INFORMATION_V2), &bytesRead))
@@ -1424,21 +1437,36 @@ HRESULT ClrDataAccess::DumpStowedExceptionObject(CLRDataEnumMemoryFlags flags, C
OBJECTREF managedExceptionObject = NULL;
-#ifdef FEATURE_COMINTEROP
- // dump the managed exception object wrapped in CCW
- // memory of the CCW object itself is dumped later by DacInstanceManager::DumpAllInstances
- DacpCCWData ccwData;
- GetCCWData(ccwPtr, &ccwData); // this call collects some memory implicitly
- managedExceptionObject = OBJECTREF(CLRDATA_ADDRESS_TO_TADDR(ccwData.managedObject));
-#endif
#ifdef FEATURE_COMWRAPPERS
+ OBJECTREF wrappedObjAddress;
+ if (DACTryGetComWrappersObjectFromCCW(ccwPtr, &wrappedObjAddress) == S_OK)
+ {
+ managedExceptionObject = wrappedObjAddress;
+ // Now report the CCW itself
+ ReportMem(TO_TADDR(ccwPtr), sizeof(TADDR));
+ TADDR managedObjectWrapperPtrPtr = ccwPtr & InteropLib::ABI::DispatchThisPtrMask;
+ ReportMem(managedObjectWrapperPtrPtr, sizeof(TADDR));
+
+ // Plus its QI and VTable that we query to determine if it is a ComWrappers CCW
+ TADDR vTableAddress = NULL;
+ TADDR qiAddress = NULL;
+ DACGetComWrappersCCWVTableQIAddress(ccwPtr, &vTableAddress, &qiAddress);
+ ReportMem(vTableAddress, sizeof(TADDR));
+ ReportMem(qiAddress, sizeof(TADDR));
+
+ // And the MOW it points to
+ TADDR mow = DACGetManagedObjectWrapperFromCCW(ccwPtr);
+ ReportMem(mow, sizeof(ManagedObjectWrapperDACInterface));
+ }
+#endif
+#ifdef FEATURE_COMINTEROP
if (managedExceptionObject == NULL)
{
- OBJECTREF wrappedObjAddress;
- if (DACTryGetComWrappersObjectFromCCW(ccwPtr, &wrappedObjAddress) == S_OK)
- {
- managedExceptionObject = wrappedObjAddress;
- }
+ // dump the managed exception object wrapped in CCW
+ // memory of the CCW object itself is dumped later by DacInstanceManager::DumpAllInstances
+ DacpCCWData ccwData;
+ GetCCWData(ccwPtr, &ccwData); // this call collects some memory implicitly
+ managedExceptionObject = OBJECTREF(CLRDATA_ADDRESS_TO_TADDR(ccwData.managedObject));
}
#endif
DumpManagedExcepObject(flags, managedExceptionObject);
diff --git a/src/coreclr/src/debug/daccess/fntableaccess.h b/src/coreclr/src/debug/daccess/fntableaccess.h
index b9b73e6fe3b3..9501e0bbeec3 100644
--- a/src/coreclr/src/debug/daccess/fntableaccess.h
+++ b/src/coreclr/src/debug/daccess/fntableaccess.h
@@ -106,7 +106,7 @@ struct FakeStub
UINT32 m_signature;
#else
#ifdef HOST_64BIT
- //README ALIGNEMENT: in retail mode UINT m_numCodeBytes does not align to 16byte for the code
+ //README ALIGNMENT: in retail mode UINT m_numCodeBytes does not align to 16byte for the code
// after the Stub struct. This is to pad properly
UINT m_pad_code_bytes;
#endif // HOST_64BIT
diff --git a/src/coreclr/src/debug/daccess/inspect.cpp b/src/coreclr/src/debug/daccess/inspect.cpp
index 75cfcc3cadce..28375862bd38 100644
--- a/src/coreclr/src/debug/daccess/inspect.cpp
+++ b/src/coreclr/src/debug/daccess/inspect.cpp
@@ -136,7 +136,7 @@ GetTypeFieldValueFlags(TypeHandle typeHandle,
// Perform extra checks to identify well-known classes.
//
- if ((&g_Mscorlib)->IsClass(typeHandle.GetMethodTable(), CLASS__STRING))
+ if ((&g_CoreLib)->IsClass(typeHandle.GetMethodTable(), CLASS__STRING))
{
otherFlags |= CLRDATA_VALUE_IS_STRING;
}
diff --git a/src/coreclr/src/debug/daccess/nidump.cpp b/src/coreclr/src/debug/daccess/nidump.cpp
index 5a0bbfd81006..e59fc9195954 100644
--- a/src/coreclr/src/debug/daccess/nidump.cpp
+++ b/src/coreclr/src/debug/daccess/nidump.cpp
@@ -92,7 +92,6 @@ FORCEINLINE ULONG DacSigUncompressData(
return *pData++;
return DacSigUncompressBigData(pData);
}
-//const static mdToken g_tkCorEncodeToken[4] ={mdtTypeDef, mdtTypeRef, mdtTypeSpec, mdtBaseType};
// uncompress a token
inline mdToken DacSigUncompressToken( // return the token.
@@ -102,7 +101,7 @@ inline mdToken DacSigUncompressToken( // return the token.
mdToken tkType;
tk = DacSigUncompressData(pData);
- tkType = g_tkCorEncodeToken[tk & 0x3];
+ tkType = CorSigDecodeTokenType(tk & 0x3);
tk = TokenFromRid(tk >> 2, tkType);
return tk;
}
@@ -477,7 +476,7 @@ NativeImageDumper::NativeImageDumper(PTR_VOID loadedBase,
m_dis(dis),
m_MetadataSize(0),
m_ILHostCopy(NULL),
- m_isMscorlibHardBound(false),
+ m_isCoreLibHardBound(false),
m_sectionAlignment(0)
{
IfFailThrow(m_display->GetDumpOptions(&m_dumpOptions));
@@ -1132,54 +1131,54 @@ NativeImageDumper::DumpNativeImage()
/* XXX Wed 12/14/2005
* Now for the real insanity. I need to initialize static classes in
- * the DAC. First I need to find mscorlib's dependency entry. Search
+ * the DAC. First I need to find CoreLib's dependency entry. Search
* through all of the dependencies to find the one marked as
- * fIsMscorlib. If I don't find anything marked that way, then "self"
- * is mscorlib.
+ * fIsCoreLib. If I don't find anything marked that way, then "self"
+ * is CoreLib.
*/
- Dependency * mscorlib = NULL;
+ Dependency * corelib = NULL;
for( COUNT_T i = 0; i < m_numDependencies; ++i )
{
- if( m_dependencies[i].fIsMscorlib )
+ if( m_dependencies[i].fIsCoreLib )
{
- mscorlib = &m_dependencies[i];
+ corelib = &m_dependencies[i];
break;
}
}
- //If we're actually dumping mscorlib, remap the mscorlib dependency to our own native image.
- if( (mscorlib == NULL) || !wcscmp(m_name, CoreLibName_W))
+ //If we're actually dumping CoreLib, remap the CoreLib dependency to our own native image.
+ if( (corelib == NULL) || !wcscmp(m_name, CoreLibName_W))
{
- mscorlib = GetDependency(0);
- mscorlib->fIsMscorlib = TRUE;
- _ASSERTE(mscorlib->fIsHardbound);
+ corelib = GetDependency(0);
+ corelib->fIsCoreLib = TRUE;
+ _ASSERTE(corelib->fIsHardbound);
}
- _ASSERTE(mscorlib != NULL);
- if( mscorlib->fIsHardbound )
+ _ASSERTE(corelib != NULL);
+ if( corelib->fIsHardbound )
{
- m_isMscorlibHardBound = true;
+ m_isCoreLibHardBound = true;
}
- if( m_isMscorlibHardBound )
+ if( m_isCoreLibHardBound )
{
//go through the module to the binder.
- PTR_Module mscorlibModule = mscorlib->pModule;
+ PTR_Module corelibModule = corelib->pModule;
- PTR_MscorlibBinder binder = mscorlibModule->m_pBinder;
- g_Mscorlib = *binder;
+ PTR_CoreLibBinder binder = corelibModule->m_pBinder;
+ g_CoreLib = *binder;
- PTR_MethodTable mt = MscorlibBinder::GetExistingClass(CLASS__OBJECT);
+ PTR_MethodTable mt = CoreLibBinder::GetExistingClass(CLASS__OBJECT);
g_pObjectClass = mt;
}
if (g_pObjectClass == NULL)
{
- //if mscorlib is not hard bound, then warn the user (many features of nidump are shut off)
- m_display->ErrorPrintF( "Assembly %S is soft bound to mscorlib. nidump cannot dump MethodTables completely.\n", m_name );
+ //if CoreLib is not hard bound, then warn the user (many features of nidump are shut off)
+ m_display->ErrorPrintF( "Assembly %S is soft bound to CoreLib. nidump cannot dump MethodTables completely.\n", m_name );
// TritonTODO: reason?
// reset "hard bound state"
- m_isMscorlibHardBound = false;
+ m_isCoreLibHardBound = false;
}
}
@@ -1267,8 +1266,8 @@ void NativeImageDumper::TraceDumpDependency(int idx, NativeImageDumper::Dependen
m_display->ErrorPrintF("\tSize: %x (%d)\n", dependency->size, dependency->size);
m_display->ErrorPrintF("\tModule: P=%p, L=%p\n", DataPtrToDisplay(dac_cast(dependency->pModule)),
PTR_TO_TADDR(dependency->pModule));
- m_display->ErrorPrintF("Mscorlib=%s, Hardbound=%s\n",
- (dependency->fIsMscorlib ? "true" : "false"),
+ m_display->ErrorPrintF("CoreLib=%s, Hardbound=%s\n",
+ (dependency->fIsCoreLib ? "true" : "false"),
(dependency->fIsHardbound ? "true" : "false"));
m_display->ErrorPrintF("Name: %S\n", dependency->name);
}
@@ -2391,7 +2390,7 @@ mdAssemblyRef NativeImageDumper::MapAssemblyRefToManifest(mdAssemblyRef token, I
}
else if (wcscmp(szAssemblyName, CoreLibName_W) == 0)
{
- // Mscorlib is special - version number and public key token are ignored.
+ // CoreLib is special - version number and public key token are ignored.
ret = currentRef;
break;
}
@@ -2400,7 +2399,7 @@ mdAssemblyRef NativeImageDumper::MapAssemblyRefToManifest(mdAssemblyRef token, I
metadata.usBuildNumber == 255 &&
metadata.usRevisionNumber == 255)
{
- // WinMDs encode all assemblyrefs with version 255.255.255.255 including CLR assembly dependencies (mscorlib, System).
+ // WinMDs encode all assemblyrefs with version 255.255.255.255 including CLR assembly dependencies (corelib, System).
ret = currentRef;
}
else
@@ -2602,8 +2601,8 @@ NativeImageDumper::Dependency *NativeImageDumper::OpenDependency(int index)
Dependency& dependency = m_dependencies[index];
AppendTokenName(entry->dwAssemblyRef, buf, m_manifestImport, true);
bool isHardBound = !!(entry->signNativeImage != INVALID_NGEN_SIGNATURE);
- SString mscorlibStr(SString::Literal, CoreLibName_W);
- bool isMscorlib = (0 == buf.Compare( mscorlibStr ));
+ SString corelibStr(SString::Literal, CoreLibName_W);
+ bool isCoreLib = (0 == buf.Compare( corelibStr ));
dependency.fIsHardbound = isHardBound;
wcscpy_s(dependency.name, _countof(dependency.name),
(const WCHAR*)buf);
@@ -2703,7 +2702,7 @@ NativeImageDumper::Dependency *NativeImageDumper::OpenDependency(int index)
ofRead,
IID_IMetaDataImport2,
(IUnknown **) &dependency.pImport));
- dependency.fIsMscorlib = isMscorlib;
+ dependency.fIsCoreLib = isCoreLib;
}
m_dependencies[index].entry = entry;
@@ -3716,7 +3715,7 @@ void NativeImageDumper::DumpModule( PTR_Module module )
/* REVISIT_TODO Fri 10/14/2005
* Dump the binder
*/
- PTR_MscorlibBinder binder = module->m_pBinder;
+ PTR_CoreLibBinder binder = module->m_pBinder;
if( NULL != binder )
{
DisplayStartStructureWithOffset( m_pBinder, DPtrToPreferredAddr(binder),
@@ -3726,38 +3725,38 @@ void NativeImageDumper::DumpModule( PTR_Module module )
//these four fields don't have anything useful in ngen images.
DisplayWriteFieldPointer( m_classDescriptions,
DPtrToPreferredAddr(binder->m_classDescriptions),
- MscorlibBinder, MODULE );
+ CoreLibBinder, MODULE );
DisplayWriteFieldPointer( m_methodDescriptions,
DPtrToPreferredAddr(binder->m_methodDescriptions),
- MscorlibBinder, MODULE );
+ CoreLibBinder, MODULE );
DisplayWriteFieldPointer( m_fieldDescriptions,
DPtrToPreferredAddr(binder->m_fieldDescriptions),
- MscorlibBinder, MODULE );
+ CoreLibBinder, MODULE );
DisplayWriteFieldPointer( m_pModule,
DPtrToPreferredAddr(binder->m_pModule),
- MscorlibBinder, MODULE );
+ CoreLibBinder, MODULE );
- DisplayWriteFieldInt( m_cClasses, binder->m_cClasses, MscorlibBinder,
+ DisplayWriteFieldInt( m_cClasses, binder->m_cClasses, CoreLibBinder,
MODULE );
DisplayWriteFieldAddress( m_pClasses,
DPtrToPreferredAddr(binder->m_pClasses),
sizeof(*binder->m_pClasses)
* binder->m_cClasses,
- MscorlibBinder, MODULE );
- DisplayWriteFieldInt( m_cFields, binder->m_cFields, MscorlibBinder,
+ CoreLibBinder, MODULE );
+ DisplayWriteFieldInt( m_cFields, binder->m_cFields, CoreLibBinder,
MODULE );
DisplayWriteFieldAddress( m_pFields,
DPtrToPreferredAddr(binder->m_pFields),
sizeof(*binder->m_pFields)
* binder->m_cFields,
- MscorlibBinder, MODULE );
- DisplayWriteFieldInt( m_cMethods, binder->m_cMethods, MscorlibBinder,
+ CoreLibBinder, MODULE );
+ DisplayWriteFieldInt( m_cMethods, binder->m_cMethods, CoreLibBinder,
MODULE );
DisplayWriteFieldAddress( m_pMethods,
DPtrToPreferredAddr(binder->m_pMethods),
sizeof(*binder->m_pMethods)
* binder->m_cMethods,
- MscorlibBinder, MODULE );
+ CoreLibBinder, MODULE );
DisplayEndStructure( MODULE ); //m_pBinder
}
@@ -6766,11 +6765,11 @@ NativeImageDumper::DumpMethodTable( PTR_MethodTable mt, const char * name,
MethodTableToString( mt, buf );
m_display->ErrorPrintF( "WARNING! MethodTable %S is generic but is not hard bound to its EEClass. Cannot compute generic dictionary sizes.\n", (const WCHAR *)buf );
}
- else if( !m_isMscorlibHardBound )
+ else if( !m_isCoreLibHardBound )
{
/* REVISIT_TODO Mon 8/20/2007
- * If we're not hard bound to mscorlib, most things don't work. They depend on knowing what
- * g_pObjectClass is. Without the hard binding to mscorlib, I can't figure that out.
+ * If we're not hard bound to CoreLib, most things don't work. They depend on knowing what
+ * g_pObjectClass is. Without the hard binding to CoreLib, I can't figure that out.
*/
haveCompleteExtents = false;
}
@@ -7996,7 +7995,7 @@ void NativeImageDumper::DumpMethodDesc( PTR_MethodDesc md, PTR_Module module )
InstantiatedMethodDesc, METHODDESCS );
#ifdef FEATURE_COMINTEROP
- if (imd->IMD_HasComPlusCallInfo())
+ if (imd->IsGenericComPlusCall())
{
PTR_ComPlusCallInfo compluscall = imd->IMD_GetComPlusCallInfo();
DumpComPlusCallInfo( compluscall, METHODDESCS );
diff --git a/src/coreclr/src/debug/daccess/nidump.h b/src/coreclr/src/debug/daccess/nidump.h
index b8c0a04ddb41..a6e9461a475a 100644
--- a/src/coreclr/src/debug/daccess/nidump.h
+++ b/src/coreclr/src/debug/daccess/nidump.h
@@ -305,7 +305,7 @@ class NativeImageDumper
TADDR pMetadataStartTarget;
TADDR pMetadataStartHost;
SIZE_T MetadataSize;
- bool fIsMscorlib;
+ bool fIsCoreLib;
bool fIsHardbound;
WCHAR name[128];
};
@@ -548,9 +548,9 @@ class NativeImageDumper
COUNT_T m_ILSectionSize;
#endif
- //This is true if we are hard bound to mscorlib. This enables various forms of generics dumping and MT
+ //This is true if we are hard bound to corelib. This enables various forms of generics dumping and MT
//dumping that require g_pObjectClass to be set.
- bool m_isMscorlibHardBound;
+ bool m_isCoreLibHardBound;
#if 0
PTR_CCOR_SIGNATURE metadataToHostDAC( PCCOR_SIGNATURE pSig,
diff --git a/src/coreclr/src/debug/daccess/reimpl.cpp b/src/coreclr/src/debug/daccess/reimpl.cpp
index 832522fca7c9..63beae098e6e 100644
--- a/src/coreclr/src/debug/daccess/reimpl.cpp
+++ b/src/coreclr/src/debug/daccess/reimpl.cpp
@@ -97,7 +97,7 @@ DacGetThreadContext(Thread* thread, T_CONTEXT* context)
ULONG32 contextFlags;
- contextFlags = CONTEXT_ALL;
+ contextFlags = DT_CONTEXT_ALL;
HRESULT status =
g_dacImpl->m_pTarget->
diff --git a/src/coreclr/src/debug/daccess/request.cpp b/src/coreclr/src/debug/daccess/request.cpp
index 4c6671149bee..99366e980e26 100644
--- a/src/coreclr/src/debug/daccess/request.cpp
+++ b/src/coreclr/src/debug/daccess/request.cpp
@@ -15,11 +15,15 @@
#include "typestring.h"
#include
#include
+
#ifdef FEATURE_COMINTEROP
#include
#endif // FEATURE_COMINTEROP
+#ifdef FEATURE_COMWRAPPERS
+#include
#include
+#endif // FEATURE_COMWRAPPERS
#ifndef TARGET_UNIX
// It is unfortunate having to include this header just to get the definition of GenericModeBlock
@@ -1058,7 +1062,7 @@ HRESULT ClrDataAccess::GetMethodDescData(
OBJECTREF value = pResolver->GetManagedResolver();
if (value)
{
- FieldDesc *pField = (&g_Mscorlib)->GetField(FIELD__DYNAMICRESOLVER__DYNAMIC_METHOD);
+ FieldDesc *pField = (&g_CoreLib)->GetField(FIELD__DYNAMICRESOLVER__DYNAMIC_METHOD);
_ASSERTE(pField);
value = pField->GetRefValue(value);
if (value)
@@ -4071,58 +4075,93 @@ PTR_IUnknown ClrDataAccess::DACGetCOMIPFromCCW(PTR_ComCallWrapper pCCW, int vtab
#endif
#ifdef FEATURE_COMWRAPPERS
-HRESULT ClrDataAccess::DACTryGetComWrappersObjectFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTREF* objRef)
+BOOL ClrDataAccess::DACGetComWrappersCCWVTableQIAddress(CLRDATA_ADDRESS ccwPtr, TADDR *vTableAddress, TADDR *qiAddress)
{
- if (ccwPtr == 0 || objRef == NULL)
- return E_INVALIDARG;
-
- SOSDacEnter();
+ _ASSERTE(vTableAddress != NULL && qiAddress != NULL);
- // Read CCWs QI address and compare it to the managed object wrapper's implementation.
+ HRESULT hr = S_OK;
ULONG32 bytesRead = 0;
TADDR ccw = CLRDATA_ADDRESS_TO_TADDR(ccwPtr);
- TADDR vTableAddress = NULL;
- IfFailGo(m_pTarget->ReadVirtual(ccw, (PBYTE)&vTableAddress, sizeof(TADDR), &bytesRead));
- if (bytesRead != sizeof(TADDR)
+ *vTableAddress = NULL;
+ if (FAILED(m_pTarget->ReadVirtual(ccw, (PBYTE)vTableAddress, sizeof(TADDR), &bytesRead))
+ || bytesRead != sizeof(TADDR)
|| vTableAddress == NULL)
{
- hr = E_FAIL;
- goto ErrExit;
+ return FALSE;
}
- TADDR qiAddress = NULL;
- IfFailGo(m_pTarget->ReadVirtual(vTableAddress, (PBYTE)&qiAddress, sizeof(TADDR), &bytesRead));
- if (bytesRead != sizeof(TADDR)
+ *qiAddress = NULL;
+ if (FAILED(m_pTarget->ReadVirtual(*vTableAddress, (PBYTE)qiAddress, sizeof(TADDR), &bytesRead))
+ || bytesRead != sizeof(TADDR)
|| qiAddress == NULL)
{
- hr = E_FAIL;
- goto ErrExit;
+ return FALSE;
}
#ifdef TARGET_ARM
// clear the THUMB bit on qiAddress before comparing with known vtable entry
- qiAddress &= ~THUMB_CODE;
+ *qiAddress &= ~THUMB_CODE;
#endif
- if (qiAddress != GetEEFuncEntryPoint(ManagedObjectWrapper_QueryInterface))
+ return TRUE;
+}
+
+BOOL ClrDataAccess::DACIsComWrappersCCW(CLRDATA_ADDRESS ccwPtr)
+{
+ TADDR vTableAddress = NULL;
+ TADDR qiAddress = NULL;
+ if (!DACGetComWrappersCCWVTableQIAddress(ccwPtr, &vTableAddress, &qiAddress))
+ {
+ return FALSE;
+ }
+
+ return qiAddress == GetEEFuncEntryPoint(ManagedObjectWrapper_QueryInterface);
+}
+
+TADDR ClrDataAccess::DACGetManagedObjectWrapperFromCCW(CLRDATA_ADDRESS ccwPtr)
+{
+ if (!DACIsComWrappersCCW(ccwPtr))
+ {
+ return NULL;
+ }
+
+ ULONG32 bytesRead = 0;
+ TADDR managedObjectWrapperPtrPtr = ccwPtr & InteropLib::ABI::DispatchThisPtrMask;
+ TADDR managedObjectWrapperPtr = 0;
+ if (FAILED(m_pTarget->ReadVirtual(managedObjectWrapperPtrPtr, (PBYTE)&managedObjectWrapperPtr, sizeof(TADDR), &bytesRead))
+ || bytesRead != sizeof(TADDR))
+ {
+ return NULL;
+ }
+
+ return managedObjectWrapperPtr;
+}
+
+HRESULT ClrDataAccess::DACTryGetComWrappersObjectFromCCW(CLRDATA_ADDRESS ccwPtr, OBJECTREF* objRef)
+{
+ if (ccwPtr == 0 || objRef == NULL)
+ return E_INVALIDARG;
+
+ SOSDacEnter();
+
+ if (!DACIsComWrappersCCW(ccwPtr))
{
hr = E_FAIL;
goto ErrExit;
}
- // Mask the "dispatch pointer" to get a double pointer to the ManagedObjectWrapper
- TADDR managedObjectWrapperPtrPtr = ccw & InteropLib::ABI::DispatchThisPtrMask;
+ TADDR ccw = CLRDATA_ADDRESS_TO_TADDR(ccwPtr);
// Return ManagedObjectWrapper as an OBJECTHANDLE. (The OBJECTHANDLE is guaranteed to live at offset 0).
- TADDR managedObjectWrapperPtr;
- IfFailGo(m_pTarget->ReadVirtual(managedObjectWrapperPtrPtr, (PBYTE)&managedObjectWrapperPtr, sizeof(TADDR), &bytesRead));
- if (bytesRead != sizeof(TADDR))
+ TADDR managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccwPtr);
+ if (managedObjectWrapperPtr == NULL)
{
hr = E_FAIL;
goto ErrExit;
}
+ ULONG32 bytesRead = 0;
OBJECTHANDLE handle;
IfFailGo(m_pTarget->ReadVirtual(managedObjectWrapperPtr, (PBYTE)&handle, sizeof(OBJECTHANDLE), &bytesRead));
if (bytesRead != sizeof(OBJECTHANDLE))
@@ -4741,3 +4780,236 @@ HRESULT ClrDataAccess::GetBreakingChangeVersion(int* pVersion)
*pVersion = SOS_BREAKING_CHANGE_VERSION;
return S_OK;
}
+
+HRESULT ClrDataAccess::GetObjectComWrappersData(CLRDATA_ADDRESS objAddr, CLRDATA_ADDRESS *rcw, unsigned int count, CLRDATA_ADDRESS *mowList, unsigned int *pNeeded)
+{
+#ifdef FEATURE_COMWRAPPERS
+ if (objAddr == 0 )
+ {
+ return E_INVALIDARG;
+ }
+
+ if (count > 0 && mowList == NULL)
+ {
+ return E_INVALIDARG;
+ }
+
+ SOSDacEnter();
+ if (pNeeded != NULL)
+ {
+ *pNeeded = 0;
+ }
+
+ if (rcw != NULL)
+ {
+ *rcw = 0;
+ }
+
+ PTR_SyncBlock pSyncBlk = PTR_Object(TO_TADDR(objAddr))->PassiveGetSyncBlock();
+ if (pSyncBlk != NULL)
+ {
+ PTR_InteropSyncBlockInfo pInfo = pSyncBlk->GetInteropInfoNoCreate();
+ if (pInfo != NULL)
+ {
+ if (rcw != NULL)
+ {
+ *rcw = TO_TADDR(pInfo->m_externalComObjectContext);
+ }
+
+ DPTR(NewHolder) mapHolder(PTR_TO_MEMBER_TADDR(InteropSyncBlockInfo, pInfo, m_managedObjectComWrapperMap));
+ DPTR(ManagedObjectComWrapperByIdMap *)ppMap(PTR_TO_MEMBER_TADDR(NewHolder, mapHolder, m_value));
+ DPTR(ManagedObjectComWrapperByIdMap) pMap(TO_TADDR(*ppMap));
+
+ CQuickArrayList comWrappers;
+ if (pMap != NULL)
+ {
+ ManagedObjectComWrapperByIdMap::Iterator iter = pMap->Begin();
+ while (iter != pMap->End())
+ {
+ comWrappers.Push(TO_CDADDR(iter->Value()));
+ ++iter;
+
+ }
+ }
+
+ if (pNeeded != NULL)
+ {
+ *pNeeded = (unsigned int)comWrappers.Size();
+ }
+
+ for (SIZE_T pos = 0; pos < comWrappers.Size(); ++pos)
+ {
+ if (pos >= count)
+ {
+ hr = S_FALSE;
+ break;
+ }
+
+ mowList[pos] = comWrappers[pos];
+ }
+ }
+ else
+ {
+ hr = S_FALSE;
+ }
+ }
+ else
+ {
+ hr = S_FALSE;
+ }
+
+ SOSDacLeave();
+ return hr;
+#else // FEATURE_COMWRAPPERS
+ return E_NOTIMPL;
+#endif // FEATURE_COMWRAPPERS
+}
+
+HRESULT ClrDataAccess::IsComWrappersCCW(CLRDATA_ADDRESS ccw, BOOL *isComWrappersCCW)
+{
+#ifdef FEATURE_COMWRAPPERS
+ if (ccw == 0)
+ {
+ return E_INVALIDARG;
+ }
+
+ SOSDacEnter();
+
+ if (isComWrappersCCW != NULL)
+ {
+ TADDR managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccw);
+ *isComWrappersCCW = managedObjectWrapperPtr != NULL;
+ hr = *isComWrappersCCW ? S_OK : S_FALSE;
+ }
+
+ SOSDacLeave();
+ return hr;
+#else // FEATURE_COMWRAPPERS
+ return E_NOTIMPL;
+#endif // FEATURE_COMWRAPPERS
+}
+
+HRESULT ClrDataAccess::GetComWrappersCCWData(CLRDATA_ADDRESS ccw, CLRDATA_ADDRESS *managedObject, int *refCount)
+{
+#ifdef FEATURE_COMWRAPPERS
+ if (ccw == 0)
+ {
+ return E_INVALIDARG;
+ }
+
+ SOSDacEnter();
+
+ TADDR managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccw);
+ if (managedObjectWrapperPtr != NULL)
+ {
+ PTR_ManagedObjectWrapper pMOW(managedObjectWrapperPtr);
+
+ if (managedObject != NULL)
+ {
+ OBJECTREF managedObjectRef;
+ if (SUCCEEDED(DACTryGetComWrappersObjectFromCCW(ccw, &managedObjectRef)))
+ {
+ *managedObject = PTR_HOST_TO_TADDR(managedObjectRef);
+ }
+ else
+ {
+ *managedObject = 0;
+ }
+ }
+
+ if (refCount != NULL)
+ {
+ *refCount = (int)pMOW->_refCount;
+ }
+ }
+ else
+ {
+ // Not a ComWrappers CCW
+ hr = E_INVALIDARG;
+ }
+
+ SOSDacLeave();
+ return hr;
+#else // FEATURE_COMWRAPPERS
+ return E_NOTIMPL;
+#endif // FEATURE_COMWRAPPERS
+}
+
+HRESULT ClrDataAccess::IsComWrappersRCW(CLRDATA_ADDRESS rcw, BOOL *isComWrappersRCW)
+{
+#ifdef FEATURE_COMWRAPPERS
+ if (rcw == 0)
+ {
+ return E_INVALIDARG;
+ }
+
+ SOSDacEnter();
+
+ if (isComWrappersRCW != NULL)
+ {
+ PTR_ExternalObjectContext pRCW(TO_TADDR(rcw));
+ BOOL stillValid = TRUE;
+ if(pRCW->SyncBlockIndex >= SyncBlockCache::s_pSyncBlockCache->m_SyncTableSize)
+ {
+ stillValid = FALSE;
+ }
+
+ PTR_SyncBlock pSyncBlk = NULL;
+ if (stillValid)
+ {
+ PTR_SyncTableEntry ste = PTR_SyncTableEntry(dac_cast(g_pSyncTable) + (sizeof(SyncTableEntry) * pRCW->SyncBlockIndex));
+ pSyncBlk = ste->m_SyncBlock;
+ if(pSyncBlk == NULL)
+ {
+ stillValid = FALSE;
+ }
+ }
+
+ PTR_InteropSyncBlockInfo pInfo = NULL;
+ if (stillValid)
+ {
+ pInfo = pSyncBlk->GetInteropInfoNoCreate();
+ if(pInfo == NULL)
+ {
+ stillValid = FALSE;
+ }
+ }
+
+ if (stillValid)
+ {
+ stillValid = TO_TADDR(pInfo->m_externalComObjectContext) == PTR_HOST_TO_TADDR(pRCW);
+ }
+
+ *isComWrappersRCW = stillValid;
+ hr = *isComWrappersRCW ? S_OK : S_FALSE;
+ }
+
+ SOSDacLeave();
+ return hr;
+#else // FEATURE_COMWRAPPERS
+ return E_NOTIMPL;
+#endif // FEATURE_COMWRAPPERS
+}
+
+HRESULT ClrDataAccess::GetComWrappersRCWData(CLRDATA_ADDRESS rcw, CLRDATA_ADDRESS *identity)
+{
+#ifdef FEATURE_COMWRAPPERS
+ if (rcw == 0)
+ {
+ return E_INVALIDARG;
+ }
+
+ SOSDacEnter();
+
+ PTR_ExternalObjectContext pEOC(TO_TADDR(rcw));
+ if (identity != NULL)
+ {
+ *identity = PTR_CDADDR(pEOC->identity);
+ }
+
+ SOSDacLeave();
+ return hr;
+#else // FEATURE_COMWRAPPERS
+ return E_NOTIMPL;
+#endif // FEATURE_COMWRAPPERS
+}
diff --git a/src/coreclr/src/debug/daccess/stack.cpp b/src/coreclr/src/debug/daccess/stack.cpp
index 09e16b4979ab..94ef49b972ad 100644
--- a/src/coreclr/src/debug/daccess/stack.cpp
+++ b/src/coreclr/src/debug/daccess/stack.cpp
@@ -1391,7 +1391,7 @@ ClrDataFrame::ValueFromDebugInfo(MetaSig* sig,
// XXX Microsoft - Sometimes types can't be looked
// up and this at least allows the value to be used,
// but is it the right behavior?
- argType = TypeHandle(MscorlibBinder::GetElementType(ELEMENT_TYPE_U8));
+ argType = TypeHandle(CoreLibBinder::GetElementType(ELEMENT_TYPE_U8));
valueFlags = 0;
}
else
diff --git a/src/coreclr/src/debug/dbgutil/CMakeLists.txt b/src/coreclr/src/debug/dbgutil/CMakeLists.txt
index bee929f37982..30be04114a49 100644
--- a/src/coreclr/src/debug/dbgutil/CMakeLists.txt
+++ b/src/coreclr/src/debug/dbgutil/CMakeLists.txt
@@ -2,7 +2,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
if(CLR_CMAKE_HOST_WIN32)
#use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
endif(CLR_CMAKE_HOST_WIN32)
if(CLR_CMAKE_HOST_WIN32 OR CLR_CMAKE_HOST_OSX)
diff --git a/src/coreclr/src/debug/dbgutil/machoreader.cpp b/src/coreclr/src/debug/dbgutil/machoreader.cpp
index 155ec15a3af0..fa94b49b8d4a 100644
--- a/src/coreclr/src/debug/dbgutil/machoreader.cpp
+++ b/src/coreclr/src/debug/dbgutil/machoreader.cpp
@@ -401,6 +401,7 @@ MachOReader::ReadString(const char* address, std::string& str)
char c = 0;
if (!ReadMemory((void*)(address + i), &c, sizeof(char)))
{
+ Trace("ERROR: Failed to read string at %p\n", (void*)(address + i));
return false;
}
if (c == '\0')
diff --git a/src/coreclr/src/debug/debug-pal/CMakeLists.txt b/src/coreclr/src/debug/debug-pal/CMakeLists.txt
index 12a0005c0532..213fa59e784c 100644
--- a/src/coreclr/src/debug/debug-pal/CMakeLists.txt
+++ b/src/coreclr/src/debug/debug-pal/CMakeLists.txt
@@ -34,4 +34,6 @@ if(CLR_CMAKE_HOST_UNIX)
endif(CLR_CMAKE_HOST_UNIX)
-_add_library(debug-pal OBJECT ${TWO_WAY_PIPE_SOURCES})
+_add_library(debug-pal_obj OBJECT ${TWO_WAY_PIPE_SOURCES})
+add_library(debug-pal INTERFACE)
+target_sources(debug-pal INTERFACE $)
diff --git a/src/coreclr/src/debug/debug-pal/unix/diagnosticsipc.cpp b/src/coreclr/src/debug/debug-pal/unix/diagnosticsipc.cpp
index 632ac03a44c2..2dc6c8807a65 100644
--- a/src/coreclr/src/debug/debug-pal/unix/diagnosticsipc.cpp
+++ b/src/coreclr/src/debug/debug-pal/unix/diagnosticsipc.cpp
@@ -61,8 +61,8 @@ IpcStream::DiagnosticsIpc *IpcStream::DiagnosticsIpc::Create(const char *const p
"socket");
}
- if (mode == ConnectionMode::CLIENT)
- return new IpcStream::DiagnosticsIpc(-1, &serverAddress, ConnectionMode::CLIENT);
+ if (mode == ConnectionMode::CONNECT)
+ return new IpcStream::DiagnosticsIpc(-1, &serverAddress, ConnectionMode::CONNECT);
#ifdef __APPLE__
mode_t prev_mask = umask(~(S_IRUSR | S_IWUSR)); // This will set the default permission bit to 600
@@ -116,8 +116,8 @@ IpcStream::DiagnosticsIpc *IpcStream::DiagnosticsIpc::Create(const char *const p
bool IpcStream::DiagnosticsIpc::Listen(ErrorCallback callback)
{
- _ASSERTE(mode == ConnectionMode::SERVER);
- if (mode != ConnectionMode::SERVER)
+ _ASSERTE(mode == ConnectionMode::LISTEN);
+ if (mode != ConnectionMode::LISTEN)
{
if (callback != nullptr)
callback("Cannot call Listen on a client connection", -1);
@@ -150,7 +150,7 @@ bool IpcStream::DiagnosticsIpc::Listen(ErrorCallback callback)
IpcStream *IpcStream::DiagnosticsIpc::Accept(ErrorCallback callback)
{
- _ASSERTE(mode == ConnectionMode::SERVER);
+ _ASSERTE(mode == ConnectionMode::LISTEN);
_ASSERTE(_isListening);
sockaddr_un from;
@@ -168,7 +168,7 @@ IpcStream *IpcStream::DiagnosticsIpc::Accept(ErrorCallback callback)
IpcStream *IpcStream::DiagnosticsIpc::Connect(ErrorCallback callback)
{
- _ASSERTE(mode == ConnectionMode::CLIENT);
+ _ASSERTE(mode == ConnectionMode::CONNECT);
sockaddr_un clientAddress{};
clientAddress.sun_family = AF_UNIX;
@@ -194,7 +194,7 @@ IpcStream *IpcStream::DiagnosticsIpc::Connect(ErrorCallback callback)
return nullptr;
}
- return new IpcStream(clientSocket, ConnectionMode::CLIENT);
+ return new IpcStream(clientSocket, ConnectionMode::CONNECT);
}
int32_t IpcStream::DiagnosticsIpc::Poll(IpcPollHandle *rgIpcPollHandles, uint32_t nHandles, int32_t timeoutMs, ErrorCallback callback)
@@ -208,7 +208,7 @@ int32_t IpcStream::DiagnosticsIpc::Poll(IpcPollHandle *rgIpcPollHandles, uint32_
if (rgIpcPollHandles[i].pIpc != nullptr)
{
// SERVER
- _ASSERTE(rgIpcPollHandles[i].pIpc->mode == ConnectionMode::SERVER);
+ _ASSERTE(rgIpcPollHandles[i].pIpc->mode == ConnectionMode::LISTEN);
fd = rgIpcPollHandles[i].pIpc->_serverSocket;
}
else
@@ -246,6 +246,8 @@ int32_t IpcStream::DiagnosticsIpc::Poll(IpcPollHandle *rgIpcPollHandles, uint32_
{
if (pollfds[i].revents != 0)
{
+ if (callback != nullptr)
+ callback("IpcStream::DiagnosticsIpc::Poll - poll revents", (uint32_t)pollfds[i].revents);
// error check FIRST
if (pollfds[i].revents & POLLHUP)
{
@@ -253,21 +255,22 @@ int32_t IpcStream::DiagnosticsIpc::Poll(IpcPollHandle *rgIpcPollHandles, uint32_
// will technically meet the requirements for POLLIN
// i.e., a call to recv/read won't block
rgIpcPollHandles[i].revents = (uint8_t)PollEvents::HANGUP;
- delete[] pollfds;
- return -1;
}
else if ((pollfds[i].revents & (POLLERR|POLLNVAL)))
{
if (callback != nullptr)
callback("Poll error", (uint32_t)pollfds[i].revents);
rgIpcPollHandles[i].revents = (uint8_t)PollEvents::ERR;
- delete[] pollfds;
- return -1;
}
else if (pollfds[i].revents & (POLLIN|POLLPRI))
{
rgIpcPollHandles[i].revents = (uint8_t)PollEvents::SIGNALED;
- break;
+ }
+ else
+ {
+ rgIpcPollHandles[i].revents = (uint8_t)PollEvents::UNKNOWN;
+ if (callback != nullptr)
+ callback("unkown poll response", (uint32_t)pollfds[i].revents);
}
}
}
@@ -341,7 +344,7 @@ bool IpcStream::Read(void *lpBuffer, const uint32_t nBytesToRead, uint32_t &nByt
pfd.fd = _clientSocket;
pfd.events = POLLIN;
int retval = poll(&pfd, 1, timeoutMs);
- if (retval <= 0 || pfd.revents != POLLIN)
+ if (retval <= 0 || !(pfd.revents & POLLIN))
{
// timeout or error
return false;
@@ -382,7 +385,7 @@ bool IpcStream::Write(const void *lpBuffer, const uint32_t nBytesToWrite, uint32
pfd.fd = _clientSocket;
pfd.events = POLLOUT;
int retval = poll(&pfd, 1, timeoutMs);
- if (retval <= 0 || pfd.revents != POLLOUT)
+ if (retval <= 0 || !(pfd.revents & POLLOUT))
{
// timeout or error
return false;
diff --git a/src/coreclr/src/debug/debug-pal/win/diagnosticsipc.cpp b/src/coreclr/src/debug/debug-pal/win/diagnosticsipc.cpp
index 6c1b55e31118..9a28e482342f 100644
--- a/src/coreclr/src/debug/debug-pal/win/diagnosticsipc.cpp
+++ b/src/coreclr/src/debug/debug-pal/win/diagnosticsipc.cpp
@@ -56,8 +56,8 @@ IpcStream::DiagnosticsIpc *IpcStream::DiagnosticsIpc::Create(const char *const p
bool IpcStream::DiagnosticsIpc::Listen(ErrorCallback callback)
{
- _ASSERTE(mode == ConnectionMode::SERVER);
- if (mode != ConnectionMode::SERVER)
+ _ASSERTE(mode == ConnectionMode::LISTEN);
+ if (mode != ConnectionMode::LISTEN)
{
if (callback != nullptr)
callback("Cannot call Listen on a client connection", -1);
@@ -119,6 +119,7 @@ bool IpcStream::DiagnosticsIpc::Listen(ErrorCallback callback)
_hPipe = INVALID_HANDLE_VALUE;
::CloseHandle(_oOverlap.hEvent);
_oOverlap.hEvent = INVALID_HANDLE_VALUE;
+ memset(&_oOverlap, 0, sizeof(OVERLAPPED)); // clear the overlapped objects state
return false;
}
}
@@ -130,7 +131,7 @@ bool IpcStream::DiagnosticsIpc::Listen(ErrorCallback callback)
IpcStream *IpcStream::DiagnosticsIpc::Accept(ErrorCallback callback)
{
_ASSERTE(_isListening);
- _ASSERTE(mode == ConnectionMode::SERVER);
+ _ASSERTE(mode == ConnectionMode::LISTEN);
DWORD dwDummy = 0;
bool fSuccess = GetOverlappedResult(
@@ -147,7 +148,7 @@ IpcStream *IpcStream::DiagnosticsIpc::Accept(ErrorCallback callback)
}
// create new IpcStream using handle and reset the Server object so it can listen again
- IpcStream *pStream = new IpcStream(_hPipe, ConnectionMode::SERVER);
+ IpcStream *pStream = new IpcStream(_hPipe, ConnectionMode::LISTEN);
// reset the server
_hPipe = INVALID_HANDLE_VALUE;
@@ -166,8 +167,8 @@ IpcStream *IpcStream::DiagnosticsIpc::Accept(ErrorCallback callback)
IpcStream *IpcStream::DiagnosticsIpc::Connect(ErrorCallback callback)
{
- _ASSERTE(mode == ConnectionMode::CLIENT);
- if (mode != ConnectionMode::CLIENT)
+ _ASSERTE(mode == ConnectionMode::CONNECT);
+ if (mode != ConnectionMode::CONNECT)
{
if (callback != nullptr)
callback("Cannot call connect on a server connection", 0);
@@ -193,27 +194,38 @@ IpcStream *IpcStream::DiagnosticsIpc::Connect(ErrorCallback callback)
return new IpcStream(hPipe, mode);
}
-void IpcStream::DiagnosticsIpc::Close(bool isShutdown, ErrorCallback)
+void IpcStream::DiagnosticsIpc::Close(bool isShutdown, ErrorCallback callback)
{
// don't attempt cleanup on shutdown and let the OS handle it
if (isShutdown)
+ {
+ if (callback != nullptr)
+ callback("Closing without cleaning underlying handles", 100);
return;
+ }
if (_hPipe != INVALID_HANDLE_VALUE)
{
- if (mode == DiagnosticsIpc::ConnectionMode::SERVER)
+ if (mode == DiagnosticsIpc::ConnectionMode::LISTEN)
{
const BOOL fSuccessDisconnectNamedPipe = ::DisconnectNamedPipe(_hPipe);
_ASSERTE(fSuccessDisconnectNamedPipe != 0);
+ if (fSuccessDisconnectNamedPipe != 0 && callback != nullptr)
+ callback("Failed to disconnect NamedPipe", ::GetLastError());
}
const BOOL fSuccessCloseHandle = ::CloseHandle(_hPipe);
_ASSERTE(fSuccessCloseHandle != 0);
+ if (fSuccessCloseHandle != 0 && callback != nullptr)
+ callback("Failed to close pipe handle", ::GetLastError());
}
if (_oOverlap.hEvent != INVALID_HANDLE_VALUE)
{
- ::CloseHandle(_oOverlap.hEvent);
+ const BOOL fSuccessCloseEvent = ::CloseHandle(_oOverlap.hEvent);
+ _ASSERTE(fSuccessCloseEvent != 0);
+ if (fSuccessCloseEvent != 0 && callback != nullptr)
+ callback("Failed to close overlap event handle", ::GetLastError());
}
}
@@ -230,25 +242,32 @@ IpcStream::~IpcStream()
Close();
}
-void IpcStream::Close(ErrorCallback)
+void IpcStream::Close(ErrorCallback callback)
{
if (_hPipe != INVALID_HANDLE_VALUE)
{
Flush();
- if (_mode == DiagnosticsIpc::ConnectionMode::SERVER)
+ if (_mode == DiagnosticsIpc::ConnectionMode::LISTEN)
{
const BOOL fSuccessDisconnectNamedPipe = ::DisconnectNamedPipe(_hPipe);
_ASSERTE(fSuccessDisconnectNamedPipe != 0);
+ if (fSuccessDisconnectNamedPipe != 0 && callback != nullptr)
+ callback("Failed to disconnect NamedPipe", ::GetLastError());
}
const BOOL fSuccessCloseHandle = ::CloseHandle(_hPipe);
_ASSERTE(fSuccessCloseHandle != 0);
+ if (fSuccessCloseHandle != 0 && callback != nullptr)
+ callback("Failed to close pipe handle", ::GetLastError());
}
if (_oOverlap.hEvent != INVALID_HANDLE_VALUE)
{
- ::CloseHandle(_oOverlap.hEvent);
+ const BOOL fSuccessCloseEvent = ::CloseHandle(_oOverlap.hEvent);
+ _ASSERTE(fSuccessCloseEvent != 0);
+ if (fSuccessCloseEvent != 0 && callback != nullptr)
+ callback("Failed to close overlapped event handle", ::GetLastError());
}
}
@@ -262,7 +281,7 @@ int32_t IpcStream::DiagnosticsIpc::Poll(IpcPollHandle *rgIpcPollHandles, uint32_
if (rgIpcPollHandles[i].pIpc != nullptr)
{
// SERVER
- _ASSERTE(rgIpcPollHandles[i].pIpc->mode == DiagnosticsIpc::ConnectionMode::SERVER);
+ _ASSERTE(rgIpcPollHandles[i].pIpc->mode == DiagnosticsIpc::ConnectionMode::LISTEN);
pHandles[i] = rgIpcPollHandles[i].pIpc->_oOverlap.hEvent;
}
else
@@ -302,6 +321,11 @@ int32_t IpcStream::DiagnosticsIpc::Poll(IpcPollHandle *rgIpcPollHandles, uint32_
return -1;
}
}
+ else
+ {
+ // there's already data to be read
+ pHandles[i] = rgIpcPollHandles[i].pStream->_oOverlap.hEvent;
+ }
}
else
{
@@ -369,12 +393,12 @@ int32_t IpcStream::DiagnosticsIpc::Poll(IpcPollHandle *rgIpcPollHandles, uint32_
if (!fSuccess)
{
DWORD error = ::GetLastError();
- if (error == ERROR_PIPE_NOT_CONNECTED)
+ if (error == ERROR_PIPE_NOT_CONNECTED || error == ERROR_BROKEN_PIPE)
rgIpcPollHandles[index].revents = (uint8_t)IpcStream::DiagnosticsIpc::PollEvents::HANGUP;
else
{
if (callback != nullptr)
- callback("Client connection error", -1);
+ callback("Client connection error", error);
rgIpcPollHandles[index].revents = (uint8_t)IpcStream::DiagnosticsIpc::PollEvents::ERR;
delete[] pHandles;
return -1;
@@ -410,39 +434,43 @@ bool IpcStream::Read(void *lpBuffer, const uint32_t nBytesToRead, uint32_t &nByt
if (!fSuccess)
{
+ // if we're waiting infinitely, only make one syscall
if (timeoutMs == InfiniteTimeout)
{
- fSuccess = GetOverlappedResult(_hPipe,
- overlap,
- &nNumberOfBytesRead,
- true) != 0;
+ fSuccess = GetOverlappedResult(_hPipe, // pipe
+ overlap, // overlapped
+ &nNumberOfBytesRead, // out actual number of bytes read
+ true) != 0; // block until async IO completes
}
else
{
DWORD dwError = GetLastError();
if (dwError == ERROR_IO_PENDING)
{
+ // Wait on overlapped IO event (triggers when async IO is complete regardless of success)
+ // or timeout
DWORD dwWait = WaitForSingleObject(_oOverlap.hEvent, (DWORD)timeoutMs);
if (dwWait == WAIT_OBJECT_0)
{
- // get the result
- fSuccess = GetOverlappedResult(_hPipe,
- overlap,
- &nNumberOfBytesRead,
- true) != 0;
+ // async IO compelted, get the result
+ fSuccess = GetOverlappedResult(_hPipe, // pipe
+ overlap, // overlapped
+ &nNumberOfBytesRead, // out actual number of bytes read
+ true) != 0; // block until async IO completes
}
else
{
- // cancel IO and ensure the cancel happened
- if (CancelIo(_hPipe))
+ // We either timed out or something else went wrong.
+ // For any error, attempt to cancel IO and ensure the cancel happened
+ if (CancelIoEx(_hPipe, overlap) != 0)
{
// check if the async write beat the cancellation
fSuccess = GetOverlappedResult(_hPipe, overlap, &nNumberOfBytesRead, true) != 0;
+ // Failure here isn't recoverable, so return as such
}
}
}
}
- // TODO: Add error handling.
}
nBytesRead = static_cast(nNumberOfBytesRead);
@@ -464,40 +492,43 @@ bool IpcStream::Write(const void *lpBuffer, const uint32_t nBytesToWrite, uint32
if (!fSuccess)
{
- DWORD dwError = GetLastError();
- if (dwError == ERROR_IO_PENDING)
+ // if we're waiting infinitely, only make one syscall
+ if (timeoutMs == InfiniteTimeout)
{
- if (timeoutMs == InfiniteTimeout)
- {
- // if we're waiting infinitely, don't bother with extra kernel call
- fSuccess = GetOverlappedResult(_hPipe,
- overlap,
- &nNumberOfBytesWritten,
- true) != 0;
- }
- else
+ fSuccess = GetOverlappedResult(_hPipe, // pipe
+ overlap, // overlapped
+ &nNumberOfBytesWritten, // out actual number of bytes written
+ true) != 0; // block until async IO completes
+ }
+ else
+ {
+ DWORD dwError = GetLastError();
+ if (dwError == ERROR_IO_PENDING)
{
+ // Wait on overlapped IO event (triggers when async IO is complete regardless of success)
+ // or timeout
DWORD dwWait = WaitForSingleObject(_oOverlap.hEvent, (DWORD)timeoutMs);
if (dwWait == WAIT_OBJECT_0)
{
- // get the result
- fSuccess = GetOverlappedResult(_hPipe,
- overlap,
- &nNumberOfBytesWritten,
- true) != 0;
+ // async IO compelted, get the result
+ fSuccess = GetOverlappedResult(_hPipe, // pipe
+ overlap, // overlapped
+ &nNumberOfBytesWritten, // out actual number of bytes written
+ true) != 0; // block until async IO completes
}
else
{
- // cancel IO and ensure the cancel happened
- if (CancelIo(_hPipe))
+ // We either timed out or something else went wrong.
+ // For any error, attempt to cancel IO and ensure the cancel happened
+ if (CancelIoEx(_hPipe, overlap) != 0)
{
// check if the async write beat the cancellation
fSuccess = GetOverlappedResult(_hPipe, overlap, &nNumberOfBytesWritten, true) != 0;
+ // Failure here isn't recoverable, so return as such
}
}
}
}
- // TODO: Add error handling.
}
nBytesWritten = static_cast(nNumberOfBytesWritten);
diff --git a/src/coreclr/src/debug/di/CMakeLists.txt b/src/coreclr/src/debug/di/CMakeLists.txt
index 6cfedda1d899..55f34bd1ce3e 100644
--- a/src/coreclr/src/debug/di/CMakeLists.txt
+++ b/src/coreclr/src/debug/di/CMakeLists.txt
@@ -50,7 +50,7 @@ set(CORDBDI_HEADERS
if(CLR_CMAKE_HOST_WIN32)
#use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
if (CLR_CMAKE_TARGET_ARCH_AMD64 OR ((CLR_CMAKE_TARGET_ARCH_ARM64 OR CLR_CMAKE_TARGET_ARCH_ARM)
AND NOT DEFINED CLR_CROSS_COMPONENTS_BUILD))
@@ -59,7 +59,10 @@ if(CLR_CMAKE_HOST_WIN32)
if ((CLR_CMAKE_TARGET_ARCH_ARM OR CLR_CMAKE_TARGET_ARCH_ARM64) AND NOT DEFINED CLR_CROSS_COMPONENTS_BUILD)
convert_to_absolute_path(CORDBDI_SOURCES_ASM_FILE ${CORDBDI_SOURCES_ASM_FILE})
- preprocess_compile_asm(TARGET cordbdi ASM_FILES ${CORDBDI_SOURCES_ASM_FILE} OUTPUT_OBJECTS CORDBDI_SOURCES_ASM_FILE)
+ preprocess_files(CORDBDI_SOURCES_ASM_FILE ${CORDBDI_SOURCES_ASM_FILE})
+ if (CMAKE_GENERATOR MATCHES "Visual Studio")
+ compile_asm(TARGET cordbdi ASM_FILES ${CORDBDI_SOURCES_ASM_FILE} OUTPUT_OBJECTS CORDBDI_SOURCES_ASM_FILE)
+ endif()
endif()
elseif(CLR_CMAKE_HOST_UNIX)
@@ -79,5 +82,5 @@ endif (CLR_CMAKE_TARGET_WIN32)
list(APPEND CORDBDI_SOURCES ${CORDBDI_SOURCES_ASM_FILE})
add_library_clr(cordbdi STATIC ${CORDBDI_SOURCES})
-target_precompile_header(TARGET cordbdi HEADER stdafx.h)
+target_precompile_headers(cordbdi PRIVATE stdafx.h)
add_dependencies(cordbdi eventing_headers)
diff --git a/src/coreclr/src/debug/di/eventredirectionpipeline.h b/src/coreclr/src/debug/di/eventredirectionpipeline.h
index f2b3c55d38ad..e219c182980a 100644
--- a/src/coreclr/src/debug/di/eventredirectionpipeline.h
+++ b/src/coreclr/src/debug/di/eventredirectionpipeline.h
@@ -117,7 +117,7 @@ class EventRedirectionPipeline :
// Command parameters for create case.
// Note that we must always physically call CreateProcess on the debuggee so that we get the proper out-parameters
- // from create-processs (eg, target's handle, startup info, etc). So we always attach the auxillary debugger
+ // from create-process (eg, target's handle, startup info, etc). So we always attach the auxillary debugger
// even in the create case. Use "-pr -pb" in Windbg to attach to a create-suspended process.
//
// Common Windbg options:
diff --git a/src/coreclr/src/debug/di/module.cpp b/src/coreclr/src/debug/di/module.cpp
index d02dfdd08146..39f306f7c0f4 100644
--- a/src/coreclr/src/debug/di/module.cpp
+++ b/src/coreclr/src/debug/di/module.cpp
@@ -869,7 +869,7 @@ HRESULT CordbModule::InitPublicMetaDataFromFile(const WCHAR * pszFullPathName,
DWORD dwOpenFlags,
bool validateFileInfo)
{
-#ifdef TARGET_UNIX
+#ifdef HOST_UNIX
// UNIXTODO: Some intricate details of file mapping don't work on Linux as on Windows.
// We have to revisit this and try to fix it for POSIX system.
return E_FAIL;
@@ -1200,6 +1200,10 @@ HRESULT CordbModule::QueryInterface(REFIID id, void **pInterface)
{
*pInterface = static_cast(this);
}
+ else if (id == IID_ICorDebugModule4)
+ {
+ *pInterface = static_cast(this);
+ }
else if (id == IID_IUnknown)
{
*pInterface = static_cast(static_cast(this));
@@ -2752,6 +2756,24 @@ HRESULT CordbModule::GetJITCompilerFlags(DWORD *pdwFlags )
return hr;
}
+HRESULT CordbModule::IsMappedLayout(BOOL *isMapped)
+{
+ VALIDATE_POINTER_TO_OBJECT(isMapped, BOOL*);
+ FAIL_IF_NEUTERED(this);
+
+ HRESULT hr = S_OK;
+ CordbProcess *pProcess = GetProcess();
+
+ ATT_REQUIRE_STOPPED_MAY_FAIL(pProcess);
+ PUBLIC_API_BEGIN(pProcess);
+ {
+ hr = pProcess->GetDAC()->IsModuleMapped(m_vmModule, isMapped);
+ }
+ PUBLIC_API_END(hr);
+
+ return hr;
+}
+
/* ------------------------------------------------------------------------- *
* CordbCode class
* ------------------------------------------------------------------------- */
diff --git a/src/coreclr/src/debug/di/platformspecific.cpp b/src/coreclr/src/debug/di/platformspecific.cpp
index 07652a305641..fb2d8eb92453 100644
--- a/src/coreclr/src/debug/di/platformspecific.cpp
+++ b/src/coreclr/src/debug/di/platformspecific.cpp
@@ -16,10 +16,10 @@
#include "shimremotedatatarget.cpp"
#include "remoteeventchannel.cpp"
#elif WIN32
-#include "WindowsPipeline.cpp"
-#include "EventRedirectionPipeline.cpp"
-#include "ShimLocalDataTarget.cpp"
-#include "LocalEventChannel.cpp"
+#include "windowspipeline.cpp"
+#include "eventredirectionpipeline.cpp"
+#include "shimlocaldatatarget.cpp"
+#include "localeventchannel.cpp"
#endif
#if TARGET_X86
diff --git a/src/coreclr/src/debug/di/rspriv.h b/src/coreclr/src/debug/di/rspriv.h
index 1bb48df2356c..5cbba66aaf18 100644
--- a/src/coreclr/src/debug/di/rspriv.h
+++ b/src/coreclr/src/debug/di/rspriv.h
@@ -2533,7 +2533,7 @@ class CordbAppDomain : public CordbBase,
// Unique objects that represent the use of some
// basic ELEMENT_TYPE's as type parameters. These
- // are shared acrosss the entire process. We could
+ // are shared across the entire process. We could
// go and try to find the classes corresponding to these
// element types but it seems simpler just to keep
// them as special cases.
@@ -4139,7 +4139,8 @@ class CordbProcess :
class CordbModule : public CordbBase,
public ICorDebugModule,
public ICorDebugModule2,
- public ICorDebugModule3
+ public ICorDebugModule3,
+ public ICorDebugModule4
{
public:
CordbModule(CordbProcess * process,
@@ -4234,6 +4235,11 @@ class CordbModule : public CordbBase,
COM_METHOD CreateReaderForInMemorySymbols(REFIID riid,
void** ppObj);
+ //-----------------------------------------------------------
+ // ICorDebugModule4
+ //-----------------------------------------------------------
+ COM_METHOD IsMappedLayout(BOOL *isMapped);
+
//-----------------------------------------------------------
// Internal members
//-----------------------------------------------------------
diff --git a/src/coreclr/src/debug/di/rsthread.cpp b/src/coreclr/src/debug/di/rsthread.cpp
index 600cd485e22d..9f1a2374a75a 100644
--- a/src/coreclr/src/debug/di/rsthread.cpp
+++ b/src/coreclr/src/debug/di/rsthread.cpp
@@ -603,7 +603,7 @@ bool CordbThread::OwnsFrame(CordbFrame * pFrame)
// This routine is a internal helper function for ICorDebugThread2::GetTaskId.
//
// Arguments:
-// pHandle - return thread handle here after fetching from the left side. Can return SWITCHOUT_HANDLE_VALUE.
+// pHandle - return thread handle here after fetching from the left side.
//
// Return Value:
// hr - It can fail with CORDBG_E_THREAD_NOT_SCHEDULED.
@@ -629,12 +629,6 @@ void CordbThread::RefreshHandle(HANDLE * phThread)
IDacDbiInterface * pDAC = GetProcess()->GetDAC();
HANDLE hThread = pDAC->GetThreadHandle(m_vmThreadToken);
- if (hThread == SWITCHOUT_HANDLE_VALUE)
- {
- *phThread = SWITCHOUT_HANDLE_VALUE;
- ThrowHR(CORDBG_E_THREAD_NOT_SCHEDULED);
- }
-
_ASSERTE(hThread != INVALID_HANDLE_VALUE);
PREFAST_ASSUME(hThread != NULL);
@@ -2254,7 +2248,7 @@ HRESULT CordbThread::HasUnhandledException()
// ppStackWalk - out parameter; return the new stackwalker
//
// Return Value:
-// Return S_OK on succcess.
+// Return S_OK on success.
// Return E_FAIL on error.
//
// Notes:
diff --git a/src/coreclr/src/debug/di/rstype.cpp b/src/coreclr/src/debug/di/rstype.cpp
index 36b137949664..3fcb5ee927d6 100644
--- a/src/coreclr/src/debug/di/rstype.cpp
+++ b/src/coreclr/src/debug/di/rstype.cpp
@@ -590,7 +590,7 @@ HRESULT CordbType::MkType(CordbAppDomain * pAppDomain,
pClass->SetIsValueClass(true);
pClass->SetIsValueClassKnown(true);
- // drop through
+ FALLTHROUGH;
case ELEMENT_TYPE_CLASS:
{
@@ -683,7 +683,7 @@ HRESULT CordbType::GetType(CorElementType *pType)
// Determining if something is a VC or not can involve asking the EE.
// We could do it ourselves based on the metadata but it's non-trivial
// determining if a class has System.ValueType as a parent (we have
- // to find and OpenScope the mscorlib.dll which we don't currently do
+ // to find and OpenScope the System.Private.CoreLib.dll which we don't currently do
// on the right-side). But the IsValueClass call can fail if the
// class is not yet loaded on the right side. In that case we
// ignore the failure and return ELEMENT_TYPE_CLASS
@@ -2009,6 +2009,7 @@ void CordbType::TypeToExpandedTypeData(DebuggerIPCE_ExpandedTypeData *data)
}
case ELEMENT_TYPE_END:
_ASSERTE(!"bad element type!");
+ break;
default:
data->elementType = m_elementType;
@@ -2389,6 +2390,7 @@ HRESULT CordbType::GetTypeID(COR_TYPEID *pId)
case ELEMENT_TYPE_BYREF:
case ELEMENT_TYPE_FNPTR:
IfFailThrow(CORDBG_E_UNSUPPORTED);
+ break;
default:
_ASSERTE(!"unexpected element type!");
IfFailThrow(CORDBG_E_UNSUPPORTED);
diff --git a/src/coreclr/src/debug/di/shimremotedatatarget.cpp b/src/coreclr/src/debug/di/shimremotedatatarget.cpp
index 38bf162e430f..9a01508e2115 100644
--- a/src/coreclr/src/debug/di/shimremotedatatarget.cpp
+++ b/src/coreclr/src/debug/di/shimremotedatatarget.cpp
@@ -68,7 +68,7 @@ class ShimRemoteDataTarget : public ShimDataTarget
DbgTransportTarget * m_pProxy;
DbgTransportSession * m_pTransport;
#ifdef FEATURE_REMOTE_PROC_MEM
- int m_fd; // /proc//mem handle
+ DWORD m_memoryHandle; // PAL_ReadProcessMemory handle or UINT32_MAX if fallback
#endif
};
@@ -106,9 +106,7 @@ ShimRemoteDataTarget::ShimRemoteDataTarget(DWORD processId,
m_pContinueStatusChangedUserData = NULL;
#ifdef FEATURE_REMOTE_PROC_MEM
- char memPath[128];
- _snprintf_s(memPath, sizeof(memPath), sizeof(memPath), "/proc/%lu/mem", m_processId);
- m_fd = _open(memPath, 0); // O_RDONLY
+ PAL_OpenProcessMemory(m_processId, &m_memoryHandle);
#endif
}
@@ -135,11 +133,8 @@ ShimRemoteDataTarget::~ShimRemoteDataTarget()
void ShimRemoteDataTarget::Dispose()
{
#ifdef FEATURE_REMOTE_PROC_MEM
- if (m_fd != -1)
- {
- _close(m_fd);
- m_fd = -1;
- }
+ PAL_CloseProcessMemory(m_memoryHandle);
+ m_memoryHandle = UINT32_MAX;
#endif
if (m_pTransport != NULL)
{
@@ -269,10 +264,9 @@ ShimRemoteDataTarget::ReadVirtual(
HRESULT hr = S_OK;
#ifdef FEATURE_REMOTE_PROC_MEM
- if (m_fd != -1)
+ if (m_memoryHandle != UINT32_MAX)
{
- read = _pread(m_fd, pBuffer, cbRequestSize, (ULONG64)address);
- if (read == (size_t)-1)
+ if (!PAL_ReadProcessMemory(m_memoryHandle, (ULONG64)address, pBuffer, cbRequestSize, &read))
{
hr = E_FAIL;
}
diff --git a/src/coreclr/src/debug/ee/amd64/amd64walker.cpp b/src/coreclr/src/debug/ee/amd64/amd64walker.cpp
index 5af7ec728946..16807eedc1b7 100644
--- a/src/coreclr/src/debug/ee/amd64/amd64walker.cpp
+++ b/src/coreclr/src/debug/ee/amd64/amd64walker.cpp
@@ -580,6 +580,7 @@ static int opSize(Amd64InstrDecode::InstrForm form, int pp, bool W, bool L, bool
// P_M6B_or_M4B
case Amd64InstrDecode::InstrForm::MOnly_P_M6B_or_M4B:
opSize = P ? 6 : 4;
+ break;
// M4B
case Amd64InstrDecode::InstrForm::M1st_M4B:
case Amd64InstrDecode::InstrForm::M1st_M4B_I1B:
@@ -833,7 +834,7 @@ void NativeWalker::DecodeInstructionForPatchSkip(const BYTE *address, Instructio
opCodeMap = Primary;
break;
}
- // Fall through
+ FALLTHROUGH;
case 0xc4: // Vex 3-byte
opCodeMap = (OpcodeMap)(int(address[0]) << 8 | (address[1] & 0x1f));
// W is the top bit of opcode2.
@@ -965,7 +966,7 @@ void NativeWalker::DecodeInstructionForPatchSkip(const BYTE *address, Instructio
case 2:
case 3:
pInstrAttrib->m_fIsCall = true;
- // fall through
+ FALLTHROUGH;
case 4:
case 5:
pInstrAttrib->m_fIsAbsBranch = true;
diff --git a/src/coreclr/src/debug/ee/arm64/arm64walker.cpp b/src/coreclr/src/debug/ee/arm64/arm64walker.cpp
index d46b07958b72..ae6e8c1fc293 100644
--- a/src/coreclr/src/debug/ee/arm64/arm64walker.cpp
+++ b/src/coreclr/src/debug/ee/arm64/arm64walker.cpp
@@ -102,6 +102,7 @@ BYTE* NativeWalker::SetupOrSimulateInstructionForPatchSkip(T_CONTEXT * context,
/*
+ Based off ARM DDI 0487F.c (C.4.1)
Modify the patchBypass if the opcode is IP-relative, otherwise return it
The following are the instructions that are IP-relative :
. ADR and ADRP.
@@ -113,9 +114,8 @@ BYTE* NativeWalker::SetupOrSimulateInstructionForPatchSkip(T_CONTEXT * context,
_ASSERTE((UINT_PTR)address == context->Pc);
- if ((opcode & 0x1F000000) == 0x10000000) //ADR & ADRP
+ if ((opcode & 0x1F000000) == 0x10000000) //ADR & ADRP (PC-Relative)
{
-
TADDR immhigh = ((opcode >> 5) & 0x007FFFF) << 2;
TADDR immlow = (opcode & 0x60000000) >> 29;
offset = immhigh | immlow; //ADR
@@ -136,13 +136,10 @@ BYTE* NativeWalker::SetupOrSimulateInstructionForPatchSkip(T_CONTEXT * context,
{
LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x to ADR X%d %p\n", opcode, RegNum, offset));
}
-
-
}
else if ((opcode & 0x3B000000) == 0x18000000) //LDR Literal (General or SIMD)
- {
-
+ {
offset = Expand19bitoffset(opcode);
RegNum = (opcode & 0x1F);
LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x to LDR[SW] | PRFM X%d %p\n", opcode, RegNum, offset));
@@ -187,81 +184,55 @@ BYTE* NativeWalker::SetupOrSimulateInstructionForPatchSkip(T_CONTEXT * context,
{
CORDbgSetInstruction((CORDB_ADDRESS_TYPE *)patchBypass, 0xd503201f); //Add Nop in buffer
- PCODE RegContents;
if ((opcode & 0x3B000000) == 0x18000000) //LDR Literal
{
- RegContents = (PCODE)GetMem(ip);
- if ((opcode & 0x4000000)) //LDR literal for SIMD
+ bool isSimd = ((opcode & 0x4000000) != 0); //LDR literal for SIMD
+ NEON128 SimdRegContents = { 0 };
+ short opc = (opcode >> 30);
+
+ LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x (opc: %x, isSimd: %x)\n", opcode, opc, isSimd));
+
+ switch (opc)
{
- NEON128 SimdRegContents;
- LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x to LDR V%d %p\n", opcode, RegNum, offset));
- short opc = (opcode >> 30);
- switch (opc)
- {
- case 0: //4byte data into St
- SimdRegContents.Low = 0xFFFFFFFF & RegContents; //zero the upper 32bit
- SimdRegContents.High = 0;
+ case 0: //load 4 bytes
+ SimdRegContents.Low = GetMem(ip, 4, /* signExtend */ false);
+ SimdRegContents.High = 0;
+ if (isSimd) //LDR St [imm]
SetSimdReg(context, RegNum, SimdRegContents);
- break;
- case 1: //8byte data into Dt
- SimdRegContents.Low = RegContents;
- SimdRegContents.High = 0;
+ else // LDR Wt [imm]
+ SetReg(context, RegNum, SimdRegContents.Low);
+
+ break;
+ case 1: //load 8 bytes
+ SimdRegContents.Low = GetMem(ip, 8, /* signExtend */ false);
+ SimdRegContents.High = 0;
+ if (isSimd) //LDR Dt [imm]
SetSimdReg(context, RegNum, SimdRegContents);
- break;
- case 2: //SIMD 16 byte data
+ else // LDR Xt [imm]
+ SetReg(context, RegNum, SimdRegContents.Low);
+ break;
+ case 2: //SIMD 16 byte data
+ if (isSimd) //LDR Qt [imm]
+ {
SimdRegContents = GetSimdMem(ip);
SetSimdReg(context, RegNum, SimdRegContents);
- break;
- default:
- LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate Unknown opcode: %x [LDR(litera,SIMD &FP)] \n", opcode));
- _ASSERTE(!("Arm64Walker::Simulated Unknown opcode"));
-
}
- }
- else
- {
- short opc = (opcode >> 30);
- switch (opc)
+ else //LDR St [imm] (sign extendeded)
{
- case 0: //4byte data into Wt
- LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x to LDR W%d %p\n", opcode, RegNum, offset));
- RegContents = 0xFFFFFFFF & RegContents; //zero the upper 32bits
- SetReg(context, RegNum, RegContents);
- break;
-
- case 1: //8byte data into Xt
- LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x to LDR X%d %p\n", opcode, RegNum, offset));
- SetReg(context, RegNum, RegContents);
- break;
-
- case 2: //LDRSW
- LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x to LDRSW X%d %p\n", opcode, RegNum, offset));
- RegContents = 0xFFFFFFFF & RegContents;
-
- if (RegContents & 0x80000000) //Sign extend the Word
- {
- RegContents = 0xFFFFFFFF00000000 | RegContents;
- }
- SetReg(context, RegNum, RegContents);
- break;
- case 3:
- LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x as PRFM ,but do nothing \n", opcode));
-
- break;
- default:
- LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate Unknown opcode: %x [LDR(literal)] \n", opcode));
- _ASSERTE(!("Arm64Walker::Simulated Unknown opcode"));
-
+ SimdRegContents.Low = GetMem(ip, 4, /* signExtend */ true);
+ SetReg(context, RegNum, SimdRegContents.Low);
}
+ break;
+ case 3:
+ LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x as PRFM ,but do nothing \n", opcode));
+ break;
+ default:
+ LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate Unknown opcode: %x [LDR(litera,SIMD &FP)] \n", opcode));
+ _ASSERTE(!("Arm64Walker::Simulated Unknown opcode"));
}
- }
- else
- {
- RegContents = ip;
- SetReg(context, RegNum, RegContents);
- }
+ LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate loadedMemory [Hi: %ull, lo: %ull]\n", SimdRegContents.High, SimdRegContents.Low));
- LOG((LF_CORDB, LL_INFO100000, "Arm64Walker::Simulate opcode: %x to update Reg X[V]%d, as %p \n", opcode, RegNum, GetReg(context, RegNum)));
+ }
}
//else Just execute the opcodes as IS
//{
diff --git a/src/coreclr/src/debug/ee/arm64/dbghelpers.S b/src/coreclr/src/debug/ee/arm64/dbghelpers.S
index 8fc88fa25735..4b9504efec85 100644
--- a/src/coreclr/src/debug/ee/arm64/dbghelpers.S
+++ b/src/coreclr/src/debug/ee/arm64/dbghelpers.S
@@ -22,7 +22,7 @@ NESTED_ENTRY FuncEvalHijack, _TEXT, UnhandledExceptionHandlerUnix
PROLOG_SAVE_REG_PAIR_INDEXED fp, lr, -32
str x0, [sp, #16]
// FuncEvalHijackWorker returns the address we should jump to.
- bl FuncEvalHijackWorker
+ bl C_FUNC(FuncEvalHijackWorker)
EPILOG_STACK_FREE 32
EPILOG_BRANCH_REG x0
@@ -33,7 +33,7 @@ NESTED_END FuncEvalHijack
NESTED_ENTRY ExceptionHijack, _TEXT, UnhandledExceptionHandlerUnix
// make the call
- bl ExceptionHijackWorker
+ bl C_FUNC(ExceptionHijackWorker)
// effective NOP to terminate unwind
mov x3, x3
diff --git a/src/coreclr/src/debug/ee/controller.cpp b/src/coreclr/src/debug/ee/controller.cpp
index 81d7ad6c6042..01396cc3951d 100644
--- a/src/coreclr/src/debug/ee/controller.cpp
+++ b/src/coreclr/src/debug/ee/controller.cpp
@@ -5883,7 +5883,7 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)
// the case we want to use...
fIsJump = true;
- // fall through...
+ FALLTHROUGH;
case WALK_CALL:
LOG((LF_CORDB,LL_INFO10000, "DC::TS:Imm:WALK_CALL ip=%p nextip=%p skipip=%p\n", walker.GetIP(), walker.GetNextIP(), walker.GetSkipIP()));
diff --git a/src/coreclr/src/debug/ee/dac/CMakeLists.txt b/src/coreclr/src/debug/ee/dac/CMakeLists.txt
index ffb05b56bc2b..784ed9ba2265 100644
--- a/src/coreclr/src/debug/ee/dac/CMakeLists.txt
+++ b/src/coreclr/src/debug/ee/dac/CMakeLists.txt
@@ -5,5 +5,5 @@ endif (CLR_CMAKE_TARGET_WIN32)
add_library_clr(cordbee_dac ${CORDBEE_SOURCES_DAC})
set_target_properties(cordbee_dac PROPERTIES DAC_COMPONENT TRUE)
-target_precompile_header(TARGET cordbee_dac HEADER stdafx.h)
+target_precompile_headers(cordbee_dac PRIVATE [["stdafx.h"]])
add_dependencies(cordbee_dac eventing_headers)
diff --git a/src/coreclr/src/debug/ee/debugger.cpp b/src/coreclr/src/debug/ee/debugger.cpp
index 7b2cd48b22ed..79d8dd0e6af2 100644
--- a/src/coreclr/src/debug/ee/debugger.cpp
+++ b/src/coreclr/src/debug/ee/debugger.cpp
@@ -1899,7 +1899,7 @@ void Debugger::CleanupTransportSocket(void)
// Initialize Left-Side debugger object
//
// Return Value:
-// S_OK on successs. May also throw.
+// S_OK on success. May also throw.
//
// Assumptions:
// This is called in the startup path.
@@ -3458,14 +3458,14 @@ void Debugger::getBoundaries(MethodDesc * md,
if (pModule == SystemDomain::SystemModule())
{
- // We don't look up PDBs for mscorlib. This is not quite right, but avoids
+ // We don't look up PDBs for CoreLib. This is not quite right, but avoids
// a bootstrapping problem. When an EXE loads, it has the option of setting
// the COM apartment model to STA if we need to. It is important that no
// other Coinitialize happens before this. Since loading the PDB reader uses
// com we can not come first. However managed code IS run before the COM
// apartment model is set, and thus we have a problem since this code is
// called for when JITTing managed code. We avoid the problem by just
- // bailing for mscorlib.
+ // bailing for CoreLib.
return;
}
@@ -7953,7 +7953,7 @@ void Debugger::ProcessAnyPendingEvals(Thread *pThread)
// Now clear the bit else we'll see it again when we process the Exception notification
// from this upcoming UserAbort exception.
pThread->ResetThreadStateNC(Thread::TSNC_DebuggerReAbort);
- pThread->UserAbort(Thread::TAR_Thread, EEPolicy::TA_Safe, INFINITE, Thread::UAC_Normal);
+ pThread->UserAbort(Thread::TAR_Thread, EEPolicy::TA_Safe, INFINITE);
}
#endif
@@ -10722,6 +10722,7 @@ bool Debugger::HandleIPCEvent(DebuggerIPCEvent * pEvent)
//
// For regular (non-jit) attach, fall through to do an async break.
//
+ FALLTHROUGH;
case DB_IPCE_ASYNC_BREAK:
{
@@ -12138,7 +12139,7 @@ void Debugger::TypeHandleToExpandedTypeInfo(AreValueTypesBoxed boxed,
case ELEMENT_TYPE_VALUETYPE:
if (boxed == OnlyPrimitivesUnboxed || boxed == AllBoxed)
res->elementType = ELEMENT_TYPE_CLASS;
- // drop through
+ FALLTHROUGH;
case ELEMENT_TYPE_CLASS:
{
@@ -12896,7 +12897,7 @@ class EnCSequencePointHelper
//
EnCSequencePointHelper::EnCSequencePointHelper(DebuggerJitInfo *pJitInfo)
: m_pJitInfo(pJitInfo),
- m_pOffsetToHandlerInfo(NULL)
+ m_pOffsetToHandlerInfo(NULL)
{
CONTRACTL
{
@@ -15242,15 +15243,6 @@ HRESULT Debugger::FuncEvalSetup(DebuggerIPCE_FuncEvalInfo *pEvalInfo,
return CORDBG_E_FUNC_EVAL_BAD_START_POINT;
}
- if (MethodDescBackpatchInfoTracker::IsLockOwnedByAnyThread())
- {
- // A thread may have suspended for the debugger while holding the slot backpatching lock while trying to enter
- // cooperative GC mode. If the FuncEval calls a method that is eligible for slot backpatching (virtual or interface
- // methods that are eligible for tiering), the FuncEval may deadlock on trying to acquire the same lock. Fail the
- // FuncEval to avoid the issue.
- return CORDBG_E_FUNC_EVAL_BAD_START_POINT;
- }
-
// Create a DebuggerEval to hold info about this eval while its in progress. Constructor copies the thread's
// CONTEXT.
DebuggerEval *pDE = new (interopsafe, nothrow) DebuggerEval(filterContext, pEvalInfo, fInException);
@@ -15484,7 +15476,7 @@ Debugger::FuncEvalAbort(
//
EX_TRY
{
- hr = pDE->m_thread->UserAbort(Thread::TAR_FuncEval, EEPolicy::TA_Safe, (DWORD)FUNC_EVAL_DEFAULT_TIMEOUT_VALUE, Thread::UAC_Normal);
+ hr = pDE->m_thread->UserAbort(Thread::TAR_FuncEval, EEPolicy::TA_Safe, (DWORD)FUNC_EVAL_DEFAULT_TIMEOUT_VALUE);
if (hr == HRESULT_FROM_WIN32(ERROR_TIMEOUT))
{
hr = S_OK;
@@ -15550,7 +15542,7 @@ Debugger::FuncEvalRudeAbort(
//
EX_TRY
{
- hr = pDE->m_thread->UserAbort(Thread::TAR_FuncEval, EEPolicy::TA_Rude, (DWORD)FUNC_EVAL_DEFAULT_TIMEOUT_VALUE, Thread::UAC_Normal);
+ hr = pDE->m_thread->UserAbort(Thread::TAR_FuncEval, EEPolicy::TA_Rude, (DWORD)FUNC_EVAL_DEFAULT_TIMEOUT_VALUE);
if (hr == HRESULT_FROM_WIN32(ERROR_TIMEOUT))
{
hr = S_OK;
diff --git a/src/coreclr/src/debug/ee/debugger.h b/src/coreclr/src/debug/ee/debugger.h
index 2450ab65d4f9..b149dcc94d33 100644
--- a/src/coreclr/src/debug/ee/debugger.h
+++ b/src/coreclr/src/debug/ee/debugger.h
@@ -725,37 +725,6 @@ class DebuggerRCThread
return GetRCThreadSendBuffer();
}
- DebuggerIPCEvent *GetIPCEventSendBufferContinuation(
- DebuggerIPCEvent *eventCur)
- {
- CONTRACTL
- {
- NOTHROW;
- GC_NOTRIGGER;
- PRECONDITION(eventCur != NULL);
- PRECONDITION(eventCur->next == NULL);
- }
- CONTRACTL_END;
-
- DebuggerIPCEvent *dipce = (DebuggerIPCEvent *) new (nothrow) BYTE [CorDBIPC_BUFFER_SIZE];
- dipce->next = NULL;
-
- LOG((LF_CORDB,LL_INFO1000000, "About to GIPCESBC 0x%x\n",dipce));
-
- if (dipce != NULL)
- {
- eventCur->next = dipce;
- }
-#ifdef _DEBUG
- else
- {
- _ASSERTE( !"GetIPCEventSendBufferContinuation failed to allocate mem!" );
- }
-#endif //_DEBUG
-
- return dipce;
- }
-
// Send an IPCEvent once we're ready for sending. This should be done inbetween
// SENDIPCEVENT_BEGIN & SENDIPCEVENT_END. See definition of SENDIPCEVENT_BEGIN
// for usage pattern
@@ -3392,7 +3361,7 @@ class DebuggerEvalBreakpointInfoSegment
/* ------------------------------------------------------------------------ *
* DebuggerEval class
*
- * Note that arguments get passsed in a block allocated when
+ * Note that arguments get passed in a block allocated when
* the func-eval is set up. The setup phase passes the total count of arguments.
*
* In some situations type arguments must also be passed, e.g.
diff --git a/src/coreclr/src/debug/ee/funceval.cpp b/src/coreclr/src/debug/ee/funceval.cpp
index 0febdcbaef7f..8700b93d1318 100644
--- a/src/coreclr/src/debug/ee/funceval.cpp
+++ b/src/coreclr/src/debug/ee/funceval.cpp
@@ -3886,7 +3886,7 @@ void * STDCALL FuncEvalHijackWorker(DebuggerEval *pDE)
FrameWithCookie FEFrame(pDE, GetIP(&pDE->m_context), false);
FEFrame.Push();
- pDE->m_thread->UserAbort(pDE->m_requester, EEPolicy::TA_Safe, INFINITE, Thread::UAC_Normal);
+ pDE->m_thread->UserAbort(pDE->m_requester, EEPolicy::TA_Safe, INFINITE);
_ASSERTE(!"Should not return from UserAbort here!");
return NULL;
}
diff --git a/src/coreclr/src/debug/ee/i386/dbghelpers.S b/src/coreclr/src/debug/ee/i386/dbghelpers.S
index 16440fb1d0f6..5e8a2e6800d1 100644
--- a/src/coreclr/src/debug/ee/i386/dbghelpers.S
+++ b/src/coreclr/src/debug/ee/i386/dbghelpers.S
@@ -14,7 +14,7 @@ NESTED_ENTRY FuncEvalHijack, _TEXT, UnhandledExceptionHandlerUnix
CHECK_STACK_ALIGNMENT
call C_FUNC(FuncEvalHijackWorker)
add esp, (4 + STK_ALIGN_PADDING)
- jmp eax // return is the patch addresss to jmp to
+ jmp eax // return is the patch address to jmp to
#undef STK_ALIGN_PADDING
NESTED_END FuncEvalHijack, _TEXT
diff --git a/src/coreclr/src/debug/ee/i386/dbghelpers.asm b/src/coreclr/src/debug/ee/i386/dbghelpers.asm
index 7825dee6ab7e..94a1bc921e8e 100644
--- a/src/coreclr/src/debug/ee/i386/dbghelpers.asm
+++ b/src/coreclr/src/debug/ee/i386/dbghelpers.asm
@@ -28,7 +28,7 @@
_FuncEvalHijack@0 proc public
push eax ; the ptr to the DebuggerEval
call _FuncEvalHijackWorker@4
- jmp eax ; return is the patch addresss to jmp to
+ jmp eax ; return is the patch address to jmp to
_FuncEvalHijack@0 endp
diff --git a/src/coreclr/src/debug/ee/wks/CMakeLists.txt b/src/coreclr/src/debug/ee/wks/CMakeLists.txt
index a6891ebb052c..ca3aca44e1ff 100644
--- a/src/coreclr/src/debug/ee/wks/CMakeLists.txt
+++ b/src/coreclr/src/debug/ee/wks/CMakeLists.txt
@@ -9,9 +9,12 @@ if (CLR_CMAKE_TARGET_WIN32)
if(CLR_CMAKE_HOST_ARCH_ARM OR CLR_CMAKE_HOST_ARCH_ARM64)
- preprocess_compile_asm(TARGET cordbee_wks ASM_FILES ${ASM_FILE} OUTPUT_OBJECTS ASM_OBJECTS)
+ preprocess_files(ASM_FILE ${ASM_FILE})
+ if (CMAKE_GENERATOR MATCHES "Visual Studio")
+ compile_asm(TARGET cordbee_wks_obj ASM_FILES ${ASM_FILE} OUTPUT_OBJECTS ASM_OBJECTS)
+ endif()
- add_library_clr(cordbee_wks OBJECT ${CORDBEE_SOURCES_WKS} ${ASM_FILE} ${ASM_OBJECTS})
+ add_library_clr(cordbee_wks_obj OBJECT ${CORDBEE_SOURCES_WKS} ${ASM_FILE} ${ASM_OBJECTS})
else ()
@@ -23,19 +26,21 @@ if (CLR_CMAKE_TARGET_WIN32)
set_source_files_properties(${ASM_FILE} PROPERTIES COMPILE_OPTIONS "${ASM_OPTIONS}")
- add_library_clr(cordbee_wks OBJECT ${CORDBEE_SOURCES_WKS} ${ASM_FILE})
+ add_library_clr(cordbee_wks_obj OBJECT ${CORDBEE_SOURCES_WKS} ${ASM_FILE})
endif()
else ()
if(CLR_CMAKE_HOST_ARCH_AMD64 OR CLR_CMAKE_HOST_ARCH_ARM OR CLR_CMAKE_HOST_ARCH_ARM64 OR CLR_CMAKE_HOST_ARCH_I386)
- add_library_clr(cordbee_wks OBJECT ${CORDBEE_SOURCES_WKS} ../${ARCH_SOURCES_DIR}/dbghelpers.S)
+ add_library_clr(cordbee_wks_obj OBJECT ${CORDBEE_SOURCES_WKS} ../${ARCH_SOURCES_DIR}/dbghelpers.S)
else()
message(FATAL_ERROR "Unknown platform")
endif()
endif (CLR_CMAKE_TARGET_WIN32)
-target_precompile_header(TARGET cordbee_wks HEADER stdafx.h)
-add_dependencies(cordbee_wks eventing_headers)
+target_precompile_headers(cordbee_wks_obj PRIVATE [["stdafx.h"]])
+add_dependencies(cordbee_wks_obj eventing_headers)
+add_library(cordbee_wks INTERFACE)
+target_sources(cordbee_wks INTERFACE $)
diff --git a/src/coreclr/src/debug/ildbsymlib/CMakeLists.txt b/src/coreclr/src/debug/ildbsymlib/CMakeLists.txt
index b5b249228d26..4aea0cfedb4a 100644
--- a/src/coreclr/src/debug/ildbsymlib/CMakeLists.txt
+++ b/src/coreclr/src/debug/ildbsymlib/CMakeLists.txt
@@ -1,6 +1,6 @@
if(CLR_CMAKE_HOST_WIN32)
#use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
endif(CLR_CMAKE_HOST_WIN32)
set( ILDBSYMLIB_SOURCES
@@ -10,5 +10,6 @@ set( ILDBSYMLIB_SOURCES
symwrite.cpp
)
-add_library_clr(ildbsymlib OBJECT ${ILDBSYMLIB_SOURCES})
-
+add_library_clr(ildbsymlib_obj OBJECT ${ILDBSYMLIB_SOURCES})
+add_library(ildbsymlib INTERFACE)
+target_sources(ildbsymlib INTERFACE $)
diff --git a/src/coreclr/src/debug/ildbsymlib/symread.cpp b/src/coreclr/src/debug/ildbsymlib/symread.cpp
index 61588f9f6849..dc12d4fd8c72 100644
--- a/src/coreclr/src/debug/ildbsymlib/symread.cpp
+++ b/src/coreclr/src/debug/ildbsymlib/symread.cpp
@@ -1945,7 +1945,7 @@ SymMethod::GetRanges(
{
// Search through all the sequence points since line might have there
- // IL spread accross multiple ranges (for loops for example)
+ // IL spread across multiple ranges (for loops for example)
if (m_pData->m_pSequencePoints[point].Document() == DocumentEntry &&
line >= m_pData->m_pSequencePoints[point].StartLine() &&
line <= m_pData->m_pSequencePoints[point].EndLine())
diff --git a/src/coreclr/src/debug/inc/dacdbiinterface.h b/src/coreclr/src/debug/inc/dacdbiinterface.h
index 79405d60e3d8..1f99f5f29665 100644
--- a/src/coreclr/src/debug/inc/dacdbiinterface.h
+++ b/src/coreclr/src/debug/inc/dacdbiinterface.h
@@ -2733,6 +2733,9 @@ class IDacDbiInterface
virtual
HRESULT GetLoaderHeapMemoryRanges(OUT DacDbiArrayList *pRanges) = 0;
+ virtual
+ HRESULT IsModuleMapped(VMPTR_Module pModule, OUT BOOL *isModuleMapped) = 0;
+
// The following tag tells the DD-marshalling tool to stop scanning.
// END_MARSHAL
diff --git a/src/coreclr/src/debug/inc/dbgipcevents.h b/src/coreclr/src/debug/inc/dbgipcevents.h
index eda4029c0fb1..6fd2cf197c65 100644
--- a/src/coreclr/src/debug/inc/dbgipcevents.h
+++ b/src/coreclr/src/debug/inc/dbgipcevents.h
@@ -848,7 +848,7 @@ typedef VMPTR_Base VMPTR_CONTEXT;
#endif
// DomainFile is a base-class for a CLR module, with app-domain affinity.
-// For domain-neutral modules (like mscorlib), there is a DomainFile instance
+// For domain-neutral modules (like CoreLib), there is a DomainFile instance
// for each appdomain the module lives in.
// This is the canonical handle ICorDebug uses to a CLR module.
DEFINE_VMPTR(class DomainFile, PTR_DomainFile, VMPTR_DomainFile);
@@ -984,20 +984,9 @@ struct MSLAYOUT IPCEventTypeNameMapping
const char * eventName;
};
-constexpr IPCEventTypeNameMapping DbgIPCEventTypeNames[] =
-{
- #define IPC_EVENT_TYPE0(type, val) { type, #type },
- #define IPC_EVENT_TYPE1(type, val) { type, #type },
- #define IPC_EVENT_TYPE2(type, val) { type, #type },
- #include "dbgipceventtypes.h"
- #undef IPC_EVENT_TYPE2
- #undef IPC_EVENT_TYPE1
- #undef IPC_EVENT_TYPE0
- { DB_IPCE_INVALID_EVENT, "DB_IPCE_Error" }
-};
-
-const size_t nameCount = sizeof(DbgIPCEventTypeNames) / sizeof(DbgIPCEventTypeNames[0]);
+extern const IPCEventTypeNameMapping DbgIPCEventTypeNames[];
+extern const size_t nameCount;
struct MSLAYOUT IPCENames // We use a class/struct so that the function can remain in a shared header file
{
@@ -1028,7 +1017,7 @@ struct MSLAYOUT IPCENames // We use a class/struct so that the function can rema
#undef IPC_EVENT_TYPE0
};
- unsigned int i, lim;
+ size_t i, lim;
if (eventType < DB_IPCE_DEBUGGER_FIRST)
{
diff --git a/src/coreclr/src/debug/inc/dbgtargetcontext.h b/src/coreclr/src/debug/inc/dbgtargetcontext.h
index c4640aa64395..f96a18c008dd 100644
--- a/src/coreclr/src/debug/inc/dbgtargetcontext.h
+++ b/src/coreclr/src/debug/inc/dbgtargetcontext.h
@@ -60,10 +60,11 @@
#define DT_CONTEXT_SEGMENTS (DT_CONTEXT_i386 | 0x00000004L)
#define DT_CONTEXT_FLOATING_POINT (DT_CONTEXT_i386 | 0x00000008L) // 387 state
#define DT_CONTEXT_DEBUG_REGISTERS (DT_CONTEXT_i386 | 0x00000010L)
-
-#define DT_CONTEXT_FULL (DT_CONTEXT_CONTROL | DT_CONTEXT_INTEGER | DT_CONTEXT_SEGMENTS)
#define DT_CONTEXT_EXTENDED_REGISTERS (DT_CONTEXT_i386 | 0x00000020L)
+#define DT_CONTEXT_FULL (DT_CONTEXT_CONTROL | DT_CONTEXT_INTEGER | DT_CONTEXT_SEGMENTS)
+#define DT_CONTEXT_ALL (DT_CONTEXT_CONTROL | DT_CONTEXT_INTEGER | DT_CONTEXT_SEGMENTS | DT_CONTEXT_FLOATING_POINT | DT_CONTEXT_DEBUG_REGISTERS | DT_CONTEXT_EXTENDED_REGISTERS)
+
#define DT_MAXIMUM_SUPPORTED_EXTENSION 512
typedef struct {
diff --git a/src/coreclr/src/debug/inc/dbgtransportsession.h b/src/coreclr/src/debug/inc/dbgtransportsession.h
index 6eb202039ab2..f90f4db12ca7 100644
--- a/src/coreclr/src/debug/inc/dbgtransportsession.h
+++ b/src/coreclr/src/debug/inc/dbgtransportsession.h
@@ -793,7 +793,7 @@ class DbgTransportSession
// Upon receiving a reply message, signal the event on the message to wake up the thread waiting for
// the reply message and close the handle to the event.
- void SignalReplyEvent(Message * pMesssage);
+ void SignalReplyEvent(Message * pMessage);
// Given a message ID, find the matching message in the send queue. If there is no match, return NULL.
// If there is a match, remove the message from the send queue and return it.
diff --git a/src/coreclr/src/debug/inc/diagnosticsipc.h b/src/coreclr/src/debug/inc/diagnosticsipc.h
index 99d670ca6ca5..b5fff7afc65a 100644
--- a/src/coreclr/src/debug/inc/diagnosticsipc.h
+++ b/src/coreclr/src/debug/inc/diagnosticsipc.h
@@ -16,6 +16,7 @@ typedef void (*ErrorCallback)(const char *szMessage, uint32_t code);
class IpcStream final
{
+ friend class IpcStreamFactory;
public:
static constexpr int32_t InfiniteTimeout = -1;
~IpcStream();
@@ -26,11 +27,12 @@ class IpcStream final
class DiagnosticsIpc final
{
+ friend class IpcStreamFactory;
public:
enum ConnectionMode
{
- CLIENT,
- SERVER
+ CONNECT,
+ LISTEN
};
enum class PollEvents : uint8_t
@@ -38,7 +40,8 @@ class IpcStream final
NONE = 0x00, // no events
SIGNALED = 0x01, // ready for use
HANGUP = 0x02, // connection remotely closed
- ERR = 0x04 // other error
+ ERR = 0x04, // error
+ UNKNOWN = 0x80 // unknown state
};
// The bookeeping struct used for polling on server and client structs
@@ -99,7 +102,7 @@ class IpcStream final
sockaddr_un *const _pServerAddress;
bool _isClosed;
- DiagnosticsIpc(const int serverSocket, sockaddr_un *const pServerAddress, ConnectionMode mode = ConnectionMode::SERVER);
+ DiagnosticsIpc(const int serverSocket, sockaddr_un *const pServerAddress, ConnectionMode mode = ConnectionMode::LISTEN);
// Used to unlink the socket so it can be removed from the filesystem
// when the last reference to it is closed.
@@ -110,7 +113,7 @@ class IpcStream final
HANDLE _hPipe = INVALID_HANDLE_VALUE;
OVERLAPPED _oOverlap = {};
- DiagnosticsIpc(const char(&namedPipeName)[MaxNamedPipeNameLength], ConnectionMode mode = ConnectionMode::SERVER);
+ DiagnosticsIpc(const char(&namedPipeName)[MaxNamedPipeNameLength], ConnectionMode mode = ConnectionMode::LISTEN);
#endif /* TARGET_UNIX */
bool _isListening;
@@ -125,13 +128,13 @@ class IpcStream final
private:
#ifdef TARGET_UNIX
int _clientSocket = -1;
- IpcStream(int clientSocket, int serverSocket, DiagnosticsIpc::ConnectionMode mode = DiagnosticsIpc::ConnectionMode::SERVER)
+ IpcStream(int clientSocket, DiagnosticsIpc::ConnectionMode mode = DiagnosticsIpc::ConnectionMode::LISTEN)
: _clientSocket(clientSocket), _mode(mode) {}
#else
HANDLE _hPipe = INVALID_HANDLE_VALUE;
OVERLAPPED _oOverlap = {};
BOOL _isTestReading = false; // used to check whether we are already doing a 0-byte read to test for data
- IpcStream(HANDLE hPipe, DiagnosticsIpc::ConnectionMode mode = DiagnosticsIpc::ConnectionMode::SERVER);
+ IpcStream(HANDLE hPipe, DiagnosticsIpc::ConnectionMode mode = DiagnosticsIpc::ConnectionMode::LISTEN);
#endif /* TARGET_UNIX */
DiagnosticsIpc::ConnectionMode _mode;
diff --git a/src/coreclr/src/debug/runtimeinfo/CMakeLists.txt b/src/coreclr/src/debug/runtimeinfo/CMakeLists.txt
index 99b8f5edd084..5f5778d1899e 100644
--- a/src/coreclr/src/debug/runtimeinfo/CMakeLists.txt
+++ b/src/coreclr/src/debug/runtimeinfo/CMakeLists.txt
@@ -7,5 +7,8 @@ set(RUNTIMEINFO_SOURCES
add_library_clr(runtimeinfo STATIC ${RUNTIMEINFO_SOURCES})
add_dependencies(runtimeinfo coreclr_module_index_header)
-add_dependencies(runtimeinfo mscordaccore_module_index_header)
-add_dependencies(runtimeinfo mscordbi_module_index_header)
+
+if (NOT (CLR_CMAKE_TARGET_WIN32 AND (CLR_CMAKE_TARGET_ARCH_I386 OR CLR_CMAKE_TARGET_ARCH_ARM) AND CLR_CMAKE_HOST_ARCH_AMD64))
+ add_dependencies(runtimeinfo mscordaccore_module_index_header)
+ add_dependencies(runtimeinfo mscordbi_module_index_header)
+endif()
\ No newline at end of file
diff --git a/src/coreclr/src/debug/shared/utils.cpp b/src/coreclr/src/debug/shared/utils.cpp
index 5363e30ee8a8..b9c7d72db3f7 100644
--- a/src/coreclr/src/debug/shared/utils.cpp
+++ b/src/coreclr/src/debug/shared/utils.cpp
@@ -200,3 +200,17 @@ void ExportILToNativeMap(ULONG32 cMap, // [in] Min size of mapExt, m
#endif // _DEBUG
}
}
+
+const IPCEventTypeNameMapping DbgIPCEventTypeNames[] =
+{
+ #define IPC_EVENT_TYPE0(type, val) { type, #type },
+ #define IPC_EVENT_TYPE1(type, val) { type, #type },
+ #define IPC_EVENT_TYPE2(type, val) { type, #type },
+ #include "dbgipceventtypes.h"
+ #undef IPC_EVENT_TYPE2
+ #undef IPC_EVENT_TYPE1
+ #undef IPC_EVENT_TYPE0
+ { DB_IPCE_INVALID_EVENT, "DB_IPCE_Error" }
+};
+
+const size_t nameCount = sizeof(DbgIPCEventTypeNames) / sizeof(DbgIPCEventTypeNames[0]);
diff --git a/src/coreclr/src/debug/shim/CMakeLists.txt b/src/coreclr/src/debug/shim/CMakeLists.txt
index 6517eb73327a..2e2c923d6c49 100644
--- a/src/coreclr/src/debug/shim/CMakeLists.txt
+++ b/src/coreclr/src/debug/shim/CMakeLists.txt
@@ -1,6 +1,6 @@
if(CLR_CMAKE_HOST_WIN32)
#use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
add_definitions(-DHOST_WINDOWS)
endif(CLR_CMAKE_HOST_WIN32)
diff --git a/src/coreclr/src/debug/shim/debugshim.cpp b/src/coreclr/src/debug/shim/debugshim.cpp
index 25e7a25d6764..b86c8eb0cfcc 100644
--- a/src/coreclr/src/debug/shim/debugshim.cpp
+++ b/src/coreclr/src/debug/shim/debugshim.cpp
@@ -50,6 +50,31 @@ typedef HRESULT (STDAPICALLTYPE *OpenVirtualProcess2FnPtr)(ULONG64 clrInstanceI
typedef HMODULE (STDAPICALLTYPE *LoadLibraryWFnPtr)(LPCWSTR lpLibFileName);
+static bool IsTargetWindows(ICorDebugDataTarget* pDataTarget)
+{
+ CorDebugPlatform targetPlatform;
+
+ HRESULT result = pDataTarget->GetPlatform(&targetPlatform);
+
+ if(FAILED(result))
+ {
+ _ASSERTE(!"Unexpected error");
+ return false;
+ }
+
+ switch (targetPlatform)
+ {
+ case CORDB_PLATFORM_WINDOWS_X86:
+ case CORDB_PLATFORM_WINDOWS_AMD64:
+ case CORDB_PLATFORM_WINDOWS_IA64:
+ case CORDB_PLATFORM_WINDOWS_ARM:
+ case CORDB_PLATFORM_WINDOWS_ARM64:
+ return true;
+ default:
+ return false;
+ }
+}
+
// Implementation of ICLRDebugging::OpenVirtualProcess
//
// Arguments:
@@ -212,7 +237,7 @@ STDMETHODIMP CLRDebuggingImpl::OpenVirtualProcess(
_ASSERTE(pFlags == NULL || *pFlags == 0);
}
}
-#ifdef TARGET_UNIX
+#ifdef HOST_UNIX
else
{
// On Linux/MacOS the DAC module handle needs to be re-created using the DAC PAL instance
@@ -232,7 +257,7 @@ STDMETHODIMP CLRDebuggingImpl::OpenVirtualProcess(
hr = E_HANDLE;
}
}
-#endif // TARGET_UNIX
+#endif // HOST_UNIX
}
// If no errors so far and "OpenVirtualProcessImpl2" doesn't exist
@@ -277,7 +302,7 @@ STDMETHODIMP CLRDebuggingImpl::OpenVirtualProcess(
if (pDacModulePath != NULL)
{
-#ifdef TARGET_UNIX
+#ifdef HOST_UNIX
free(pDacModulePath);
#else
CoTaskMemFree(pDacModulePath);
@@ -286,7 +311,7 @@ STDMETHODIMP CLRDebuggingImpl::OpenVirtualProcess(
if (pDbiModulePath != NULL)
{
-#ifdef TARGET_UNIX
+#ifdef HOST_UNIX
free(pDbiModulePath);
#else
CoTaskMemFree(pDbiModulePath);
@@ -409,193 +434,198 @@ HRESULT CLRDebuggingImpl::GetCLRInfo(ICorDebugDataTarget* pDataTarget,
__out_z __inout_ecount(dwDacNameCharCount) WCHAR* pDacName,
DWORD dwDacNameCharCount)
{
-#ifndef TARGET_UNIX
- WORD imageFileMachine = 0;
- DWORD resourceSectionRVA = 0;
- HRESULT hr = GetMachineAndResourceSectionRVA(pDataTarget, moduleBaseAddress, &imageFileMachine, &resourceSectionRVA);
-
- // We want the version resource which has type = RT_VERSION = 16, name = 1, language = 0x409
- DWORD versionResourceRVA = 0;
- DWORD versionResourceSize = 0;
- if(SUCCEEDED(hr))
- {
- hr = GetResourceRvaFromResourceSectionRva(pDataTarget, moduleBaseAddress, resourceSectionRVA, 16, 1, 0x409,
- &versionResourceRVA, &versionResourceSize);
- }
-
- // At last we get our version info
- VS_FIXEDFILEINFO fixedFileInfo = {0};
- if(SUCCEEDED(hr))
- {
- // The version resource has 3 words, then the unicode string "VS_VERSION_INFO"
- // (16 WCHARS including the null terminator)
- // then padding to a 32-bit boundary, then the VS_FIXEDFILEINFO struct
- DWORD fixedFileInfoRVA = ((versionResourceRVA + 3*2 + 16*2 + 3)/4)*4;
- hr = ReadFromDataTarget(pDataTarget, moduleBaseAddress + fixedFileInfoRVA, (BYTE*)&fixedFileInfo, sizeof(fixedFileInfo));
- }
-
- //Verify the signature on the version resource
- if(SUCCEEDED(hr) && fixedFileInfo.dwSignature != PE_FIXEDFILEINFO_SIGNATURE)
- {
- hr = CORDBG_E_NOT_CLR;
- }
-
- // Record the version information
- if(SUCCEEDED(hr))
- {
- pVersion->wMajor = (WORD) (fixedFileInfo.dwProductVersionMS >> 16);
- pVersion->wMinor = (WORD) (fixedFileInfo.dwProductVersionMS & 0xFFFF);
- pVersion->wBuild = (WORD) (fixedFileInfo.dwProductVersionLS >> 16);
- pVersion->wRevision = (WORD) (fixedFileInfo.dwProductVersionLS & 0xFFFF);
- }
-
- // Now grab the special clr debug info resource
- // We may need to scan a few different names searching though...
- // 1) CLRDEBUGINFO where host_os = 'WINDOWS' or 'CORESYS' and host_arch = 'X86' or 'ARM' or 'AMD64'
- // 2) For back-compat if the host os is windows and the host architecture matches the target then CLRDEBUGINFO is used with no suffix.
- DWORD debugResourceRVA = 0;
- DWORD debugResourceSize = 0;
- BOOL useCrossPlatformNaming = FALSE;
- if(SUCCEEDED(hr))
+#ifdef HOST_WINDOWS
+ if(IsTargetWindows(pDataTarget))
{
- // the initial state is that we haven't found a proper resource
- HRESULT hrGetResource = E_FAIL;
-
- // First check for the resource which has type = RC_DATA = 10, name = "CLRDEBUGINFO", language = 0
-#if defined (HOST_WINDOWS) && defined(HOST_X86)
- const WCHAR * resourceName = W("CLRDEBUGINFOWINDOWSX86");
-#endif
+ WORD imageFileMachine = 0;
+ DWORD resourceSectionRVA = 0;
+ HRESULT hr = GetMachineAndResourceSectionRVA(pDataTarget, moduleBaseAddress, &imageFileMachine, &resourceSectionRVA);
-#if !defined (HOST_WINDOWS) && defined(HOST_X86)
- const WCHAR * resourceName = W("CLRDEBUGINFOCORESYSX86");
-#endif
-
-#if defined (HOST_WINDOWS) && defined(HOST_AMD64)
- const WCHAR * resourceName = W("CLRDEBUGINFOWINDOWSAMD64");
-#endif
-
-#if !defined (HOST_WINDOWS) && defined(HOST_AMD64)
- const WCHAR * resourceName = W("CLRDEBUGINFOCORESYSAMD64");
-#endif
-
-#if defined (HOST_WINDOWS) && defined(HOST_ARM64)
- const WCHAR * resourceName = W("CLRDEBUGINFOWINDOWSARM64");
-#endif
-
-#if !defined (HOST_WINDOWS) && defined(HOST_ARM64)
- const WCHAR * resourceName = W("CLRDEBUGINFOCORESYSARM64");
-#endif
+ // We want the version resource which has type = RT_VERSION = 16, name = 1, language = 0x409
+ DWORD versionResourceRVA = 0;
+ DWORD versionResourceSize = 0;
+ if(SUCCEEDED(hr))
+ {
+ hr = GetResourceRvaFromResourceSectionRva(pDataTarget, moduleBaseAddress, resourceSectionRVA, 16, 1, 0x409,
+ &versionResourceRVA, &versionResourceSize);
+ }
-#if defined (HOST_WINDOWS) && defined(HOST_ARM)
- const WCHAR * resourceName = W("CLRDEBUGINFOWINDOWSARM");
-#endif
+ // At last we get our version info
+ VS_FIXEDFILEINFO fixedFileInfo = {0};
+ if(SUCCEEDED(hr))
+ {
+ // The version resource has 3 words, then the unicode string "VS_VERSION_INFO"
+ // (16 WCHARS including the null terminator)
+ // then padding to a 32-bit boundary, then the VS_FIXEDFILEINFO struct
+ DWORD fixedFileInfoRVA = ((versionResourceRVA + 3*2 + 16*2 + 3)/4)*4;
+ hr = ReadFromDataTarget(pDataTarget, moduleBaseAddress + fixedFileInfoRVA, (BYTE*)&fixedFileInfo, sizeof(fixedFileInfo));
+ }
-#if !defined (HOST_WINDOWS) && defined(HOST_ARM)
- const WCHAR * resourceName = W("CLRDEBUGINFOCORESYSARM");
-#endif
+ //Verify the signature on the version resource
+ if(SUCCEEDED(hr) && fixedFileInfo.dwSignature != PE_FIXEDFILEINFO_SIGNATURE)
+ {
+ hr = CORDBG_E_NOT_CLR;
+ }
- hrGetResource = GetResourceRvaFromResourceSectionRvaByName(pDataTarget, moduleBaseAddress, resourceSectionRVA, 10, resourceName, 0,
- &debugResourceRVA, &debugResourceSize);
- useCrossPlatformNaming = SUCCEEDED(hrGetResource);
+ // Record the version information
+ if(SUCCEEDED(hr))
+ {
+ pVersion->wMajor = (WORD) (fixedFileInfo.dwProductVersionMS >> 16);
+ pVersion->wMinor = (WORD) (fixedFileInfo.dwProductVersionMS & 0xFFFF);
+ pVersion->wBuild = (WORD) (fixedFileInfo.dwProductVersionLS >> 16);
+ pVersion->wRevision = (WORD) (fixedFileInfo.dwProductVersionLS & 0xFFFF);
+ }
+ // Now grab the special clr debug info resource
+ // We may need to scan a few different names searching though...
+ // 1) CLRDEBUGINFO where host_os = 'WINDOWS' or 'CORESYS' and host_arch = 'X86' or 'ARM' or 'AMD64'
+ // 2) For back-compat if the host os is windows and the host architecture matches the target then CLRDEBUGINFO is used with no suffix.
+ DWORD debugResourceRVA = 0;
+ DWORD debugResourceSize = 0;
+ BOOL useCrossPlatformNaming = FALSE;
+ if(SUCCEEDED(hr))
+ {
+ // the initial state is that we haven't found a proper resource
+ HRESULT hrGetResource = E_FAIL;
+
+ // First check for the resource which has type = RC_DATA = 10, name = "CLRDEBUGINFO", language = 0
+ #if defined (HOST_WINDOWS) && defined(HOST_X86)
+ const WCHAR * resourceName = W("CLRDEBUGINFOWINDOWSX86");
+ #endif
+
+ #if !defined (HOST_WINDOWS) && defined(HOST_X86)
+ const WCHAR * resourceName = W("CLRDEBUGINFOCORESYSX86");
+ #endif
+
+ #if defined (HOST_WINDOWS) && defined(HOST_AMD64)
+ const WCHAR * resourceName = W("CLRDEBUGINFOWINDOWSAMD64");
+ #endif
+
+ #if !defined (HOST_WINDOWS) && defined(HOST_AMD64)
+ const WCHAR * resourceName = W("CLRDEBUGINFOCORESYSAMD64");
+ #endif
+
+ #if defined (HOST_WINDOWS) && defined(HOST_ARM64)
+ const WCHAR * resourceName = W("CLRDEBUGINFOWINDOWSARM64");
+ #endif
+
+ #if !defined (HOST_WINDOWS) && defined(HOST_ARM64)
+ const WCHAR * resourceName = W("CLRDEBUGINFOCORESYSARM64");
+ #endif
+
+ #if defined (HOST_WINDOWS) && defined(HOST_ARM)
+ const WCHAR * resourceName = W("CLRDEBUGINFOWINDOWSARM");
+ #endif
+
+ #if !defined (HOST_WINDOWS) && defined(HOST_ARM)
+ const WCHAR * resourceName = W("CLRDEBUGINFOCORESYSARM");
+ #endif
+
+ hrGetResource = GetResourceRvaFromResourceSectionRvaByName(pDataTarget, moduleBaseAddress, resourceSectionRVA, 10, resourceName, 0,
+ &debugResourceRVA, &debugResourceSize);
+ useCrossPlatformNaming = SUCCEEDED(hrGetResource);
+
+
+ #if defined(HOST_WINDOWS) && (defined(HOST_X86) || defined(HOST_AMD64) || defined(HOST_ARM))
+ #if defined(HOST_X86)
+ #define _HOST_MACHINE_TYPE IMAGE_FILE_MACHINE_I386
+ #elif defined(HOST_AMD64)
+ #define _HOST_MACHINE_TYPE IMAGE_FILE_MACHINE_AMD64
+ #elif defined(HOST_ARM)
+ #define _HOST_MACHINE_TYPE IMAGE_FILE_MACHINE_ARMNT
+ #endif
+
+ // if this is windows, and if host_arch matches target arch then we can fallback to searching for CLRDEBUGINFO on failure
+ if(FAILED(hrGetResource) && (imageFileMachine == _HOST_MACHINE_TYPE))
+ {
+ hrGetResource = GetResourceRvaFromResourceSectionRvaByName(pDataTarget, moduleBaseAddress, resourceSectionRVA, 10, W("CLRDEBUGINFO"), 0,
+ &debugResourceRVA, &debugResourceSize);
+ }
-#if defined(HOST_WINDOWS) && (defined(HOST_X86) || defined(HOST_AMD64) || defined(HOST_ARM))
- #if defined(HOST_X86)
- #define _HOST_MACHINE_TYPE IMAGE_FILE_MACHINE_I386
- #elif defined(HOST_AMD64)
- #define _HOST_MACHINE_TYPE IMAGE_FILE_MACHINE_AMD64
- #elif defined(HOST_ARM)
- #define _HOST_MACHINE_TYPE IMAGE_FILE_MACHINE_ARMNT
- #endif
+ #undef _HOST_MACHINE_TYPE
+ #endif
+ // if the search failed, we don't recognize the CLR
+ if(FAILED(hrGetResource))
+ hr = CORDBG_E_NOT_CLR;
+ }
- // if this is windows, and if host_arch matches target arch then we can fallback to searching for CLRDEBUGINFO on failure
- if(FAILED(hrGetResource) && (imageFileMachine == _HOST_MACHINE_TYPE))
+ CLR_DEBUG_RESOURCE debugResource;
+ if(SUCCEEDED(hr) && debugResourceSize != sizeof(debugResource))
{
- hrGetResource = GetResourceRvaFromResourceSectionRvaByName(pDataTarget, moduleBaseAddress, resourceSectionRVA, 10, W("CLRDEBUGINFO"), 0,
- &debugResourceRVA, &debugResourceSize);
+ hr = CORDBG_E_NOT_CLR;
}
- #undef _HOST_MACHINE_TYPE
-#endif
- // if the search failed, we don't recognize the CLR
- if(FAILED(hrGetResource))
+ // Get the special debug resource from the image and return the results
+ if(SUCCEEDED(hr))
+ {
+ hr = ReadFromDataTarget(pDataTarget, moduleBaseAddress + debugResourceRVA, (BYTE*)&debugResource, sizeof(debugResource));
+ }
+ if(SUCCEEDED(hr) && (debugResource.dwVersion != 0))
+ {
hr = CORDBG_E_NOT_CLR;
- }
-
- CLR_DEBUG_RESOURCE debugResource;
- if(SUCCEEDED(hr) && debugResourceSize != sizeof(debugResource))
- {
- hr = CORDBG_E_NOT_CLR;
- }
-
- // Get the special debug resource from the image and return the results
- if(SUCCEEDED(hr))
- {
- hr = ReadFromDataTarget(pDataTarget, moduleBaseAddress + debugResourceRVA, (BYTE*)&debugResource, sizeof(debugResource));
- }
- if(SUCCEEDED(hr) && (debugResource.dwVersion != 0))
- {
- hr = CORDBG_E_NOT_CLR;
- }
+ }
- // The signature needs to match m_skuId exactly, except for m_skuId=CLR_ID_ONECORE_CLR which is
- // also compatible with the older CLR_ID_PHONE_CLR signature.
- if(SUCCEEDED(hr) &&
- (debugResource.signature != m_skuId) &&
- !( (debugResource.signature == CLR_ID_PHONE_CLR) && (m_skuId == CLR_ID_ONECORE_CLR) ))
- {
- hr = CORDBG_E_NOT_CLR;
- }
+ // The signature needs to match m_skuId exactly, except for m_skuId=CLR_ID_ONECORE_CLR which is
+ // also compatible with the older CLR_ID_PHONE_CLR signature.
+ if(SUCCEEDED(hr) &&
+ (debugResource.signature != m_skuId) &&
+ !( (debugResource.signature == CLR_ID_PHONE_CLR) && (m_skuId == CLR_ID_ONECORE_CLR) ))
+ {
+ hr = CORDBG_E_NOT_CLR;
+ }
- if(SUCCEEDED(hr) &&
- (debugResource.signature != CLR_ID_ONECORE_CLR) &&
- useCrossPlatformNaming)
- {
- FormatLongDacModuleName(pDacName, dwDacNameCharCount, imageFileMachine, &fixedFileInfo);
- swprintf_s(pDbiName, dwDbiNameCharCount, W("%s_%s.dll"), MAIN_DBI_MODULE_NAME_W, W("x86"));
- }
- else
- {
- if(m_skuId == CLR_ID_V4_DESKTOP)
- swprintf_s(pDacName, dwDacNameCharCount, W("%s.dll"), CLR_DAC_MODULE_NAME_W);
+ if(SUCCEEDED(hr) &&
+ (debugResource.signature != CLR_ID_ONECORE_CLR) &&
+ useCrossPlatformNaming)
+ {
+ FormatLongDacModuleName(pDacName, dwDacNameCharCount, imageFileMachine, &fixedFileInfo);
+ swprintf_s(pDbiName, dwDbiNameCharCount, W("%s_%s.dll"), MAIN_DBI_MODULE_NAME_W, W("x86"));
+ }
else
- swprintf_s(pDacName, dwDacNameCharCount, W("%s.dll"), CORECLR_DAC_MODULE_NAME_W);
- swprintf_s(pDbiName, dwDbiNameCharCount, W("%s.dll"), MAIN_DBI_MODULE_NAME_W);
- }
+ {
+ if(m_skuId == CLR_ID_V4_DESKTOP)
+ swprintf_s(pDacName, dwDacNameCharCount, W("%s.dll"), CLR_DAC_MODULE_NAME_W);
+ else
+ swprintf_s(pDacName, dwDacNameCharCount, W("%s.dll"), CORECLR_DAC_MODULE_NAME_W);
+ swprintf_s(pDbiName, dwDbiNameCharCount, W("%s.dll"), MAIN_DBI_MODULE_NAME_W);
+ }
- if(SUCCEEDED(hr))
- {
- *pdwDbiTimeStamp = debugResource.dwDbiTimeStamp;
- *pdwDbiSizeOfImage = debugResource.dwDbiSizeOfImage;
- *pdwDacTimeStamp = debugResource.dwDacTimeStamp;
- *pdwDacSizeOfImage = debugResource.dwDacSizeOfImage;
- }
+ if(SUCCEEDED(hr))
+ {
+ *pdwDbiTimeStamp = debugResource.dwDbiTimeStamp;
+ *pdwDbiSizeOfImage = debugResource.dwDbiSizeOfImage;
+ *pdwDacTimeStamp = debugResource.dwDacTimeStamp;
+ *pdwDacSizeOfImage = debugResource.dwDacSizeOfImage;
+ }
- // any failure should be interpreted as this module not being a CLR
- if(FAILED(hr))
- {
- return CORDBG_E_NOT_CLR;
+ // any failure should be interpreted as this module not being a CLR
+ if(FAILED(hr))
+ {
+ return CORDBG_E_NOT_CLR;
+ }
+ else
+ {
+ return S_OK;
+ }
}
else
+#endif // !HOST_WINDOWS
{
- return S_OK;
- }
-#else
- swprintf_s(pDacName, dwDacNameCharCount, W("%s"), MAKEDLLNAME_W(CORECLR_DAC_MODULE_NAME_W));
- swprintf_s(pDbiName, dwDbiNameCharCount, W("%s"), MAKEDLLNAME_W(MAIN_DBI_MODULE_NAME_W));
+ swprintf_s(pDacName, dwDacNameCharCount, W("%s"), MAKEDLLNAME_W(CORECLR_DAC_MODULE_NAME_W));
+ swprintf_s(pDbiName, dwDbiNameCharCount, W("%s"), MAKEDLLNAME_W(MAIN_DBI_MODULE_NAME_W));
- pVersion->wMajor = 0;
- pVersion->wMinor = 0;
- pVersion->wBuild = 0;
- pVersion->wRevision = 0;
+ pVersion->wMajor = 0;
+ pVersion->wMinor = 0;
+ pVersion->wBuild = 0;
+ pVersion->wRevision = 0;
- *pdwDbiTimeStamp = 0;
- *pdwDbiSizeOfImage = 0;
- *pdwDacTimeStamp = 0;
- *pdwDacSizeOfImage = 0;
+ *pdwDbiTimeStamp = 0;
+ *pdwDbiSizeOfImage = 0;
+ *pdwDacTimeStamp = 0;
+ *pdwDacSizeOfImage = 0;
- return S_OK;
-#endif // TARGET_UNIX
+ return S_OK;
+ }
}
// Formats the long name for DAC
diff --git a/src/coreclr/src/dlls/CMakeLists.txt b/src/coreclr/src/dlls/CMakeLists.txt
index 6df11d24cd4e..6ef420d165f1 100644
--- a/src/coreclr/src/dlls/CMakeLists.txt
+++ b/src/coreclr/src/dlls/CMakeLists.txt
@@ -2,8 +2,10 @@ if(CLR_CMAKE_TARGET_WIN32)
add_subdirectory(clretwrc)
endif(CLR_CMAKE_TARGET_WIN32)
add_subdirectory(dbgshim)
-add_subdirectory(mscordbi)
-add_subdirectory(mscordac)
+if (NOT (CLR_CMAKE_TARGET_WIN32 AND (CLR_CMAKE_TARGET_ARCH_I386 OR CLR_CMAKE_TARGET_ARCH_ARM) AND CLR_CMAKE_HOST_ARCH_AMD64))
+ add_subdirectory(mscordbi)
+ add_subdirectory(mscordac)
+endif()
add_subdirectory(mscoree)
add_subdirectory(mscorpe)
add_subdirectory(mscorrc)
diff --git a/src/coreclr/src/dlls/clretwrc/CMakeLists.txt b/src/coreclr/src/dlls/clretwrc/CMakeLists.txt
index 9935362c0c9a..d2cb5cfae98e 100644
--- a/src/coreclr/src/dlls/clretwrc/CMakeLists.txt
+++ b/src/coreclr/src/dlls/clretwrc/CMakeLists.txt
@@ -20,6 +20,6 @@ add_library_clr(clretwrc SHARED
)
# add the install targets
-install_clr(TARGETS clretwrc ADDITIONAL_DESTINATION sharedFramework)
+install_clr(TARGETS clretwrc ADDITIONAL_DESTINATIONS sharedFramework)
add_dependencies(clretwrc eventing_headers)
diff --git a/src/coreclr/src/dlls/dbgshim/CMakeLists.txt b/src/coreclr/src/dlls/dbgshim/CMakeLists.txt
index 54cedfeb2c29..12b5b64d6bc3 100644
--- a/src/coreclr/src/dlls/dbgshim/CMakeLists.txt
+++ b/src/coreclr/src/dlls/dbgshim/CMakeLists.txt
@@ -9,7 +9,7 @@ set(DBGSHIM_SOURCES
if(CLR_CMAKE_HOST_WIN32)
# Use static crt
- add_definitions(-MT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)
add_definitions(-DFX_VER_INTERNALNAME_STR=dbgshim.dll)
endif(CLR_CMAKE_HOST_WIN32)
@@ -78,4 +78,4 @@ endif(CLR_CMAKE_HOST_WIN32)
target_link_libraries(dbgshim ${DBGSHIM_LIBRARIES})
# add the install targets
-install_clr(TARGETS dbgshim ADDITIONAL_DESTINATION sharedFramework)
+install_clr(TARGETS dbgshim ADDITIONAL_DESTINATIONS sharedFramework)
diff --git a/src/coreclr/src/dlls/mscordac/CMakeLists.txt b/src/coreclr/src/dlls/mscordac/CMakeLists.txt
index 7a3e19525f2a..a66f99e4251c 100644
--- a/src/coreclr/src/dlls/mscordac/CMakeLists.txt
+++ b/src/coreclr/src/dlls/mscordac/CMakeLists.txt
@@ -133,13 +133,11 @@ if(CLR_CMAKE_HOST_WIN32)
# mscordac.def should be generated before mscordaccore.dll is built
add_dependencies(mscordaccore mscordaccore_def)
- set(MSCORDAC_OBJ_PATH "${CMAKE_CURRENT_BINARY_DIR}/mscordacobj.dir/${CMAKE_CFG_INTDIR}/mscordac.obj")
-
# Generate export file
add_custom_command(
DEPENDS mscordaccore_def "${CURRENT_BINARY_DIR_FOR_CONFIG}/mscordac.def" mscordacobj daccess
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.exp
- COMMAND lib.exe /OUT:"${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.lib" /DEF:"${CURRENT_BINARY_DIR_FOR_CONFIG}/mscordac.def" "$" $<$,$>:/LTCG> ${STATIC_LIBRARY_FLAGS} ${MSCORDAC_OBJ_PATH}
+ COMMAND lib.exe /OUT:"${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.lib" /DEF:"${CURRENT_BINARY_DIR_FOR_CONFIG}/mscordac.def" "$" $<$,$>:/LTCG> ${STATIC_LIBRARY_FLAGS} $
COMMENT "Generating mscordaccore.exp export file"
)
@@ -149,7 +147,8 @@ if(CLR_CMAKE_HOST_WIN32)
)
add_custom_target(mscordaccore_exp DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.exp)
- add_dependencies(mscordaccore mscordaccore_exp)
+ add_dependencies(mscordaccore_exp mscordacobj)
+ add_dependencies(mscordaccore mscordaccore_exp mscordacobj)
set(COREDAC_LIBRARIES
${CMAKE_CURRENT_BINARY_DIR}/mscordaccore.exp # export file
@@ -179,11 +178,11 @@ if(CLR_CMAKE_HOST_WIN32 AND CLR_CMAKE_TARGET_UNIX)
)
endif(CLR_CMAKE_HOST_WIN32 AND CLR_CMAKE_TARGET_UNIX)
-if(CLR_CMAKE_HOST_OSX)
+if(CLR_CMAKE_HOST_UNIX)
list(APPEND COREDAC_LIBRARIES
coreclrpal_dac
)
-endif(CLR_CMAKE_HOST_OSX)
+endif(CLR_CMAKE_HOST_UNIX)
target_link_libraries(mscordaccore PRIVATE ${COREDAC_LIBRARIES})
@@ -194,7 +193,7 @@ if(FEATURE_SINGLE_FILE_DIAGNOSTICS)
endif(FEATURE_SINGLE_FILE_DIAGNOSTICS)
# add the install targets
-install_clr(TARGETS mscordaccore ADDITIONAL_DESTINATION sharedFramework)
+install_clr(TARGETS mscordaccore ADDITIONAL_DESTINATIONS sharedFramework)
if(CLR_CMAKE_HOST_WIN32)
set(LONG_NAME_HOST_ARCH ${CLR_CMAKE_HOST_ARCH})
diff --git a/src/coreclr/src/dlls/mscordac/mscordac_unixexports.src b/src/coreclr/src/dlls/mscordac/mscordac_unixexports.src
index 29c010b9e849..a7e6a8786ed7 100644
--- a/src/coreclr/src/dlls/mscordac/mscordac_unixexports.src
+++ b/src/coreclr/src/dlls/mscordac/mscordac_unixexports.src
@@ -43,6 +43,9 @@ nativeStringResourceTable_mscorrc
#PAL_InitializeDLL
#PAL_TerminateEx
#PAL_IsDebuggerPresent
+#PAL_OpenProcessMemory
+#PAL_CloseProcessMemory
+#PAL_ReadProcessMemory
#PAL_ProbeMemory
#PAL_Random
#PAL_memcpy
@@ -82,7 +85,6 @@ nativeStringResourceTable_mscorrc
#sscanf_s
#CopyFileW
-#CreateFileMappingA
#CreateFileMappingW
#CreateFileA
#CreateFileW
@@ -108,7 +110,6 @@ nativeStringResourceTable_mscorrc
#FreeLibrary
#FileTimeToSystemTime
#GetACP
-#GetCPInfo
#GetCurrentDirectoryW
#GetCurrentProcess
#GetCurrentProcessId
@@ -131,13 +132,11 @@ nativeStringResourceTable_mscorrc
#GetTempPathA
#GetTempPathW
#InitializeCriticalSection
-#IsDBCSLeadByte
#LeaveCriticalSection
#LoadLibraryA
#LoadLibraryW
#LoadLibraryExW
#LocalAlloc
-#LocalReAlloc
#LocalFree
#MapViewOfFile
#MoveFileExW
diff --git a/src/coreclr/src/dlls/mscordbi/CMakeLists.txt b/src/coreclr/src/dlls/mscordbi/CMakeLists.txt
index b87b3eadb6a1..85f6cb6a7496 100644
--- a/src/coreclr/src/dlls/mscordbi/CMakeLists.txt
+++ b/src/coreclr/src/dlls/mscordbi/CMakeLists.txt
@@ -10,6 +10,8 @@ if(CORECLR_SET_RPATH)
endif(CLR_CMAKE_HOST_OSX)
endif(CORECLR_SET_RPATH)
+set(CMAKE_INCLUDE_CURRENT_DIR ON)
+
set(MSCORDBI_SOURCES
mscordbi.cpp
)
@@ -50,7 +52,7 @@ else(CLR_CMAKE_HOST_WIN32)
endif(CLR_CMAKE_HOST_WIN32)
add_library_clr(mscordbi SHARED ${MSCORDBI_SOURCES})
-target_precompile_header(TARGET mscordbi HEADER stdafx.h)
+target_precompile_headers(mscordbi PRIVATE $<$:stdafx.h>)
if(CLR_CMAKE_HOST_UNIX)
add_custom_target(mscordbi_exports DEPENDS ${EXPORTS_FILE})
@@ -118,4 +120,4 @@ if(FEATURE_SINGLE_FILE_DIAGNOSTICS)
endif(FEATURE_SINGLE_FILE_DIAGNOSTICS)
# add the install targets
-install_clr(TARGETS mscordbi ADDITIONAL_DESTINATION sharedFramework)
+install_clr(TARGETS mscordbi ADDITIONAL_DESTINATIONS sharedFramework)
diff --git a/src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt b/src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt
index f01133ce40ff..11dee9f699a5 100644
--- a/src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt
+++ b/src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt
@@ -10,17 +10,15 @@ if (CLR_CMAKE_HOST_WIN32)
list(APPEND CLR_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/coreclr.def)
- add_link_options(/ENTRY:CoreDllMain)
-
# Incremental linking results in the linker inserting extra padding and routing function calls via thunks that can break the
# invariants (e.g. size of region between Jit_PatchedCodeLast-Jit_PatchCodeStart needs to fit in a page).
- add_link_options(/INCREMENTAL:NO)
+ add_linker_flag("/INCREMENTAL:NO")
# Delay load libraries required for WinRT as that is not supported on all platforms
- add_link_options("/DELAYLOAD:api-ms-win-core-winrt-l1-1-0.dll")
+ add_linker_flag("/DELAYLOAD:api-ms-win-core-winrt-l1-1-0.dll")
# Delay load version.dll so that we can specify how to search when loading it as it is not part of Windows' known DLLs
- add_link_options("/DELAYLOAD:version.dll")
+ add_linker_flag("/DELAYLOAD:version.dll")
# No library groups for Win32
set(START_LIBRARY_GROUP)
@@ -33,7 +31,7 @@ else(CLR_CMAKE_HOST_WIN32)
if(CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_FREEBSD OR CLR_CMAKE_TARGET_NETBSD OR CLR_CMAKE_TARGET_SUNOS)
# This option is necessary to ensure that the overloaded delete operator defined inside
# of the utilcode will be used instead of the standard library delete operator.
- add_link_options("LINKER:-Bsymbolic")
+ add_linker_flag("-Wl,-Bsymbolic")
# The following linked options can be inserted into the linker libraries list to
# ensure proper resolving of circular references between a subset of the libraries.
@@ -127,6 +125,7 @@ if(CLR_CMAKE_TARGET_WIN32)
shlwapi.lib
bcrypt.lib
RuntimeObject.lib
+ delayimp.lib
)
else()
list(APPEND CORECLR_LIBRARIES
@@ -168,8 +167,11 @@ if(FEATURE_MERGE_JIT_AND_ENGINE)
set(CLRJIT_STATIC clrjit_static)
endif(FEATURE_MERGE_JIT_AND_ENGINE)
-target_link_libraries(coreclr PUBLIC ${CORECLR_LIBRARIES} ${CLRJIT_STATIC} cee_wks cee_wks_core)
-target_link_libraries(coreclr_static PUBLIC ${CORECLR_LIBRARIES} clrjit_static cee_wks_mergeable cee_wks_core)
+target_sources(coreclr PUBLIC $)
+target_link_libraries(coreclr PUBLIC ${CORECLR_LIBRARIES} ${CLRJIT_STATIC} cee_wks)
+target_sources(coreclr_static PUBLIC $)
+target_link_libraries(coreclr_static PUBLIC ${CORECLR_LIBRARIES} clrjit_static cee_wks_mergeable)
+target_compile_definitions(coreclr_static PUBLIC CORECLR_EMBEDDED)
# Create the runtime module index header file containing the coreclr build id
# for xplat and the timestamp/size on Windows.
@@ -178,55 +180,49 @@ if(FEATURE_SINGLE_FILE_DIAGNOSTICS)
endif(FEATURE_SINGLE_FILE_DIAGNOSTICS)
if(CLR_CMAKE_TARGET_WIN32)
- if (NOT CMAKE_GENERATOR MATCHES "Visual Studio .*")
- add_custom_target(inject_debug_resources ALL COMMAND UNABLE_TO_EMBED_DAC_ON_WINDOWS_NON_VS_GENERATOR)
- add_dependencies(inject_debug_resources coreclr mscordaccore mscordbi)
+ # Add dac table & debug resource to coreclr
+ get_include_directories(INC_DIR)
+ get_compile_definitions(PREPROCESS_DEFINITIONS)
+ list(APPEND INC_DIR -I${CLR_DIR}/src/vm -I${CLR_DIR}/src/vm/${ARCH_SOURCES_DIR} -I${CLR_DIR}/src/debug/ee -I${CLR_DIR}/src/gc)
+ list(APPEND PREPROCESS_DEFINITIONS -DDACCESS_COMPILE -DTARGET_64BIT)
+
+ if (CLR_CMAKE_HOST_ARCH_AMD64)
+ list(APPEND PREPROCESS_DEFINITIONS -DTARGET_AMD64)
+ elseif (CLR_CMAKE_HOST_ARCH_ARM64)
+ list(APPEND PREPROCESS_DEFINITIONS -DTARGET_ARM64)
+ elseif (CLR_CMAKE_HOST_ARCH_ARM)
+ list(APPEND PREPROCESS_DEFINITIONS -DTARGET_ARM)
+ elseif (CLR_CMAKE_HOST_ARCH_I386)
+ list(APPEND PREPROCESS_DEFINITIONS -DTARGET_X86)
else()
- # Add dac table & debug resource to coreclr
- get_include_directories(INC_DIR)
- get_compile_definitions(PREPROCESS_DEFINITIONS)
- list(APPEND INC_DIR -I${CLR_DIR}/src/vm -I${CLR_DIR}/src/vm/${ARCH_SOURCES_DIR} -I${CLR_DIR}/src/debug/ee -I${CLR_DIR}/src/gc)
- list(APPEND PREPROCESS_DEFINITIONS -DDACCESS_COMPILE -DTARGET_64BIT)
-
- if (CLR_CMAKE_HOST_ARCH_AMD64)
- list(APPEND PREPROCESS_DEFINITIONS -DTARGET_AMD64)
- elseif (CLR_CMAKE_HOST_ARCH_ARM64)
- list(APPEND PREPROCESS_DEFINITIONS -DTARGET_ARM64)
- elseif (CLR_CMAKE_HOST_ARCH_ARM)
- list(APPEND PREPROCESS_DEFINITIONS -DTARGET_ARM)
- elseif (CLR_CMAKE_HOST_ARCH_I386)
- list(APPEND PREPROCESS_DEFINITIONS -DTARGET_X86)
- else()
- clr_unknown_arch()
- endif()
-
-
- if (CLR_CMAKE_CROSS_ARCH)
+ clr_unknown_arch()
+ endif()
+
+
+ if (CLR_CMAKE_CROSS_ARCH)
include(${CMAKE_INSTALL_PREFIX}/${CLR_CMAKE_CROSS_HOST_ARCH}/dactabletools/dactabletools.cmake)
- endif()
-
- add_custom_command(
- DEPENDS coreclr mscordaccore mscordbi ${CLR_DIR}/src/debug/daccess/daccess.cpp
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/inject_debug_resources.timestamp
- COMMAND ${CMAKE_CXX_COMPILER} /P /EP /TP ${PREPROCESS_DEFINITIONS} ${INC_DIR} /Fi${CMAKE_CURRENT_BINARY_DIR}/daccess.i ${CLR_DIR}/src/debug/daccess/daccess.cpp
- COMMAND dactablegen /dac:${CMAKE_CURRENT_BINARY_DIR}/daccess.i /pdb:${CMAKE_CURRENT_BINARY_DIR}/$/coreclr.pdb /dll:$ /bin:${CMAKE_CURRENT_BINARY_DIR}/wks.bin
- COMMAND InjectResource /bin:${CMAKE_CURRENT_BINARY_DIR}/wks.bin /dll:$
- COMMAND GenClrDebugResource /dac:$ /dbi:$ /sku:onecoreclr /out:${CMAKE_CURRENT_BINARY_DIR}/clrDebugResource.bin
- COMMAND InjectResource /bin:${CMAKE_CURRENT_BINARY_DIR}/clrDebugResource.bin /dll:$ /name:CLRDEBUGINFO
- COMMAND InjectResource /bin:${CMAKE_CURRENT_SOURCE_DIR}/dump_helper_resource.bin /dll:$ /name:MINIDUMP_AUXILIARY_PROVIDER
- COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/inject_debug_resources.timestamp
- COMMENT Add dactable, debug resources, and dump helper resources to coreclr
- )
-
- if(NOT DEFINED CLR_CROSS_COMPONENTS_BUILD)
- add_custom_target(inject_debug_resources ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/inject_debug_resources.timestamp)
- endif()
endif()
+ add_custom_command(
+ DEPENDS coreclr mscordaccore mscordbi ${CLR_DIR}/src/debug/daccess/daccess.cpp
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/inject_debug_resources.timestamp
+ COMMAND ${CMAKE_CXX_COMPILER} /P /EP /TP ${PREPROCESS_DEFINITIONS} ${INC_DIR} /Fi${CMAKE_CURRENT_BINARY_DIR}/daccess.i ${CLR_DIR}/src/debug/daccess/daccess.cpp
+ COMMAND ${CLR_REPO_ROOT_DIR}/dotnet.cmd exec ${CMAKE_INSTALL_PREFIX}/DacTableGen/DacTableGen.dll /dac:${CMAKE_CURRENT_BINARY_DIR}/daccess.i /pdb:$ /dll:$ /bin:${CMAKE_CURRENT_BINARY_DIR}/wks.bin
+ COMMAND InjectResource /bin:${CMAKE_CURRENT_BINARY_DIR}/wks.bin /dll:$
+ COMMAND GenClrDebugResource /dac:$ /dbi:$ /sku:onecoreclr /out:${CMAKE_CURRENT_BINARY_DIR}/clrDebugResource.bin
+ COMMAND InjectResource /bin:${CMAKE_CURRENT_BINARY_DIR}/clrDebugResource.bin /dll:$ /name:CLRDEBUGINFO
+ COMMAND InjectResource /bin:${CMAKE_CURRENT_SOURCE_DIR}/dump_helper_resource.bin /dll:$ /name:MINIDUMP_AUXILIARY_PROVIDER
+ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/inject_debug_resources.timestamp
+ COMMENT Add dactable, debug resources, and dump helper resources to coreclr
+ )
+
+ if(NOT DEFINED CLR_CROSS_COMPONENTS_BUILD)
+ add_custom_target(inject_debug_resources ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/inject_debug_resources.timestamp)
+ endif()
endif(CLR_CMAKE_TARGET_WIN32)
# add the install targets
-install_clr(TARGETS coreclr ADDITIONAL_DESTINATION sharedFramework)
+install_clr(TARGETS coreclr ADDITIONAL_DESTINATIONS sharedFramework)
# publish coreclr_static lib
_install(TARGETS coreclr_static DESTINATION lib)
diff --git a/src/coreclr/src/dlls/mscoree/coreclr/README.md b/src/coreclr/src/dlls/mscoree/coreclr/README.md
index 0e291a87a3d4..b4f3e6f8845d 100644
--- a/src/coreclr/src/dlls/mscoree/coreclr/README.md
+++ b/src/coreclr/src/dlls/mscoree/coreclr/README.md
@@ -4,4 +4,4 @@ but if that changes we can always create a little nicer tooling for it.
dump\_helper\_resource.bin is used to populate the DUMP\_HELPER resource inside coreclr.dll on Windows. When an application crashes, Windows MinidumpWriteDump is planning to scan
modules looking for this resource. The content of the resource is expected to be the name of a dll in the same folder, encoded in UTF8, null terminated, that implements the
CLRDataCreateInterface function. For OS security purposes MinidumpWriteDump will do an authenticode signing check before loading the indicated binary, however if your build isn't
-signed you can get around this limitation by registering it at HKLM\Software\Microsoft\WindowsNT\CurrentVersion\MiniDumpAuxilliaryDlls.
\ No newline at end of file
+signed you can get around this limitation by registering it at HKLM\Software\Microsoft\WindowsNT\CurrentVersion\MiniDumpAuxilliaryDlls.
diff --git a/src/coreclr/src/dlls/mscoree/mscoree.cpp b/src/coreclr/src/dlls/mscoree/mscoree.cpp
index 810a3e88f3fe..c610e9e91a10 100644
--- a/src/coreclr/src/dlls/mscoree/mscoree.cpp
+++ b/src/coreclr/src/dlls/mscoree/mscoree.cpp
@@ -17,16 +17,13 @@
#include
-// Globals
-extern HINSTANCE g_hThisInst;
+#if !defined(CROSSGEN_COMPILE) && !defined(CORECLR_EMBEDDED)
-// Locals.
BOOL STDMETHODCALLTYPE EEDllMain( // TRUE on success, FALSE on error.
HINSTANCE hInst, // Instance handle of the loaded module.
DWORD dwReason, // Reason for loading.
- LPVOID lpReserved); // Unused.
+ LPVOID lpReserved); // Unused.
-#ifndef CROSSGEN_COMPILE
//*****************************************************************************
// Handle lifetime of loaded library.
//*****************************************************************************
@@ -34,65 +31,9 @@ BOOL STDMETHODCALLTYPE EEDllMain( // TRUE on success, FALSE on error.
#include
#ifdef TARGET_WINDOWS
-
-#include // for __security_init_cookie()
-
-extern "C" BOOL WINAPI _CRT_INIT(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved);
extern "C" BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved);
-
-// For the CoreClr, this is the real DLL entrypoint. We make ourselves the first entrypoint as
-// we need to capture coreclr's hInstance before the C runtime initializes. This function
-// will capture hInstance, let the C runtime initialize and then invoke the "classic"
-// DllMain that initializes everything else.
-extern "C" BOOL WINAPI CoreDllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)
-{
- STATIC_CONTRACT_NOTHROW;
-
- BOOL result;
- switch (dwReason)
- {
- case DLL_PROCESS_ATTACH:
- // Make sure the /GS security cookie is initialized before we call anything else.
- // BinScope detects the call to __security_init_cookie in its "Has Non-GS-friendly
- // Initialization" check and makes it pass.
- __security_init_cookie();
-
- // It's critical that we initialize g_hmodCoreCLR before the CRT initializes.
- // We have a lot of global ctors that will break if we let the CRT initialize without
- // this step having been done.
-
- g_hmodCoreCLR = (HINSTANCE)hInstance;
-
- if (!(result = _CRT_INIT(hInstance, dwReason, lpReserved)))
- {
- // CRT_INIT may fail to initialize the CRT heap. Make sure we don't continue
- // down a path that would trigger an AV and tear down the host process
- break;
- }
- result = DllMain(hInstance, dwReason, lpReserved);
- break;
-
- case DLL_THREAD_ATTACH:
- _CRT_INIT(hInstance, dwReason, lpReserved);
- result = DllMain(hInstance, dwReason, lpReserved);
- break;
-
- case DLL_PROCESS_DETACH: // intentional fallthru
- case DLL_THREAD_DETACH:
- result = DllMain(hInstance, dwReason, lpReserved);
- _CRT_INIT(hInstance, dwReason, lpReserved);
- break;
-
- default:
- result = FALSE; // it'd be an OS bug if we got here - not much we can do.
- break;
- }
- return result;
-}
-
#endif // TARGET_WINDOWS
-
extern "C"
#ifdef TARGET_UNIX
DLLEXPORT // For Win32 PAL LoadLibrary emulation
@@ -101,45 +42,13 @@ BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)
{
STATIC_CONTRACT_NOTHROW;
- switch (dwReason)
- {
- case DLL_PROCESS_ATTACH:
- {
-#ifndef TARGET_WINDOWS
- g_hmodCoreCLR = (HINSTANCE)hInstance;
-#endif
-
- // Save the module handle.
- g_hThisInst = (HINSTANCE)hInstance;
-
- // Prevent buffer-overruns
- // If buffer is overrun, it is possible the saved callback has been trashed.
- // The callback is unsafe.
- //SetBufferOverrunHandler();
- if (!EEDllMain((HINSTANCE)hInstance, dwReason, lpReserved))
- {
- return FALSE;
- }
- }
- break;
-
- case DLL_PROCESS_DETACH:
- {
- EEDllMain((HINSTANCE)hInstance, dwReason, lpReserved);
- }
- break;
-
- case DLL_THREAD_DETACH:
- {
- EEDllMain((HINSTANCE)hInstance, dwReason, lpReserved);
- }
- break;
- }
-
- return TRUE;
+ return EEDllMain((HINSTANCE)hInstance, dwReason, lpReserved);
}
-#endif // CROSSGEN_COMPILE
+#endif // !defined(CROSSGEN_COMPILE) && !defined(CORECLR_EMBEDDED)
+
+// Globals
+extern HINSTANCE g_hThisInst;
HINSTANCE GetModuleInst()
{
@@ -444,7 +353,7 @@ HRESULT SetInternalSystemDirectory()
}
#if defined(CROSSGEN_COMPILE)
-void SetMscorlibPath(LPCWSTR wzSystemDirectory)
+void SetCoreLibPath(LPCWSTR wzSystemDirectory)
{
DWORD len = (DWORD)wcslen(wzSystemDirectory);
bool appendSeparator = wzSystemDirectory[len-1] != DIRECTORY_SEPARATOR_CHAR_W;
diff --git a/src/coreclr/src/dlls/mscoree/unixinterface.cpp b/src/coreclr/src/dlls/mscoree/unixinterface.cpp
index def877265312..e23ece987224 100644
--- a/src/coreclr/src/dlls/mscoree/unixinterface.cpp
+++ b/src/coreclr/src/dlls/mscoree/unixinterface.cpp
@@ -27,6 +27,9 @@ typedef NewArrayHolder ConstWStringHolder;
// Specifies whether coreclr is embedded or standalone
extern bool g_coreclr_embedded;
+// Specifies whether hostpolicy is embedded in executable or standalone
+extern bool g_hostpolicy_embedded;
+
// Holder for array of wide strings
class ConstWStringArrayHolder : public NewArrayHolder
{
@@ -116,7 +119,8 @@ static void ConvertConfigPropertiesToUnicode(
int propertyCount,
LPCWSTR** propertyKeysWRef,
LPCWSTR** propertyValuesWRef,
- BundleProbe** bundleProbe)
+ BundleProbe** bundleProbe,
+ bool* hostPolicyEmbedded)
{
LPCWSTR* propertyKeysW = new (nothrow) LPCWSTR[propertyCount];
ASSERTE_ALL_BUILDS(propertyKeysW != nullptr);
@@ -135,6 +139,11 @@ static void ConvertConfigPropertiesToUnicode(
// is passed in as the value of "BUNDLE_PROBE" property (encoded as a string).
*bundleProbe = (BundleProbe*)_wcstoui64(propertyValuesW[propertyIndex], nullptr, 0);
}
+ else if (strcmp(propertyKeys[propertyIndex], "HOSTPOLICY_EMBEDDED") == 0)
+ {
+ // The HOSTPOLICY_EMBEDDED property indicates if the executable has hostpolicy statically linked in
+ *hostPolicyEmbedded = (wcscmp(propertyValuesW[propertyIndex], W("true")) == 0);
+ }
}
*propertyKeysWRef = propertyKeysW;
@@ -177,6 +186,7 @@ int coreclr_initialize(
LPCWSTR* propertyKeysW;
LPCWSTR* propertyValuesW;
BundleProbe* bundleProbe = nullptr;
+ bool hostPolicyEmbedded = false;
ConvertConfigPropertiesToUnicode(
propertyKeys,
@@ -184,7 +194,8 @@ int coreclr_initialize(
propertyCount,
&propertyKeysW,
&propertyValuesW,
- &bundleProbe);
+ &bundleProbe,
+ &hostPolicyEmbedded);
#ifdef TARGET_UNIX
DWORD error = PAL_InitializeCoreCLR(exePath, g_coreclr_embedded);
@@ -198,6 +209,8 @@ int coreclr_initialize(
}
#endif
+ g_hostpolicy_embedded = hostPolicyEmbedded;
+
ReleaseHolder host;
hr = CorHost2::CreateObject(IID_ICLRRuntimeHost4, (void**)&host);
diff --git a/src/coreclr/src/dlls/mscorpe/ceefilegenwriter.cpp b/src/coreclr/src/dlls/mscorpe/ceefilegenwriter.cpp
index 77afa5a83024..0fb18b0629b2 100644
--- a/src/coreclr/src/dlls/mscorpe/ceefilegenwriter.cpp
+++ b/src/coreclr/src/dlls/mscorpe/ceefilegenwriter.cpp
@@ -12,10 +12,168 @@
#include
#include "corerror.h"
-#include "stubs.h"
#include
#include
+// The following block contains a template for the default entry point stubs of a COM+
+// IL only program. One can emit these stubs (with some fix-ups) and make
+// the code supplied the entry point value for the image. The fix-ups will
+// in turn cause mscoree.dll to be loaded and the correct entry point to be
+// called.
+//
+// Note: Although these stubs contain x86 specific code, they are used
+// for all platforms
+
+
+//*****************************************************************************
+// This stub is designed for a x86 Windows application. It will call the
+// _CorExeMain function in mscoree.dll. This entry point will in turn load
+// and run the IL program.
+//
+// jump _CorExeMain();
+//
+// The code jumps to the imported function _CorExeMain using the iat.
+// The address in the template is address of the iat entry which is
+// fixed up by the loader when the image is paged in.
+//*****************************************************************************
+
+const BYTE ExeMainX86Template[] =
+{
+ // Jump through IAT to _CorExeMain
+ 0xFF, 0x25, // jmp [iat:_CorDllMain entry]
+ 0x00, 0x00, 0x00, 0x00, // address to replace
+
+};
+
+#define ExeMainX86TemplateSize sizeof(ExeMainX86Template)
+#define CorExeMainX86IATOffset 2
+
+//*****************************************************************************
+// This stub is designed for a x86 Windows application. It will call the
+// _CorDllMain function in mscoree.dll with with the base entry point for
+// the loaded DLL. This entry point will in turn load and run the IL program.
+//
+// jump _CorDllMain
+//
+// The code jumps to the imported function _CorExeMain using the iat.
+// The address in the template is address of the iat entry which is
+// fixed up by the loader when the image is paged in.
+//*****************************************************************************
+
+const BYTE DllMainX86Template[] =
+{
+ // Jump through IAT to CorDllMain
+ 0xFF, 0x25, // jmp [iat:_CorDllMain entry]
+ 0x00, 0x00, 0x00, 0x00, // address to replace
+};
+
+#define DllMainX86TemplateSize sizeof(DllMainX86Template)
+#define CorDllMainX86IATOffset 2
+
+//*****************************************************************************
+// This stub is designed for a AMD64 Windows application. It will call the
+// _CorExeMain function in mscoree.dll. This entry point will in turn load
+// and run the IL program.
+//
+// mov rax, _CorExeMain();
+// jmp [rax]
+//
+// The code jumps to the imported function _CorExeMain using the iat.
+// The address in the template is address of the iat entry which is
+// fixed up by the loader when the image is paged in.
+//*****************************************************************************
+
+const BYTE ExeMainAMD64Template[] =
+{
+ // Jump through IAT to _CorExeMain
+ 0x48, 0xA1, // rex.w rex.b mov rax,[following address]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//address of iat:_CorExeMain entry
+ 0xFF, 0xE0 // jmp [rax]
+};
+
+#define ExeMainAMD64TemplateSize sizeof(ExeMainAMD64Template)
+#define CorExeMainAMD64IATOffset 2
+
+//*****************************************************************************
+// This stub is designed for a AMD64 Windows application. It will call the
+// _CorDllMain function in mscoree.dll with with the base entry point for
+// the loaded DLL. This entry point will in turn load and run the IL program.
+//
+// mov rax, _CorDllMain();
+// jmp [rax]
+//
+// The code jumps to the imported function _CorDllMain using the iat.
+// The address in the template is address of the iat entry which is
+// fixed up by the loader when the image is paged in.
+//*****************************************************************************
+
+const BYTE DllMainAMD64Template[] =
+{
+ // Jump through IAT to CorDllMain
+ 0x48, 0xA1, // rex.w rex.b mov rax,[following address]
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//address of iat:_CorDllMain entry
+ 0xFF, 0xE0 // jmp [rax]
+};
+
+#define DllMainAMD64TemplateSize sizeof(DllMainAMD64Template)
+#define CorDllMainAMD64IATOffset 2
+
+//*****************************************************************************
+// This stub is designed for an ia64 Windows application. It will call the
+// _CorExeMain function in mscoree.dll. This entry point will in turn load
+// and run the IL program.
+//
+// jump _CorExeMain();
+//
+// The code jumps to the imported function _CorExeMain using the iat.
+// We set the value of gp to point at the iat table entry for _CorExeMain
+//*****************************************************************************
+
+const BYTE ExeMainIA64Template[] =
+{
+ // ld8 r9 = [gp] ;;
+ // ld8 r10 = [r9],8
+ // nop.i ;;
+ // ld8 gp = [r9]
+ // mov b6 = r10
+ // br.cond.sptk.few b6
+ //
+ 0x0B, 0x48, 0x00, 0x02, 0x18, 0x10, 0xA0, 0x40,
+ 0x24, 0x30, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00,
+ 0x10, 0x08, 0x00, 0x12, 0x18, 0x10, 0x60, 0x50,
+ 0x04, 0x80, 0x03, 0x00, 0x60, 0x00, 0x80, 0x00
+};
+
+#define ExeMainIA64TemplateSize sizeof(ExeMainIA64Template)
+
+//*****************************************************************************
+// This stub is designed for an ia64 Windows application. It will call the
+// _CorDllMain function in mscoree.dll with with the base entry point for
+// the loaded DLL. This entry point will in turn load and run the IL program.
+//
+// jump _CorDllMain
+//
+// The code jumps to the imported function _CorExeMain using the iat.
+// We set the value of gp to point at the iat table entry for _CorExeMain
+//*****************************************************************************
+
+const BYTE DllMainIA64Template[] =
+{
+ // ld8 r9 = [gp] ;;
+ // ld8 r10 = [r9],8
+ // nop.i ;;
+ // ld8 gp = [r9]
+ // mov b6 = r10
+ // br.cond.sptk.few b6
+ //
+ 0x0B, 0x48, 0x00, 0x02, 0x18, 0x10, 0xA0, 0x40,
+ 0x24, 0x30, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00,
+ 0x10, 0x08, 0x00, 0x12, 0x18, 0x10, 0x60, 0x50,
+ 0x04, 0x80, 0x03, 0x00, 0x60, 0x00, 0x80, 0x00
+};
+
+#define DllMainIA64TemplateSize sizeof(DllMainIA64Template)
+
#ifdef EMIT_FIXUPS
// Emitted PEFIXUP structure looks like this
diff --git a/src/coreclr/src/dlls/mscorpe/stubs.h b/src/coreclr/src/dlls/mscorpe/stubs.h
deleted file mode 100644
index f0e7ce380df3..000000000000
--- a/src/coreclr/src/dlls/mscorpe/stubs.h
+++ /dev/null
@@ -1,168 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-//*****************************************************************************
-// Stubs.h
-//
-// This file contains a template for the default entry point stubs of a COM+
-// IL only program. One can emit these stubs (with some fix-ups) and make
-// the code supplied the entry point value for the image. The fix-ups will
-// in turn cause mscoree.dll to be loaded and the correct entry point to be
-// called.
-//
-// Note: Although these stubs contain x86 specific code, they are used
-// for all platforms
-//
-//*****************************************************************************
-#ifndef __STUBS_H__
-#define __STUBS_H__
-
-//*****************************************************************************
-// This stub is designed for a x86 Windows application. It will call the
-// _CorExeMain function in mscoree.dll. This entry point will in turn load
-// and run the IL program.
-//
-// jump _CorExeMain();
-//
-// The code jumps to the imported function _CorExeMain using the iat.
-// The address in the template is address of the iat entry which is
-// fixed up by the loader when the image is paged in.
-//*****************************************************************************
-
-constexpr BYTE ExeMainX86Template[] =
-{
- // Jump through IAT to _CorExeMain
- 0xFF, 0x25, // jmp [iat:_CorDllMain entry]
- 0x00, 0x00, 0x00, 0x00, // address to replace
-
-};
-
-#define ExeMainX86TemplateSize sizeof(ExeMainX86Template)
-#define CorExeMainX86IATOffset 2
-
-//*****************************************************************************
-// This stub is designed for a x86 Windows application. It will call the
-// _CorDllMain function in mscoree.dll with with the base entry point for
-// the loaded DLL. This entry point will in turn load and run the IL program.
-//
-// jump _CorDllMain
-//
-// The code jumps to the imported function _CorExeMain using the iat.
-// The address in the template is address of the iat entry which is
-// fixed up by the loader when the image is paged in.
-//*****************************************************************************
-
-constexpr BYTE DllMainX86Template[] =
-{
- // Jump through IAT to CorDllMain
- 0xFF, 0x25, // jmp [iat:_CorDllMain entry]
- 0x00, 0x00, 0x00, 0x00, // address to replace
-};
-
-#define DllMainX86TemplateSize sizeof(DllMainX86Template)
-#define CorDllMainX86IATOffset 2
-
-//*****************************************************************************
-// This stub is designed for a AMD64 Windows application. It will call the
-// _CorExeMain function in mscoree.dll. This entry point will in turn load
-// and run the IL program.
-//
-// mov rax, _CorExeMain();
-// jmp [rax]
-//
-// The code jumps to the imported function _CorExeMain using the iat.
-// The address in the template is address of the iat entry which is
-// fixed up by the loader when the image is paged in.
-//*****************************************************************************
-
-constexpr BYTE ExeMainAMD64Template[] =
-{
- // Jump through IAT to _CorExeMain
- 0x48, 0xA1, // rex.w rex.b mov rax,[following address]
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//address of iat:_CorExeMain entry
- 0xFF, 0xE0 // jmp [rax]
-};
-
-#define ExeMainAMD64TemplateSize sizeof(ExeMainAMD64Template)
-#define CorExeMainAMD64IATOffset 2
-
-//*****************************************************************************
-// This stub is designed for a AMD64 Windows application. It will call the
-// _CorDllMain function in mscoree.dll with with the base entry point for
-// the loaded DLL. This entry point will in turn load and run the IL program.
-//
-// mov rax, _CorDllMain();
-// jmp [rax]
-//
-// The code jumps to the imported function _CorDllMain using the iat.
-// The address in the template is address of the iat entry which is
-// fixed up by the loader when the image is paged in.
-//*****************************************************************************
-
-constexpr BYTE DllMainAMD64Template[] =
-{
- // Jump through IAT to CorDllMain
- 0x48, 0xA1, // rex.w rex.b mov rax,[following address]
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,//address of iat:_CorDllMain entry
- 0xFF, 0xE0 // jmp [rax]
-};
-
-#define DllMainAMD64TemplateSize sizeof(DllMainAMD64Template)
-#define CorDllMainAMD64IATOffset 2
-
-//*****************************************************************************
-// This stub is designed for an ia64 Windows application. It will call the
-// _CorExeMain function in mscoree.dll. This entry point will in turn load
-// and run the IL program.
-//
-// jump _CorExeMain();
-//
-// The code jumps to the imported function _CorExeMain using the iat.
-// We set the value of gp to point at the iat table entry for _CorExeMain
-//*****************************************************************************
-
-constexpr BYTE ExeMainIA64Template[] =
-{
- // ld8 r9 = [gp] ;;
- // ld8 r10 = [r9],8
- // nop.i ;;
- // ld8 gp = [r9]
- // mov b6 = r10
- // br.cond.sptk.few b6
- //
- 0x0B, 0x48, 0x00, 0x02, 0x18, 0x10, 0xA0, 0x40,
- 0x24, 0x30, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00,
- 0x10, 0x08, 0x00, 0x12, 0x18, 0x10, 0x60, 0x50,
- 0x04, 0x80, 0x03, 0x00, 0x60, 0x00, 0x80, 0x00
-};
-
-#define ExeMainIA64TemplateSize sizeof(ExeMainIA64Template)
-
-//*****************************************************************************
-// This stub is designed for an ia64 Windows application. It will call the
-// _CorDllMain function in mscoree.dll with with the base entry point for
-// the loaded DLL. This entry point will in turn load and run the IL program.
-//
-// jump _CorDllMain
-//
-// The code jumps to the imported function _CorExeMain using the iat.
-// We set the value of gp to point at the iat table entry for _CorExeMain
-//*****************************************************************************
-
-constexpr BYTE DllMainIA64Template[] =
-{
- // ld8 r9 = [gp] ;;
- // ld8 r10 = [r9],8
- // nop.i ;;
- // ld8 gp = [r9]
- // mov b6 = r10
- // br.cond.sptk.few b6
- //
- 0x0B, 0x48, 0x00, 0x02, 0x18, 0x10, 0xA0, 0x40,
- 0x24, 0x30, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00,
- 0x10, 0x08, 0x00, 0x12, 0x18, 0x10, 0x60, 0x50,
- 0x04, 0x80, 0x03, 0x00, 0x60, 0x00, 0x80, 0x00
-};
-
-#define DllMainIA64TemplateSize sizeof(DllMainIA64Template)
-
-#endif // __STUBS_H__
diff --git a/src/coreclr/src/dlls/mscorrc/CMakeLists.txt b/src/coreclr/src/dlls/mscorrc/CMakeLists.txt
index ed5ee8876508..040b12a240a2 100644
--- a/src/coreclr/src/dlls/mscorrc/CMakeLists.txt
+++ b/src/coreclr/src/dlls/mscorrc/CMakeLists.txt
@@ -15,11 +15,13 @@ if(CLR_CMAKE_HOST_WIN32)
include.rc
)
- install_clr(TARGETS mscorrc ADDITIONAL_DESTINATION sharedFramework)
+ install_clr(TARGETS mscorrc ADDITIONAL_DESTINATIONS sharedFramework)
else()
build_resources(${CMAKE_CURRENT_SOURCE_DIR}/include.rc mscorrc TARGET_CPP_FILE)
- add_library_clr(mscorrc OBJECT
+ add_library_clr(mscorrc_obj OBJECT
${TARGET_CPP_FILE}
)
+ add_library(mscorrc INTERFACE)
+ target_sources(mscorrc INTERFACE $)
endif(CLR_CMAKE_HOST_WIN32)
diff --git a/src/coreclr/src/dlls/mscorrc/mscorrc.rc b/src/coreclr/src/dlls/mscorrc/mscorrc.rc
index a50f742cef00..360442044ca4 100644
--- a/src/coreclr/src/dlls/mscorrc/mscorrc.rc
+++ b/src/coreclr/src/dlls/mscorrc/mscorrc.rc
@@ -182,6 +182,7 @@ BEGIN
IDS_EE_NDIRECT_UNSUPPORTED_SIG "Method's type signature is not PInvoke compatible."
IDS_EE_COM_UNSUPPORTED_SIG "Method's type signature is not Interop compatible."
IDS_EE_COM_UNSUPPORTED_TYPE "The method returned a COM Variant type that is not Interop compatible."
+ IDS_EE_MULTIPLE_CALLCONV_UNSUPPORTED "Multiple unmanaged calling conventions are specified. Only a single calling convention is supported."
IDS_EE_NDIRECT_BADNATL "Invalid PInvoke or UnmanagedFunctionPointer metadata format."
IDS_EE_NDIRECT_BADNATL_CALLCONV "Invalid PInvoke or UnmanagedFunctionPointer calling convention."
IDS_EE_NDIRECT_BADNATL_VARARGS_CALLCONV "Invalid PInvoke calling convention. Vararg functions must use the cdecl calling convention."
diff --git a/src/coreclr/src/dlls/mscorrc/resource.h b/src/coreclr/src/dlls/mscorrc/resource.h
index 738b751c7fae..b78c5d84c304 100644
--- a/src/coreclr/src/dlls/mscorrc/resource.h
+++ b/src/coreclr/src/dlls/mscorrc/resource.h
@@ -43,6 +43,7 @@
#define IDS_EE_COM_UNSUPPORTED_SIG 0x170d
#define IDS_EE_NOSYNCHRONIZED 0x170f
#define IDS_EE_NDIRECT_BADNATL_THISCALL 0x1710
+#define IDS_EE_MULTIPLE_CALLCONV_UNSUPPORTED 0x1711
#define IDS_EE_LOAD_BAD_MAIN_SIG 0x1712
#define IDS_EE_COM_UNSUPPORTED_TYPE 0x1713
diff --git a/src/coreclr/src/gc/CMakeLists.txt b/src/coreclr/src/gc/CMakeLists.txt
index c46f46fdfbae..c68bbcefc347 100644
--- a/src/coreclr/src/gc/CMakeLists.txt
+++ b/src/coreclr/src/gc/CMakeLists.txt
@@ -1,11 +1,11 @@
set(CMAKE_INCLUDE_CURRENT_DIR ON)
-# Local GC meta-issue: https://github.com/dotnet/coreclr/issues/11518
+# Local GC meta-issue: https://github.com/dotnet/runtime/issues/8061
-# https://github.com/dotnet/coreclr/issues/11516
+# https://github.com/dotnet/runtime/issues/8059
remove_definitions(-DSTRESS_HEAP)
-# https://github.com/dotnet/coreclr/issues/11519
+# https://github.com/dotnet/runtime/issues/8062
remove_definitions(-DWRITE_BARRIER_CHECK)
set( GC_SOURCES
@@ -42,7 +42,7 @@ endif(CLR_CMAKE_HOST_UNIX)
if (CLR_CMAKE_TARGET_ARCH_AMD64 AND CLR_CMAKE_TARGET_WIN32)
set ( GC_SOURCES
${GC_SOURCES}
- vxsort/isa_detection_dummy.cpp
+ vxsort/isa_detection.cpp
vxsort/do_vxsort_avx2.cpp
vxsort/do_vxsort_avx512.cpp
vxsort/machine_traits.avx2.cpp
@@ -50,6 +50,7 @@ if (CLR_CMAKE_TARGET_ARCH_AMD64 AND CLR_CMAKE_TARGET_WIN32)
vxsort/smallsort/bitonic_sort.AVX2.int32_t.generated.cpp
vxsort/smallsort/bitonic_sort.AVX512.int64_t.generated.cpp
vxsort/smallsort/bitonic_sort.AVX512.int32_t.generated.cpp
+ vxsort/smallsort/avx2_load_mask_tables.cpp
)
endif (CLR_CMAKE_TARGET_ARCH_AMD64 AND CLR_CMAKE_TARGET_WIN32)
@@ -112,7 +113,7 @@ target_link_libraries(clrgc ${GC_LINK_LIBRARIES})
install_clr(TARGETS clrgc)
if(CLR_CMAKE_HOST_UNIX)
- # dprintf causes many warnings (https://github.com/dotnet/coreclr/issues/13367)
+ # dprintf causes many warnings (https://github.com/dotnet/runtime/issues/8737)
add_compile_options(-Wno-format)
endif(CLR_CMAKE_HOST_UNIX)
diff --git a/src/coreclr/src/gc/env/gcenv.ee.h b/src/coreclr/src/gc/env/gcenv.ee.h
index 986acabacbec..d596575ad2b4 100644
--- a/src/coreclr/src/gc/env/gcenv.ee.h
+++ b/src/coreclr/src/gc/env/gcenv.ee.h
@@ -86,7 +86,7 @@ class GCToEEInterface
static uint32_t GetTotalNumSizedRefHandles();
static bool AnalyzeSurvivorsRequested(int condemnedGeneration);
- static void AnalyzeSurvivorsFinished(int condemnedGeneration);
+ static void AnalyzeSurvivorsFinished(size_t gcIndex, int condemnedGeneration, uint64_t promoted_bytes, void (*reportGenerationBounds)());
static void VerifySyncTableEntry();
static void UpdateGCEventStatus(int publicLevel, int publicKeywords, int privateLevel, int privateKeywords);
diff --git a/src/coreclr/src/gc/env/gcenv.object.h b/src/coreclr/src/gc/env/gcenv.object.h
index c5c6d42fd641..9bbdbe912447 100644
--- a/src/coreclr/src/gc/env/gcenv.object.h
+++ b/src/coreclr/src/gc/env/gcenv.object.h
@@ -164,7 +164,11 @@ class Object
MethodTable * GetGCSafeMethodTable() const
{
+#ifdef HOST_64BIT
+ return (MethodTable *)((uintptr_t)m_pMethTab & ~7);
+#else
return (MethodTable *)((uintptr_t)m_pMethTab & ~3);
+#endif //HOST_64BIT
}
void RawSetMethodTable(MethodTable * pMT)
diff --git a/src/coreclr/src/gc/env/gcenv.os.h b/src/coreclr/src/gc/env/gcenv.os.h
index 3dee37ad8e54..f8724fc8687a 100644
--- a/src/coreclr/src/gc/env/gcenv.os.h
+++ b/src/coreclr/src/gc/env/gcenv.os.h
@@ -290,7 +290,7 @@ class GCToOSInterface
// size - size of the virtual memory range
// Return:
// Address of the allocated memory
- static void* VirtualReserveAndCommitLargePages(size_t size);
+ static void* VirtualReserveAndCommitLargePages(size_t size, uint16_t node = NUMA_NODE_UNDEFINED);
// Decomit virtual memory range.
// Parameters:
diff --git a/src/coreclr/src/gc/gc.cpp b/src/coreclr/src/gc/gc.cpp
index 6bf8e51a6bce..9f022df84657 100644
--- a/src/coreclr/src/gc/gc.cpp
+++ b/src/coreclr/src/gc/gc.cpp
@@ -53,6 +53,9 @@ BOOL bgc_heap_walk_for_etw_p = FALSE;
#define MAX_PTR ((uint8_t*)(~(ptrdiff_t)0))
#define commit_min_th (16*OS_PAGE_SIZE)
+#define MIN_SOH_CROSS_GEN_REFS (400)
+#define MIN_LOH_CROSS_GEN_REFS (800)
+
static size_t smoothed_desired_per_heap = 0;
#ifdef SERVER_GC
@@ -197,10 +200,10 @@ gc_oh_num gen_to_oh(int gen)
{
switch (gen)
{
- case soh_gen0:
+ case soh_gen0:
return gc_oh_num::soh;
case soh_gen1:
- return gc_oh_num::soh;
+ return gc_oh_num::soh;
case soh_gen2:
return gc_oh_num::soh;
case loh_generation:
@@ -445,7 +448,7 @@ void log_va_msg(const char *fmt, va_list args)
{
gc_log_lock.Enter();
- const int BUFFERSIZE = 512;
+ const int BUFFERSIZE = 4096;
static char rgchBuffer[BUFFERSIZE];
char * pBuffer = &rgchBuffer[0];
@@ -1213,7 +1216,7 @@ class exclusive_sync
void uoh_alloc_done_with_index (int index)
{
dprintf (3, ("uoh alloc: release lock on %Ix based on %d", (uint8_t *)alloc_objects[index], index));
- assert ((index >= 0) && (index < max_pending_allocs));
+ assert ((index >= 0) && (index < max_pending_allocs));
alloc_objects[index] = (uint8_t*)0;
}
@@ -1984,6 +1987,8 @@ void stomp_write_barrier_resize(bool is_runtime_suspended, bool requires_upper_b
void stomp_write_barrier_ephemeral(uint8_t* ephemeral_low, uint8_t* ephemeral_high)
{
+ initGCShadow();
+
WriteBarrierParameters args = {};
args.operation = WriteBarrierOp::StompEphemeral;
args.is_runtime_suspended = true;
@@ -2021,7 +2026,7 @@ void stomp_write_barrier_initialize(uint8_t* ephemeral_low, uint8_t* ephemeral_h
// Things we need to manually initialize:
// gen0 min_size - based on cache
// gen0/1 max_size - based on segment size
-static static_data static_data_table[latency_level_last - latency_level_first + 1][total_generation_count] =
+static static_data static_data_table[latency_level_last - latency_level_first + 1][total_generation_count] =
{
// latency_level_memory_footprint
{
@@ -2089,7 +2094,7 @@ void qsort1(uint8_t** low, uint8_t** high, unsigned int depth);
#endif //USE_INTROSORT
void* virtual_alloc (size_t size);
-void* virtual_alloc (size_t size, bool use_large_pages_p);
+void* virtual_alloc (size_t size, bool use_large_pages_p, uint16_t numa_node = NUMA_NODE_UNDEFINED);
/* per heap static initialization */
#if defined(BACKGROUND_GC) && !defined(MULTIPLE_HEAPS)
@@ -2182,6 +2187,8 @@ size_t gc_heap::current_total_committed_bookkeeping = 0;
double gc_heap::short_plugs_pad_ratio = 0;
#endif //SHORT_PLUGS
+int gc_heap::generation_skip_ratio_threshold = 0;
+
uint64_t gc_heap::suspended_start_time = 0;
uint64_t gc_heap::end_gc_time = 0;
uint64_t gc_heap::total_suspended_time = 0;
@@ -2271,6 +2278,12 @@ uint32_t gc_heap::fgn_maxgen_percent = 0;
size_t gc_heap::fgn_last_alloc = 0;
int gc_heap::generation_skip_ratio = 100;
+#ifdef FEATURE_CARD_MARKING_STEALING
+VOLATILE(size_t) gc_heap::n_eph_soh = 0;
+VOLATILE(size_t) gc_heap::n_gen_soh = 0;
+VOLATILE(size_t) gc_heap::n_eph_loh = 0;
+VOLATILE(size_t) gc_heap::n_gen_loh = 0;
+#endif //FEATURE_CARD_MARKING_STEALING
uint64_t gc_heap::loh_alloc_since_cg = 0;
@@ -2285,6 +2298,9 @@ uint8_t* gc_heap::background_saved_lowest_address = 0;
uint8_t* gc_heap::background_saved_highest_address = 0;
uint8_t* gc_heap::next_sweep_obj = 0;
uint8_t* gc_heap::current_sweep_pos = 0;
+#ifdef DOUBLY_LINKED_FL
+heap_segment* gc_heap::current_sweep_seg = 0;
+#endif //DOUBLY_LINKED_FL
exclusive_sync* gc_heap::bgc_alloc_lock;
#endif //BACKGROUND_GC
@@ -2597,6 +2613,11 @@ alloc_list gc_heap::loh_alloc_list [NUM_LOH_ALIST-1];
alloc_list gc_heap::gen2_alloc_list[NUM_GEN2_ALIST-1];
alloc_list gc_heap::poh_alloc_list [NUM_POH_ALIST-1];
+#ifdef DOUBLY_LINKED_FL
+// size we removed with no undo; only for recording purpose
+size_t gc_heap::gen2_removed_no_undo = 0;
+#endif //DOUBLY_LINKED_FL
+
dynamic_data gc_heap::dynamic_data_table [total_generation_count];
gc_history_per_heap gc_heap::gc_data_per_heap;
size_t gc_heap::maxgen_pinned_compact_before_advance = 0;
@@ -3039,7 +3060,7 @@ gc_heap::dt_low_card_table_efficiency_p (gc_tuning_point tp)
/* promote into max-generation if the card table has too many
* generation faults besides the n -> 0
*/
- ret = (generation_skip_ratio < 30);
+ ret = (generation_skip_ratio < generation_skip_ratio_threshold);
break;
}
@@ -3604,10 +3625,43 @@ heap_segment* seg_mapping_table_segment_of (uint8_t* o)
size_t gcard_of ( uint8_t*);
#define GC_MARKED (size_t)0x1
+#ifdef DOUBLY_LINKED_FL
+// This bit indicates that we'll need to set the bgc mark bit for this object during an FGC.
+// We only do this when we decide to compact.
+#define BGC_MARKED_BY_FGC (size_t)0x2
+#define MAKE_FREE_OBJ_IN_COMPACT (size_t)0x4
+#endif //DOUBLY_LINKED_FL
+
#define slot(i, j) ((uint8_t**)(i))[(j)+1]
#define free_object_base_size (plug_skew + sizeof(ArrayBase))
+#define free_list_slot(x) ((uint8_t**)(x))[2]
+#define free_list_undo(x) ((uint8_t**)(x))[-1]
+#define UNDO_EMPTY ((uint8_t*)1)
+
+#ifdef DOUBLY_LINKED_FL
+#define free_list_prev(x) ((uint8_t**)(x))[3]
+#define PREV_EMPTY ((uint8_t*)1)
+
+void check_and_clear_in_free_list (uint8_t* o, size_t size)
+{
+ if (size >= min_free_list)
+ {
+ free_list_prev (o) = PREV_EMPTY;
+ }
+}
+// This is used when we need to clear the prev bit for a free object we made because we know
+// it's not actually a free obj (it's just a temporary thing during allocation).
+void clear_prev_bit (uint8_t* o, size_t size)
+{
+ if (size >= min_free_list)
+ {
+ free_list_prev (o) = 0;
+ }
+}
+#endif //DOUBLY_LINKED_FL
+
class CObjectHeader : public Object
{
public:
@@ -3678,7 +3732,11 @@ class CObjectHeader : public Object
MethodTable *GetMethodTable() const
{
- return( (MethodTable *) (((size_t) RawGetMethodTable()) & (~(GC_MARKED))));
+ return( (MethodTable *) (((size_t) RawGetMethodTable()) & (~(GC_MARKED
+#ifdef DOUBLY_LINKED_FL
+ | BGC_MARKED_BY_FGC | MAKE_FREE_OBJ_IN_COMPACT
+#endif //DOUBLY_LINKED_FL
+ ))));
}
void SetMarked()
@@ -3703,10 +3761,43 @@ class CObjectHeader : public Object
return !!((((CObjectHeader*)this)->GetHeader()->GetBits()) & BIT_SBLK_GC_RESERVE);
}
+ // Now we set more bits should actually only clear the mark bit
void ClearMarked()
{
- RawSetMethodTable( GetMethodTable() );
+#ifdef DOUBLY_LINKED_FL
+ RawSetMethodTable ((MethodTable *)(((size_t) RawGetMethodTable()) & (~GC_MARKED)));
+#else
+ RawSetMethodTable (GetMethodTable());
+#endif //DOUBLY_LINKED_FL
+ }
+
+#ifdef DOUBLY_LINKED_FL
+ void SetBGCMarkBit()
+ {
+ RawSetMethodTable((MethodTable *) (((size_t) RawGetMethodTable()) | BGC_MARKED_BY_FGC));
+ }
+ BOOL IsBGCMarkBitSet() const
+ {
+ return !!(((size_t)RawGetMethodTable()) & BGC_MARKED_BY_FGC);
+ }
+ void ClearBGCMarkBit()
+ {
+ RawSetMethodTable((MethodTable *)(((size_t) RawGetMethodTable()) & (~BGC_MARKED_BY_FGC)));
+ }
+
+ void SetFreeObjInCompactBit()
+ {
+ RawSetMethodTable((MethodTable *) (((size_t) RawGetMethodTable()) | MAKE_FREE_OBJ_IN_COMPACT));
+ }
+ BOOL IsFreeObjInCompactBitSet() const
+ {
+ return !!(((size_t)RawGetMethodTable()) & MAKE_FREE_OBJ_IN_COMPACT);
+ }
+ void ClearFreeObjInCompactBit()
+ {
+ RawSetMethodTable((MethodTable *)(((size_t) RawGetMethodTable()) & (~MAKE_FREE_OBJ_IN_COMPACT)));
}
+#endif //DOUBLY_LINKED_FL
CGCDesc *GetSlotMap ()
{
@@ -3730,8 +3821,26 @@ class CObjectHeader : public Object
//((void**) this)[-1] = 0; // clear the sync block,
assert (*numComponentsPtr >= 0);
if (GCConfig::GetHeapVerifyLevel() & GCConfig::HEAPVERIFY_GC)
+ {
memset (((uint8_t*)this)+sizeof(ArrayBase), 0xcc, *numComponentsPtr);
+#ifdef DOUBLY_LINKED_FL
+ // However, in this case we can't leave the Next field uncleared because no one will clear it
+ // so it remains 0xcc and that's not good for verification
+ if (*numComponentsPtr > 0)
+ {
+ free_list_slot (this) = 0;
+ }
+#endif //DOUBLY_LINKED_FL
+ }
#endif //VERIFY_HEAP
+
+#ifdef DOUBLY_LINKED_FL
+ // For background GC, we need to distinguish between a free object that's not on the free list
+ // and one that is. So we always set its prev to PREV_EMPTY to indicate that it's a free
+ // object that's not on the free list. If it should be on the free list, it will be set to the
+ // appropriate non zero value.
+ check_and_clear_in_free_list ((uint8_t*)this, size);
+#endif //DOUBLY_LINKED_FL
}
void UnsetFree()
@@ -3782,9 +3891,57 @@ class CObjectHeader : public Object
#define header(i) ((CObjectHeader*)(i))
-#define free_list_slot(x) ((uint8_t**)(x))[2]
-#define free_list_undo(x) ((uint8_t**)(x))[-1]
-#define UNDO_EMPTY ((uint8_t*)1)
+#ifdef DOUBLY_LINKED_FL
+inline
+BOOL is_on_free_list (uint8_t* o, size_t size)
+{
+ if (size >= min_free_list)
+ {
+ if (header(o)->GetMethodTable() == g_gc_pFreeObjectMethodTable)
+ {
+ return (free_list_prev (o) != PREV_EMPTY);
+ }
+ }
+
+ return FALSE;
+}
+
+inline
+void set_plug_bgc_mark_bit (uint8_t* node)
+{
+ header(node)->SetBGCMarkBit();
+}
+
+inline
+BOOL is_plug_bgc_mark_bit_set (uint8_t* node)
+{
+ return header(node)->IsBGCMarkBitSet();
+}
+
+inline
+void clear_plug_bgc_mark_bit (uint8_t* node)
+{
+ header(node)->ClearBGCMarkBit();
+}
+
+inline
+void set_free_obj_in_compact_bit (uint8_t* node)
+{
+ header(node)->SetFreeObjInCompactBit();
+}
+
+inline
+BOOL is_free_obj_in_compact_bit_set (uint8_t* node)
+{
+ return header(node)->IsFreeObjInCompactBitSet();
+}
+
+inline
+void clear_free_obj_in_compact_bit (uint8_t* node)
+{
+ header(node)->ClearFreeObjInCompactBit();
+}
+#endif //DOUBLY_LINKED_FL
#ifdef SHORT_PLUGS
inline
@@ -3914,6 +4071,14 @@ struct imemory_data
uint8_t* memory_base;
};
+struct numa_reserved_block
+{
+ uint8_t* memory_base;
+ size_t block_size;
+
+ numa_reserved_block() : memory_base(nullptr), block_size(0) { }
+};
+
struct initial_memory_details
{
imemory_data *initial_memory;
@@ -3930,12 +4095,13 @@ struct initial_memory_details
int current_block_large;
int current_block_pinned;
- enum
- {
+ enum
+ {
ALLATONCE = 1,
EACH_GENERATION,
EACH_BLOCK,
- ALLATONCE_SEPARATED_POH
+ ALLATONCE_SEPARATED_POH,
+ EACH_NUMA_NODE
};
size_t allocation_pattern;
@@ -3955,8 +4121,8 @@ struct initial_memory_details
{
switch (gen)
{
- case soh_gen0:
- case soh_gen1:
+ case soh_gen0:
+ case soh_gen1:
case soh_gen2: return initial_normal_heap[h_number].memory_base;
case loh_generation: return initial_large_heap[h_number].memory_base;
case poh_generation: return initial_pinned_heap[h_number].memory_base;
@@ -3968,8 +4134,8 @@ struct initial_memory_details
{
switch (gen)
{
- case soh_gen0:
- case soh_gen1:
+ case soh_gen0:
+ case soh_gen1:
case soh_gen2: return block_size_normal;
case loh_generation: return block_size_large;
case poh_generation: return block_size_pinned;
@@ -3977,11 +4143,13 @@ struct initial_memory_details
}
};
+ int numa_reserved_block_count;
+ numa_reserved_block* numa_reserved_block_table;
};
initial_memory_details memory_details;
-BOOL gc_heap::reserve_initial_memory (size_t normal_size, size_t large_size, size_t pinned_size, int num_heaps, bool use_large_pages_p, bool separated_poh_p)
+BOOL gc_heap::reserve_initial_memory (size_t normal_size, size_t large_size, size_t pinned_size, int num_heaps, bool use_large_pages_p, bool separated_poh_p, uint16_t* heap_no_to_numa_node)
{
BOOL reserve_success = FALSE;
@@ -3989,7 +4157,7 @@ BOOL gc_heap::reserve_initial_memory (size_t normal_size, size_t large_size, siz
assert (memory_details.initial_memory == 0);
// soh + loh + poh segments * num_heaps
- memory_details.initial_memory = new (nothrow) imemory_data[num_heaps * (total_generation_count - ephemeral_generation_count)];
+ memory_details.initial_memory = new (nothrow) imemory_data[num_heaps * (total_generation_count - ephemeral_generation_count)];
if (memory_details.initial_memory == 0)
{
dprintf (2, ("failed to reserve %Id bytes for imemory_data", num_heaps * (total_generation_count - ephemeral_generation_count) * sizeof (imemory_data)));
@@ -4025,127 +4193,286 @@ BOOL gc_heap::reserve_initial_memory (size_t normal_size, size_t large_size, siz
return FALSE;
}
- size_t temp_pinned_size = (separated_poh_p ? 0 : pinned_size);
- size_t separate_pinned_size = memory_details.block_count * pinned_size;
- size_t requestedMemory = memory_details.block_count * (normal_size + large_size + temp_pinned_size);
-
- uint8_t* allatonce_block = (uint8_t*)virtual_alloc (requestedMemory, use_large_pages_p);
- uint8_t* separated_poh_block = nullptr;
- if (allatonce_block && separated_poh_p)
+ // figure out number of NUMA nodes and allocate additional table for NUMA local reservation
+ memory_details.numa_reserved_block_count = 0;
+ memory_details.numa_reserved_block_table = nullptr;
+ int numa_node_count = 0;
+ if (heap_no_to_numa_node != nullptr)
{
- separated_poh_block = (uint8_t*)virtual_alloc (separate_pinned_size, false);
- if (!separated_poh_block)
+ uint16_t highest_numa_node = 0;
+
+ // figure out the highest NUMA node
+ for (int heap_no = 0; heap_no < num_heaps; heap_no++)
{
- virtual_free (allatonce_block, requestedMemory);
- allatonce_block = nullptr;
+ uint16_t heap_numa_node = heap_no_to_numa_node[heap_no];
+ highest_numa_node = max (highest_numa_node, heap_numa_node);
}
- }
- if (allatonce_block)
- {
- if (separated_poh_p)
+
+ assert (highest_numa_node < MAX_SUPPORTED_CPUS);
+
+ numa_node_count = highest_numa_node + 1;
+ memory_details.numa_reserved_block_count = numa_node_count * (1 + separated_poh_p);
+ memory_details.numa_reserved_block_table = new (nothrow) numa_reserved_block[memory_details.numa_reserved_block_count];
+ if (memory_details.numa_reserved_block_table == nullptr)
{
- g_gc_lowest_address = min (allatonce_block, separated_poh_block);
- g_gc_highest_address = max ((allatonce_block + requestedMemory), (separated_poh_block + separate_pinned_size));
- memory_details.allocation_pattern = initial_memory_details::ALLATONCE_SEPARATED_POH;
+ // we couldn't get the memory - continue as if doing the non-NUMA case
+ dprintf(2, ("failed to reserve %Id bytes for numa_reserved_block data", memory_details.numa_reserved_block_count * sizeof(numa_reserved_block)));
+ memory_details.numa_reserved_block_count = 0;
}
- else
+ }
+
+ if (memory_details.numa_reserved_block_table != nullptr)
+ {
+ // figure out how much to reserve on each NUMA node
+ // note this can be very different between NUMA nodes, depending on
+ // which processors our heaps are associated with
+ size_t merged_pinned_size = separated_poh_p ? 0 : pinned_size;
+ for (int heap_no = 0; heap_no < num_heaps; heap_no++)
{
- g_gc_lowest_address = allatonce_block;
- g_gc_highest_address = allatonce_block + requestedMemory;
- memory_details.allocation_pattern = initial_memory_details::ALLATONCE;
+ uint16_t heap_numa_node = heap_no_to_numa_node[heap_no];
+
+ numa_reserved_block * block = &memory_details.numa_reserved_block_table[heap_numa_node];
+
+ // add the size required for this heap
+ block->block_size += normal_size + large_size + merged_pinned_size;
+
+ if (separated_poh_p)
+ {
+ numa_reserved_block* pinned_block = &memory_details.numa_reserved_block_table[numa_node_count + heap_numa_node];
+
+ // add the pinned size required for this heap
+ pinned_block->block_size += pinned_size;
+ }
}
- for (int i = 0; i < memory_details.block_count; i++)
+ // reserve the appropriate size on each NUMA node
+ bool failure = false;
+ for (int block_index = 0; block_index < memory_details.numa_reserved_block_count; block_index++)
{
- memory_details.initial_normal_heap[i].memory_base = allatonce_block +
- (i * normal_size);
- memory_details.initial_large_heap[i].memory_base = allatonce_block +
- (memory_details.block_count * normal_size) + (i * large_size);
- if (separated_poh_p)
+ numa_reserved_block * block = &memory_details.numa_reserved_block_table[block_index];
+
+ if (block->block_size == 0)
+ continue;
+
+ int numa_node = block_index % numa_node_count;
+ bool pinned_block = block_index >= numa_node_count;
+ block->memory_base = (uint8_t*)virtual_alloc (block->block_size, use_large_pages_p && !pinned_block, numa_node);
+ if (block->memory_base == nullptr)
{
- memory_details.initial_pinned_heap[i].memory_base = separated_poh_block +
- (i * pinned_size);
+ dprintf(2, ("failed to reserve %Id bytes for on NUMA node %u", block->block_size, numa_node));
+ failure = true;
+ break;
}
else
{
- memory_details.initial_pinned_heap[i].memory_base = allatonce_block +
- (memory_details.block_count * (normal_size + large_size)) + (i * pinned_size);
+ g_gc_lowest_address = min(g_gc_lowest_address, block->memory_base);
+ g_gc_highest_address = max(g_gc_highest_address, block->memory_base + block->block_size);
+ }
+ }
+
+ if (failure)
+ {
+ // if we had any failures, undo the work done so far
+ // we will instead use one of the other allocation patterns
+ // we could try to use what we did succeed to reserve, but that gets complicated
+ for (int block_index = 0; block_index < memory_details.numa_reserved_block_count; block_index++)
+ {
+ numa_reserved_block * block = &memory_details.numa_reserved_block_table[block_index];
+
+ if (block->memory_base != nullptr)
+ {
+ virtual_free(block->memory_base, block->block_size);
+ block->memory_base = nullptr;
+ }
}
+ delete [] memory_details.numa_reserved_block_table;
+ memory_details.numa_reserved_block_table = nullptr;
+ memory_details.numa_reserved_block_count = 0;
+ }
+ else
+ {
+ // for each NUMA node, give out the memory to its heaps
+ for (uint16_t numa_node = 0; numa_node < numa_node_count; numa_node++)
+ {
+ numa_reserved_block * block = &memory_details.numa_reserved_block_table[numa_node];
+
+ numa_reserved_block* pinned_block = separated_poh_p ? &memory_details.numa_reserved_block_table[numa_node_count + numa_node] : nullptr;
+
+ // if the block's size is 0, there can be no heaps on this NUMA node
+ if (block->block_size == 0)
+ {
+ assert((pinned_block == nullptr) || (pinned_block->block_size == 0));
+ continue;
+ }
+
+ uint8_t* memory_base = block->memory_base;
+ uint8_t* pinned_memory_base = ((pinned_block == nullptr) ? nullptr : pinned_block->memory_base);
+ for (int heap_no = 0; heap_no < num_heaps; heap_no++)
+ {
+ uint16_t heap_numa_node = heap_no_to_numa_node[heap_no];
+
+ if (heap_numa_node != numa_node)
+ {
+ // this heap is on another NUMA node
+ continue;
+ }
+
+ memory_details.initial_normal_heap[heap_no].memory_base = memory_base;
+ memory_base += normal_size;
+ memory_details.initial_large_heap[heap_no].memory_base = memory_base;
+ memory_base += large_size;
+
+ if (separated_poh_p)
+ {
+ memory_details.initial_pinned_heap[heap_no].memory_base = pinned_memory_base;
+ pinned_memory_base += pinned_size;
+ }
+ else
+ {
+ memory_details.initial_pinned_heap[heap_no].memory_base = memory_base;
+ memory_base += pinned_size;
+ }
+ }
+ // sanity check - we should be at the end of the memory block for this NUMA node
+ assert (memory_base == block->memory_base + block->block_size);
+ assert ((pinned_block == nullptr) || (pinned_memory_base == pinned_block->memory_base + pinned_block->block_size));
+ }
+ memory_details.allocation_pattern = initial_memory_details::EACH_NUMA_NODE;
reserve_success = TRUE;
}
}
- else
+
+ if (!reserve_success)
{
- // try to allocate 3 blocks
- uint8_t* b1 = (uint8_t*)virtual_alloc (memory_details.block_count * normal_size, use_large_pages_p);
- uint8_t* b2 = (uint8_t*)virtual_alloc (memory_details.block_count * large_size, use_large_pages_p);
- uint8_t* b3 = (uint8_t*)virtual_alloc (memory_details.block_count * pinned_size, use_large_pages_p && !separated_poh_p);
+ size_t temp_pinned_size = (separated_poh_p ? 0 : pinned_size);
+ size_t separate_pinned_size = memory_details.block_count * pinned_size;
+ size_t requestedMemory = memory_details.block_count * (normal_size + large_size + temp_pinned_size);
- if (b1 && b2 && b3)
+ uint8_t* allatonce_block = (uint8_t*)virtual_alloc(requestedMemory, use_large_pages_p);
+ uint8_t* separated_poh_block = nullptr;
+ if (allatonce_block && separated_poh_p)
+ {
+ separated_poh_block = (uint8_t*)virtual_alloc(separate_pinned_size, false);
+ if (!separated_poh_block)
+ {
+ virtual_free(allatonce_block, requestedMemory);
+ allatonce_block = nullptr;
+ }
+ }
+ if (allatonce_block)
{
- memory_details.allocation_pattern = initial_memory_details::EACH_GENERATION;
- g_gc_lowest_address = min (b1, min(b2, b3));
- g_gc_highest_address = max (b1 + memory_details.block_count * normal_size,
- max (b2 + memory_details.block_count * large_size,
- b3 + memory_details.block_count * pinned_size));
+ if (separated_poh_p)
+ {
+ g_gc_lowest_address = min(allatonce_block, separated_poh_block);
+ g_gc_highest_address = max((allatonce_block + requestedMemory), (separated_poh_block + separate_pinned_size));
+ memory_details.allocation_pattern = initial_memory_details::ALLATONCE_SEPARATED_POH;
+ }
+ else
+ {
+ g_gc_lowest_address = allatonce_block;
+ g_gc_highest_address = allatonce_block + requestedMemory;
+ memory_details.allocation_pattern = initial_memory_details::ALLATONCE;
+ }
for (int i = 0; i < memory_details.block_count; i++)
{
- memory_details.initial_normal_heap[i].memory_base = b1 + (i * normal_size);
- memory_details.initial_large_heap[i].memory_base = b2 + (i * large_size);
- memory_details.initial_pinned_heap[i].memory_base = b3 + (i * pinned_size);
+ memory_details.initial_normal_heap[i].memory_base = allatonce_block +
+ (i * normal_size);
+ memory_details.initial_large_heap[i].memory_base = allatonce_block +
+ (memory_details.block_count * normal_size) + (i * large_size);
+ if (separated_poh_p)
+ {
+ memory_details.initial_pinned_heap[i].memory_base = separated_poh_block +
+ (i * pinned_size);
+ }
+ else
+ {
+ memory_details.initial_pinned_heap[i].memory_base = allatonce_block +
+ (memory_details.block_count * (normal_size + large_size)) + (i * pinned_size);
+ }
}
-
reserve_success = TRUE;
}
else
{
- // allocation failed, we'll go on to try allocating each block.
- // We could preserve the b1 alloc, but code complexity increases
- if (b1)
- virtual_free (b1, memory_details.block_count * normal_size);
- if (b2)
- virtual_free (b2, memory_details.block_count * large_size);
- if (b3)
- virtual_free (b3, memory_details.block_count * pinned_size);
- }
+ // try to allocate 3 blocks
+ uint8_t* b1 = (uint8_t*)virtual_alloc(memory_details.block_count * normal_size, use_large_pages_p);
+ uint8_t* b2 = (uint8_t*)virtual_alloc(memory_details.block_count * large_size, use_large_pages_p);
+ uint8_t* b3 = (uint8_t*)virtual_alloc(memory_details.block_count * pinned_size, use_large_pages_p && !separated_poh_p);
- if ((b2 == NULL) && (memory_details.block_count > 1))
- {
- memory_details.allocation_pattern = initial_memory_details::EACH_BLOCK;
+ if (b1 && b2 && b3)
+ {
+ memory_details.allocation_pattern = initial_memory_details::EACH_GENERATION;
+ g_gc_lowest_address = min(b1, min(b2, b3));
+ g_gc_highest_address = max(b1 + memory_details.block_count * normal_size,
+ max(b2 + memory_details.block_count * large_size,
+ b3 + memory_details.block_count * pinned_size));
- imemory_data* current_block = memory_details.initial_memory;
- for (int i = 0; i < (memory_details.block_count * (total_generation_count - ephemeral_generation_count)); i++, current_block++)
+ for (int i = 0; i < memory_details.block_count; i++)
+ {
+ memory_details.initial_normal_heap[i].memory_base = b1 + (i * normal_size);
+ memory_details.initial_large_heap[i].memory_base = b2 + (i * large_size);
+ memory_details.initial_pinned_heap[i].memory_base = b3 + (i * pinned_size);
+ }
+
+ reserve_success = TRUE;
+ }
+ else
{
- size_t block_size = memory_details.block_size (i);
- current_block->memory_base =
- (uint8_t*)virtual_alloc (block_size, use_large_pages_p);
- if (current_block->memory_base == 0)
- {
- // Free the blocks that we've allocated so far
- current_block = memory_details.initial_memory;
- for (int j = 0; j < i; j++, current_block++) {
- if (current_block->memory_base != 0) {
- block_size = memory_details.block_size (i);
- virtual_free (current_block->memory_base, block_size);
+ // allocation failed, we'll go on to try allocating each block.
+ // We could preserve the b1 alloc, but code complexity increases
+ if (b1)
+ virtual_free(b1, memory_details.block_count * normal_size);
+ if (b2)
+ virtual_free(b2, memory_details.block_count * large_size);
+ if (b3)
+ virtual_free(b3, memory_details.block_count * pinned_size);
+ }
+
+ if ((b2 == NULL) && (memory_details.block_count > 1))
+ {
+ memory_details.allocation_pattern = initial_memory_details::EACH_BLOCK;
+
+ imemory_data* current_block = memory_details.initial_memory;
+ for (int i = 0; i < (memory_details.block_count * (total_generation_count - ephemeral_generation_count)); i++, current_block++)
+ {
+ size_t block_size = memory_details.block_size(i);
+ uint16_t numa_node = NUMA_NODE_UNDEFINED;
+ if (heap_no_to_numa_node != nullptr)
+ {
+ int heap_no = i % memory_details.block_count;
+ numa_node = heap_no_to_numa_node[heap_no];
+ }
+ current_block->memory_base =
+ (uint8_t*)virtual_alloc(block_size, use_large_pages_p, numa_node);
+ if (current_block->memory_base == 0)
+ {
+ // Free the blocks that we've allocated so far
+ current_block = memory_details.initial_memory;
+ for (int j = 0; j < i; j++, current_block++) {
+ if (current_block->memory_base != 0) {
+ block_size = memory_details.block_size(i);
+ virtual_free(current_block->memory_base, block_size);
+ }
}
+ reserve_success = FALSE;
+ break;
}
- reserve_success = FALSE;
- break;
- }
- else
- {
- if (current_block->memory_base < g_gc_lowest_address)
- g_gc_lowest_address = current_block->memory_base;
- if (((uint8_t*)current_block->memory_base + block_size) > g_gc_highest_address)
- g_gc_highest_address = (current_block->memory_base + block_size);
+ else
+ {
+ if (current_block->memory_base < g_gc_lowest_address)
+ g_gc_lowest_address = current_block->memory_base;
+ if (((uint8_t*)current_block->memory_base + block_size) > g_gc_highest_address)
+ g_gc_highest_address = (current_block->memory_base + block_size);
+ }
+ reserve_success = TRUE;
}
- reserve_success = TRUE;
}
}
}
+
return reserve_success;
}
@@ -4153,36 +4480,37 @@ void gc_heap::destroy_initial_memory()
{
if (memory_details.initial_memory != NULL)
{
- if (memory_details.allocation_pattern == initial_memory_details::ALLATONCE)
+ switch (memory_details.allocation_pattern)
{
- virtual_free(memory_details.initial_memory[0].memory_base,
+ case initial_memory_details::ALLATONCE:
+ virtual_free (memory_details.initial_memory[0].memory_base,
memory_details.block_count*(memory_details.block_size_normal +
memory_details.block_size_large + memory_details.block_size_pinned));
- }
- else if (memory_details.allocation_pattern == initial_memory_details::ALLATONCE_SEPARATED_POH)
- {
+ break;
+
+ case initial_memory_details::ALLATONCE_SEPARATED_POH:
virtual_free(memory_details.initial_memory[0].memory_base,
- memory_details.block_count*(memory_details.block_size_normal +
- memory_details.block_size_large));
+ memory_details.block_count * (memory_details.block_size_normal +
+ memory_details.block_size_large));
virtual_free(memory_details.initial_pinned_heap[0].memory_base,
- memory_details.block_count*(memory_details.block_size_pinned));
- }
- else if (memory_details.allocation_pattern == initial_memory_details::EACH_GENERATION)
- {
+ memory_details.block_count * (memory_details.block_size_pinned));
+ break;
+
+ case initial_memory_details::EACH_GENERATION:
virtual_free (memory_details.initial_normal_heap[0].memory_base,
memory_details.block_count*memory_details.block_size_normal);
virtual_free (memory_details.initial_large_heap[0].memory_base,
memory_details.block_count*memory_details.block_size_large);
- virtual_free (memory_details.initial_pinned_heap[0].memory_base,
+ virtual_free (memory_details.initial_pinned_heap[0].memory_base,
memory_details.block_count*memory_details.block_size_pinned);
- }
- else
+ break;
+
+ case initial_memory_details::EACH_BLOCK:
{
- assert (memory_details.allocation_pattern == initial_memory_details::EACH_BLOCK);
- imemory_data *current_block = memory_details.initial_memory;
- for (int i = 0; i < (memory_details.block_count*(total_generation_count - ephemeral_generation_count)); i++, current_block++)
+ imemory_data* current_block = memory_details.initial_memory;
+ for (int i = 0; i < (memory_details.block_count * (total_generation_count - ephemeral_generation_count)); i++, current_block++)
{
size_t block_size = memory_details.block_size (i);
if (current_block->memory_base != NULL)
@@ -4190,6 +4518,24 @@ void gc_heap::destroy_initial_memory()
virtual_free (current_block->memory_base, block_size);
}
}
+ break;
+ }
+ case initial_memory_details::EACH_NUMA_NODE:
+ for (int block_index = 0; block_index < memory_details.numa_reserved_block_count; block_index++)
+ {
+ numa_reserved_block * block = &memory_details.numa_reserved_block_table[block_index];
+
+ if (block->memory_base != nullptr)
+ {
+ virtual_free (block->memory_base, block->block_size);
+ }
+ }
+ delete [] memory_details.numa_reserved_block_table;
+ break;
+
+ default:
+ assert (!"unexpected allocation_pattern");
+ break;
}
delete [] memory_details.initial_memory;
@@ -4215,7 +4561,7 @@ void* virtual_alloc (size_t size)
return virtual_alloc(size, false);
}
-void* virtual_alloc (size_t size, bool use_large_pages_p)
+void* virtual_alloc (size_t size, bool use_large_pages_p, uint16_t numa_node)
{
size_t requested_size = size;
@@ -4238,8 +4584,8 @@ void* virtual_alloc (size_t size, bool use_large_pages_p)
#endif // !FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
void* prgmem = use_large_pages_p ?
- GCToOSInterface::VirtualReserveAndCommitLargePages(requested_size) :
- GCToOSInterface::VirtualReserve(requested_size, card_size * card_word_width, flags);
+ GCToOSInterface::VirtualReserveAndCommitLargePages(requested_size, numa_node) :
+ GCToOSInterface::VirtualReserve(requested_size, card_size * card_word_width, flags, numa_node);
void *aligned_mem = prgmem;
// We don't want (prgmem + size) to be right at the end of the address space
@@ -4817,10 +5163,45 @@ class heap_select
memset(sniff_buffer, 0, sniff_buf_size*sizeof(uint8_t));
}
- //can not enable gc numa aware, force all heaps to be in
- //one numa node by filling the array with all 0s
- if (!GCToOSInterface::CanEnableGCNumaAware())
- memset(heap_no_to_numa_node, 0, sizeof (heap_no_to_numa_node));
+ bool do_numa = GCToOSInterface::CanEnableGCNumaAware();
+
+ // we want to assign heap indices such that there is a contiguous
+ // range of heap numbers for each numa node
+
+ // we do this in two passes:
+ // 1. gather processor numbers and numa node numbers for all heaps
+ // 2. assign heap numbers for each numa node
+
+ // Pass 1: gather processor numbers and numa node numbers
+ uint16_t proc_no[MAX_SUPPORTED_CPUS];
+ uint16_t node_no[MAX_SUPPORTED_CPUS];
+ uint16_t max_node_no = 0;
+ for (int i = 0; i < n_heaps; i++)
+ {
+ if (!GCToOSInterface::GetProcessorForHeap (i, &proc_no[i], &node_no[i]))
+ break;
+ if (!do_numa || node_no[i] == NUMA_NODE_UNDEFINED)
+ node_no[i] = 0;
+ max_node_no = max(max_node_no, node_no[i]);
+ }
+
+ // Pass 2: assign heap numbers by numa node
+ int cur_heap_no = 0;
+ for (uint16_t cur_node_no = 0; cur_node_no <= max_node_no; cur_node_no++)
+ {
+ for (int i = 0; i < n_heaps; i++)
+ {
+ if (node_no[i] != cur_node_no)
+ continue;
+
+ // we found a heap on cur_node_no
+ heap_no_to_proc_no[cur_heap_no] = proc_no[i];
+ heap_no_to_numa_node[cur_heap_no] = cur_node_no;
+ proc_no_to_numa_node[proc_no[i]] = cur_node_no;
+
+ cur_heap_no++;
+ }
+ }
return TRUE;
}
@@ -5021,6 +5402,9 @@ class heap_select
uint16_t numa_node = heap_no_to_numa_node[hn];
*start = (int)numa_node_to_heap_map[numa_node];
*end = (int)(numa_node_to_heap_map[numa_node+1]);
+#ifdef HEAP_BALANCE_INSTRUMENTATION
+ dprintf(HEAP_BALANCE_TEMP_LOG, ("TEMPget_heap_range: %d is in numa node %d, start = %d, end = %d", hn, numa_node, *start, *end));
+#endif //HEAP_BALANCE_INSTRUMENTATION
}
// This gets the next valid numa node index starting at current_index+1.
@@ -5206,7 +5590,7 @@ void add_to_hb_numa (
(hb_info_proc->index)++;
}
-const int hb_log_buffer_size = 1024;
+const int hb_log_buffer_size = 4096;
static char hb_log_buffer[hb_log_buffer_size];
int last_hb_recorded_gc_index = -1;
#endif //HEAP_BALANCE_INSTRUMENTATION
@@ -5421,24 +5805,6 @@ void gc_heap::destroy_thread_support ()
}
}
-bool get_proc_and_numa_for_heap (int heap_number)
-{
- uint16_t proc_no;
- uint16_t node_no;
-
- bool res = GCToOSInterface::GetProcessorForHeap (heap_number, &proc_no, &node_no);
- if (res)
- {
- heap_select::set_proc_no_for_heap (heap_number, proc_no);
- if (node_no != NUMA_NODE_UNDEFINED)
- {
- heap_select::set_numa_node_for_heap_and_proc (heap_number, proc_no, node_no);
- }
- }
-
- return res;
-}
-
void set_thread_affinity_for_heap (int heap_number, uint16_t proc_no)
{
if (!GCToOSInterface::SetThreadAffinity (proc_no))
@@ -5483,6 +5849,7 @@ void gc_heap::gc_thread_function ()
END_TIMING(suspend_ee_during_log);
proceed_with_gc_p = TRUE;
+ gradual_decommit_in_progress_p = FALSE;
if (!should_proceed_with_gc())
{
@@ -5622,7 +5989,7 @@ bool gc_heap::virtual_commit (void* address, size_t size, gc_oh_num oh, int h_nu
check_commit_cs.Enter();
bool exceeded_p = false;
- if (heap_hard_limit_oh[0] != 0)
+ if (heap_hard_limit_oh[soh] != 0)
{
if ((oh != gc_oh_num::none) && (committed_by_oh[oh] + size) > heap_hard_limit_oh[oh])
{
@@ -5669,7 +6036,7 @@ bool gc_heap::virtual_commit (void* address, size_t size, gc_oh_num oh, int h_nu
{
check_commit_cs.Enter();
committed_by_oh[oh] -= size;
-
+
dprintf (1, ("commit failed, updating %Id to %Id",
current_total_committed, (current_total_committed - size)));
current_total_committed -= size;
@@ -5893,8 +6260,13 @@ class mark
// We should think about whether it's really necessary to have to copy back the pre plug
// info since it was already copied during compacting plugs. But if a plug doesn't move
// by >= 3 ptr size (the size of gap_reloc_pair), it means we'd have to recover pre plug info.
- void recover_plug_info()
+ size_t recover_plug_info()
{
+ // We need to calculate the size for sweep case in order to correctly record the
+ // free_obj_space - sweep would've made these artifical gaps into free objects and
+ // we would need to deduct the size because now we are writing into those free objects.
+ size_t recovered_sweep_size = 0;
+
if (saved_pre_p)
{
if (gc_heap::settings.compaction)
@@ -5912,6 +6284,7 @@ class mark
&saved_pre_plug,
(first - sizeof (plug_and_gap))));
memcpy ((first - sizeof (plug_and_gap)), &saved_pre_plug, sizeof (saved_pre_plug));
+ recovered_sweep_size += sizeof (saved_pre_plug);
}
}
@@ -5932,8 +6305,11 @@ class mark
&saved_post_plug,
saved_post_plug_info_start));
memcpy (saved_post_plug_info_start, &saved_post_plug, sizeof (saved_post_plug));
+ recovered_sweep_size += sizeof (saved_post_plug);
}
}
+
+ return recovered_sweep_size;
}
};
@@ -6053,7 +6429,7 @@ void gc_heap::fix_uoh_allocation_area()
#endif // _DEBUG
generation_alloc_context (generation_of (i));
assert (acontext->alloc_ptr == 0);
- assert (acontext->alloc_limit == 0);
+ assert (acontext->alloc_limit == 0);
#if 0
dprintf (3, ("UOH alloc context: gen: %Ix, ptr: %Ix, limit %Ix",
@@ -8282,44 +8658,16 @@ static void do_vxsort (uint8_t** item_array, ptrdiff_t item_count, uint8_t* rang
if (IsSupportedInstructionSet (InstructionSet::AVX2) && (item_count > AVX2_THRESHOLD_SIZE))
{
- // is the range small enough for a 32-bit sort?
- // the 32-bit sort is almost twice as fast
- ptrdiff_t range = range_high - range_low;
- assert(sizeof(uint8_t*) == (1 << 3));
- ptrdiff_t scaled_range = range >> 3;
- if ((uint32_t)scaled_range == scaled_range)
- {
- dprintf (3, ("Sorting mark lists as 32-bit offsets"));
-
- do_pack_avx2 (item_array, item_count, range_low);
-
- int32_t* item_array_32 = (int32_t*)item_array;
-
- // use AVX512F only if the list is large enough to pay for downclocking impact
- if (IsSupportedInstructionSet (InstructionSet::AVX512F) && (item_count > AVX512F_THRESHOLD_SIZE))
- {
- do_vxsort_avx512 (item_array_32, &item_array_32[item_count - 1]);
- }
- else
- {
- do_vxsort_avx2 (item_array_32, &item_array_32[item_count - 1]);
- }
+ dprintf(3, ("Sorting mark lists"));
- do_unpack_avx2 (item_array_32, item_count, range_low);
+ // use AVX512F only if the list is large enough to pay for downclocking impact
+ if (IsSupportedInstructionSet (InstructionSet::AVX512F) && (item_count > AVX512F_THRESHOLD_SIZE))
+ {
+ do_vxsort_avx512 (item_array, &item_array[item_count - 1], range_low, range_high);
}
else
{
- dprintf(3, ("Sorting mark lists"));
-
- // use AVX512F only if the list is large enough to pay for downclocking impact
- if (IsSupportedInstructionSet (InstructionSet::AVX512F) && (item_count > AVX512F_THRESHOLD_SIZE))
- {
- do_vxsort_avx512 (item_array, &item_array[item_count - 1]);
- }
- else
- {
- do_vxsort_avx2 (item_array, &item_array[item_count - 1]);
- }
+ do_vxsort_avx2 (item_array, &item_array[item_count - 1], range_low, range_high);
}
}
else
@@ -8347,6 +8695,8 @@ void gc_heap::sort_mark_list()
{
if (settings.condemned_generation >= max_generation)
{
+ // fake a mark list overflow so merge_mark_lists knows to quit early
+ mark_list_index = mark_list_end + 1;
return;
}
@@ -8397,7 +8747,7 @@ void gc_heap::sort_mark_list()
high = max (high, heap_segment_allocated (hp->ephemeral_heap_segment));
}
- // give up if this is not an ephemeral GC or the mark list size is unreasonably large
+ // give up if the mark list size is unreasonably large
if (total_mark_list_size > (total_ephemeral_size / 256))
{
mark_list_index = mark_list_end + 1;
@@ -9494,7 +9844,7 @@ int gc_heap::object_gennum_plan (uint8_t* o)
heap_segment* gc_heap::make_heap_segment (uint8_t* new_pages, size_t size, gc_oh_num oh, int h_number)
{
- assert(oh != gc_oh_num::none);
+ assert(oh != gc_oh_num::none);
size_t initial_commit = SEGMENT_INITIAL_COMMIT;
if (!virtual_commit (new_pages, initial_commit, oh, h_number))
@@ -10053,11 +10403,11 @@ void gc_heap::make_generation (int gen_num, heap_segment* seg, uint8_t* start)
gen->allocation_segment = seg;
gen->plan_allocation_start = 0;
gen->free_list_space = 0;
- gen->pinned_allocated = 0;
- gen->free_list_allocated = 0;
+ gen->pinned_allocated = 0;
+ gen->free_list_allocated = 0;
gen->end_seg_allocated = 0;
- gen->condemned_allocated = 0;
- gen->sweep_allocated = 0;
+ gen->condemned_allocated = 0;
+ gen->sweep_allocated = 0;
gen->free_obj_space = 0;
gen->allocation_size = 0;
gen->pinned_allocation_sweep_size = 0;
@@ -10065,6 +10415,10 @@ void gc_heap::make_generation (int gen_num, heap_segment* seg, uint8_t* start)
gen->allocate_end_seg_p = FALSE;
gen->free_list_allocator.clear();
+#ifdef DOUBLY_LINKED_FL
+ gen->set_bgc_mark_bit_p = FALSE;
+#endif //DOUBLY_LINKED_FL
+
#ifdef FREE_USAGE_STATS
memset (gen->gen_free_spaces, 0, sizeof (gen.gen_free_spaces));
memset (gen->gen_current_pinned_free_spaces, 0, sizeof (gen.gen_current_pinned_free_spaces));
@@ -10097,9 +10451,10 @@ FILE* CreateLogFile(const GCConfigStringHolder& temp_logfile_name, bool is_confi
}
char logfile_name[MAX_LONGPATH+1];
- uint32_t pid = GCToOSInterface::GetCurrentProcessId();
+ //uint32_t pid = GCToOSInterface::GetCurrentProcessId();
const char* suffix = is_config ? ".config.log" : ".log";
- _snprintf_s(logfile_name, MAX_LONGPATH+1, _TRUNCATE, "%s.%d%s", temp_logfile_name.Get(), pid, suffix);
+ //_snprintf_s(logfile_name, MAX_LONGPATH+1, _TRUNCATE, "%s.%d%s", temp_logfile_name.Get(), pid, suffix);
+ _snprintf_s(logfile_name, MAX_LONGPATH+1, _TRUNCATE, "%s%s", temp_logfile_name.Get(), suffix);
logFile = fopen(logfile_name, "wb");
return logFile;
}
@@ -10250,8 +10605,13 @@ HRESULT gc_heap::initialize_gc (size_t soh_segment_size,
reserved_memory = 0;
size_t initial_heap_size = soh_segment_size + loh_segment_size + poh_segment_size;
+ uint16_t* heap_no_to_numa_node = nullptr;
#ifdef MULTIPLE_HEAPS
reserved_memory_limit = initial_heap_size * number_of_heaps;
+ if (!heap_select::init(number_of_heaps))
+ return E_OUTOFMEMORY;
+ if (GCToOSInterface::CanEnableGCNumaAware())
+ heap_no_to_numa_node = heap_select::heap_no_to_numa_node;
#else //MULTIPLE_HEAPS
reserved_memory_limit = initial_heap_size;
int number_of_heaps = 1;
@@ -10262,8 +10622,8 @@ HRESULT gc_heap::initialize_gc (size_t soh_segment_size,
check_commit_cs.Initialize();
}
- bool separated_poh_p = use_large_pages_p && heap_hard_limit_oh[0] && (GCConfig::GetGCHeapHardLimitPOH() == 0) && (GCConfig::GetGCHeapHardLimitPOHPercent() == 0);
- if (!reserve_initial_memory (soh_segment_size, loh_segment_size, poh_segment_size, number_of_heaps, use_large_pages_p, separated_poh_p))
+ bool separated_poh_p = use_large_pages_p && heap_hard_limit_oh[soh] && (GCConfig::GetGCHeapHardLimitPOH() == 0) && (GCConfig::GetGCHeapHardLimitPOHPercent() == 0);
+ if (!reserve_initial_memory (soh_segment_size, loh_segment_size, poh_segment_size, number_of_heaps, use_large_pages_p, separated_poh_p, heap_no_to_numa_node))
return E_OUTOFMEMORY;
#ifdef CARD_BUNDLE
@@ -10331,9 +10691,6 @@ HRESULT gc_heap::initialize_gc (size_t soh_segment_size,
if (!create_thread_support (number_of_heaps))
return E_OUTOFMEMORY;
- if (!heap_select::init (number_of_heaps))
- return E_OUTOFMEMORY;
-
#endif //MULTIPLE_HEAPS
#ifdef MULTIPLE_HEAPS
@@ -10562,6 +10919,8 @@ gc_heap::init_semi_shared()
short_plugs_pad_ratio = (double)DESIRED_PLUG_LENGTH / (double)(DESIRED_PLUG_LENGTH - Align (min_obj_size));
#endif //SHORT_PLUGS
+ generation_skip_ratio_threshold = (int)GCConfig::GetGCLowSkipRatio();
+
ret = 1;
cleanup:
@@ -10803,6 +11162,12 @@ gc_heap::init_gc_heap (int h_number)
generation_skip_ratio = 100;
+#ifdef FEATURE_CARD_MARKING_STEALING
+ n_eph_soh = 0;
+ n_gen_soh = 0;
+ n_eph_loh = 0;
+ n_gen_loh = 0;
+#endif //FEATURE_CARD_MARKING_STEALING
mark_stack_tos = 0;
mark_stack_bos = 0;
@@ -10955,7 +11320,7 @@ gc_heap::init_gc_heap (int h_number)
heap_segment_allocated (pseg) = heap_segment_mem (pseg) + Align (min_obj_size, get_alignment_constant (FALSE));
heap_segment_used (pseg) = heap_segment_allocated (pseg) - plug_skew;
- generation_of (max_generation)->free_list_allocator = allocator(NUM_GEN2_ALIST, BASE_GEN2_ALIST_BITS, gen2_alloc_list);
+ generation_of (max_generation)->free_list_allocator = allocator(NUM_GEN2_ALIST, BASE_GEN2_ALIST_BITS, gen2_alloc_list, max_generation);
generation_of (loh_generation)->free_list_allocator = allocator(NUM_LOH_ALIST, BASE_LOH_ALIST_BITS, loh_alloc_list);
generation_of (poh_generation)->free_list_allocator = allocator(NUM_POH_ALIST, BASE_POH_ALIST_BITS, poh_alloc_list);
@@ -11030,7 +11395,6 @@ gc_heap::init_gc_heap (int h_number)
}
#ifdef MULTIPLE_HEAPS
- get_proc_and_numa_for_heap (heap_number);
if (!create_gc_thread ())
return 0;
@@ -11107,6 +11471,11 @@ gc_heap::init_gc_heap (int h_number)
bgc_overflow_count = 0;
end_loh_size = dd_min_size (dynamic_data_of (loh_generation));
end_poh_size = dd_min_size (dynamic_data_of (poh_generation));
+
+ current_sweep_pos = 0;
+#ifdef DOUBLY_LINKED_FL
+ current_sweep_seg = 0;
+#endif //DOUBLY_LINKED_FL
#endif //BACKGROUND_GC
#ifdef GC_CONFIG_DRIVEN
@@ -11301,6 +11670,15 @@ BOOL gc_heap::grow_heap_segment (heap_segment* seg, uint8_t* high_address, bool*
assert (heap_segment_committed (seg) <= heap_segment_reserved (seg));
assert (high_address <= heap_segment_committed (seg));
+
+#ifdef MULTIPLE_HEAPS
+ // we should never increase committed beyond decommit target when gradual
+ // decommit is in progress - if we do, this means commit and decommit are
+ // going on at the same time.
+ assert (!gradual_decommit_in_progress_p ||
+ (seg != ephemeral_heap_segment) ||
+ (heap_segment_committed (seg) <= heap_segment_decommit_target (seg)));
+#endif // MULTIPLE_HEAPS
}
return !!ret;
@@ -11329,6 +11707,52 @@ int gc_heap::grow_heap_segment (heap_segment* seg, uint8_t* allocated, uint8_t*
#endif // FEATURE_STRUCTALIGN
}
+// thread this object to the front of gen's free list and update stats.
+void gc_heap::thread_free_item_front (generation* gen, uint8_t* free_start, size_t free_size)
+{
+ make_unused_array (free_start, free_size);
+ generation_free_list_space (gen) += free_size;
+ generation_allocator(gen)->thread_item_front (free_start, free_size);
+ add_gen_free (gen->gen_num, free_size);
+
+ if (gen->gen_num == max_generation)
+ {
+ dprintf (2, ("AO h%d: gen2F+: %Ix(%Id)->%Id, FO: %Id",
+ heap_number, free_start, free_size,
+ generation_free_list_space (gen), generation_free_obj_space (gen)));
+ }
+}
+
+#ifdef DOUBLY_LINKED_FL
+void gc_heap::thread_item_front_added (generation* gen, uint8_t* free_start, size_t free_size)
+{
+ make_unused_array (free_start, free_size);
+ generation_free_list_space (gen) += free_size;
+ int bucket_index = generation_allocator(gen)->thread_item_front_added (free_start, free_size);
+
+ if (gen->gen_num == max_generation)
+ {
+ dprintf (2, ("AO [h%d] gen2FL+: %Ix(%Id)->%Id",
+ heap_number, free_start, free_size, generation_free_list_space (gen)));
+ }
+
+ add_gen_free (gen->gen_num, free_size);
+}
+#endif //DOUBLY_LINKED_FL
+
+// this is for free objects that are not on the free list; also update stats.
+void gc_heap::make_free_obj (generation* gen, uint8_t* free_start, size_t free_size)
+{
+ make_unused_array (free_start, free_size);
+ generation_free_obj_space (gen) += free_size;
+
+ if (gen->gen_num == max_generation)
+ {
+ dprintf (2, ("AO [h%d] gen2FO+: %Ix(%Id)->%Id",
+ heap_number, free_start, free_size, generation_free_obj_space (gen)));
+ }
+}
+
//used only in older generation allocation (i.e during gc).
void gc_heap::adjust_limit (uint8_t* start, size_t limit_size, generation* gen)
{
@@ -11351,41 +11775,83 @@ void gc_heap::adjust_limit (uint8_t* start, size_t limit_size, generation* gen)
{
dprintf (3, ("filling up hole: %Ix, size %Ix", hole, size));
size_t allocated_size = generation_allocation_pointer (gen) - generation_allocation_context_start_region (gen);
- if (size >= Align (min_free_list))
+#ifdef DOUBLY_LINKED_FL
+ if (gen->gen_num == max_generation)
{
- if (allocated_size < min_free_list)
+ // For BGC since we need to thread the max_gen's free list as a doubly linked list we need to preserve 5 ptr-sized
+ // words: SB | MT | Len | Next | Prev
+ // This means we cannot simply make a filler free object right after what's allocated in this alloc context if
+ // that's < 5-ptr sized.
+ //
+ if (allocated_size < min_free_item_no_prev)
{
+ // We can't make the free object just yet. Need to record the size.
+ size_t* filler_free_obj_size_location = (size_t*)(generation_allocation_context_start_region (gen) + min_free_item_no_prev);
+ size_t filler_free_obj_size = 0;
if (size >= (Align (min_free_list) + Align (min_obj_size)))
{
- //split hole into min obj + threadable free item
- make_unused_array (hole, min_obj_size);
- generation_free_obj_space (gen) += Align (min_obj_size);
- make_unused_array (hole + Align (min_obj_size), size - Align (min_obj_size));
- generation_free_list_space (gen) += size - Align (min_obj_size);
- generation_allocator(gen)->thread_item_front (hole + Align (min_obj_size),
- size - Align (min_obj_size));
- add_gen_free (gen->gen_num, (size - Align (min_obj_size)));
+
+ filler_free_obj_size = Align (min_obj_size);
+ size_t fl_size = size - filler_free_obj_size;
+ thread_item_front_added (gen, (hole + filler_free_obj_size), fl_size);
}
else
{
- dprintf (3, ("allocated size too small, can't put back rest on free list %Ix", allocated_size));
- make_unused_array (hole, size);
- generation_free_obj_space (gen) += size;
+ filler_free_obj_size = size;
}
+
+ generation_free_obj_space (gen) += filler_free_obj_size;
+ *filler_free_obj_size_location = filler_free_obj_size;
+ uint8_t* old_loc = generation_last_free_list_allocated (gen);
+ set_free_obj_in_compact_bit (old_loc);
+
+ dprintf (3333, ("[h%d] ac: %Ix->%Ix((%Id < %Id), Pset %Ix s->%Id", heap_number,
+ generation_allocation_context_start_region (gen), generation_allocation_pointer (gen),
+ allocated_size, min_free_item_no_prev, filler_free_obj_size_location, filler_free_obj_size));
}
else
{
- dprintf (3, ("threading hole in front of free list"));
- make_unused_array (hole, size);
- generation_free_list_space (gen) += size;
- generation_allocator(gen)->thread_item_front (hole, size);
- add_gen_free (gen->gen_num, size);
+ if (size >= Align (min_free_list))
+ {
+ thread_item_front_added (gen, hole, size);
+ }
+ else
+ {
+ make_free_obj (gen, hole, size);
+ }
}
}
else
+#endif //DOUBLY_LINKED_FL
{
- make_unused_array (hole, size);
- generation_free_obj_space (gen) += size;
+ // TODO: this should be written the same way as the above, ie, it should check allocated_size first,
+ // but it doesn't need to do MAKE_FREE_OBJ_IN_COMPACT related things.
+ if (size >= Align (min_free_list))
+ {
+ if (allocated_size < min_free_item_no_prev)
+ {
+ if (size >= (Align (min_free_list) + Align (min_obj_size)))
+ {
+ //split hole into min obj + threadable free item
+ make_free_obj (gen, hole, min_obj_size);
+ thread_free_item_front (gen, hole + Align (min_obj_size), size - Align (min_obj_size));
+ }
+ else
+ {
+ dprintf (3, ("allocated size too small, can't put back rest on free list %Ix", allocated_size));
+ make_free_obj (gen, hole, size);
+ }
+ }
+ else
+ {
+ dprintf (3, ("threading hole in front of free list"));
+ thread_free_item_front (gen, hole, size);
+ }
+ }
+ else
+ {
+ make_free_obj (gen, hole, size);
+ }
}
}
}
@@ -11524,12 +11990,13 @@ void gc_heap::check_batch_mark_array_bits (uint8_t* start, uint8_t* end)
}
#endif //VERIFY_HEAP && BACKGROUND_GC
-allocator::allocator (unsigned int num_b, int fbb, alloc_list* b)
+allocator::allocator (unsigned int num_b, int fbb, alloc_list* b, int gen)
{
assert (num_b < MAX_BUCKET_COUNT);
num_buckets = num_b;
first_bucket_bits = fbb;
buckets = b;
+ gen_number = gen;
}
alloc_list& allocator::alloc_list_of (unsigned int bn)
@@ -11552,8 +12019,16 @@ size_t& allocator::alloc_list_damage_count_of (unsigned int bn)
void allocator::unlink_item (unsigned int bn, uint8_t* item, uint8_t* prev_item, BOOL use_undo_p)
{
- //unlink the free_item
alloc_list* al = &alloc_list_of (bn);
+ uint8_t* next_item = free_list_slot(item);
+
+#ifdef DOUBLY_LINKED_FL
+ // if repair_list is TRUE yet use_undo_p is FALSE, it means we do need to make sure
+ // this item does not look like it's on the free list as we will not have a chance to
+ // do that later.
+ BOOL repair_list = !discard_if_no_fit_p ();
+#endif //DOUBLY_LINKED_FL
+
if (prev_item)
{
if (use_undo_p && (free_list_undo (prev_item) == UNDO_EMPTY))
@@ -11562,18 +12037,199 @@ void allocator::unlink_item (unsigned int bn, uint8_t* item, uint8_t* prev_item,
free_list_undo (prev_item) = item;
alloc_list_damage_count_of (bn)++;
}
- free_list_slot (prev_item) = free_list_slot(item);
+
+ free_list_slot (prev_item) = next_item;
+ }
+ else
+ {
+ al->alloc_list_head() = next_item;
+ }
+ if (al->alloc_list_tail() == item)
+ {
+ al->alloc_list_tail() = prev_item;
+ }
+
+#ifdef DOUBLY_LINKED_FL
+ if (repair_list)
+ {
+ if (!use_undo_p)
+ {
+ free_list_prev (item) = PREV_EMPTY;
+ }
+ }
+
+ if (gen_number == max_generation)
+ {
+ dprintf (3, ("[g%2d, b%2d]UL: %Ix->%Ix->%Ix (h: %Ix, t: %Ix)",
+ gen_number, bn, free_list_prev (item), item, free_list_slot (item),
+ al->alloc_list_head(), al->alloc_list_tail()));
+ dprintf (3, ("[g%2d, b%2d]UL: exit, h->N: %Ix, h->P: %Ix, t->N: %Ix, t->P: %Ix",
+ gen_number, bn,
+ (al->alloc_list_head() ? free_list_slot (al->alloc_list_head()) : 0),
+ (al->alloc_list_head() ? free_list_prev (al->alloc_list_head()) : 0),
+ (al->alloc_list_tail() ? free_list_slot (al->alloc_list_tail()) : 0),
+ (al->alloc_list_tail() ? free_list_prev (al->alloc_list_tail()) : 0)));
+ }
+#endif //DOUBLY_LINKED_FL
+}
+
+#ifdef DOUBLY_LINKED_FL
+void allocator::unlink_item_no_undo (unsigned int bn, uint8_t* item, size_t size)
+{
+ alloc_list* al = &alloc_list_of (bn);
+
+ uint8_t* next_item = free_list_slot (item);
+ uint8_t* prev_item = free_list_prev (item);
+
+#ifdef FL_VERIFICATION
+ {
+ uint8_t* start = al->alloc_list_head();
+ BOOL found_p = FALSE;
+ while (start)
+ {
+ if (start == item)
+ {
+ found_p = TRUE;
+ break;
+ }
+
+ start = free_list_slot (start);
+ }
+
+ if (!found_p)
+ {
+ dprintf (1, ("could not find %Ix in b%d!!!", item, a_l_number));
+ FATAL_GC_ERROR();
+ }
+ }
+#endif //FL_VERIFICATION
+
+ if (prev_item)
+ {
+ free_list_slot (prev_item) = next_item;
}
else
{
- al->alloc_list_head() = (uint8_t*)free_list_slot(item);
+ al->alloc_list_head() = next_item;
}
+
+ if (next_item)
+ {
+ free_list_prev (next_item) = prev_item;
+ }
+
if (al->alloc_list_tail() == item)
{
al->alloc_list_tail() = prev_item;
}
+
+ free_list_prev (item) = PREV_EMPTY;
+
+ if (gen_number == max_generation)
+ {
+ dprintf (3, ("[g%2d, b%2d]ULN: %Ix->%Ix->%Ix (h: %Ix, t: %Ix)",
+ gen_number, bn, free_list_prev (item), item, free_list_slot (item),
+ al->alloc_list_head(), al->alloc_list_tail()));
+ dprintf (3, ("[g%2d, b%2d]ULN: exit: h->N: %Ix, h->P: %Ix, t->N: %Ix, t->P: %Ix",
+ gen_number, bn,
+ (al->alloc_list_head() ? free_list_slot (al->alloc_list_head()) : 0),
+ (al->alloc_list_head() ? free_list_prev (al->alloc_list_head()) : 0),
+ (al->alloc_list_tail() ? free_list_slot (al->alloc_list_tail()) : 0),
+ (al->alloc_list_tail() ? free_list_prev (al->alloc_list_tail()) : 0)));
+ }
}
+void allocator::unlink_item_no_undo (uint8_t* item, size_t size)
+{
+ unsigned int bn = first_suitable_bucket (size);
+ unlink_item_no_undo (bn, item, size);
+}
+
+void allocator::unlink_item_no_undo_added (unsigned int bn, uint8_t* item, uint8_t* previous_item)
+{
+ alloc_list* al = &alloc_list_of (bn);
+
+ uint8_t* next_item = free_list_slot (item);
+ uint8_t* prev_item = free_list_prev (item);
+
+ assert (prev_item == previous_item);
+
+ if (prev_item)
+ {
+ free_list_slot (prev_item) = next_item;
+ }
+ else
+ {
+ al->added_alloc_list_head() = next_item;
+ }
+
+ if (next_item)
+ {
+ free_list_prev (next_item) = prev_item;
+ }
+
+ if (al->added_alloc_list_tail() == item)
+ {
+ al->added_alloc_list_tail() = prev_item;
+ }
+
+ free_list_prev (item) = PREV_EMPTY;
+
+ if (gen_number == max_generation)
+ {
+ dprintf (3333, ("[g%2d, b%2d]ULNA: %Ix->%Ix->%Ix (h: %Ix, t: %Ix)",
+ gen_number, bn, free_list_prev (item), item, free_list_slot (item),
+ al->added_alloc_list_head(), al->added_alloc_list_tail()));
+ dprintf (3333, ("[g%2d, b%2d]ULNA: exit: h->N: %Ix, h->P: %Ix, t->N: %Ix, t->P: %Ix",
+ gen_number, bn,
+ (al->added_alloc_list_head() ? free_list_slot (al->added_alloc_list_head()) : 0),
+ (al->added_alloc_list_head() ? free_list_prev (al->added_alloc_list_head()) : 0),
+ (al->added_alloc_list_tail() ? free_list_slot (al->added_alloc_list_tail()) : 0),
+ (al->added_alloc_list_tail() ? free_list_prev (al->added_alloc_list_tail()) : 0)));
+ }
+}
+
+int allocator::thread_item_front_added (uint8_t* item, size_t size)
+{
+ unsigned int a_l_number = first_suitable_bucket (size);
+ alloc_list* al = &alloc_list_of (a_l_number);
+
+ free_list_slot (item) = al->added_alloc_list_head();
+ free_list_prev (item) = 0;
+ // this list's UNDO is not useful.
+ free_list_undo (item) = UNDO_EMPTY;
+
+ if (al->added_alloc_list_head() != 0)
+ {
+ uint8_t* head_prev = free_list_prev (al->added_alloc_list_head());
+ free_list_prev (al->added_alloc_list_head()) = item;
+ }
+
+ al->added_alloc_list_head() = item;
+
+ if (al->added_alloc_list_tail() == 0)
+ {
+ al->added_alloc_list_tail() = item;
+ }
+
+ if (gen_number == max_generation)
+ {
+ dprintf (3333, ("[g%2d, b%2d]TFFA: exit: %Ix->%Ix->%Ix (h: %Ix, t: %Ix)",
+ gen_number, a_l_number,
+ free_list_prev (item), item, free_list_slot (item),
+ al->added_alloc_list_head(), al->added_alloc_list_tail()));
+ dprintf (3333, ("[g%2d, b%2d]TFFA: h->N: %Ix, h->P: %Ix, t->N: %Ix, t->P: %Ix",
+ gen_number, a_l_number,
+ (al->added_alloc_list_head() ? free_list_slot (al->added_alloc_list_head()) : 0),
+ (al->added_alloc_list_head() ? free_list_prev (al->added_alloc_list_head()) : 0),
+ (al->added_alloc_list_tail() ? free_list_slot (al->added_alloc_list_tail()) : 0),
+ (al->added_alloc_list_tail() ? free_list_prev (al->added_alloc_list_tail()) : 0)));
+ }
+
+ return a_l_number;
+}
+#endif //DOUBLY_LINKED_FL
+
void allocator::clear()
{
for (unsigned int i = 0; i < num_buckets; i++)
@@ -11586,7 +12242,7 @@ void allocator::clear()
//always thread to the end.
void allocator::thread_item (uint8_t* item, size_t size)
{
- unsigned int a_l_number = first_suitable_bucket(size);
+ unsigned int a_l_number = first_suitable_bucket (size);
alloc_list* al = &alloc_list_of (a_l_number);
uint8_t*& head = al->alloc_list_head();
uint8_t*& tail = al->alloc_list_tail();
@@ -11595,6 +12251,13 @@ void allocator::thread_item (uint8_t* item, size_t size)
free_list_undo (item) = UNDO_EMPTY;
assert (item != head);
+#ifdef DOUBLY_LINKED_FL
+ if (gen_number == max_generation)
+ {
+ free_list_prev (item) = tail;
+ }
+#endif //DOUBLY_LINKED_FL
+
if (head == 0)
{
head = item;
@@ -11609,6 +12272,22 @@ void allocator::thread_item (uint8_t* item, size_t size)
}
tail = item;
+
+#ifdef DOUBLY_LINKED_FL
+ if (gen_number == max_generation)
+ {
+ dprintf (3333, ("[g%2d, b%2d]TFE: %Ix->%Ix->%Ix (h: %Ix, t: %Ix)",
+ gen_number, a_l_number,
+ free_list_prev (item), item, free_list_slot (item),
+ al->alloc_list_head(), al->alloc_list_tail()));
+ dprintf (3333, ("[g%2d, b%2d]TFE: exit: h->N: %Ix, h->P: %Ix, t->N: %Ix, t->P: %Ix",
+ gen_number, a_l_number,
+ (al->alloc_list_head() ? free_list_slot (al->alloc_list_head()) : 0),
+ (al->alloc_list_head() ? free_list_prev (al->alloc_list_head()) : 0),
+ (al->alloc_list_tail() ? free_list_slot (al->alloc_list_tail()) : 0),
+ (al->alloc_list_tail() ? free_list_prev (al->alloc_list_tail()) : 0)));
+ }
+#endif //DOUBLY_LINKED_FL
}
void allocator::thread_item_front (uint8_t* item, size_t size)
@@ -11621,13 +12300,43 @@ void allocator::thread_item_front (uint8_t* item, size_t size)
if (al->alloc_list_tail() == 0)
{
+ assert (al->alloc_list_head() == 0);
al->alloc_list_tail() = al->alloc_list_head();
}
+
+#ifdef DOUBLY_LINKED_FL
+ if (gen_number == max_generation)
+ {
+ if (al->alloc_list_head() != 0)
+ {
+ free_list_prev (al->alloc_list_head()) = item;
+ }
+ }
+#endif //DOUBLY_LINKED_FL
+
al->alloc_list_head() = item;
if (al->alloc_list_tail() == 0)
{
al->alloc_list_tail() = item;
}
+
+#ifdef DOUBLY_LINKED_FL
+ if (gen_number == max_generation)
+ {
+ free_list_prev (item) = 0;
+
+ dprintf (3333, ("[g%2d, b%2d]TFF: exit: %Ix->%Ix->%Ix (h: %Ix, t: %Ix)",
+ gen_number, a_l_number,
+ free_list_prev (item), item, free_list_slot (item),
+ al->alloc_list_head(), al->alloc_list_tail()));
+ dprintf (3333, ("[g%2d, b%2d]TFF: h->N: %Ix, h->P: %Ix, t->N: %Ix, t->P: %Ix",
+ gen_number, a_l_number,
+ (al->alloc_list_head() ? free_list_slot (al->alloc_list_head()) : 0),
+ (al->alloc_list_head() ? free_list_prev (al->alloc_list_head()) : 0),
+ (al->alloc_list_tail() ? free_list_slot (al->alloc_list_tail()) : 0),
+ (al->alloc_list_tail() ? free_list_prev (al->alloc_list_tail()) : 0)));
+ }
+#endif //DOUBLY_LINKED_FL
}
void allocator::copy_to_alloc_list (alloc_list* toalist)
@@ -11636,6 +12345,11 @@ void allocator::copy_to_alloc_list (alloc_list* toalist)
{
toalist [i] = alloc_list_of (i);
#ifdef FL_VERIFICATION
+ size_t damage_count = alloc_list_damage_count_of (i);
+ // We are only calling this method to copy to an empty list
+ // so damage count is always 0
+ assert (damage_count == 0);
+
uint8_t* free_item = alloc_list_head_of (i);
size_t count = 0;
while (free_item)
@@ -11652,9 +12366,37 @@ void allocator::copy_to_alloc_list (alloc_list* toalist)
void allocator::copy_from_alloc_list (alloc_list* fromalist)
{
BOOL repair_list = !discard_if_no_fit_p ();
- for (unsigned int i = 0; i < num_buckets; i++)
+#ifdef DOUBLY_LINKED_FL
+ BOOL bgc_repair_p = FALSE;
+ if (gen_number == max_generation)
+ {
+ bgc_repair_p = TRUE;
+
+ if (alloc_list_damage_count_of (0) != 0)
+ {
+ GCToOSInterface::DebugBreak();
+ }
+
+ uint8_t* b0_head = alloc_list_head_of (0);
+ if (b0_head)
+ {
+ free_list_prev (b0_head) = 0;
+ }
+
+ added_alloc_list_head_of (0) = 0;
+ added_alloc_list_tail_of (0) = 0;
+ }
+
+ unsigned int start_index = (bgc_repair_p ? 1 : 0);
+#else
+ unsigned int start_index = 0;
+
+#endif //DOUBLY_LINKED_FL
+
+ for (unsigned int i = start_index; i < num_buckets; i++)
{
size_t count = alloc_list_damage_count_of (i);
+
alloc_list_of (i) = fromalist [i];
assert (alloc_list_damage_count_of (i) == 0);
@@ -11664,12 +12406,14 @@ void allocator::copy_from_alloc_list (alloc_list* fromalist)
//new items may have been added during the plan phase
//items may have been unlinked.
uint8_t* free_item = alloc_list_head_of (i);
+
while (free_item && count)
{
assert (((CObjectHeader*)free_item)->IsFree());
if ((free_list_undo (free_item) != UNDO_EMPTY))
{
count--;
+
free_list_slot (free_item) = free_list_undo (free_item);
free_list_undo (free_item) = UNDO_EMPTY;
}
@@ -11677,6 +12421,14 @@ void allocator::copy_from_alloc_list (alloc_list* fromalist)
free_item = free_list_slot (free_item);
}
+#ifdef DOUBLY_LINKED_FL
+ if (bgc_repair_p)
+ {
+ added_alloc_list_head_of (i) = 0;
+ added_alloc_list_tail_of (i) = 0;
+ }
+#endif //DOUBLY_LINKED_FL
+
#ifdef FL_VERIFICATION
free_item = alloc_list_head_of (i);
size_t item_count = 0;
@@ -11689,6 +12441,7 @@ void allocator::copy_from_alloc_list (alloc_list* fromalist)
assert (item_count == alloc_list_of (i).item_count);
#endif //FL_VERIFICATION
}
+
#ifdef DEBUG
uint8_t* tail_item = alloc_list_tail_of (i);
assert ((tail_item == 0) || (free_list_slot (tail_item) == 0));
@@ -11699,13 +12452,37 @@ void allocator::copy_from_alloc_list (alloc_list* fromalist)
void allocator::commit_alloc_list_changes()
{
BOOL repair_list = !discard_if_no_fit_p ();
+#ifdef DOUBLY_LINKED_FL
+ BOOL bgc_repair_p = FALSE;
+ if (gen_number == max_generation)
+ {
+ bgc_repair_p = TRUE;
+ }
+#endif //DOUBLY_LINKED_FL
+
if (repair_list)
{
for (unsigned int i = 0; i < num_buckets; i++)
{
//remove the undo info from list.
uint8_t* free_item = alloc_list_head_of (i);
+
+#ifdef DOUBLY_LINKED_FL
+ if (bgc_repair_p)
+ {
+ dprintf (3, ("C[b%2d] ENTRY: h: %Ix t: %Ix", i,
+ alloc_list_head_of (i), alloc_list_tail_of (i)));
+ }
+
+ if (free_item && bgc_repair_p)
+ {
+ if (free_list_prev (free_item) != 0)
+ free_list_prev (free_item) = 0;
+ }
+#endif //DOUBLY_LINKED_FL
+
size_t count = alloc_list_damage_count_of (i);
+
while (free_item && count)
{
assert (((CObjectHeader*)free_item)->IsFree());
@@ -11713,6 +12490,16 @@ void allocator::commit_alloc_list_changes()
if (free_list_undo (free_item) != UNDO_EMPTY)
{
free_list_undo (free_item) = UNDO_EMPTY;
+
+#ifdef DOUBLY_LINKED_FL
+ if (bgc_repair_p)
+ {
+ uint8_t* next_item = free_list_slot (free_item);
+ if (next_item && (free_list_prev (next_item) != free_item))
+ free_list_prev (next_item) = free_item;
+ }
+#endif //DOUBLY_LINKED_FL
+
count--;
}
@@ -11720,6 +12507,41 @@ void allocator::commit_alloc_list_changes()
}
alloc_list_damage_count_of (i) = 0;
+
+#ifdef DOUBLY_LINKED_FL
+ if (bgc_repair_p)
+ {
+ uint8_t* head = alloc_list_head_of (i);
+ uint8_t* tail_added = added_alloc_list_tail_of (i);
+
+ if (tail_added)
+ {
+ assert (free_list_slot (tail_added) == 0);
+
+ if (head)
+ {
+ free_list_slot (tail_added) = head;
+ free_list_prev (head) = tail_added;
+ }
+ }
+
+ uint8_t* head_added = added_alloc_list_head_of (i);
+
+ if (head_added)
+ {
+ alloc_list_head_of (i) = head_added;
+ uint8_t* final_head = alloc_list_head_of (i);
+
+ if (alloc_list_tail_of (i) == 0)
+ {
+ alloc_list_tail_of (i) = tail_added;
+ }
+ }
+
+ added_alloc_list_head_of (i) = 0;
+ added_alloc_list_tail_of (i) = 0;
+ }
+#endif //DOUBLY_LINKED_FL
}
}
}
@@ -12013,7 +12835,7 @@ void gc_heap::check_for_full_gc (int gen_num, size_t size)
{
return;
}
-
+
if (gen_num < max_generation)
{
gen_num = max_generation;
@@ -12334,7 +13156,7 @@ BOOL gc_heap::a_fit_free_list_p (int gen_number,
#ifdef BACKGROUND_GC
void gc_heap::bgc_uoh_alloc_clr (uint8_t* alloc_start,
- size_t size,
+ size_t size,
alloc_context* acontext,
uint32_t flags,
int align_const,
@@ -12343,6 +13165,9 @@ void gc_heap::bgc_uoh_alloc_clr (uint8_t* alloc_start,
heap_segment* seg)
{
make_unused_array (alloc_start, size);
+#ifdef DOUBLY_LINKED_FL
+ clear_prev_bit (alloc_start, size);
+#endif //DOUBLY_LINKED_FL
size_t size_of_array_base = sizeof(ArrayBase);
@@ -12414,7 +13239,7 @@ void gc_heap::bgc_uoh_alloc_clr (uint8_t* alloc_start,
BOOL gc_heap::a_fit_free_list_uoh_p (size_t size,
alloc_context* acontext,
- uint32_t flags,
+ uint32_t flags,
int align_const,
int gen_number)
{
@@ -12454,8 +13279,8 @@ BOOL gc_heap::a_fit_free_list_uoh_p (size_t size,
bgc_track_uoh_alloc();
#endif //BACKGROUND_GC
- //unlink the free_item
allocator->unlink_item (a_l_idx, free_list, prev_free_item, FALSE);
+ remove_gen_free (gen_number, free_list_size);
// Substract min obj size because limit_from_size adds it. Not needed for LOH
size_t limit = limit_from_size (size - Align(min_obj_size, align_const), flags, free_list_size,
@@ -12481,6 +13306,7 @@ BOOL gc_heap::a_fit_free_list_uoh_p (size_t size,
if (remain_size >= Align(min_free_list, align_const))
{
loh_thread_gap_front (remain, remain_size, gen);
+ add_gen_free (gen_number, remain_size);
assert (remain_size >= Align (min_obj_size, align_const));
}
else
@@ -12488,6 +13314,8 @@ BOOL gc_heap::a_fit_free_list_uoh_p (size_t size,
generation_free_obj_space (gen) += remain_size;
}
generation_free_list_space (gen) -= free_list_size;
+ generation_free_list_allocated (gen) += limit;
+
dprintf (3, ("found fit on loh at %Ix", free_list));
#ifdef BACKGROUND_GC
if (cookie != -1)
@@ -12668,7 +13496,9 @@ BOOL gc_heap::uoh_a_fit_segment_end_p (int gen_number,
oom_reason* oom_r)
{
*commit_failed_p = FALSE;
- heap_segment* seg = generation_allocation_segment (generation_of (gen_number));
+
+ generation* gen = generation_of (gen_number);
+ heap_segment* seg = generation_allocation_segment (gen);
BOOL can_allocate_p = FALSE;
while (seg)
@@ -12699,6 +13529,11 @@ BOOL gc_heap::uoh_a_fit_segment_end_p (int gen_number,
seg = heap_segment_next_rw (seg);
}
+ if (can_allocate_p)
+ {
+ generation_end_seg_allocated (gen) += size;
+ }
+
return can_allocate_p;
}
@@ -13449,7 +14284,7 @@ allocation_state gc_heap::allocate_uoh (int gen_number,
can_use_existing_p = uoh_try_fit (gen_number, size, acontext, flags,
align_const, &commit_failed_p, &oom_r);
uoh_alloc_state = (can_use_existing_p ?
- a_state_can_allocate :
+ a_state_can_allocate :
(commit_failed_p ?
a_state_trigger_full_compact_gc :
a_state_acquire_seg));
@@ -13461,7 +14296,7 @@ allocation_state gc_heap::allocate_uoh (int gen_number,
BOOL commit_failed_p = FALSE;
BOOL can_use_existing_p = FALSE;
- can_use_existing_p = uoh_try_fit (gen_number, size, acontext, flags,
+ can_use_existing_p = uoh_try_fit (gen_number, size, acontext, flags,
align_const, &commit_failed_p, &oom_r);
// Even after we got a new seg it doesn't necessarily mean we can allocate,
// another LOH allocating thread could have beat us to acquire the msl so
@@ -13510,9 +14345,9 @@ allocation_state gc_heap::allocate_uoh (int gen_number,
current_full_compact_gc_count = get_full_compact_gc_count();
can_get_new_seg_p = uoh_get_new_seg (gen_number, size, &did_full_compacting_gc, &oom_r);
- uoh_alloc_state = (can_get_new_seg_p ?
- a_state_try_fit_new_seg :
- (did_full_compacting_gc ?
+ uoh_alloc_state = (can_get_new_seg_p ?
+ a_state_try_fit_new_seg :
+ (did_full_compacting_gc ?
a_state_check_retry_seg :
a_state_check_and_wait_for_bgc));
break;
@@ -13528,8 +14363,8 @@ allocation_state gc_heap::allocate_uoh (int gen_number,
// Since we release the msl before we try to allocate a seg, other
// threads could have allocated a bunch of segments before us so
// we might need to retry.
- uoh_alloc_state = (can_get_new_seg_p ?
- a_state_try_fit_after_cg :
+ uoh_alloc_state = (can_get_new_seg_p ?
+ a_state_try_fit_after_cg :
a_state_check_retry_seg);
break;
}
@@ -13540,10 +14375,10 @@ allocation_state gc_heap::allocate_uoh (int gen_number,
current_full_compact_gc_count = get_full_compact_gc_count();
- can_get_new_seg_p = uoh_get_new_seg (gen_number, size, &did_full_compacting_gc, &oom_r);
- uoh_alloc_state = (can_get_new_seg_p ?
- a_state_try_fit_new_seg :
- (did_full_compacting_gc ?
+ can_get_new_seg_p = uoh_get_new_seg (gen_number, size, &did_full_compacting_gc, &oom_r);
+ uoh_alloc_state = (can_get_new_seg_p ?
+ a_state_try_fit_new_seg :
+ (did_full_compacting_gc ?
a_state_check_retry_seg :
a_state_trigger_full_compact_gc));
assert ((uoh_alloc_state != a_state_cant_allocate) || (oom_r != oom_no_failure));
@@ -13556,8 +14391,8 @@ allocation_state gc_heap::allocate_uoh (int gen_number,
bgc_in_progress_p = check_and_wait_for_bgc (awr_loh_oos_bgc, &did_full_compacting_gc, true);
uoh_alloc_state = (!bgc_in_progress_p ?
- a_state_trigger_full_compact_gc :
- (did_full_compacting_gc ?
+ a_state_trigger_full_compact_gc :
+ (did_full_compacting_gc ?
a_state_try_fit_after_cg :
a_state_try_fit_after_bgc));
break;
@@ -13590,9 +14425,9 @@ allocation_state gc_heap::allocate_uoh (int gen_number,
should_retry_get_seg = TRUE;
}
}
-
- uoh_alloc_state = (should_retry_gc ?
- a_state_trigger_full_compact_gc :
+
+ uoh_alloc_state = (should_retry_gc ?
+ a_state_trigger_full_compact_gc :
(should_retry_get_seg ?
a_state_try_fit_after_cg :
a_state_cant_allocate));
@@ -13860,7 +14695,7 @@ void gc_heap::balance_heaps (alloc_context* acontext)
home_hp = acontext->get_home_heap ()->pGenGCHeap;
proc_hp_num = heap_select::select_heap (acontext);
- if (acontext->get_home_heap () != GCHeap::GetHeap (proc_hp_num))
+ if (home_hp != gc_heap::g_heaps[proc_hp_num])
{
#ifdef HEAP_BALANCE_INSTRUMENTATION
alloc_count_p = false;
@@ -13869,10 +14704,6 @@ void gc_heap::balance_heaps (alloc_context* acontext)
}
else if ((acontext->alloc_count & 15) == 0)
set_home_heap = TRUE;
-
- if (set_home_heap)
- {
- }
}
else
{
@@ -13924,84 +14755,153 @@ void gc_heap::balance_heaps (alloc_context* acontext)
return;
}
+#ifdef HEAP_BALANCE_INSTRUMENTATION
+ proc_no = GCToOSInterface::GetCurrentProcessorNumber ();
+ if (proc_no != last_proc_no)
+ {
+ dprintf (HEAP_BALANCE_TEMP_LOG, ("TEMPSP: %d->%d", last_proc_no, proc_no));
+ multiple_procs_p = true;
+ last_proc_no = proc_no;
+ }
+
+ int new_home_hp_num = heap_select::proc_no_to_heap_no[proc_no];
+#else
+ int new_home_hp_num = heap_select::select_heap(acontext);
+#endif //HEAP_BALANCE_INSTRUMENTATION
+ gc_heap* new_home_hp = gc_heap::g_heaps[new_home_hp_num];
+ acontext->set_home_heap (new_home_hp->vm_heap);
+
int start, end, finish;
- heap_select::get_heap_range_for_heap (org_hp->heap_number, &start, &end);
+ heap_select::get_heap_range_for_heap (new_home_hp_num, &start, &end);
finish = start + n_heaps;
-try_again:
- gc_heap* new_home_hp = 0;
-
do
{
max_hp = org_hp;
max_hp_num = org_hp_num;
max_size = org_size + delta;
-#ifdef HEAP_BALANCE_INSTRUMENTATION
- proc_no = GCToOSInterface::GetCurrentProcessorNumber ();
- if (proc_no != last_proc_no)
- {
- dprintf (HEAP_BALANCE_TEMP_LOG, ("TEMPSP: %d->%d", last_proc_no, proc_no));
- multiple_procs_p = true;
- last_proc_no = proc_no;
- }
-
- int current_hp_num = heap_select::proc_no_to_heap_no[proc_no];
- acontext->set_home_heap (GCHeap::GetHeap (current_hp_num));
-#else
- acontext->set_home_heap (GCHeap::GetHeap (heap_select::select_heap (acontext)));
-#endif //HEAP_BALANCE_INSTRUMENTATION
- new_home_hp = acontext->get_home_heap ()->pGenGCHeap;
+ org_alloc_context_count = org_hp->alloc_context_count;
+ max_alloc_context_count = org_alloc_context_count;
if (org_hp == new_home_hp)
max_size = max_size + delta;
- org_alloc_context_count = org_hp->alloc_context_count;
- max_alloc_context_count = org_alloc_context_count;
if (max_alloc_context_count > 1)
max_size /= max_alloc_context_count;
- int actual_start = start;
- int actual_end = (end - 1);
-
- for (int i = start; i < end; i++)
+ // check if the new home heap has more space
+ if (org_hp != new_home_hp)
{
- gc_heap* hp = GCHeap::GetHeap (i % n_heaps)->pGenGCHeap;
- dd = hp->dynamic_data_of (0);
- ptrdiff_t size = dd_new_allocation (dd);
+ dd = new_home_hp->dynamic_data_of(0);
+ ptrdiff_t size = dd_new_allocation(dd);
- if (hp == new_home_hp)
- {
- size = size + delta;
- }
- int hp_alloc_context_count = hp->alloc_context_count;
+ // favor new home heap over org heap
+ size += delta * 2;
+
+ int new_home_hp_alloc_context_count = new_home_hp->alloc_context_count;
+ if (new_home_hp_alloc_context_count > 0)
+ size /= (new_home_hp_alloc_context_count + 1);
- if (hp_alloc_context_count > 0)
- {
- size /= (hp_alloc_context_count + 1);
- }
if (size > max_size)
{
#ifdef HEAP_BALANCE_INSTRUMENTATION
- dprintf (HEAP_BALANCE_TEMP_LOG, ("TEMPorg h%d(%dmb), m h%d(%dmb)",
+ dprintf(HEAP_BALANCE_TEMP_LOG, ("TEMPorg h%d(%dmb), m h%d(%dmb)",
org_hp_num, (max_size / 1024 / 1024),
- hp->heap_number, (size / 1024 / 1024)));
+ new_home_hp_num, (size / 1024 / 1024)));
#endif //HEAP_BALANCE_INSTRUMENTATION
- max_hp = hp;
+ max_hp = new_home_hp;
max_size = size;
- max_hp_num = max_hp->heap_number;
- max_alloc_context_count = hp_alloc_context_count;
+ max_hp_num = new_home_hp_num;
+ max_alloc_context_count = new_home_hp_alloc_context_count;
}
}
- }
- while (org_alloc_context_count != org_hp->alloc_context_count ||
- max_alloc_context_count != max_hp->alloc_context_count);
- if ((max_hp == org_hp) && (end < finish))
- {
- start = end; end = finish;
- delta = local_delta * 2; // Make it twice as hard to balance to remote nodes on NUMA.
- goto try_again;
+ // consider heaps both inside our local NUMA node,
+ // and outside, but with different thresholds
+ enum
+ {
+ LOCAL_NUMA_NODE,
+ REMOTE_NUMA_NODE
+ };
+
+ for (int pass = LOCAL_NUMA_NODE; pass <= REMOTE_NUMA_NODE; pass++)
+ {
+ int count = end - start;
+ int max_tries = min(count, 4);
+
+ // we will consider max_tries consecutive (in a circular sense)
+ // other heaps from a semi random starting point
+
+ // alloc_count often increases by multiples of 16 (due to logic at top of routine),
+ // and we want to advance the starting point by 4 between successive calls,
+ // therefore the shift right by 2 bits
+ int heap_num = start + ((acontext->alloc_count >> 2) + new_home_hp_num) % count;
+
+#ifdef HEAP_BALANCE_INSTRUMENTATION
+ dprintf(HEAP_BALANCE_TEMP_LOG, ("TEMP starting at h%d (home_heap_num = %d, alloc_count = %d)", heap_num, new_home_hp_num, acontext->alloc_count));
+#endif //HEAP_BALANCE_INSTRUMENTATION
+
+ for (int tries = max_tries; --tries >= 0; heap_num++)
+ {
+ // wrap around if we hit the end of our range
+ if (heap_num >= end)
+ heap_num -= count;
+ // wrap around if we hit the end of the heap numbers
+ if (heap_num >= n_heaps)
+ heap_num -= n_heaps;
+
+ assert (heap_num < n_heaps);
+ gc_heap* hp = gc_heap::g_heaps[heap_num];
+ dd = hp->dynamic_data_of(0);
+ ptrdiff_t size = dd_new_allocation(dd);
+
+#ifdef HEAP_BALANCE_INSTRUMENTATION
+ dprintf(HEAP_BALANCE_TEMP_LOG, ("TEMP looking at h%d(%dmb)",
+ heap_num, (size / 1024 / 1024)));
+#endif //HEAP_BALANCE_INSTRUMENTATION
+ // if the size is not bigger than what we already have,
+ // give up immediately, as it can't be a winner...
+ // this is a micro-optimization to avoid fetching the
+ // alloc_context_count and possibly dividing by it
+ if (size <= max_size)
+ continue;
+
+ int hp_alloc_context_count = hp->alloc_context_count;
+
+ if (hp_alloc_context_count > 0)
+ {
+ size /= (hp_alloc_context_count + 1);
+ }
+
+ if (size > max_size)
+ {
+#ifdef HEAP_BALANCE_INSTRUMENTATION
+ dprintf(HEAP_BALANCE_TEMP_LOG, ("TEMPorg h%d(%dmb), m h%d(%dmb)",
+ org_hp_num, (max_size / 1024 / 1024),
+ hp->heap_number, (size / 1024 / 1024)));
+#endif //HEAP_BALANCE_INSTRUMENTATION
+
+ max_hp = hp;
+ max_size = size;
+ max_hp_num = max_hp->heap_number;
+ max_alloc_context_count = hp_alloc_context_count;
+ }
+ }
+
+ if ((max_hp == org_hp) && (end < finish))
+ {
+ start = end; end = finish;
+ delta = local_delta * 2; // Make it twice as hard to balance to remote nodes on NUMA.
+ }
+ else
+ {
+ // we already found a better heap, or there are no remote NUMA nodes
+ break;
+ }
+ }
}
+ while (org_alloc_context_count != org_hp->alloc_context_count ||
+ max_alloc_context_count != max_hp->alloc_context_count);
#ifdef HEAP_BALANCE_INSTRUMENTATION
uint16_t ideal_proc_no_before_set_ideal = 0;
@@ -14121,7 +15021,7 @@ gc_heap* gc_heap::balance_heaps_uoh (alloc_context* acontext, size_t alloc_size,
if (max_hp != home_hp)
{
- dprintf (3, ("uoh: %d(%Id)->%d(%Id)",
+ dprintf (3, ("uoh: %d(%Id)->%d(%Id)",
home_hp->heap_number, dd_new_allocation (home_hp->dynamic_data_of (generation_num)),
max_hp->heap_number, dd_new_allocation (max_hp->dynamic_data_of (generation_num))));
}
@@ -14256,10 +15156,17 @@ void gc_heap::leave_allocation_segment (generation* gen)
void gc_heap::init_free_and_plug()
{
#ifdef FREE_USAGE_STATS
- for (int i = 0; i <= settings.condemned_generation; i++)
+ int i = (settings.concurrent ? max_generation : 0);
+
+ for (; i <= settings.condemned_generation; i++)
{
generation* gen = generation_of (i);
+#ifdef DOUBLY_LINKED_FL
+ print_free_and_plug ("BGC");
+#else
memset (gen->gen_free_spaces, 0, sizeof (gen->gen_free_spaces));
+#endif //DOUBLY_LINKED_FL
+ memset (gen->gen_plugs_allocated_in_free, 0, sizeof (gen->gen_plugs_allocated_in_free));
memset (gen->gen_plugs, 0, sizeof (gen->gen_plugs));
memset (gen->gen_current_pinned_free_spaces, 0, sizeof (gen->gen_current_pinned_free_spaces));
}
@@ -14301,23 +15208,32 @@ void gc_heap::print_free_and_plug (const char* msg)
#endif //FREE_USAGE_STATS && SIMPLE_DPRINTF
}
-void gc_heap::add_gen_plug (int gen_number, size_t plug_size)
+// replace with allocator::first_suitable_bucket
+int gc_heap::find_bucket (size_t size)
{
-#ifdef FREE_USAGE_STATS
- dprintf (3, ("adding plug size %Id to gen%d", plug_size, gen_number));
- generation* gen = generation_of (gen_number);
size_t sz = BASE_GEN_SIZE;
int i = 0;
- for (; i < NUM_GEN_POWER2; i++)
+ for (; i < (NUM_GEN_POWER2 - 1); i++)
{
- if (plug_size < sz)
+ if (size < sz)
{
break;
}
sz = sz * 2;
}
+ return i;
+}
+
+void gc_heap::add_gen_plug (int gen_number, size_t plug_size)
+{
+#ifdef FREE_USAGE_STATS
+ dprintf (3, ("adding plug size %Id to gen%d", plug_size, gen_number));
+ generation* gen = generation_of (gen_number);
+ size_t sz = BASE_GEN_SIZE;
+ int i = find_bucket (plug_size);
+
(gen->gen_plugs[i])++;
#else
UNREFERENCED_PARAMETER(gen_number);
@@ -14330,16 +15246,7 @@ void gc_heap::add_item_to_current_pinned_free (int gen_number, size_t free_size)
#ifdef FREE_USAGE_STATS
generation* gen = generation_of (gen_number);
size_t sz = BASE_GEN_SIZE;
- int i = 0;
-
- for (; i < NUM_GEN_POWER2; i++)
- {
- if (free_size < sz)
- {
- break;
- }
- sz = sz * 2;
- }
+ int i = find_bucket (free_size);
(gen->gen_current_pinned_free_spaces[i])++;
generation_pinned_free_obj_space (gen) += free_size;
@@ -14353,24 +15260,25 @@ void gc_heap::add_item_to_current_pinned_free (int gen_number, size_t free_size)
#endif //FREE_USAGE_STATS
}
+// This is only for items large enough to be on the FL
+// Ideally we should keep track of smaller ones too but for now
+// it's easier to make the accounting right
void gc_heap::add_gen_free (int gen_number, size_t free_size)
{
#ifdef FREE_USAGE_STATS
dprintf (3, ("adding free size %Id to gen%d", free_size, gen_number));
+ if (free_size < min_free_list)
+ return;
+
generation* gen = generation_of (gen_number);
size_t sz = BASE_GEN_SIZE;
- int i = 0;
+ int i = find_bucket (free_size);
- for (; i < NUM_GEN_POWER2; i++)
+ (gen->gen_free_spaces[i])++;
+ if (gen_number == max_generation)
{
- if (free_size < sz)
- {
- break;
- }
- sz = sz * 2;
+ //dprintf (2, ("Mb b%d: f+ %Id (%Id->%Id)", i, free_size, (gen->gen_free_spaces[i]).num_items, (gen->gen_free_spaces[i]).total_size));
}
-
- (gen->gen_free_spaces[i])++;
#else
UNREFERENCED_PARAMETER(gen_number);
UNREFERENCED_PARAMETER(free_size);
@@ -14381,29 +15289,82 @@ void gc_heap::remove_gen_free (int gen_number, size_t free_size)
{
#ifdef FREE_USAGE_STATS
dprintf (3, ("removing free %Id from gen%d", free_size, gen_number));
+ if (free_size < min_free_list)
+ return;
+
generation* gen = generation_of (gen_number);
size_t sz = BASE_GEN_SIZE;
- int i = 0;
+ int i = find_bucket (free_size);
- for (; i < NUM_GEN_POWER2; i++)
+ (gen->gen_free_spaces[i])--;
+ if (gen_number == max_generation)
{
- if (free_size < sz)
- {
- break;
- }
- sz = sz * 2;
+ //dprintf (2, ("Mb b%d: f- %Id (%Id->%Id)", i, free_size, (gen->gen_free_spaces[i]).num_items, (gen->gen_free_spaces[i]).total_size));
}
-
- (gen->gen_free_spaces[i])--;
#else
UNREFERENCED_PARAMETER(gen_number);
UNREFERENCED_PARAMETER(free_size);
#endif //FREE_USAGE_STATS
}
+#ifdef DOUBLY_LINKED_FL
+// This is only called on free spaces.
+BOOL gc_heap::should_set_bgc_mark_bit (uint8_t* o)
+{
+ if (!current_sweep_seg)
+ {
+ assert (current_bgc_state == bgc_not_in_process);
+ return FALSE;
+ }
+
+ // This is cheaper so I am doing this comparision first before having to get the seg for o.
+ if (in_range_for_segment (o, current_sweep_seg))
+ {
+ // The current sweep seg could have free spaces beyond its background_allocated so we need
+ // to check for that.
+ if ((o >= current_sweep_pos) && (o < heap_segment_background_allocated (current_sweep_seg)))
+ {
+ if (current_sweep_seg == saved_sweep_ephemeral_seg)
+ return (o < saved_sweep_ephemeral_start);
+ else
+ return TRUE;
+ }
+ else
+ return FALSE;
+ }
+ else
+ {
+ // We can have segments outside the BGC range that were allocated during mark - and we
+ // wouldn't have committed the mark array for them and their background_allocated would be
+ // non-zero. Don't set mark bits for those.
+ // The ones allocated during BGC sweep would have their background_allocated as 0.
+ if ((o >= background_saved_lowest_address) && (o < background_saved_highest_address))
+ {
+ heap_segment* seg = seg_mapping_table_segment_of (o);
+ // if bgc_allocated is 0 it means it was allocated during bgc sweep,
+ // and everything on it should be considered live.
+ uint8_t* background_allocated = heap_segment_background_allocated (seg);
+ if (background_allocated == 0)
+ return FALSE;
+ // During BGC sweep gen1 GCs could add some free spaces in gen2.
+ // If we use those, we should not set the mark bits on them.
+ // They could either be a newly allocated seg which is covered by the
+ // above case; or they are on a seg that's seen but beyond what BGC mark
+ // saw.
+ else if (o >= background_allocated)
+ return FALSE;
+ else
+ return (!heap_segment_swept_p (seg));
+ }
+ else
+ return FALSE;
+ }
+}
+#endif //DOUBLY_LINKED_FL
+
uint8_t* gc_heap::allocate_in_older_generation (generation* gen, size_t size,
- int from_gen_number,
- uint8_t* old_loc REQD_ALIGN_AND_OFFSET_DCL)
+ int from_gen_number,
+ uint8_t* old_loc REQD_ALIGN_AND_OFFSET_DCL)
{
size = Align (size);
assert (size >= Align (min_obj_size));
@@ -14411,6 +15372,14 @@ uint8_t* gc_heap::allocate_in_older_generation (generation* gen, size_t size,
assert (from_gen_number >= 0);
assert (generation_of (from_gen_number + 1) == gen);
+#ifdef DOUBLY_LINKED_FL
+ BOOL consider_bgc_mark_p = FALSE;
+ BOOL check_current_sweep_p = FALSE;
+ BOOL check_saved_sweep_p = FALSE;
+ BOOL try_added_list_p = (gen->gen_num == max_generation);
+ BOOL record_free_list_allocated_p = ((gen->gen_num == max_generation) && (current_c_gc_state == c_gc_state_planning));
+#endif //DOUBLY_LINKED_FL
+
allocator* gen_allocator = generation_allocator (gen);
BOOL discard_p = gen_allocator->discard_if_no_fit_p ();
#ifdef SHORT_PLUGS
@@ -14432,8 +15401,71 @@ uint8_t* gc_heap::allocate_in_older_generation (generation* gen, size_t size,
{
for (unsigned int a_l_idx = gen_allocator->first_suitable_bucket(real_size * 2); a_l_idx < gen_allocator->number_of_buckets(); a_l_idx++)
{
- uint8_t* free_list = gen_allocator->alloc_list_head_of (a_l_idx);
+ uint8_t* free_list = 0;
uint8_t* prev_free_item = 0;
+
+ BOOL use_undo_p = !discard_p;
+
+#ifdef DOUBLY_LINKED_FL
+ if (a_l_idx == 0)
+ {
+ use_undo_p = FALSE;
+ }
+
+ if (try_added_list_p)
+ {
+ free_list = gen_allocator->added_alloc_list_head_of (a_l_idx);
+ while (free_list != 0)
+ {
+ dprintf (3, ("considering free list in added list%Ix", (size_t)free_list));
+
+ size_t free_list_size = unused_array_size (free_list);
+
+ if (size_fit_p (size REQD_ALIGN_AND_OFFSET_ARG, free_list, (free_list + free_list_size),
+ old_loc, USE_PADDING_TAIL | pad_in_front))
+ {
+ dprintf (4, ("F:%Ix-%Id",
+ (size_t)free_list, free_list_size));
+
+ gen_allocator->unlink_item_no_undo_added (a_l_idx, free_list, prev_free_item);
+ generation_free_list_space (gen) -= free_list_size;
+
+ remove_gen_free (gen->gen_num, free_list_size);
+
+ if (record_free_list_allocated_p)
+ {
+ generation_set_bgc_mark_bit_p (gen) = should_set_bgc_mark_bit (free_list);
+ dprintf (3333, ("SFA: %Ix->%Ix(%d)", free_list, (free_list + free_list_size),
+ (generation_set_bgc_mark_bit_p (gen) ? 1 : 0)));
+ }
+ adjust_limit (free_list, free_list_size, gen);
+ generation_allocate_end_seg_p (gen) = FALSE;
+
+ goto finished;
+ }
+ // We do first fit on bucket 0 because we are not guaranteed to find a fit there.
+ else if (a_l_idx == 0)
+ {
+ dprintf (3, ("couldn't use this free area, discarding"));
+ generation_free_obj_space (gen) += free_list_size;
+
+ gen_allocator->unlink_item_no_undo_added (a_l_idx, free_list, prev_free_item);
+ generation_free_list_space (gen) -= free_list_size;
+
+ remove_gen_free (gen->gen_num, free_list_size);
+ }
+ else
+ {
+ prev_free_item = free_list;
+ }
+ free_list = free_list_slot (free_list);
+ }
+ }
+#endif //DOUBLY_LINKED_FL
+
+ free_list = gen_allocator->alloc_list_head_of (a_l_idx);
+ prev_free_item = 0;
+
while (free_list != 0)
{
dprintf (3, ("considering free list %Ix", (size_t)free_list));
@@ -14446,10 +15478,25 @@ uint8_t* gc_heap::allocate_in_older_generation (generation* gen, size_t size,
dprintf (4, ("F:%Ix-%Id",
(size_t)free_list, free_list_size));
- gen_allocator->unlink_item (a_l_idx, free_list, prev_free_item, !discard_p);
+ gen_allocator->unlink_item (a_l_idx, free_list, prev_free_item, use_undo_p);
generation_free_list_space (gen) -= free_list_size;
remove_gen_free (gen->gen_num, free_list_size);
+#ifdef DOUBLY_LINKED_FL
+ if (!discard_p && !use_undo_p)
+ {
+ gen2_removed_no_undo += free_list_size;
+ dprintf (3, ("h%d: remove with no undo %Id = %Id",
+ heap_number, free_list_size, gen2_removed_no_undo));
+ }
+
+ if (record_free_list_allocated_p)
+ {
+ generation_set_bgc_mark_bit_p (gen) = should_set_bgc_mark_bit (free_list);
+ dprintf (3333, ("SF: %Ix(%d)", free_list, (generation_set_bgc_mark_bit_p (gen) ? 1 : 0)));
+ }
+#endif //DOUBLY_LINKED_FL
+
adjust_limit (free_list, free_list_size, gen);
generation_allocate_end_seg_p (gen) = FALSE;
goto finished;
@@ -14463,6 +15510,15 @@ uint8_t* gc_heap::allocate_in_older_generation (generation* gen, size_t size,
gen_allocator->unlink_item (a_l_idx, free_list, prev_free_item, FALSE);
generation_free_list_space (gen) -= free_list_size;
remove_gen_free (gen->gen_num, free_list_size);
+
+#ifdef DOUBLY_LINKED_FL
+ if (!discard_p)
+ {
+ gen2_removed_no_undo += free_list_size;
+ dprintf (3, ("h%d: b0 remove with no undo %Id = %Id",
+ heap_number, free_list_size, gen2_removed_no_undo));
+ }
+#endif //DOUBLY_LINKED_FL
}
else
{
@@ -14582,12 +15638,28 @@ uint8_t* gc_heap::allocate_in_older_generation (generation* gen, size_t size,
generation_allocation_pointer (gen) += size + pad;
assert (generation_allocation_pointer (gen) <= generation_allocation_limit (gen));
+
+ generation_free_obj_space (gen) += pad;
+
if (generation_allocate_end_seg_p (gen))
{
generation_end_seg_allocated (gen) += size;
}
else
{
+#ifdef DOUBLY_LINKED_FL
+ if (generation_set_bgc_mark_bit_p (gen))
+ {
+ dprintf (2, ("IOM: %Ix(->%Ix(%Id) (%Ix-%Ix)", old_loc, result, pad,
+ (size_t)(&mark_array [mark_word_of (result)]),
+ (size_t)(mark_array [mark_word_of (result)])));
+
+ set_plug_bgc_mark_bit (old_loc);
+ }
+
+ generation_last_free_list_allocated (gen) = old_loc;
+#endif //DOUBLY_LINKED_FL
+
generation_free_list_allocated (gen) += size;
}
generation_allocation_size (gen) += size;
@@ -14596,7 +15668,7 @@ uint8_t* gc_heap::allocate_in_older_generation (generation* gen, size_t size,
generation_allocation_pointer (gen), generation_allocation_limit (gen),
generation_allocation_context_start_region (gen)));
- return result + pad;;
+ return (result + pad);
}
}
@@ -15122,6 +16194,11 @@ uint8_t* gc_heap::allocate_in_condemned_generations (generation* gen,
generation_allocation_pointer (gen) += size + pad;
assert (generation_allocation_pointer (gen) <= generation_allocation_limit (gen));
+ if ((pad > 0) && (to_gen_number >= 0))
+ {
+ generation_free_obj_space (generation_of (to_gen_number)) += pad;
+ }
+
#ifdef FREE_USAGE_STATS
generation_allocated_since_last_pin (gen) += size;
#endif //FREE_USAGE_STATS
@@ -15262,7 +16339,7 @@ int gc_heap::joined_generation_to_condemn (BOOL should_evaluate_elevation,
else if ((current_total_committed * 10) >= (heap_hard_limit * 9))
{
size_t loh_frag = get_total_gen_fragmentation (loh_generation);
-
+
// If the LOH frag is >= 1/8 it's worth compacting it
if ((loh_frag * 8) >= heap_hard_limit)
{
@@ -15666,8 +16743,8 @@ int gc_heap::generation_to_condemn (int n_initial,
for (int i = uoh_start_generation; i < total_generation_count; i++)
{
- dd_fragmentation (dynamic_data_of (i)) =
- generation_free_list_space (generation_of (i)) +
+ dd_fragmentation (dynamic_data_of (i)) =
+ generation_free_list_space (generation_of (i)) +
generation_free_obj_space (generation_of (i));
}
@@ -16091,8 +17168,8 @@ int gc_heap::generation_to_condemn (int n_initial,
#ifdef MULTIPLE_HEAPS
for (int i = 0; i < n_heaps; i++)
{
- if (((g_heaps[i]->current_generation_size (max_generation)) > bgc_min_per_heap) ||
- ((g_heaps[i]->current_generation_size (loh_generation)) > bgc_min_per_heap) ||
+ if (((g_heaps[i]->current_generation_size (max_generation)) > bgc_min_per_heap) ||
+ ((g_heaps[i]->current_generation_size (loh_generation)) > bgc_min_per_heap) ||
((g_heaps[i]->current_generation_size (poh_generation)) > bgc_min_per_heap))
{
bgc_heap_too_small = FALSE;
@@ -16100,8 +17177,8 @@ int gc_heap::generation_to_condemn (int n_initial,
}
}
#else //MULTIPLE_HEAPS
- if ((current_generation_size (max_generation) > bgc_min_per_heap) ||
- (current_generation_size (loh_generation) > bgc_min_per_heap) ||
+ if ((current_generation_size (max_generation) > bgc_min_per_heap) ||
+ (current_generation_size (loh_generation) > bgc_min_per_heap) ||
(current_generation_size (poh_generation) > bgc_min_per_heap))
{
bgc_heap_too_small = FALSE;
@@ -16207,6 +17284,10 @@ void gc_heap::init_background_gc ()
PREFIX_ASSUME(generation_allocation_segment(gen) != NULL);
+#ifdef DOUBLY_LINKED_FL
+ generation_set_bgc_mark_bit_p (gen) = FALSE;
+#endif //DOUBLY_LINKED_FL
+
//reset the plan allocation for each segment
for (heap_segment* seg = generation_allocation_segment (gen); seg != ephemeral_heap_segment;
seg = heap_segment_next_rw (seg))
@@ -16750,7 +17831,7 @@ void gc_heap::gc1()
#endif // HOST_64BIT
gc_data_global.final_youngest_desired = desired_per_heap;
}
-#if 1 //subsumed by the linear allocation model
+#if 1 //subsumed by the linear allocation model
if (gen >= uoh_start_generation)
{
// to avoid spikes in mem usage due to short terms fluctuations in survivorship,
@@ -17074,7 +18155,7 @@ BOOL gc_heap::loh_allocated_for_no_gc()
return FALSE;
heap_segment* seg = generation_allocation_segment (generation_of (loh_generation));
- do
+ do
{
if (seg == saved_loh_segment_no_gc)
{
@@ -18066,8 +19147,8 @@ gc_heap* gc_heap::heap_of_gc (uint8_t* o)
// will find all heap objects (large and small)
//
// Callers of this method need to guarantee the interior pointer is within the heap range.
-//
-// If you need it to be stricter, eg if you only want to find an object in ephemeral range,
+//
+// If you need it to be stricter, eg if you only want to find an object in ephemeral range,
// you should make sure interior is within that range before calling this method.
uint8_t* gc_heap::find_object (uint8_t* interior)
{
@@ -18088,12 +19169,12 @@ uint8_t* gc_heap::find_object (uint8_t* interior)
{
// this is a pointer to a UOH object
heap_segment* seg = find_segment (interior, FALSE);
- if (seg
+ if (seg)
+ {
#ifdef FEATURE_CONSERVATIVE_GC
- && (GCConfig::GetConservativeGC() || interior <= heap_segment_allocated(seg))
+ if (interior >= heap_segment_allocated(seg))
+ return 0;
#endif
- )
- {
// If interior falls within the first free object at the beginning of a generation,
// we don't have brick entry for it, and we may incorrectly treat it as on large object heap.
int align_const = get_alignment_constant (heap_segment_read_only_p (seg)
@@ -19687,7 +20768,7 @@ void gc_heap::background_process_mark_overflow_internal (int condemned_gen_numbe
while (seg)
{
uint8_t* o = hp->background_first_overflow (min_add, seg, concurrent_p, small_object_segments);
-
+
while ((o < hp->background_seg_end (seg, concurrent_p)) && (o <= max_add))
{
dprintf (3, ("considering %Ix", (size_t)o));
@@ -19986,7 +21067,7 @@ size_t gc_heap::committed_size()
for (int i = max_generation; i < total_generation_count; i++)
{
generation* gen = generation_of (i);
- heap_segment* seg = heap_segment_rw (generation_start_segment (gen));
+ heap_segment* seg = heap_segment_rw (generation_start_segment (gen));
while (seg)
{
@@ -20512,6 +21593,13 @@ void gc_heap::mark_phase (int condemned_gen_number, BOOL mark_only_p)
if (!full_p)
{
+#ifdef FEATURE_CARD_MARKING_STEALING
+ n_eph_soh = 0;
+ n_gen_soh = 0;
+ n_eph_loh = 0;
+ n_gen_loh = 0;
+#endif //FEATURE_CARD_MARKING_STEALING
+
#ifdef CARD_BUNDLE
#ifdef MULTIPLE_HEAPS
if (gc_t_join.r_join(this, gc_r_join_update_card_bundle))
@@ -20634,9 +21722,19 @@ void gc_heap::mark_phase (int condemned_gen_number, BOOL mark_only_p)
if (gc_t_join.joined())
#endif //MULTIPLE_HEAPS
{
+ uint64_t promoted_bytes_global = 0;
#ifdef HEAP_ANALYZE
heap_analyze_enabled = FALSE;
- GCToEEInterface::AnalyzeSurvivorsFinished(condemned_gen_number);
+#ifdef MULTIPLE_HEAPS
+ for (int i = 0; i < n_heaps; i++)
+ {
+ promoted_bytes_global += promoted_bytes (i);
+ }
+#else
+ promoted_bytes_global = promoted_bytes (0);
+#endif //MULTIPLE_HEAPS
+
+ GCToEEInterface::AnalyzeSurvivorsFinished (settings.gc_index, condemned_gen_number, promoted_bytes_global, GCHeap::ReportGenerationBounds);
#endif // HEAP_ANALYZE
GCToEEInterface::AfterGcScanRoots (condemned_gen_number, max_generation, &sc);
@@ -20654,6 +21752,18 @@ void gc_heap::mark_phase (int condemned_gen_number, BOOL mark_only_p)
#ifdef FEATURE_CARD_MARKING_STEALING
reset_card_marking_enumerators();
+
+ if (!full_p)
+ {
+ int generation_skip_ratio_soh = ((n_eph_soh > MIN_SOH_CROSS_GEN_REFS) ?
+ (int)(((float)n_gen_soh / (float)n_eph_soh) * 100) : 100);
+ int generation_skip_ratio_loh = ((n_eph_loh > MIN_LOH_CROSS_GEN_REFS) ?
+ (int)(((float)n_gen_loh / (float)n_eph_loh) * 100) : 100);
+
+ generation_skip_ratio = min (generation_skip_ratio_soh, generation_skip_ratio_loh);
+ dprintf (2, ("h%d skip ratio soh: %d, loh: %d", heap_number,
+ generation_skip_ratio_soh, generation_skip_ratio_loh));
+ }
#endif // FEATURE_CARD_MARKING_STEALING
// null out the target of short weakref that were not promoted.
@@ -21790,8 +22900,8 @@ BOOL gc_heap::plan_loh()
heap_segment* seg = start_seg;
uint8_t* o = generation_allocation_start (gen);
- dprintf (1235, ("before GC LOH size: %Id, free list: %Id, free obj: %Id\n",
- generation_size (loh_generation),
+ dprintf (1235, ("before GC LOH size: %Id, free list: %Id, free obj: %Id\n",
+ generation_size (loh_generation),
generation_free_list_space (gen),
generation_free_obj_space (gen)));
@@ -22035,8 +23145,8 @@ void gc_heap::compact_loh()
assert (loh_pinned_plug_que_empty_p());
- dprintf (1235, ("after GC LOH size: %Id, free list: %Id, free obj: %Id\n\n",
- generation_size (loh_generation),
+ dprintf (1235, ("after GC LOH size: %Id, free list: %Id, free obj: %Id\n\n",
+ generation_size (loh_generation),
generation_free_list_space (gen),
generation_free_obj_space (gen)));
}
@@ -22091,8 +23201,8 @@ void gc_heap::relocate_in_loh_compact()
}
}
- dprintf (1235, ("after GC LOH size: %Id, free list: %Id, free obj: %Id\n\n",
- generation_size (loh_generation),
+ dprintf (1235, ("after GC LOH size: %Id, free list: %Id, free obj: %Id\n\n",
+ generation_size (loh_generation),
generation_free_list_space (gen),
generation_free_obj_space (gen)));
}
@@ -22476,6 +23586,15 @@ void gc_heap::plan_phase (int condemned_gen_number)
memcpy (r_older_gen_free_space, older_gen->gen_free_spaces, sizeof (r_older_gen_free_space));
#endif //FREE_USAGE_STATS
generation_allocate_end_seg_p (older_gen) = FALSE;
+
+#ifdef DOUBLY_LINKED_FL
+ if (older_gen->gen_num == max_generation)
+ {
+ generation_set_bgc_mark_bit_p (older_gen) = FALSE;
+ generation_last_free_list_allocated (older_gen) = 0;
+ }
+#endif //DOUBLY_LINKED_FL
+
r_older_gen_free_list_allocated = generation_free_list_allocated (older_gen);
r_older_gen_condemned_allocated = generation_condemned_allocated (older_gen);
r_older_gen_end_seg_allocated = generation_end_seg_allocated (older_gen);
@@ -22597,6 +23716,10 @@ void gc_heap::plan_phase (int condemned_gen_number)
BOOL fire_pinned_plug_events_p = EVENT_ENABLED(PinPlugAtGCTime);
size_t last_plug_len = 0;
+#ifdef DOUBLY_LINKED_FL
+ gen2_removed_no_undo = 0;
+#endif //DOUBLY_LINKED_FL
+
while (1)
{
if (x >= end)
@@ -23347,7 +24470,8 @@ void gc_heap::plan_phase (int condemned_gen_number)
}
}
- if (maxgen_size_inc_p && provisional_mode_triggered)
+ if (maxgen_size_inc_p && provisional_mode_triggered &&
+ !(background_running_p() || (current_bgc_state == bgc_initialized)))
{
pm_trigger_full_gc = true;
dprintf (GTC_LOG, ("in PM: maxgen size inc, doing a sweeping gen1 and trigger NGC2"));
@@ -23458,7 +24582,8 @@ void gc_heap::plan_phase (int condemned_gen_number)
rearrange_uoh_segments ();
}
- if (maxgen_size_inc_p && provisional_mode_triggered)
+ if (maxgen_size_inc_p && provisional_mode_triggered &&
+ !(background_running_p() || (current_bgc_state == bgc_initialized)))
{
pm_trigger_full_gc = true;
dprintf (GTC_LOG, ("in PM: maxgen size inc, doing a sweeping gen1 and trigger NGC2"));
@@ -23495,7 +24620,8 @@ void gc_heap::plan_phase (int condemned_gen_number)
if (!pm_trigger_full_gc && pm_stress_on && provisional_mode_triggered)
{
if ((settings.condemned_generation == (max_generation - 1)) &&
- ((settings.gc_index % 5) == 0))
+ ((settings.gc_index % 5) == 0) &&
+ !(background_running_p() || (current_bgc_state == bgc_initialized)))
{
pm_trigger_full_gc = true;
}
@@ -23747,9 +24873,28 @@ void gc_heap::plan_phase (int condemned_gen_number)
if ((condemned_gen_number < max_generation))
{
+#ifdef FREE_USAGE_STATS
+ memcpy (older_gen->gen_free_spaces, r_older_gen_free_space, sizeof (r_older_gen_free_space));
+#endif //FREE_USAGE_STATS
generation_allocator (older_gen)->copy_from_alloc_list (r_free_list);
generation_free_list_space (older_gen) = r_free_list_space;
generation_free_obj_space (older_gen) = r_free_obj_space;
+
+#ifdef DOUBLY_LINKED_FL
+ if (condemned_gen_number == (max_generation - 1))
+ {
+ dprintf (2, ("[h%d] no undo, FL %Id-%Id -> %Id, FO %Id+%Id=%Id",
+ heap_number,
+ generation_free_list_space (older_gen), gen2_removed_no_undo,
+ (generation_free_list_space (older_gen) - gen2_removed_no_undo),
+ generation_free_obj_space (older_gen), gen2_removed_no_undo,
+ (generation_free_obj_space (older_gen) + gen2_removed_no_undo)));
+
+ generation_free_list_space (older_gen) -= gen2_removed_no_undo;
+ generation_free_obj_space (older_gen) += gen2_removed_no_undo;
+ }
+#endif //DOUBLY_LINKED_FL
+
generation_free_list_allocated (older_gen) = r_older_gen_free_list_allocated;
generation_end_seg_allocated (older_gen) = r_older_gen_end_seg_allocated;
generation_condemned_allocated (older_gen) = r_older_gen_condemned_allocated;
@@ -23770,7 +24915,14 @@ void gc_heap::plan_phase (int condemned_gen_number)
gen0_big_free_spaces = 0;
make_free_lists (condemned_gen_number);
- recover_saved_pinned_info();
+ size_t total_recovered_sweep_size = recover_saved_pinned_info();
+ if (total_recovered_sweep_size > 0)
+ {
+ generation_free_obj_space (generation_of (max_generation)) -= total_recovered_sweep_size;
+ dprintf (2, ("h%d: deduct %Id for pin, fo->%Id",
+ heap_number, total_recovered_sweep_size,
+ generation_free_obj_space (generation_of (max_generation))));
+ }
#ifdef FEATURE_PREMORTEM_FINALIZATION
finalize_queue->UpdatePromotedGenerations (condemned_gen_number, TRUE);
@@ -23849,8 +25001,13 @@ void gc_heap::fix_generation_bounds (int condemned_gen_number,
dprintf(3,("Fixing generation pointers for %Ix", gen_number));
if ((gen_number < max_generation) && ephemeral_promotion)
{
+ size_t saved_eph_start_size = saved_ephemeral_plan_start_size[gen_number];
+
make_unused_array (saved_ephemeral_plan_start[gen_number],
- saved_ephemeral_plan_start_size[gen_number]);
+ saved_eph_start_size);
+ generation_free_obj_space (generation_of (max_generation)) += saved_eph_start_size;
+ dprintf (2, ("[h%d] EP %Ix(%Id)", heap_number, saved_ephemeral_plan_start[gen_number],
+ saved_ephemeral_plan_start_size[gen_number]));
}
reset_allocation_pointers (gen, generation_plan_allocation_start (gen));
make_unused_array (generation_allocation_start (gen), generation_plan_allocation_start_size (gen));
@@ -24090,6 +25247,21 @@ void gc_heap::make_free_list_in_brick (uint8_t* tree, make_free_args* args)
clear_plug_padded (plug);
}
#endif //SHORT_PLUGS
+
+#ifdef DOUBLY_LINKED_FL
+ // These 2 checks should really just be merged into one.
+ if (is_plug_bgc_mark_bit_set (plug))
+ {
+ dprintf (3333, ("cbgcm: %Ix", plug));
+ clear_plug_bgc_mark_bit (plug);
+ }
+ if (is_free_obj_in_compact_bit_set (plug))
+ {
+ dprintf (3333, ("cfoc: %Ix", plug));
+ clear_free_obj_in_compact_bit (plug);
+ }
+#endif //DOUBLY_LINKED_FL
+
gen_crossing:
{
if ((args->current_gen_limit == MAX_PTR) ||
@@ -25425,9 +26597,61 @@ void gc_heap::gcmemcopy (uint8_t* dest, uint8_t* src, size_t len, BOOL copy_car
copy_mark_bits_for_addresses (dest, src, len);
}
#endif //BACKGROUND_GC
+
+#ifdef DOUBLY_LINKED_FL
+ BOOL set_bgc_mark_bits_p = is_plug_bgc_mark_bit_set (src);
+ if (set_bgc_mark_bits_p)
+ {
+ clear_plug_bgc_mark_bit (src);
+ }
+
+ BOOL make_free_obj_p = FALSE;
+ if (len < min_free_item_no_prev)
+ {
+ make_free_obj_p = is_free_obj_in_compact_bit_set (src);
+
+ if (make_free_obj_p)
+ {
+ clear_free_obj_in_compact_bit (src);
+ }
+ }
+#endif //DOUBLY_LINKED_FL
+
//dprintf(3,(" Memcopy [%Ix->%Ix, %Ix->%Ix[", (size_t)src, (size_t)dest, (size_t)src+len, (size_t)dest+len));
dprintf(3,(" mc: [%Ix->%Ix, %Ix->%Ix[", (size_t)src, (size_t)dest, (size_t)src+len, (size_t)dest+len));
memcopy (dest - plug_skew, src - plug_skew, len);
+
+#ifdef DOUBLY_LINKED_FL
+ if (set_bgc_mark_bits_p)
+ {
+ uint8_t* dest_o = dest;
+ uint8_t* dest_end_o = dest + len;
+ while (dest_o < dest_end_o)
+ {
+ uint8_t* next_o = dest_o + Align (size (dest_o));
+ background_mark (dest_o, background_saved_lowest_address, background_saved_highest_address);
+
+ dest_o = next_o;
+ }
+ dprintf (3333, ("[h%d] GM: %Ix(%Ix-%Ix)->%Ix(%Ix-%Ix)",
+ heap_number, dest,
+ (size_t)(&mark_array [mark_word_of (dest)]),
+ (size_t)(mark_array [mark_word_of (dest)]),
+ dest_end_o,
+ (size_t)(&mark_array [mark_word_of (dest_o)]),
+ (size_t)(mark_array [mark_word_of (dest_o)])));
+ }
+
+ if (make_free_obj_p)
+ {
+ size_t* filler_free_obj_size_location = (size_t*)(dest + min_free_item_no_prev);
+ size_t filler_free_obj_size = *filler_free_obj_size_location;
+ make_unused_array ((dest + len), filler_free_obj_size);
+ dprintf (3333, ("[h%d] smallobj, %Ix(%Id): %Ix->%Ix", heap_number,
+ filler_free_obj_size_location, filler_free_obj_size, (dest + len), (dest + len + filler_free_obj_size)));
+ }
+#endif //DOUBLY_LINKED_FL
+
#ifdef FEATURE_USE_SOFTWARE_WRITE_WATCH_FOR_GC_HEAP
if (SoftwareWriteWatch::IsEnabledForGCHeap())
{
@@ -25673,14 +26897,27 @@ void gc_heap::compact_in_brick (uint8_t* tree, compact_args* args)
}
}
-void gc_heap::recover_saved_pinned_info()
+// This returns the recovered size for gen2 plugs as that's what we need
+// mostly - would be nice to make it work for all generations.
+size_t gc_heap::recover_saved_pinned_info()
{
reset_pinned_queue_bos();
+ size_t total_recovered_sweep_size = 0;
while (!(pinned_plug_que_empty_p()))
{
mark* oldest_entry = oldest_pin();
- oldest_entry->recover_plug_info();
+ size_t recovered_sweep_size = oldest_entry->recover_plug_info();
+
+ if (recovered_sweep_size > 0)
+ {
+ uint8_t* plug = pinned_plug (oldest_entry);
+ if (object_gennum (plug) == max_generation)
+ {
+ dprintf (3, ("recovered %Ix(%Id) from pin", plug, recovered_sweep_size));
+ total_recovered_sweep_size += recovered_sweep_size;
+ }
+ }
#ifdef GC_CONFIG_DRIVEN
if (oldest_entry->has_pre_plug_info() && oldest_entry->has_post_plug_info())
record_interesting_data_point (idp_pre_and_post_pin);
@@ -25692,6 +26929,8 @@ void gc_heap::recover_saved_pinned_info()
deque_pinned_plug();
}
+
+ return total_recovered_sweep_size;
}
void gc_heap::compact_phase (int condemned_gen_number,
@@ -25835,7 +27074,7 @@ void gc_heap::gc_thread_stub (void* arg)
// server GC threads run at a higher priority than normal.
GCToOSInterface::BoostThreadPriority();
- _alloca (256*heap->heap_number);
+ void* tmp = _alloca (256*heap->heap_number);
heap->gc_thread_function();
}
#ifdef _MSC_VER
@@ -26280,7 +27519,7 @@ BOOL gc_heap::commit_mark_array_bgc_init()
if (!(seg->flags & heap_segment_flags_ma_committed))
{
// For ro segments they could always be only partially in range so we'd
- // be calling this at the beginning of every BGC. We are not making this
+ // be calling this at the beginning of every BGC. We are not making this
// more efficient right now - ro segments are currently only used by redhawk.
if (heap_segment_read_only_p (seg))
{
@@ -26312,7 +27551,7 @@ BOOL gc_heap::commit_mark_array_bgc_init()
}
else
{
- // For normal segments they are by design completely in range so just
+ // For normal segments they are by design completely in range so just
// commit the whole mark array for each seg.
if (commit_mark_array_by_seg (seg, mark_array))
{
@@ -26942,9 +28181,9 @@ void gc_heap::background_mark_phase ()
gen0_bricks_cleared = FALSE;
- dprintf (2, ("end of bgc mark: loh: %d, poh: %d, soh: %d",
- generation_size (loh_generation),
- generation_size (poh_generation),
+ dprintf (2, ("end of bgc mark: loh: %d, poh: %d, soh: %d",
+ generation_size (loh_generation),
+ generation_size (poh_generation),
generation_sizes (generation_of (max_generation))));
for (int gen_idx = max_generation; gen_idx < total_generation_count; gen_idx++)
@@ -26981,9 +28220,10 @@ void gc_heap::background_mark_phase ()
heap_segment_background_allocated (seg) = heap_segment_allocated (seg);
}
- dprintf (2, ("seg %Ix background allocated is %Ix",
- heap_segment_mem (seg),
- heap_segment_background_allocated (seg)));
+ dprintf (3333, ("h%d seg %Ix background allocated is %Ix",
+ heap_number,
+ (size_t)(seg),
+ heap_segment_background_allocated (seg)));
seg = heap_segment_next_rw (seg);
}
@@ -27274,7 +28514,7 @@ void gc_heap::revisit_written_pages (BOOL concurrent_p, BOOL reset_only_p)
if ((heap_segment_mem (seg) >= background_saved_lowest_address) ||
(heap_segment_reserved (seg) <= background_saved_highest_address))
{
- dprintf (3, ("h%d: sseg: %Ix(-%Ix)", heap_number,
+ dprintf (3, ("h%d: sseg: %Ix(-%Ix)", heap_number,
heap_segment_mem (seg), heap_segment_reserved (seg)));
skip_seg_p = TRUE;
}
@@ -27290,7 +28530,7 @@ void gc_heap::revisit_written_pages (BOOL concurrent_p, BOOL reset_only_p)
dprintf (3, ("h%d: reset only starting %Ix", heap_number, base_address));
}
- dprintf (3, ("h%d: starting: %Ix, seg %Ix-%Ix", heap_number, base_address,
+ dprintf (3, ("h%d: starting: %Ix, seg %Ix-%Ix", heap_number, base_address,
heap_segment_mem (seg), heap_segment_reserved (seg)));
@@ -27338,7 +28578,7 @@ void gc_heap::revisit_written_pages (BOOL concurrent_p, BOOL reset_only_p)
{
total_dirtied_pages += bcount;
- dprintf (3, ("Found %d pages [%Ix, %Ix[",
+ dprintf (3, ("Found %d pages [%Ix, %Ix[",
bcount, (size_t)base_address, (size_t)high_address));
}
@@ -27347,7 +28587,7 @@ void gc_heap::revisit_written_pages (BOOL concurrent_p, BOOL reset_only_p)
for (unsigned i = 0; i < bcount; i++)
{
uint8_t* page = (uint8_t*)background_written_addresses[i];
- dprintf (3, ("looking at page %d at %Ix(h: %Ix)", i,
+ dprintf (3, ("looking at page %d at %Ix(h: %Ix)", i,
(size_t)page, (size_t)high_address));
if (page < high_address)
{
@@ -27381,7 +28621,7 @@ void gc_heap::revisit_written_pages (BOOL concurrent_p, BOOL reset_only_p)
}
if (i < loh_generation)
- {
+ {
if (!reset_only_p)
{
dprintf (GTC_LOG, ("h%d: SOH: dp:%Id; mo: %Id", heap_number, total_dirtied_pages, total_marked_objects));
@@ -27563,7 +28803,7 @@ BOOL gc_heap::create_bgc_thread(gc_heap* gh)
//dprintf (2, ("Creating BGC thread"));
- gh->bgc_thread_running = GCToEEInterface::CreateThread(gh->bgc_thread_stub, gh, true, ".NET Background GC");
+ gh->bgc_thread_running = GCToEEInterface::CreateThread(gh->bgc_thread_stub, gh, true, ".NET BGC");
return gh->bgc_thread_running;
}
@@ -27802,7 +29042,9 @@ void gc_heap::bgc_thread_function()
gc1();
+#ifndef DOUBLY_LINKED_FL
current_bgc_state = bgc_not_in_process;
+#endif //!DOUBLY_LINKED_FL
enable_preemptive ();
#ifdef MULTIPLE_HEAPS
@@ -28122,7 +29364,7 @@ void gc_heap::bgc_tuning::record_bgc_start()
// Note that younger gen's collection count is always updated with older gen's collections.
// So to calcuate the actual # of gen1 occurred we really should take the # of gen2s into
- // acccount (and deduct from gen1's collection count). But right now I am using it for stats.
+ // account (and deduct from gen1's collection count). But right now I am using it for stats.
size_t current_gen1_index = get_current_gc_index (max_generation - 1);
dprintf (BGC_TUNING_LOG, ("BTL: g2t[st][g1 %Id]: %0.3f minutes",
@@ -29468,7 +30710,6 @@ gc_heap::compute_next_boundary (int gen_number,
assert (gen_number > settings.condemned_generation);
return generation_allocation_start (generation_of (gen_number - 1 ));
}
-
}
inline void
@@ -29543,7 +30784,6 @@ gc_heap::mark_through_cards_helper (uint8_t** poo, size_t& n_gen,
cg_pointers_found ++;
dprintf (4, ("cg pointer %Ix found, %Id so far",
(size_t)*poo, cg_pointers_found ));
-
}
}
@@ -30011,9 +31251,20 @@ void gc_heap::mark_through_cards_for_segments (card_fn fn, BOOL relocating CARD_
// compute the efficiency ratio of the card table
if (!relocating)
{
- generation_skip_ratio = ((n_eph > 400)? (int)(((float)n_gen / (float)n_eph) * 100) : 100);
- dprintf (3, ("Msoh: cross: %Id, useful: %Id, cards set: %Id, cards cleared: %Id, ratio: %d",
- n_eph, n_gen , n_card_set, total_cards_cleared, generation_skip_ratio));
+#ifdef FEATURE_CARD_MARKING_STEALING
+ Interlocked::ExchangeAddPtr(&n_eph_soh, n_eph);
+ Interlocked::ExchangeAddPtr(&n_gen_soh, n_gen);
+ dprintf (3, ("h%d marking h%d Msoh: cross: %Id, useful: %Id, cards set: %Id, cards cleared: %Id, ratio: %d",
+ hpt->heap_number, heap_number, n_eph, n_gen, n_card_set, total_cards_cleared,
+ (n_eph ? (int)(((float)n_gen / (float)n_eph) * 100) : 0)));
+ dprintf (3, ("h%d marking h%d Msoh: total cross %Id, useful: %Id, running ratio: %d",
+ hpt->heap_number, heap_number, n_eph_soh, n_gen_soh,
+ (n_eph_soh ? (int)(((float)n_gen_soh / (float)n_eph_soh) * 100) : 0)));
+#else
+ generation_skip_ratio = ((n_eph > MIN_SOH_CROSS_GEN_REFS) ? (int)(((float)n_gen / (float)n_eph) * 100) : 100);
+ dprintf (3, ("marking h%d Msoh: cross: %Id, useful: %Id, cards set: %Id, cards cleared: %Id, ratio: %d",
+ heap_number, n_eph, n_gen, n_card_set, total_cards_cleared, generation_skip_ratio));
+#endif //FEATURE_CARD_MARKING_STEALING
}
else
{
@@ -31374,6 +32625,23 @@ generation* gc_heap::expand_heap (int condemned_generation,
get_gc_data_per_heap()->set_mechanism (gc_heap_expand, expand_new_seg_ep);
dprintf (2, ("promoting ephemeral"));
save_ephemeral_generation_starts();
+
+ // We also need to adjust free_obj_space (due to padding) here because now young gens' free_obj_space will
+ // belong to gen2.
+ generation* max_gen = generation_of (max_generation);
+ for (int i = 1; i < max_generation; i++)
+ {
+ generation_free_obj_space (max_gen) +=
+ generation_free_obj_space (generation_of (i));
+ dprintf (2, ("[h%d] maxgen freeobj + %Id=%Id",
+ heap_number, generation_free_obj_space (generation_of (i)),
+ generation_free_obj_space (max_gen)));
+ }
+
+ // TODO: This is actually insufficient - if BACKGROUND_GC is not defined we'd need to commit more
+ // in order to accommodate eph gen starts. Also in the no_gc we should make sure used
+ // is updated correctly.
+ heap_segment_used (new_seg) = heap_segment_committed (new_seg);
}
else
{
@@ -31724,8 +32992,8 @@ size_t gc_heap::desired_new_allocation (dynamic_data* dd,
{
size_t allocated = 0;
size_t committed = uoh_committed_size (gen_number, &allocated);
- dprintf (1, ("GC#%Id h%d, GMI: UOH budget, UOH commit %Id (obj %Id, frag %Id), total commit: %Id (recorded: %Id)",
- (size_t)settings.gc_index, heap_number,
+ dprintf (1, ("GC#%Id h%d, GMI: UOH budget, UOH commit %Id (obj %Id, frag %Id), total commit: %Id (recorded: %Id)",
+ (size_t)settings.gc_index, heap_number,
committed, allocated,
dd_fragmentation (dynamic_data_of (gen_number)),
get_total_committed_size(), (current_total_committed - current_total_committed_bookkeeping)));
@@ -32136,7 +33404,7 @@ void gc_heap::trim_youngest_desired_low_memory()
{
if (g_low_memory_status)
{
- size_t committed_mem = committed_size();
+ size_t committed_mem = committed_size();
dynamic_data* dd = dynamic_data_of (0);
size_t current = dd_desired_allocation (dd);
size_t candidate = max (Align ((committed_mem / 10), get_alignment_constant(FALSE)), dd_min_size (dd));
@@ -32147,7 +33415,7 @@ void gc_heap::trim_youngest_desired_low_memory()
void gc_heap::decommit_ephemeral_segment_pages()
{
- if (settings.concurrent || use_large_pages_p)
+ if (settings.concurrent || use_large_pages_p || (settings.pause_mode == pause_no_gc))
{
return;
}
@@ -32186,7 +33454,7 @@ void gc_heap::decommit_ephemeral_segment_pages()
decommit_target += target_decrease * 2 / 3;
}
- heap_segment_decommit_target(ephemeral_heap_segment) = decommit_target;
+ heap_segment_decommit_target (ephemeral_heap_segment) = decommit_target;
#ifdef MULTIPLE_HEAPS
if (decommit_target < heap_segment_committed (ephemeral_heap_segment))
@@ -33047,8 +34315,8 @@ void gc_heap::generation_delete_heap_segment (generation* gen,
{
dprintf (3, ("Preparing empty large segment %Ix for deletion", (size_t)seg));
- // We cannot thread segs in here onto freeable_uoh_segment because
- // grow_brick_card_tables could be committing mark array which needs to read
+ // We cannot thread segs in here onto freeable_uoh_segment because
+ // grow_brick_card_tables could be committing mark array which needs to read
// the seg list. So we delay it till next time we suspend EE.
seg->flags |= heap_segment_flags_uoh_delete;
// Since we will be decommitting the seg, we need to prevent heap verification
@@ -33057,12 +34325,14 @@ void gc_heap::generation_delete_heap_segment (generation* gen,
}
else
{
- if (seg == ephemeral_heap_segment)
- {
- FATAL_GC_ERROR();
- }
+ assert (seg != ephemeral_heap_segment);
+#ifdef DOUBLY_LINKED_FL
+ // For doubly linked list we go forward for SOH
+ heap_segment_next (prev_seg) = next_seg;
+#else //DOUBLY_LINKED_FL
heap_segment_next (next_seg) = prev_seg;
+#endif //DOUBLY_LINKED_FL
dprintf (3, ("Preparing empty small segment %Ix for deletion", (size_t)seg));
heap_segment_next (seg) = freeable_soh_segment;
@@ -33076,18 +34346,19 @@ void gc_heap::generation_delete_heap_segment (generation* gen,
}
void gc_heap::process_background_segment_end (heap_segment* seg,
- generation* gen,
- uint8_t* last_plug_end,
- heap_segment* start_seg,
- BOOL* delete_p)
+ generation* gen,
+ uint8_t* last_plug_end,
+ heap_segment* start_seg,
+ BOOL* delete_p,
+ size_t free_obj_size_last_gap)
{
*delete_p = FALSE;
uint8_t* allocated = heap_segment_allocated (seg);
uint8_t* background_allocated = heap_segment_background_allocated (seg);
BOOL uoh_p = heap_segment_uoh_p (seg);
- dprintf (3, ("Processing end of background segment [%Ix, %Ix[(%Ix[)",
- (size_t)heap_segment_mem (seg), background_allocated, allocated));
+ dprintf (3, ("EoS [%Ix, %Ix[(%Ix[), last: %Ix(%Id)",
+ (size_t)heap_segment_mem (seg), background_allocated, allocated, last_plug_end, free_obj_size_last_gap));
if (!uoh_p && (allocated != background_allocated))
{
@@ -33095,15 +34366,20 @@ void gc_heap::process_background_segment_end (heap_segment* seg,
dprintf (3, ("Make a free object before newly promoted objects [%Ix, %Ix[",
(size_t)last_plug_end, background_allocated));
- thread_gap (last_plug_end, background_allocated - last_plug_end, generation_of (max_generation));
+ size_t last_gap = background_allocated - last_plug_end;
+ if (last_gap > 0)
+ {
+ thread_gap (last_plug_end, last_gap, generation_of (max_generation));
+ add_gen_free (max_generation, last_gap);
- fix_brick_to_highest (last_plug_end, background_allocated);
+ fix_brick_to_highest (last_plug_end, background_allocated);
- // When we allowed fgc's during going through gaps, we could have erased the brick
- // that corresponds to bgc_allocated 'cause we had to update the brick there,
- // recover it here.
- fix_brick_to_highest (background_allocated, background_allocated);
+ // When we allowed fgc's during going through gaps, we could have erased the brick
+ // that corresponds to bgc_allocated 'cause we had to update the brick there,
+ // recover it here.
+ fix_brick_to_highest (background_allocated, background_allocated);
+ }
}
else
{
@@ -33134,7 +34410,10 @@ void gc_heap::process_background_segment_end (heap_segment* seg,
}
else
{
- dprintf (3, ("Trimming seg to %Ix[", (size_t)last_plug_end));
+ dprintf (3, ("[h%d] seg %Ix alloc %Ix->%Ix",
+ heap_number, (size_t)seg,
+ heap_segment_allocated (seg),
+ (size_t)last_plug_end));
heap_segment_allocated (seg) = last_plug_end;
set_mem_verify (heap_segment_allocated (seg) - plug_skew, heap_segment_used (seg), 0xbb);
@@ -33142,6 +34421,13 @@ void gc_heap::process_background_segment_end (heap_segment* seg,
}
}
+ if (free_obj_size_last_gap)
+ {
+ generation_free_obj_space (gen) -= free_obj_size_last_gap;
+ dprintf (2, ("[h%d] PS: gen2FO-: %Id->%Id",
+ heap_number, free_obj_size_last_gap, generation_free_obj_space (gen)));
+ }
+
dprintf (3, ("verifying seg %Ix's mark array was completely cleared", seg));
bgc_verify_mark_array_cleared (seg);
}
@@ -33224,6 +34510,10 @@ void gc_heap::should_check_bgc_mark (heap_segment* seg,
{
dprintf (3, ("seg %Ix is already swept by bgc", seg));
}
+ else if (heap_segment_background_allocated (seg) == 0)
+ {
+ dprintf (3, ("seg %Ix newly alloc during bgc"));
+ }
else
{
*consider_bgc_mark_p = TRUE;
@@ -33380,9 +34670,22 @@ void gc_heap::background_sweep()
for (int i = 0; i <= max_generation; i++)
{
generation* gen_to_reset = generation_of (i);
- generation_allocator (gen_to_reset)->clear();
- generation_free_list_space (gen_to_reset) = 0;
- generation_free_obj_space (gen_to_reset) = 0;
+#ifdef DOUBLY_LINKED_FL
+ if (i == max_generation)
+ {
+ dprintf (2, ("h%d: gen2 still has FL: %Id, FO: %Id",
+ heap_number,
+ generation_free_list_space (gen_to_reset),
+ generation_free_obj_space (gen_to_reset)));
+ }
+ else
+#endif //DOUBLY_LINKED_FL
+ {
+ generation_allocator (gen_to_reset)->clear();
+ generation_free_list_space (gen_to_reset) = 0;
+ generation_free_obj_space (gen_to_reset) = 0;
+ }
+
generation_free_list_allocated (gen_to_reset) = 0;
generation_end_seg_allocated (gen_to_reset) = 0;
generation_condemned_allocated (gen_to_reset) = 0;
@@ -33396,6 +34699,9 @@ void gc_heap::background_sweep()
FIRE_EVENT(BGC2ndNonConEnd);
uoh_alloc_thread_count = 0;
+
+ init_free_and_plug();
+
current_bgc_state = bgc_sweep_soh;
verify_soh_segment_list();
@@ -33408,7 +34714,6 @@ void gc_heap::background_sweep()
}
#endif // FEATURE_BASICFREEZE
- //TODO BACKGROUND_GC: can we move this to where we switch to the LOH?
if (current_c_gc_state != c_gc_state_planning)
{
current_c_gc_state = c_gc_state_planning;
@@ -33486,40 +34791,57 @@ void gc_heap::background_sweep()
heap_segment* next_seg = 0;
heap_segment* prev_seg;
heap_segment* start_seg;
- int align_const;
+ int align_const = get_alignment_constant (i == max_generation);
+#ifndef DOUBLY_LINKED_FL
if (i == max_generation)
{
// start with saved ephemeral segment
- // we are no longer holding gc_lock, so a new ephemeral segment could be added, we want the saved one.
+ // we are no longer holding gc_lock, so a new ephemeral segment could be added, we want the saved one.
start_seg = saved_sweep_ephemeral_seg;
prev_seg = heap_segment_next(start_seg);
- align_const = get_alignment_constant (TRUE);
}
else
+#endif //!DOUBLY_LINKED_FL
{
+ // If we use doubly linked FL we don't need to go backwards as we are maintaining the free list.
start_seg = gen_start_seg;
prev_seg = NULL;
- align_const = get_alignment_constant (FALSE);
-
- // UOH allocations are possible while sweeping SOH, so
- // we defer clearing UOH free lists until we start sweeping them
- generation_allocator (gen)->clear();
- generation_free_list_space (gen) = 0;
- generation_free_obj_space (gen) = 0;
- generation_free_list_allocated (gen) = 0;
- generation_end_seg_allocated (gen) = 0;
- generation_condemned_allocated (gen) = 0;
- generation_sweep_allocated (gen) = 0;
- generation_allocation_pointer (gen)= 0;
- generation_allocation_limit (gen) = 0;
- generation_allocation_segment (gen) = heap_segment_rw (generation_start_segment (gen));
+
+ if (i > max_generation)
+ {
+ // UOH allocations are allowed while sweeping SOH, so
+ // we defer clearing UOH free lists until we start sweeping them
+ generation_allocator (gen)->clear();
+ generation_free_list_space (gen) = 0;
+ generation_free_obj_space (gen) = 0;
+ generation_free_list_allocated (gen) = 0;
+ generation_end_seg_allocated (gen) = 0;
+ generation_condemned_allocated (gen) = 0;
+ generation_sweep_allocated (gen) = 0;
+ generation_allocation_pointer (gen)= 0;
+ generation_allocation_limit (gen) = 0;
+ generation_allocation_segment (gen) = heap_segment_rw (generation_start_segment (gen));
+ }
+ else
+ {
+ dprintf (3333, ("h%d: SOH sweep start on seg %Ix: total FL: %Id, FO: %Id",
+ heap_number, (size_t)start_seg,
+ generation_free_list_space (gen),
+ generation_free_obj_space (gen)));
+ }
}
PREFIX_ASSUME(start_seg != NULL);
heap_segment* seg = start_seg;
dprintf (2, ("bgs: sweeping gen %Ix objects", gen->gen_num));
- while (seg)
+ while (seg
+#ifdef DOUBLY_LINKED_FL
+ // We no longer go backwards in segment list for SOH so we need to bail when we see
+ // segments newly allocated during bgc sweep.
+ && !((heap_segment_background_allocated (seg) == 0) && (gen != large_object_generation))
+#endif //DOUBLY_LINKED_FL
+ )
{
uint8_t* o = heap_segment_mem (seg);
if (seg == gen_start_seg)
@@ -33532,10 +34854,18 @@ void gc_heap::background_sweep()
uint8_t* plug_end = o;
current_sweep_pos = o;
next_sweep_obj = o;
+#ifdef DOUBLY_LINKED_FL
+ current_sweep_seg = seg;
+#endif //DOUBLY_LINKED_FL
+
+ // This records the total size of free objects (including the ones on and not on FL)
+ // in the gap and it gets set to 0 when we encounter a plug. If the last gap we saw
+ // on a seg is unmarked, we will process this in process_background_segment_end.
+ size_t free_obj_size_last_gap = 0;
allow_fgc();
uint8_t* end = background_next_end (seg, (i > max_generation));
- dprintf (2, ("bgs: seg: %Ix, [%Ix, %Ix[%Ix", (size_t)seg,
+ dprintf (3333, ("bgs: seg: %Ix, [%Ix, %Ix[%Ix", (size_t)seg,
(size_t)heap_segment_mem (seg),
(size_t)heap_segment_allocated (seg),
(size_t)heap_segment_background_allocated (seg)));
@@ -33554,6 +34884,18 @@ void gc_heap::background_sweep()
if (i == max_generation)
{
add_gen_free (max_generation, plug_start-plug_end);
+
+#ifdef DOUBLY_LINKED_FL
+ if (free_obj_size_last_gap)
+ {
+ generation_free_obj_space (gen) -= free_obj_size_last_gap;
+ dprintf (3333, ("[h%d] LG: gen2FO-: %Id->%Id",
+ heap_number, free_obj_size_last_gap, generation_free_obj_space (gen)));
+
+ free_obj_size_last_gap = 0;
+ }
+#endif //DOUBLY_LINKED_FL
+
fix_brick_to_highest (plug_end, plug_start);
// we need to fix the brick for the next plug here 'cause an FGC can
// happen and can't read a stale brick.
@@ -33562,14 +34904,15 @@ void gc_heap::background_sweep()
do
{
- o = o + Align (size (o), align_const);
+ next_sweep_obj = o + Align (size (o), align_const);
current_num_objs++;
if (current_num_objs >= num_objs)
{
- current_sweep_pos = o;
+ current_sweep_pos = next_sweep_obj;
allow_fgc();
current_num_objs = 0;
}
+ o = next_sweep_obj;
} while ((o < end) && background_object_marked(o, TRUE));
plug_end = o;
@@ -33583,7 +34926,50 @@ void gc_heap::background_sweep()
while ((o < end) && !background_object_marked (o, FALSE))
{
- o = o + Align (size (o), align_const);;
+ size_t size_o = Align(size (o), align_const);
+ next_sweep_obj = o + size_o;
+
+#ifdef DOUBLY_LINKED_FL
+ if (gen != large_object_generation)
+ {
+ if (method_table (o) == g_gc_pFreeObjectMethodTable)
+ {
+ free_obj_size_last_gap += size_o;
+
+ if (is_on_free_list (o, size_o))
+ {
+ generation_allocator (gen)->unlink_item_no_undo (o, size_o);
+ generation_free_list_space (gen) -= size_o;
+ generation_free_obj_space (gen) += size_o;
+
+ dprintf (3333, ("[h%d] gen2F-: %Ix->%Ix(%Id) FL: %Id",
+ heap_number, o, (o + size_o), size_o,
+ generation_free_list_space (gen)));
+ dprintf (3333, ("h%d: gen2FO+: %Ix(%Id)->%Id (g: %Id)",
+ heap_number, o, size_o,
+ generation_free_obj_space (gen),
+ free_obj_size_last_gap));
+ remove_gen_free (max_generation, size_o);
+ }
+ else
+ {
+ // this was not on the free list so it was already part of
+ // free_obj_space, so no need to substract from it. However,
+ // we do need to keep track in this gap's FO space.
+ dprintf (3333, ("h%d: gen2FO: %Ix(%Id)->%Id (g: %Id)",
+ heap_number, o, size_o,
+ generation_free_obj_space (gen), free_obj_size_last_gap));
+ }
+
+ dprintf (3333, ("h%d: total FO: %Ix->%Ix FL: %Id, FO: %Id (g: %Id)",
+ heap_number, plug_end, next_sweep_obj,
+ generation_free_list_space (gen),
+ generation_free_obj_space (gen),
+ free_obj_size_last_gap));
+ }
+ }
+#endif //DOUBLY_LINKED_FL
+
current_num_objs++;
if (current_num_objs >= num_objs)
{
@@ -33592,9 +34978,14 @@ void gc_heap::background_sweep()
allow_fgc();
current_num_objs = 0;
}
+
+ o = next_sweep_obj;
}
}
+#ifdef DOUBLY_LINKED_FL
+ next_seg = heap_segment_next (seg);
+#else //DOUBLY_LINKED_FL
if (i > max_generation)
{
next_seg = heap_segment_next (seg);
@@ -33604,6 +34995,7 @@ void gc_heap::background_sweep()
// For SOH segments we go backwards.
next_seg = heap_segment_prev (gen_start_seg, seg);
}
+#endif //DOUBLY_LINKED_FL
BOOL delete_p = FALSE;
if (!heap_segment_read_only_p (seg))
@@ -33615,13 +35007,13 @@ void gc_heap::background_sweep()
// because we don't allow UOH allocations during bgc
// sweep anyway - the UOH segments can't change.
process_background_segment_end (seg, gen, plug_end,
- start_seg, &delete_p);
+ start_seg, &delete_p, 0);
}
else
{
assert (heap_segment_background_allocated (seg) != 0);
process_background_segment_end (seg, gen, plug_end,
- start_seg, &delete_p);
+ start_seg, &delete_p, free_obj_size_last_gap);
assert (next_seg || !delete_p);
}
@@ -33640,6 +35032,14 @@ void gc_heap::background_sweep()
verify_soh_segment_list();
+#ifdef DOUBLY_LINKED_FL
+ while (next_seg && heap_segment_background_allocated (next_seg) == 0)
+ {
+ dprintf (2, ("[h%d] skip new %Ix ", heap_number, next_seg));
+ next_seg = heap_segment_next (next_seg);
+ }
+#endif //DOUBLY_LINKED_FL
+
seg = next_seg;
dprintf (GTC_LOG, ("seg: %Ix, next_seg: %Ix, prev_seg: %Ix", seg, next_seg, prev_seg));
}
@@ -33679,12 +35079,12 @@ void gc_heap::background_sweep()
generation_free_list_space (generation_of (max_generation)),
generation_free_obj_space (generation_of (max_generation))));
- dprintf (GTC_LOG, ("h%d: end of bgc sweep: loh FL: %Id, FO: %Id",
+ dprintf (GTC_LOG, ("h%d: end of bgc sweep: loh FL: %Id, FO: %Id",
heap_number,
generation_free_list_space (generation_of (loh_generation)),
generation_free_obj_space (generation_of (loh_generation))));
- dprintf (GTC_LOG, ("h%d: end of bgc sweep: poh FL: %Id, FO: %Id",
+ dprintf (GTC_LOG, ("h%d: end of bgc sweep: poh FL: %Id, FO: %Id",
heap_number,
generation_free_list_space (generation_of (poh_generation)),
generation_free_obj_space (generation_of (poh_generation))));
@@ -33708,6 +35108,15 @@ void gc_heap::background_sweep()
// be accurate.
compute_new_dynamic_data (max_generation);
+#ifdef DOUBLY_LINKED_FL
+ current_bgc_state = bgc_not_in_process;
+
+ // We can have an FGC triggered before we set the global state to free
+ // so we need to not have left over current_sweep_seg that point to
+ // a segment that might've been deleted at the beginning of an FGC.
+ current_sweep_seg = 0;
+#endif //DOUBLY_LINKED_FL
+
enable_preemptive ();
#ifdef MULTIPLE_HEAPS
@@ -33769,10 +35178,10 @@ void gc_heap::sweep_uoh_objects (int gen_num)
generation_allocator (gen)->clear();
generation_free_list_space (gen) = 0;
generation_free_obj_space (gen) = 0;
-
+ generation_free_list_allocated (gen) = 0;
dprintf (3, ("sweeping uoh objects"));
- dprintf (3, ("seg: %Ix, [%Ix, %Ix[, starting from %Ix",
+ dprintf (3, ("seg: %Ix, [%Ix, %Ix[, starting from %Ix",
(size_t)seg,
(size_t)heap_segment_mem (seg),
(size_t)heap_segment_allocated (seg),
@@ -33933,8 +35342,8 @@ void gc_heap::mark_through_cards_for_uoh_objects (card_fn fn,
size_t total_cards_cleared = 0;
#ifdef FEATURE_CARD_MARKING_STEALING
- VOLATILE(uint32_t)* chunk_index = (VOLATILE(uint32_t)*) &(gen_num == loh_generation ?
- card_mark_chunk_index_loh :
+ VOLATILE(uint32_t)* chunk_index = (VOLATILE(uint32_t)*) &(gen_num == loh_generation ?
+ card_mark_chunk_index_loh :
card_mark_chunk_index_poh);
card_marking_enumerator card_mark_enumerator(seg, low, chunk_index);
@@ -34147,12 +35556,22 @@ void gc_heap::mark_through_cards_for_uoh_objects (card_fn fn,
// compute the efficiency ratio of the card table
if (!relocating)
{
- generation_skip_ratio = min (((n_eph > 800) ?
- (int)(((float)n_gen / (float)n_eph) * 100) : 100),
- generation_skip_ratio);
-
- dprintf (3, ("Mloh: cross: %Id, useful: %Id, cards cleared: %Id, cards set: %Id, ratio: %d",
- n_eph, n_gen, total_cards_cleared, n_card_set, generation_skip_ratio));
+#ifdef FEATURE_CARD_MARKING_STEALING
+ Interlocked::ExchangeAddPtr(&n_eph_loh, n_eph);
+ Interlocked::ExchangeAddPtr(&n_gen_loh, n_gen);
+ dprintf (3, ("h%d marking h%d Mloh: cross: %Id, useful: %Id, cards set: %Id, cards cleared: %Id, ratio: %d",
+ hpt->heap_number, heap_number, n_eph, n_gen, n_card_set, total_cards_cleared,
+ (n_eph ? (int)(((float)n_gen / (float)n_eph) * 100) : 0)));
+ dprintf (3, ("h%d marking h%d Mloh: total cross %Id, useful: %Id, running ratio: %d",
+ hpt->heap_number, heap_number, n_eph_loh, n_gen_loh,
+ (n_eph_loh ? (int)(((float)n_gen_loh / (float)n_eph_loh) * 100) : 0)));
+#else
+ generation_skip_ratio = min (((n_eph > MIN_LOH_CROSS_GEN_REFS) ?
+ (int)(((float)n_gen / (float)n_eph) * 100) : 100),
+ generation_skip_ratio);
+ dprintf (3, ("marking h%d Mloh: cross: %Id, useful: %Id, cards cleared: %Id, cards set: %Id, ratio: %d",
+ heap_number, n_eph, n_gen, total_cards_cleared, n_card_set, generation_skip_ratio));
+#endif //FEATURE_CARD_MARKING_STEALING
}
else
{
@@ -34519,7 +35938,7 @@ BOOL gc_heap::bgc_mark_array_range (heap_segment* seg,
void gc_heap::bgc_verify_mark_array_cleared (heap_segment* seg)
{
#ifdef VERIFY_HEAP
- if (gc_heap::background_running_p() &&
+ if (gc_heap::background_running_p() &&
(GCConfig::GetHeapVerifyLevel() & GCConfig::HEAPVERIFY_GC))
{
uint8_t* range_beg = 0;
@@ -34662,7 +36081,7 @@ void gc_heap::clear_all_mark_array()
void gc_heap::verify_mark_array_cleared()
{
#ifdef VERIFY_HEAP
- if (gc_heap::background_running_p() &&
+ if (gc_heap::background_running_p() &&
(GCConfig::GetHeapVerifyLevel() & GCConfig::HEAPVERIFY_GC))
{
for (int i = max_generation; i < total_generation_count; i++)
@@ -34823,6 +36242,18 @@ gc_heap::verify_free_lists ()
FATAL_GC_ERROR();
}
+#ifdef DOUBLY_LINKED_FL
+ uint8_t* prev_free_item = free_list_prev (free_list);
+ if (gen_num == max_generation)
+ {
+ if (prev_free_item != prev)
+ {
+ dprintf (1, ("%Ix prev should be: %Ix, actual: %Ix", free_list, prev_free_item, prev));
+ FATAL_GC_ERROR();
+ }
+ }
+#endif //DOUBLY_LINKED_FL
+
prev = free_list;
free_list = free_list_slot (free_list);
}
@@ -34852,7 +36283,7 @@ void
gc_heap::verify_heap (BOOL begin_gc_p)
{
int heap_verify_level = static_cast(GCConfig::GetHeapVerifyLevel());
-
+
#ifdef MULTIPLE_HEAPS
t_join* current_join = &gc_t_join;
#ifdef BACKGROUND_GC
@@ -35437,25 +36868,21 @@ HRESULT GCHeap::Initialize()
#ifdef HOST_64BIT
gc_heap::heap_hard_limit = (size_t)GCConfig::GetGCHeapHardLimit();
- gc_heap::heap_hard_limit_oh[0] = (size_t)GCConfig::GetGCHeapHardLimitSOH();
- gc_heap::heap_hard_limit_oh[1] = (size_t)GCConfig::GetGCHeapHardLimitLOH();
- gc_heap::heap_hard_limit_oh[2] = (size_t)GCConfig::GetGCHeapHardLimitPOH();
+ gc_heap::heap_hard_limit_oh[soh] = (size_t)GCConfig::GetGCHeapHardLimitSOH();
+ gc_heap::heap_hard_limit_oh[loh] = (size_t)GCConfig::GetGCHeapHardLimitLOH();
+ gc_heap::heap_hard_limit_oh[poh] = (size_t)GCConfig::GetGCHeapHardLimitPOH();
- if (gc_heap::heap_hard_limit_oh[0] || gc_heap::heap_hard_limit_oh[1] || gc_heap::heap_hard_limit_oh[2])
+ if (gc_heap::heap_hard_limit_oh[soh] || gc_heap::heap_hard_limit_oh[loh] || gc_heap::heap_hard_limit_oh[poh])
{
- if (!gc_heap::heap_hard_limit_oh[0])
+ if (!gc_heap::heap_hard_limit_oh[soh])
{
return E_INVALIDARG;
}
- if (!gc_heap::heap_hard_limit_oh[1])
+ if (!gc_heap::heap_hard_limit_oh[loh])
{
return E_INVALIDARG;
}
- if (gc_heap::heap_hard_limit_oh[2] < min_segment_size_hard_limit)
- {
- gc_heap::heap_hard_limit_oh[2] = min_segment_size_hard_limit;
- }
- gc_heap::heap_hard_limit = gc_heap::heap_hard_limit_oh[0] + gc_heap::heap_hard_limit_oh[1] + gc_heap::heap_hard_limit_oh[2];
+ gc_heap::heap_hard_limit = gc_heap::heap_hard_limit_oh[soh] + gc_heap::heap_hard_limit_oh[loh] + gc_heap::heap_hard_limit_oh[poh];
}
else
{
@@ -35480,17 +36907,10 @@ HRESULT GCHeap::Initialize()
{
return E_INVALIDARG;
}
- gc_heap::heap_hard_limit_oh[0] = (size_t)(gc_heap::total_physical_mem * (uint64_t)percent_of_mem_soh / (uint64_t)100);
- gc_heap::heap_hard_limit_oh[1] = (size_t)(gc_heap::total_physical_mem * (uint64_t)percent_of_mem_loh / (uint64_t)100);
- if (percent_of_mem_poh == 0)
- {
- gc_heap::heap_hard_limit_oh[2] = min_segment_size_hard_limit;
- }
- else
- {
- gc_heap::heap_hard_limit_oh[2] = (size_t)(gc_heap::total_physical_mem * (uint64_t)percent_of_mem_poh / (uint64_t)100);
- }
- gc_heap::heap_hard_limit = gc_heap::heap_hard_limit_oh[0] + gc_heap::heap_hard_limit_oh[1] + gc_heap::heap_hard_limit_oh[2];
+ gc_heap::heap_hard_limit_oh[soh] = (size_t)(gc_heap::total_physical_mem * (uint64_t)percent_of_mem_soh / (uint64_t)100);
+ gc_heap::heap_hard_limit_oh[loh] = (size_t)(gc_heap::total_physical_mem * (uint64_t)percent_of_mem_loh / (uint64_t)100);
+ gc_heap::heap_hard_limit_oh[poh] = (size_t)(gc_heap::total_physical_mem * (uint64_t)percent_of_mem_poh / (uint64_t)100);
+ gc_heap::heap_hard_limit = gc_heap::heap_hard_limit_oh[soh] + gc_heap::heap_hard_limit_oh[loh] + gc_heap::heap_hard_limit_oh[poh];
}
}
@@ -35584,13 +37004,18 @@ HRESULT GCHeap::Initialize()
if (gc_heap::heap_hard_limit)
{
gc_heap::use_large_pages_p = GCConfig::GetGCLargePages();
- if (gc_heap::heap_hard_limit_oh[0])
+ if (gc_heap::heap_hard_limit_oh[soh])
{
#ifdef MULTIPLE_HEAPS
if (nhp_from_config == 0)
{
for (int i = 0; i < (total_oh_count - 1); i++)
{
+ if (i == poh && gc_heap::heap_hard_limit_oh[poh] == 0)
+ {
+ // if size 0 was specified for POH, ignore it for the nhp computation
+ continue;
+ }
uint32_t nhp_oh = (uint32_t)(gc_heap::heap_hard_limit_oh[i] / min_segment_size_hard_limit);
nhp = min (nhp, nhp_oh);
}
@@ -35600,9 +37025,9 @@ HRESULT GCHeap::Initialize()
}
}
#endif
- seg_size = gc_heap::heap_hard_limit_oh[0] / nhp;
- large_seg_size = gc_heap::heap_hard_limit_oh[1] / nhp;
- pin_seg_size = gc_heap::heap_hard_limit_oh[2] / nhp;
+ seg_size = gc_heap::heap_hard_limit_oh[soh] / nhp;
+ large_seg_size = gc_heap::heap_hard_limit_oh[loh] / nhp;
+ pin_seg_size = (gc_heap::heap_hard_limit_oh[poh] != 0) ? (gc_heap::heap_hard_limit_oh[2] / nhp) : min_segment_size_hard_limit;
size_t aligned_seg_size = align_on_segment_hard_limit (seg_size);
size_t aligned_large_seg_size = align_on_segment_hard_limit (large_seg_size);
@@ -36237,6 +37662,13 @@ bool GCHeap::StressHeap(gc_alloc_context * context)
unsigned sizeToNextObj = (unsigned)Align(size(str));
uint8_t* freeObj = ((uint8_t*) str) + sizeToNextObj - sizeOfNewObj;
pGenGCHeap->make_unused_array (freeObj, sizeOfNewObj);
+
+#if !defined(TARGET_AMD64) && !defined(TARGET_X86)
+ // ensure that the write to the new free object is seen by
+ // background GC *before* the write to the string length below
+ MemoryBarrier();
+#endif
+
str->SetStringLength(str->GetStringLength() - (sizeOfNewObj / sizeof(WCHAR)));
}
else
@@ -37094,11 +38526,6 @@ void gc_heap::update_recorded_gen_data (last_recorded_gc_info* gc_info)
void gc_heap::do_post_gc()
{
- if (!settings.concurrent)
- {
- initGCShadow();
- }
-
#ifdef MULTIPLE_HEAPS
gc_heap* hp = g_heaps[0];
#else
@@ -37540,15 +38967,26 @@ size_t GCHeap::ApproxTotalBytesInUse(BOOL small_heap_only)
size_t totsize = 0;
enter_spin_lock (&pGenGCHeap->gc_lock);
- heap_segment* eph_seg = generation_allocation_segment (pGenGCHeap->generation_of (0));
- // Get small block heap size info
- totsize = (pGenGCHeap->alloc_allocated - heap_segment_mem (eph_seg));
- heap_segment* seg1 = generation_start_segment (pGenGCHeap->generation_of (max_generation));
- while (seg1 != eph_seg)
+ // the complication with the following code is that background GC may
+ // remove the ephemeral segment while we are iterating
+ // if so, we retry a couple times and ultimately may report a slightly wrong result
+ for (int tries = 1; tries <= 3; tries++)
{
- totsize += heap_segment_allocated (seg1) -
- heap_segment_mem (seg1);
- seg1 = heap_segment_next (seg1);
+ heap_segment* eph_seg = generation_allocation_segment (pGenGCHeap->generation_of (0));
+ // Get small block heap size info
+ totsize = (pGenGCHeap->alloc_allocated - heap_segment_mem (eph_seg));
+ heap_segment* seg1 = generation_start_segment (pGenGCHeap->generation_of (max_generation));
+ while ((seg1 != eph_seg) && (seg1 != nullptr) && (seg1 != pGenGCHeap->freeable_soh_segment))
+ {
+ if (!heap_segment_decommitted_p (seg1))
+ {
+ totsize += heap_segment_allocated (seg1) -
+ heap_segment_mem (seg1);
+ }
+ seg1 = heap_segment_next (seg1);
+ }
+ if (seg1 == eph_seg)
+ break;
}
//discount the fragmentation
@@ -38607,8 +40045,8 @@ void gc_heap::walk_heap_per_heap (walk_fn fn, void* context, int gen_number, BOO
generation_allocation_start (gen));
uint8_t* end = heap_segment_allocated (seg);
- BOOL small_object_segments = TRUE;
- int align_const = get_alignment_constant (small_object_segments);
+ int align_const = get_alignment_constant (TRUE);
+ BOOL walk_pinned_object_heap = walk_large_object_heap_p;
while (1)
@@ -38623,20 +40061,25 @@ void gc_heap::walk_heap_per_heap (walk_fn fn, void* context, int gen_number, BOO
}
else
{
- if (small_object_segments && walk_large_object_heap_p)
-
+ if (walk_large_object_heap_p)
{
- small_object_segments = FALSE;
- align_const = get_alignment_constant (small_object_segments);
+ walk_large_object_heap_p = FALSE;
seg = generation_start_segment (large_object_generation);
- x = heap_segment_mem (seg);
- end = heap_segment_allocated (seg);
- continue;
+ }
+ else if (walk_pinned_object_heap)
+ {
+ walk_pinned_object_heap = FALSE;
+ seg = generation_start_segment (pinned_object_generation);
}
else
{
break;
}
+
+ align_const = get_alignment_constant (FALSE);
+ x = heap_segment_mem (seg);
+ end = heap_segment_allocated (seg);
+ continue;
}
}
diff --git a/src/coreclr/src/gc/gcconfig.h b/src/coreclr/src/gc/gcconfig.h
index 085562f56dd4..62ea34f3659e 100644
--- a/src/coreclr/src/gc/gcconfig.h
+++ b/src/coreclr/src/gc/gcconfig.h
@@ -75,7 +75,7 @@ class GCConfigStringHolder
BOOL_CONFIG (LogEnabled, "GCLogEnabled", NULL, false, "Specifies if you want to turn on logging in GC") \
BOOL_CONFIG (ConfigLogEnabled, "GCConfigLogEnabled", NULL, false, "Specifies the name of the GC config log file") \
BOOL_CONFIG (GCNumaAware, "GCNumaAware", NULL, true, "Enables numa allocations in the GC") \
- BOOL_CONFIG (GCCpuGroup, "GCCpuGroup", NULL, false, "Enables CPU groups in the GC") \
+ BOOL_CONFIG (GCCpuGroup, "GCCpuGroup", "System.GC.CpuGroup", false, "Enables CPU groups in the GC") \
BOOL_CONFIG (GCLargePages, "GCLargePages", "System.GC.LargePages", false, "Enables using Large Pages in the GC") \
INT_CONFIG (HeapVerifyLevel, "HeapVerify", NULL, HEAPVERIFY_NONE, "When set verifies the integrity of the managed heap on entry and exit of each GC") \
INT_CONFIG (LOHCompactionMode, "GCLOHCompact", NULL, 0, "Specifies the LOH compaction mode") \
@@ -83,7 +83,7 @@ class GCConfigStringHolder
INT_CONFIG (BGCSpinCount, "BGCSpinCount", NULL, 140, "Specifies the bgc spin count") \
INT_CONFIG (BGCSpin, "BGCSpin", NULL, 2, "Specifies the bgc spin time") \
INT_CONFIG (HeapCount, "GCHeapCount", "System.GC.HeapCount", 0, "Specifies the number of server GC heaps") \
- INT_CONFIG (Gen0Size, "GCgen0size", NULL, 0, "Specifies the smallest gen0 size") \
+ INT_CONFIG (Gen0Size, "GCgen0size", NULL, 0, "Specifies the smallest gen0 budget") \
INT_CONFIG (SegmentSize, "GCSegmentSize", NULL, 0, "Specifies the managed heap segment size") \
INT_CONFIG (LatencyMode, "GCLatencyMode", NULL, -1, "Specifies the GC latency mode - batch, interactive or low latency (note that the same " \
"thing can be specified via API which is the supported way") \
@@ -92,13 +92,14 @@ class GCConfigStringHolder
INT_CONFIG (LogFileSize, "GCLogFileSize", NULL, 0, "Specifies the GC log file size") \
INT_CONFIG (CompactRatio, "GCCompactRatio", NULL, 0, "Specifies the ratio compacting GCs vs sweeping") \
INT_CONFIG (GCHeapAffinitizeMask, "GCHeapAffinitizeMask", "System.GC.HeapAffinitizeMask", 0, "Specifies processor mask for Server GC threads") \
- STRING_CONFIG(GCHeapAffinitizeRanges, "GCHeapAffinitizeRanges", NULL, "Specifies list of processors for Server GC threads. The format is a comma separated " \
+ STRING_CONFIG(GCHeapAffinitizeRanges, "GCHeapAffinitizeRanges", "System.GC.HeapAffinitizeRanges", "Specifies list of processors for Server GC threads. The format is a comma separated " \
"list of processor numbers or ranges of processor numbers. On Windows, each entry is " \
"prefixed by the CPU group number. Example: Unix - 1,3,5,7-9,12, Windows - 0:1,1:7-9") \
- INT_CONFIG (GCHighMemPercent, "GCHighMemPercent", NULL, 0, "The percent for GC to consider as high memory") \
+ INT_CONFIG (GCHighMemPercent, "GCHighMemPercent", "System.GC.HighMemoryPercent", 0, "The percent for GC to consider as high memory") \
INT_CONFIG (GCProvModeStress, "GCProvModeStress", NULL, 0, "Stress the provisional modes") \
INT_CONFIG (GCGen0MaxBudget, "GCGen0MaxBudget", NULL, 0, "Specifies the largest gen0 allocation budget") \
- INT_CONFIG (GCHeapHardLimit, "GCHeapHardLimit", NULL, 0, "Specifies a hard limit for the GC heap") \
+ INT_CONFIG (GCLowSkipRatio, "GCLowSkipRatio", NULL, 30, "Specifies the low generation skip ratio") \
+ INT_CONFIG (GCHeapHardLimit, "GCHeapHardLimit", "System.GC.HeapHardLimit", 0, "Specifies a hard limit for the GC heap") \
INT_CONFIG (GCHeapHardLimitPercent, "GCHeapHardLimitPercent", "System.GC.HeapHardLimitPercent", 0, "Specifies the GC heap usage as a percentage of the total memory") \
INT_CONFIG (GCTotalPhysicalMemory, "GCTotalPhysicalMemory", NULL, 0, "Specifies what the GC should consider to be total physical memory") \
STRING_CONFIG(LogFile, "GCLogFile", NULL, "Specifies the name of the GC log file") \
@@ -122,13 +123,13 @@ class GCConfigStringHolder
INT_CONFIG (BGCFLEnableTBH, "BGCFLEnableTBH", NULL, 0, "Enables TBH") \
INT_CONFIG (BGCFLEnableFF, "BGCFLEnableFF", NULL, 0, "Enables FF") \
INT_CONFIG (BGCG2RatioStep, "BGCG2RatioStep", NULL, 5, "Ratio correction factor for ML loop") \
- INT_CONFIG (GCHeapHardLimitSOH, "GCHeapHardLimitSOH", NULL, 0, "Specifies a hard limit for the GC heap SOH") \
- INT_CONFIG (GCHeapHardLimitLOH, "GCHeapHardLimitLOH", NULL, 0, "Specifies a hard limit for the GC heap LOH") \
- INT_CONFIG (GCHeapHardLimitPOH, "GCHeapHardLimitPOH", NULL, 0, "Specifies a hard limit for the GC heap POH") \
- INT_CONFIG (GCHeapHardLimitSOHPercent, "GCHeapHardLimitSOHPercent", NULL, 0, "Specifies the GC heap SOH usage as a percentage of the total memory") \
- INT_CONFIG (GCHeapHardLimitLOHPercent, "GCHeapHardLimitLOHPercent", NULL, 0, "Specifies the GC heap LOH usage as a percentage of the total memory") \
- INT_CONFIG (GCHeapHardLimitPOHPercent, "GCHeapHardLimitPOHPercent", NULL, 0, "Specifies the GC heap POH usage as a percentage of the total memory") \
- INT_CONFIG (GCEnabledInstructionSets, "GCEnabledInstructionSets", NULL, -1, "Specifies whether GC can use AVX2 or AVX512F - 0 for neither, 1 for AVX2, 3 for AVX512F")\
+ INT_CONFIG (GCHeapHardLimitSOH, "GCHeapHardLimitSOH", "System.GC.HeapHardLimitSOH", 0, "Specifies a hard limit for the GC heap SOH") \
+ INT_CONFIG (GCHeapHardLimitLOH, "GCHeapHardLimitLOH", "System.GC.HeapHardLimitLOH", 0, "Specifies a hard limit for the GC heap LOH") \
+ INT_CONFIG (GCHeapHardLimitPOH, "GCHeapHardLimitPOH", "System.GC.HeapHardLimitPOH", 0, "Specifies a hard limit for the GC heap POH") \
+ INT_CONFIG (GCHeapHardLimitSOHPercent, "GCHeapHardLimitSOHPercent", "System.GC.HeapHardLimitSOHPercent", 0, "Specifies the GC heap SOH usage as a percentage of the total memory") \
+ INT_CONFIG (GCHeapHardLimitLOHPercent, "GCHeapHardLimitLOHPercent", "System.GC.HeapHardLimitLOHPercent", 0, "Specifies the GC heap LOH usage as a percentage of the total memory") \
+ INT_CONFIG (GCHeapHardLimitPOHPercent, "GCHeapHardLimitPOHPercent", "System.GC.HeapHardLimitPOHPercent", 0, "Specifies the GC heap POH usage as a percentage of the total memory") \
+ INT_CONFIG (GCEnabledInstructionSets, "GCEnabledInstructionSets", NULL, -1, "Specifies whether GC can use AVX2 or AVX512F - 0 for neither, 1 for AVX2, 3 for AVX512F")\
// This class is responsible for retreiving configuration information
// for how the GC should operate.
diff --git a/src/coreclr/src/gc/gcee.cpp b/src/coreclr/src/gc/gcee.cpp
index 2964b14190e9..4912f2e86691 100644
--- a/src/coreclr/src/gc/gcee.cpp
+++ b/src/coreclr/src/gc/gcee.cpp
@@ -53,6 +53,11 @@ void GCHeap::UpdatePreGCCounters()
#endif // BACKGROUND_GC
FIRE_EVENT(GCStart_V2, count, depth, reason, static_cast(type));
+ ReportGenerationBounds();
+}
+
+void GCHeap::ReportGenerationBounds()
+{
g_theGCHeap->DiagDescrGenerations([](void*, int generation, uint8_t* rangeStart, uint8_t* rangeEnd, uint8_t* rangeEndReserved)
{
uint64_t range = static_cast(rangeEnd - rangeStart);
@@ -148,12 +153,7 @@ void GCHeap::UpdatePostGCCounters()
#endif //FEATURE_EVENT_TRACE
#ifdef FEATURE_EVENT_TRACE
- g_theGCHeap->DiagDescrGenerations([](void*, int generation, uint8_t* rangeStart, uint8_t* rangeEnd, uint8_t* rangeEndReserved)
- {
- uint64_t range = static_cast(rangeEnd - rangeStart);
- uint64_t rangeReserved = static_cast(rangeEndReserved - rangeStart);
- FIRE_EVENT(GCGenerationRange, generation, rangeStart, range, rangeReserved);
- }, nullptr);
+ ReportGenerationBounds();
FIRE_EVENT(GCEnd_V1, static_cast(pSettings->gc_index), condemned_gen);
diff --git a/src/coreclr/src/gc/gcenv.ee.standalone.inl b/src/coreclr/src/gc/gcenv.ee.standalone.inl
index 650812644b01..f14b327a31e1 100644
--- a/src/coreclr/src/gc/gcenv.ee.standalone.inl
+++ b/src/coreclr/src/gc/gcenv.ee.standalone.inl
@@ -274,10 +274,10 @@ inline bool GCToEEInterface::AnalyzeSurvivorsRequested(int condemnedGeneration)
return g_theGCToCLR->AnalyzeSurvivorsRequested(condemnedGeneration);
}
-inline void GCToEEInterface::AnalyzeSurvivorsFinished(int condemnedGeneration)
+inline void GCToEEInterface::AnalyzeSurvivorsFinished(size_t gcIndex, int condemnedGeneration, uint64_t promoted_bytes, void (*reportGenerationBounds)())
{
assert(g_theGCToCLR != nullptr);
- g_theGCToCLR->AnalyzeSurvivorsFinished(condemnedGeneration);
+ g_theGCToCLR->AnalyzeSurvivorsFinished(gcIndex, condemnedGeneration, promoted_bytes, reportGenerationBounds);
}
inline void GCToEEInterface::VerifySyncTableEntry()
diff --git a/src/coreclr/src/gc/gcimpl.h b/src/coreclr/src/gc/gcimpl.h
index d1f062efb44c..b1c8cb91a7b6 100644
--- a/src/coreclr/src/gc/gcimpl.h
+++ b/src/coreclr/src/gc/gcimpl.h
@@ -31,7 +31,7 @@ inline void deleteGCShadow() {}
inline void checkGCWriteBarrier() {}
#endif
-void GCProfileWalkHeap();
+void GCProfileWalkHeap(bool etwOnly);
class gc_heap;
class CFinalize;
@@ -57,7 +57,7 @@ class GCHeap : public IGCHeapInternal
friend void EnterAllocLock();
friend void LeaveAllocLock();
friend void ProfScanRootsHelper(Object** object, ScanContext *pSC, uint32_t dwFlags);
- friend void GCProfileWalkHeap();
+ friend void GCProfileWalkHeap(bool etwOnly);
public:
//In order to keep gc.cpp cleaner, ugly EE specific code is relegated to methods.
@@ -315,6 +315,8 @@ class GCHeap : public IGCHeapInternal
size_t GetLastGCGenerationSize(int gen);
virtual void Shutdown();
+
+ static void ReportGenerationBounds();
};
#endif // GCIMPL_H_
diff --git a/src/coreclr/src/gc/gcinterface.ee.h b/src/coreclr/src/gc/gcinterface.ee.h
index 158da1867dbb..f61fdf5c5e65 100644
--- a/src/coreclr/src/gc/gcinterface.ee.h
+++ b/src/coreclr/src/gc/gcinterface.ee.h
@@ -414,7 +414,7 @@ class IGCToCLR {
bool AnalyzeSurvivorsRequested(int condemnedGeneration) = 0;
virtual
- void AnalyzeSurvivorsFinished(int condemnedGeneration) = 0;
+ void AnalyzeSurvivorsFinished(size_t gcIndex, int condemnedGeneration, uint64_t promoted_bytes, void (*reportGenerationBounds)()) = 0;
virtual
void VerifySyncTableEntry() = 0;
diff --git a/src/coreclr/src/gc/gcinterface.h b/src/coreclr/src/gc/gcinterface.h
index 331f8e122108..bfe02b7db9da 100644
--- a/src/coreclr/src/gc/gcinterface.h
+++ b/src/coreclr/src/gc/gcinterface.h
@@ -396,7 +396,7 @@ typedef enum
* They are currently used for EnC for adding new field members to existing instantiations under EnC modes where
* the primary object is the original instantiation and the secondary represents the added field.
*
- * They are also used to implement the ConditionalWeakTable class in mscorlib.dll. If you want to use
+ * They are also used to implement the managed ConditionalWeakTable class. If you want to use
* these from managed code, they are exposed to BCL through the managed DependentHandle class.
*
*
@@ -587,7 +587,7 @@ class IGCHeap {
/*
===========================================================================
- BCL routines. These are routines that are directly exposed by mscorlib
+ BCL routines. These are routines that are directly exposed by CoreLib
as a part of the `System.GC` class. These routines behave in the same
manner as the functions on `System.GC`.
===========================================================================
@@ -640,14 +640,14 @@ class IGCHeap {
virtual int GetGcLatencyMode() = 0;
// Sets the current GC latency mode. newLatencyMode has already been
- // verified by mscorlib to be valid.
+ // verified by CoreLib to be valid.
virtual int SetGcLatencyMode(int newLatencyMode) = 0;
// Gets the current LOH compaction mode.
virtual int GetLOHCompactionMode() = 0;
// Sets the current LOH compaction mode. newLOHCompactionMode has
- // already been verified by mscorlib to be valid.
+ // already been verified by CoreLib to be valid.
virtual void SetLOHCompactionMode(int newLOHCompactionMode) = 0;
// Registers for a full GC notification, raising a notification if the gen 2 or
diff --git a/src/coreclr/src/gc/gcpriv.h b/src/coreclr/src/gc/gcpriv.h
index 0606b57d7279..189ad57bc069 100644
--- a/src/coreclr/src/gc/gcpriv.h
+++ b/src/coreclr/src/gc/gcpriv.h
@@ -63,6 +63,12 @@ inline void FATAL_GC_ERROR()
#define FEATURE_PREMORTEM_FINALIZATION
#define GC_HISTORY
+// We need the lower 3 bits in the MT to do our bookkeeping so doubly linked free list is only for 64-bit
+#ifdef HOST_64BIT
+// To be enabled.
+//#define DOUBLY_LINKED_FL
+#endif //HOST_64BIT
+
#ifndef FEATURE_REDHAWK
#define HEAP_ANALYZE
#define COLLECTIBLE_CLASS
@@ -233,7 +239,7 @@ const int policy_expand = 2;
#ifdef SIMPLE_DPRINTF
void GCLog (const char *fmt, ... );
-#define dprintf(l,x) {if ((l <= 1) || (l == GTC_LOG)) {GCLog x;}}
+#define dprintf(l,x) {if ((l == 1) || (l == GTC_LOG)) {GCLog x;}}
#else //SIMPLE_DPRINTF
// Nobody used the logging mechanism that used to be here. If we find ourselves
// wanting to inspect GC logs on unmodified builds, we can use this define here
@@ -583,6 +589,11 @@ typedef DPTR(class CFinalize) PTR_CFinalize;
#define MAX_BUCKET_COUNT (20)//Max number of buckets.
class alloc_list
{
+#ifdef DOUBLY_LINKED_FL
+ uint8_t* added_head;
+ uint8_t* added_tail;
+#endif //DOUBLY_LINKED_FL
+
uint8_t* head;
uint8_t* tail;
@@ -592,11 +603,20 @@ class alloc_list
size_t item_count;
#endif //FL_VERIFICATION
+#ifdef DOUBLY_LINKED_FL
+ uint8_t*& added_alloc_list_head () { return added_head;}
+ uint8_t*& added_alloc_list_tail () { return added_tail;}
+#endif //DOUBLY_LINKED_FL
+
uint8_t*& alloc_list_head () { return head;}
uint8_t*& alloc_list_tail () { return tail;}
size_t& alloc_list_damage_count(){ return damage_count; }
alloc_list()
{
+#ifdef DOUBLY_LINKED_FL
+ added_head = 0;
+ added_tail = 0;
+#endif //DOUBLY_LINKED_FL
head = 0;
tail = 0;
damage_count = 0;
@@ -610,16 +630,21 @@ class allocator
unsigned int num_buckets;
alloc_list first_bucket;
alloc_list* buckets;
+ int gen_number;
alloc_list& alloc_list_of (unsigned int bn);
size_t& alloc_list_damage_count_of (unsigned int bn);
+ void thread_free_item_end (uint8_t* free_item, uint8_t*& head, uint8_t*& tail, int bn);
public:
- allocator (unsigned int num_b, int fbb, alloc_list* b);
+ allocator (unsigned int num_b, int fbb, alloc_list* b, int gen=-1);
allocator()
{
num_buckets = 1;
first_bucket_bits = sizeof(size_t) * 8 - 1;
+ // for young gens we just set it to 0 since we don't treat
+ // them differently from each other
+ gen_number = 0;
}
unsigned int number_of_buckets()
@@ -629,7 +654,7 @@ class allocator
// skip buckets that cannot possibly fit "size" and return the next one
// there is always such bucket since the last one fits everything
- unsigned int first_suitable_bucket(size_t size)
+ unsigned int first_suitable_bucket (size_t size)
{
// sizes taking first_bucket_bits or less are mapped to bucket 0
// others are mapped to buckets 0, 1, 2 respectively
@@ -642,7 +667,7 @@ class allocator
BitScanReverse(&highest_set_bit_index, size);
#endif
- return min ((unsigned int)highest_set_bit_index, num_buckets - 1);
+ return min ((unsigned int)highest_set_bit_index, (num_buckets - 1));
}
size_t first_bucket_size()
@@ -660,6 +685,17 @@ class allocator
return alloc_list_of (bn).alloc_list_tail();
}
+#ifdef DOUBLY_LINKED_FL
+ uint8_t*& added_alloc_list_head_of (unsigned int bn)
+ {
+ return alloc_list_of (bn).added_alloc_list_head();
+ }
+ uint8_t*& added_alloc_list_tail_of (unsigned int bn)
+ {
+ return alloc_list_of (bn).added_alloc_list_tail();
+ }
+#endif //DOUBLY_LINKED_FL
+
void clear();
BOOL discard_if_no_fit_p()
@@ -689,9 +725,16 @@ class allocator
}
}
- void unlink_item (unsigned int bucket_number, uint8_t* item, uint8_t* previous_item, BOOL use_undo_p);
+ void unlink_item (unsigned int bn, uint8_t* item, uint8_t* previous_item, BOOL use_undo_p);
void thread_item (uint8_t* item, size_t size);
void thread_item_front (uint8_t* itme, size_t size);
+#ifdef DOUBLY_LINKED_FL
+ int thread_item_front_added (uint8_t* itme, size_t size);
+ void unlink_item_no_undo (uint8_t* item, size_t size);
+ void unlink_item_no_undo (unsigned int bn, uint8_t* item, size_t size);
+ void unlink_item_no_undo_added (unsigned int bn, uint8_t* item, uint8_t* previous_item);
+#endif //DOUBLY_LINKED_FL
+
void copy_to_alloc_list (alloc_list* toalist);
void copy_from_alloc_list (alloc_list* fromalist);
void commit_alloc_list_changes();
@@ -729,6 +772,11 @@ class generation
size_t pinned_allocation_sweep_size;
int gen_num;
+#ifdef DOUBLY_LINKED_FL
+ BOOL set_bgc_mark_bit_p;
+ uint8_t* last_free_list_allocated;
+#endif //DOUBLY_LINKED_FL
+
#ifdef FREE_USAGE_STATS
size_t gen_free_spaces[NUM_GEN_POWER2];
// these are non pinned plugs only
@@ -1220,7 +1268,7 @@ class gc_heap
void balance_heaps (alloc_context* acontext);
PER_HEAP
ptrdiff_t get_balance_heaps_uoh_effective_budget (int generation_num);
- static
+ static
gc_heap* balance_heaps_uoh (alloc_context* acontext, size_t size, int generation_num);
// Unlike balance_heaps_uoh, this may return nullptr if we failed to change heaps.
static
@@ -1233,7 +1281,7 @@ class gc_heap
// context - we don't actually use the ptr/limit from it so I am
// making this explicit by not passing in the alloc_context.
// Note: This are instance methods, but the heap instance is only used for
- // lowest_address and highest_address, which are currently the same accross all heaps.
+ // lowest_address and highest_address, which are currently the same across all heaps.
PER_HEAP
CObjectHeader* allocate_uoh_object (size_t size, uint32_t flags, int gen_num, int64_t& alloc_bytes);
@@ -1318,7 +1366,7 @@ class gc_heap
protected:
PER_HEAP_ISOLATED
- BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t pinned_size, int num_heaps, bool use_large_pages_p, bool separated_poh_p);
+ BOOL reserve_initial_memory (size_t normal_size, size_t large_size, size_t pinned_size, int num_heaps, bool use_large_pages_p, bool separated_poh_p, uint16_t* heap_no_to_numa_node);
PER_HEAP_ISOLATED
void destroy_initial_memory();
@@ -1548,7 +1596,7 @@ class gc_heap
PER_HEAP
BOOL a_fit_free_list_uoh_p (size_t size,
alloc_context* acontext,
- uint32_t flags,
+ uint32_t flags,
int align_const,
int gen_number);
@@ -1603,7 +1651,7 @@ class gc_heap
BOOL* short_seg_end_p);
PER_HEAP
BOOL uoh_try_fit (int gen_number,
- size_t size,
+ size_t size,
alloc_context* acontext,
uint32_t flags,
int align_const,
@@ -1899,15 +1947,32 @@ class gc_heap
PER_HEAP
void add_gen_plug (int gen_number, size_t plug_size);
+ PER_HEAP_ISOLATED
+ int find_bucket (size_t size);
+
PER_HEAP
void add_gen_free (int gen_number, size_t free_size);
+ PER_HEAP
+ void add_gen_plug_allocated_in_free (int gen_number, size_t plug_size);
+
PER_HEAP
void add_item_to_current_pinned_free (int gen_number, size_t free_size);
PER_HEAP
void remove_gen_free (int gen_number, size_t free_size);
+ PER_HEAP
+ void thread_free_item_front (generation* gen, uint8_t* free_start, size_t free_size);
+
+#ifdef DOUBLY_LINKED_FL
+ PER_HEAP
+ void thread_item_front_added (generation* gen, uint8_t* free_start, size_t free_size);
+#endif //DOUBLY_LINKED_FL
+
+ PER_HEAP
+ void make_free_obj (generation* gen, uint8_t* free_start, size_t free_size);
+
PER_HEAP
uint8_t* allocate_in_older_generation (generation* gen, size_t size,
int from_gen_number,
@@ -2058,7 +2123,9 @@ class gc_heap
void set_mem_verify (uint8_t*, uint8_t*, uint8_t);
PER_HEAP
void process_background_segment_end (heap_segment*, generation*, uint8_t*,
- heap_segment*, BOOL*);
+ heap_segment*, BOOL* delete_p,
+ size_t free_obj_size_last_gap);
+
PER_HEAP
BOOL fgc_should_consider_object (uint8_t* o,
heap_segment* seg,
@@ -2070,6 +2137,12 @@ class gc_heap
BOOL* consider_bgc_mark_p,
BOOL* check_current_sweep_p,
BOOL* check_saved_sweep_p);
+
+#ifdef DOUBLY_LINKED_FL
+ PER_HEAP
+ BOOL should_set_bgc_mark_bit (uint8_t* o);
+#endif //DOUBLY_LINKED_FL
+
PER_HEAP
void background_ephemeral_sweep();
PER_HEAP
@@ -2637,7 +2710,7 @@ class gc_heap
mark* get_oldest_pinned_entry (BOOL* has_pre_plug_info_p, BOOL* has_post_plug_info_p);
PER_HEAP
- void recover_saved_pinned_info();
+ size_t recover_saved_pinned_info();
PER_HEAP
void compact_phase (int condemned_gen_number, uint8_t*
@@ -2941,7 +3014,7 @@ class gc_heap
uint8_t* high_page (heap_segment* seg, BOOL concurrent_p);
PER_HEAP
- void revisit_written_page (uint8_t* page, uint8_t* end,
+ void revisit_written_page (uint8_t* page, uint8_t* end,
BOOL concurrent_p, uint8_t*& last_page,
uint8_t*& last_object, BOOL large_objects_p,
size_t& num_marked_objects);
@@ -3335,7 +3408,7 @@ class gc_heap
// because it's very short and by the time we are calling it
// the settings may have changed and we'd have to do more work
// to figure out the right GC to record info of.
- //
+ //
// The complications are the GCs triggered without their own
// SuspendEE, in which case we will record that GC's duration
// as its pause duration and the rest toward the GC that
@@ -4009,7 +4082,16 @@ class gc_heap
PER_HEAP
alloc_list poh_alloc_list[NUM_POH_ALIST-1];
-//------------------------------------------
+#ifdef DOUBLY_LINKED_FL
+ // For bucket 0 added list, we don't want to have to go through
+ // it to count how many bytes it has so we keep a record here.
+ // If we need to sweep in gen1, we discard this added list and
+ // need to deduct the size from free_list_space.
+ // Note that we should really move this and the free_list_space
+ // accounting into the alloc_list class.
+ PER_HEAP
+ size_t gen2_removed_no_undo;
+#endif //DOUBLY_LINKED_FL
PER_HEAP
dynamic_data dynamic_data_table [total_generation_count];
@@ -4039,6 +4121,20 @@ class gc_heap
PER_HEAP
int generation_skip_ratio;//in %
+#ifdef FEATURE_CARD_MARKING_STEALING
+ PER_HEAP
+ VOLATILE(size_t) n_eph_soh;
+ PER_HEAP
+ VOLATILE(size_t) n_gen_soh;
+ PER_HEAP
+ VOLATILE(size_t) n_eph_loh;
+ PER_HEAP
+ VOLATILE(size_t) n_gen_loh;
+#endif //FEATURE_CARD_MARKING_STEALING
+
+ PER_HEAP_ISOLATED
+ int generation_skip_ratio_threshold;
+
PER_HEAP
BOOL gen0_bricks_cleared;
PER_HEAP
@@ -4134,6 +4230,10 @@ class gc_heap
PER_HEAP
uint8_t* current_sweep_pos;
+#ifdef DOUBLY_LINKED_FL
+ PER_HEAP
+ heap_segment* current_sweep_seg;
+#endif //DOUBLY_LINKED_FL
#endif //BACKGROUND_GC
PER_HEAP
@@ -4674,6 +4774,18 @@ size_t& generation_sweep_allocated (generation* inst)
{
return inst->sweep_allocated;
}
+#ifdef DOUBLY_LINKED_FL
+inline
+BOOL& generation_set_bgc_mark_bit_p (generation* inst)
+{
+ return inst->set_bgc_mark_bit_p;
+}
+inline
+uint8_t*& generation_last_free_list_allocated (generation* inst)
+{
+ return inst->last_free_list_allocated;
+}
+#endif //DOUBLY_LINKED_FL
#ifdef FREE_USAGE_STATS
inline
size_t& generation_pinned_free_obj_space (generation* inst)
@@ -4691,6 +4803,7 @@ size_t& generation_allocated_since_last_pin (generation* inst)
return inst->allocated_since_last_pin;
}
#endif //FREE_USAGE_STATS
+
inline
float generation_allocator_efficiency (generation* inst)
{
@@ -4712,6 +4825,7 @@ size_t generation_unusable_fragmentation (generation* inst)
// We always use USE_PADDING_TAIL when fitting so items on the free list should be
// twice the min_obj_size.
#define min_free_list (2*min_obj_size)
+#define min_free_item_no_prev (min_obj_size+sizeof(uint8_t*))
struct plug
{
uint8_t * skew[plug_skew / sizeof(uint8_t *)];
@@ -4918,6 +5032,11 @@ BOOL heap_segment_decommitted_p (heap_segment * inst)
{
return !!(inst->flags & heap_segment_flags_decommitted);
}
+inline
+BOOL heap_segment_swept_p (heap_segment * inst)
+{
+ return !!(inst->flags & heap_segment_flags_swept);
+}
#endif //BACKGROUND_GC
inline
diff --git a/src/coreclr/src/gc/sample/CMakeLists.txt b/src/coreclr/src/gc/sample/CMakeLists.txt
index 40bb0b5dcd54..88dae6fc03d7 100644
--- a/src/coreclr/src/gc/sample/CMakeLists.txt
+++ b/src/coreclr/src/gc/sample/CMakeLists.txt
@@ -27,7 +27,7 @@ set(SOURCES
if (CLR_CMAKE_TARGET_ARCH_AMD64 AND CLR_CMAKE_TARGET_WIN32)
set ( SOURCES
${SOURCES}
- ../vxsort/isa_detection_dummy.cpp
+ ../vxsort/isa_detection.cpp
../vxsort/do_vxsort_avx2.cpp
../vxsort/do_vxsort_avx512.cpp
../vxsort/machine_traits.avx2.cpp
@@ -35,6 +35,7 @@ if (CLR_CMAKE_TARGET_ARCH_AMD64 AND CLR_CMAKE_TARGET_WIN32)
../vxsort/smallsort/bitonic_sort.AVX2.int32_t.generated.cpp
../vxsort/smallsort/bitonic_sort.AVX512.int64_t.generated.cpp
../vxsort/smallsort/bitonic_sort.AVX512.int32_t.generated.cpp
+ ../vxsort/smallsort/avx2_load_mask_tables.cpp
)
endif (CLR_CMAKE_TARGET_ARCH_AMD64 AND CLR_CMAKE_TARGET_WIN32)
diff --git a/src/coreclr/src/gc/sample/gcenv.ee.cpp b/src/coreclr/src/gc/sample/gcenv.ee.cpp
index 4ed20f07786e..1480e62c23b4 100644
--- a/src/coreclr/src/gc/sample/gcenv.ee.cpp
+++ b/src/coreclr/src/gc/sample/gcenv.ee.cpp
@@ -339,7 +339,7 @@ inline bool GCToEEInterface::AnalyzeSurvivorsRequested(int condemnedGeneration)
return false;
}
-inline void GCToEEInterface::AnalyzeSurvivorsFinished(int condemnedGeneration)
+inline void GCToEEInterface::AnalyzeSurvivorsFinished(size_t gcIndex, int condemnedGeneration, uint64_t promoted_bytes, void (*reportGenerationBounds)())
{
}
diff --git a/src/coreclr/src/gc/unix/config.gc.h.in b/src/coreclr/src/gc/unix/config.gc.h.in
index 954176f74a34..e633193218a2 100644
--- a/src/coreclr/src/gc/unix/config.gc.h.in
+++ b/src/coreclr/src/gc/unix/config.gc.h.in
@@ -16,9 +16,10 @@
#cmakedefine01 HAVE_SWAPCTL
#cmakedefine01 HAVE_SYSCTLBYNAME
#cmakedefine01 HAVE_PTHREAD_CONDATTR_SETCLOCK
-#cmakedefine01 HAVE_MACH_ABSOLUTE_TIME
+#cmakedefine01 HAVE_CLOCK_GETTIME_NSEC_NP
#cmakedefine01 HAVE_SCHED_GETAFFINITY
-#cmakedefine01 HAVE_PTHREAD_GETAFFINITY_NP
+#cmakedefine01 HAVE_SCHED_SETAFFINITY
+#cmakedefine01 HAVE_PTHREAD_SETAFFINITY_NP
#cmakedefine01 HAVE_PTHREAD_NP_H
#cmakedefine01 HAVE_CPUSET_T
#cmakedefine01 HAVE__SC_AVPHYS_PAGES
diff --git a/src/coreclr/src/gc/unix/configure.cmake b/src/coreclr/src/gc/unix/configure.cmake
index cc7fb90265d8..99f848c997b7 100644
--- a/src/coreclr/src/gc/unix/configure.cmake
+++ b/src/coreclr/src/gc/unix/configure.cmake
@@ -71,21 +71,13 @@ check_cxx_source_runs("
check_library_exists(pthread pthread_condattr_setclock "" HAVE_PTHREAD_CONDATTR_SETCLOCK)
-check_cxx_source_runs("
- #include
- #include
- int main()
- {
- int ret;
- mach_timebase_info_data_t timebaseInfo;
- ret = mach_timebase_info(&timebaseInfo);
- mach_absolute_time();
- exit(ret);
- }
- " HAVE_MACH_ABSOLUTE_TIME)
-
+check_symbol_exists(
+ clock_gettime_nsec_np
+ time.h
+ HAVE_CLOCK_GETTIME_NSEC_NP)
check_library_exists(c sched_getaffinity "" HAVE_SCHED_GETAFFINITY)
+check_library_exists(c sched_setaffinity "" HAVE_SCHED_SETAFFINITY)
check_library_exists(pthread pthread_create "" HAVE_LIBPTHREAD)
if (HAVE_LIBPTHREAD)
@@ -94,7 +86,7 @@ elseif (HAVE_PTHREAD_IN_LIBC)
set(PTHREAD_LIBRARY c)
endif()
-check_library_exists(${PTHREAD_LIBRARY} pthread_getaffinity_np "" HAVE_PTHREAD_GETAFFINITY_NP)
+check_library_exists(${PTHREAD_LIBRARY} pthread_setaffinity_np "" HAVE_PTHREAD_SETAFFINITY_NP)
check_cxx_symbol_exists(_SC_PHYS_PAGES unistd.h HAVE__SC_PHYS_PAGES)
check_cxx_symbol_exists(_SC_AVPHYS_PAGES unistd.h HAVE__SC_AVPHYS_PAGES)
diff --git a/src/coreclr/src/gc/unix/events.cpp b/src/coreclr/src/gc/unix/events.cpp
index 88797741fa7e..7cc55680aaf2 100644
--- a/src/coreclr/src/gc/unix/events.cpp
+++ b/src/coreclr/src/gc/unix/events.cpp
@@ -16,10 +16,6 @@
#include "gcenv.os.h"
#include "globals.h"
-#if HAVE_MACH_ABSOLUTE_TIME
-mach_timebase_info_data_t g_TimebaseInfo;
-#endif // MACH_ABSOLUTE_TIME
-
namespace
{
@@ -37,7 +33,7 @@ void TimeSpecAdd(timespec* time, uint32_t milliseconds)
}
#endif // HAVE_PTHREAD_CONDATTR_SETCLOCK
-#if HAVE_MACH_ABSOLUTE_TIME
+#if HAVE_CLOCK_GETTIME_NSEC_NP
// Convert nanoseconds to the timespec structure
// Parameters:
// nanoseconds - time in nanoseconds to convert
@@ -47,7 +43,7 @@ void NanosecondsToTimeSpec(uint64_t nanoseconds, timespec* t)
t->tv_sec = nanoseconds / tccSecondsToNanoSeconds;
t->tv_nsec = nanoseconds % tccSecondsToNanoSeconds;
}
-#endif // HAVE_PTHREAD_CONDATTR_SETCLOCK
+#endif // HAVE_CLOCK_GETTIME_NSEC_NP
} // anonymous namespace
@@ -81,7 +77,7 @@ class GCEvent::Impl
// TODO(segilles) implement this for CoreCLR
//PthreadCondAttrHolder attrsHolder(&attrs);
-#if HAVE_PTHREAD_CONDATTR_SETCLOCK && !HAVE_MACH_ABSOLUTE_TIME
+#if HAVE_PTHREAD_CONDATTR_SETCLOCK && !HAVE_CLOCK_GETTIME_NSEC_NP
// Ensure that the pthread_cond_timedwait will use CLOCK_MONOTONIC
st = pthread_condattr_setclock(&attrs, CLOCK_MONOTONIC);
if (st != 0)
@@ -89,7 +85,7 @@ class GCEvent::Impl
assert(!"Failed to set UnixEvent condition variable wait clock");
return false;
}
-#endif // HAVE_PTHREAD_CONDATTR_SETCLOCK && !HAVE_MACH_ABSOLUTE_TIME
+#endif // HAVE_PTHREAD_CONDATTR_SETCLOCK && !HAVE_CLOCK_GETTIME_NSEC_NP
st = pthread_mutex_init(&m_mutex, NULL);
if (st != 0)
@@ -130,13 +126,12 @@ class GCEvent::Impl
UNREFERENCED_PARAMETER(alertable);
timespec endTime;
-#if HAVE_MACH_ABSOLUTE_TIME
+#if HAVE_CLOCK_GETTIME_NSEC_NP
uint64_t endMachTime;
if (milliseconds != INFINITE)
{
uint64_t nanoseconds = (uint64_t)milliseconds * tccMilliSecondsToNanoSeconds;
- NanosecondsToTimeSpec(nanoseconds, &endTime);
- endMachTime = mach_absolute_time() + nanoseconds * g_TimebaseInfo.denom / g_TimebaseInfo.numer;
+ endMachTime = clock_gettime_nsec_np(CLOCK_UPTIME_RAW) + nanoseconds;
}
#elif HAVE_PTHREAD_CONDATTR_SETCLOCK
if (milliseconds != INFINITE)
@@ -159,17 +154,17 @@ class GCEvent::Impl
}
else
{
-#if HAVE_MACH_ABSOLUTE_TIME
+#if HAVE_CLOCK_GETTIME_NSEC_NP
// Since OSX doesn't support CLOCK_MONOTONIC, we use relative variant of the
// timed wait and we need to handle spurious wakeups properly.
st = pthread_cond_timedwait_relative_np(&m_condition, &m_mutex, &endTime);
if ((st == 0) && !m_state)
{
- uint64_t machTime = mach_absolute_time();
+ uint64_t machTime = clock_gettime_nsec_np(CLOCK_UPTIME_RAW);
if (machTime < endMachTime)
{
// The wake up was spurious, recalculate the relative endTime
- uint64_t remainingNanoseconds = (endMachTime - machTime) * g_TimebaseInfo.numer / g_TimebaseInfo.denom;
+ uint64_t remainingNanoseconds = endMachTime - machTime;
NanosecondsToTimeSpec(remainingNanoseconds, &endTime);
}
else
@@ -180,9 +175,9 @@ class GCEvent::Impl
st = ETIMEDOUT;
}
}
-#else // HAVE_MACH_ABSOLUTE_TIME
+#else // HAVE_CLOCK_GETTIME_NSEC_NP
st = pthread_cond_timedwait(&m_condition, &m_mutex, &endTime);
-#endif // HAVE_MACH_ABSOLUTE_TIME
+#endif // HAVE_CLOCK_GETTIME_NSEC_NP
// Verify that if the wait timed out, the event was not set
assert((st != ETIMEDOUT) || !m_state);
}
diff --git a/src/coreclr/src/gc/unix/gcenv.unix.cpp b/src/coreclr/src/gc/unix/gcenv.unix.cpp
index e7a122498699..e6b4fc744341 100644
--- a/src/coreclr/src/gc/unix/gcenv.unix.cpp
+++ b/src/coreclr/src/gc/unix/gcenv.unix.cpp
@@ -28,6 +28,12 @@
#undef min
#undef max
+#if __has_cpp_attribute(fallthrough)
+#define FALLTHROUGH [[fallthrough]]
+#else
+#define FALLTHROUGH
+#endif
+
#include
#if HAVE_SYS_TIME_H
@@ -366,14 +372,6 @@ bool GCToOSInterface::Initialize()
}
}
-#if HAVE_MACH_ABSOLUTE_TIME
- kern_return_t machRet;
- if ((machRet = mach_timebase_info(&g_TimebaseInfo)) != KERN_SUCCESS)
- {
- return false;
- }
-#endif // HAVE_MACH_ABSOLUTE_TIME
-
InitializeCGroup();
#if HAVE_SCHED_GETAFFINITY
@@ -646,7 +644,7 @@ bool GCToOSInterface::VirtualRelease(void* address, size_t size)
// size - size of the virtual memory range
// Return:
// Starting virtual address of the committed range
-void* GCToOSInterface::VirtualReserveAndCommitLargePages(size_t size)
+void* GCToOSInterface::VirtualReserveAndCommitLargePages(size_t size, uint16_t node)
{
#if HAVE_MAP_HUGETLB
uint32_t largePagesFlag = MAP_HUGETLB;
@@ -657,7 +655,7 @@ void* GCToOSInterface::VirtualReserveAndCommitLargePages(size_t size)
#endif
void* pRetVal = VirtualReserveInner(size, OS_PAGE_SIZE, 0, largePagesFlag);
- if (VirtualCommit(pRetVal, size, NUMA_NODE_UNDEFINED))
+ if (VirtualCommit(pRetVal, size, node))
{
return pRetVal;
}
@@ -800,8 +798,10 @@ bool ReadMemoryValueFromFile(const char* filename, uint64_t* val)
{
case 'g':
case 'G': multiplier = 1024;
+ FALLTHROUGH;
case 'm':
case 'M': multiplier = multiplier * 1024;
+ FALLTHROUGH;
case 'k':
case 'K': multiplier = multiplier * 1024;
}
@@ -834,9 +834,14 @@ static size_t GetLogicalProcessorCacheSizeFromOS()
cacheSize = std::max(cacheSize, ( size_t) sysconf(_SC_LEVEL4_CACHE_SIZE));
#endif
-#if defined(HOST_ARM64)
+#if defined(TARGET_LINUX) && !defined(HOST_ARM)
if (cacheSize == 0)
{
+ //
+ // Fallback to retrieve cachesize via /sys/.. if sysconf was not available
+ // for the platform. Currently musl and arm64 should be only cases to use
+ // this method to determine cache size.
+ //
size_t size;
if (ReadMemoryValueFromFile("/sys/devices/system/cpu/cpu0/cache/index0/size", &size))
@@ -850,7 +855,9 @@ static size_t GetLogicalProcessorCacheSizeFromOS()
if (ReadMemoryValueFromFile("/sys/devices/system/cpu/cpu0/cache/index4/size", &size))
cacheSize = std::max(cacheSize, size);
}
+#endif
+#if defined(HOST_ARM64) && !defined(TARGET_OSX)
if (cacheSize == 0)
{
// It is currently expected to be missing cache size info
@@ -985,19 +992,32 @@ size_t GCToOSInterface::GetCacheSizePerLogicalCpu(bool trueSize)
// true if setting the affinity was successful, false otherwise.
bool GCToOSInterface::SetThreadAffinity(uint16_t procNo)
{
-#if HAVE_PTHREAD_GETAFFINITY_NP
+#if HAVE_SCHED_SETAFFINITY || HAVE_PTHREAD_SETAFFINITY_NP
cpu_set_t cpuSet;
CPU_ZERO(&cpuSet);
CPU_SET((int)procNo, &cpuSet);
+ // Snap's default strict confinement does not allow sched_setaffinity(, ...) without manually connecting the
+ // process-control plug. sched_setaffinity(, ...) is also currently not allowed, only
+ // sched_setaffinity(0, ...). pthread_setaffinity_np(pthread_self(), ...) seems to call
+ // sched_setaffinity(, ...) in at least one implementation, and does not work. To work around those
+ // issues, use sched_setaffinity(0, ...) if available and only otherwise fall back to pthread_setaffinity_np(). See the
+ // following for more information:
+ // - https://github.com/dotnet/runtime/pull/38795
+ // - https://github.com/dotnet/runtime/issues/1634
+ // - https://forum.snapcraft.io/t/requesting-autoconnect-for-interfaces-in-pigmeat-process-control-home/17987/13
+#if HAVE_SCHED_SETAFFINITY
+ int st = sched_setaffinity(0, sizeof(cpu_set_t), &cpuSet);
+#else
int st = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuSet);
+#endif
return (st == 0);
-#else // HAVE_PTHREAD_GETAFFINITY_NP
+#else // !(HAVE_SCHED_SETAFFINITY || HAVE_PTHREAD_SETAFFINITY_NP)
// There is no API to manage thread affinity, so let's ignore the request
return false;
-#endif // HAVE_PTHREAD_GETAFFINITY_NP
+#endif // HAVE_SCHED_SETAFFINITY || HAVE_PTHREAD_SETAFFINITY_NP
}
// Boosts the calling thread's thread priority to a level higher than the default
diff --git a/src/coreclr/src/gc/unix/globals.h b/src/coreclr/src/gc/unix/globals.h
index fe0d76a36a4c..aca43064f28c 100644
--- a/src/coreclr/src/gc/unix/globals.h
+++ b/src/coreclr/src/gc/unix/globals.h
@@ -4,10 +4,6 @@
#ifndef __GLOBALS_H__
#define __GLOBALS_H__
-#if HAVE_MACH_ABSOLUTE_TIME
-#include
-#endif // HAVE_MACH_ABSOLUTE_TIME
-
const int tccSecondsToMilliSeconds = 1000;
// The number of microseconds in a second.
@@ -22,8 +18,4 @@ const int tccMilliSecondsToMicroSeconds = 1000;
// The number of nanoseconds in a millisecond.
const int tccMilliSecondsToNanoSeconds = 1000000;
-#if HAVE_MACH_ABSOLUTE_TIME
-extern mach_timebase_info_data_t g_TimebaseInfo;
-#endif // HAVE_MACH_ABSOLUTE_TIME
-
#endif // __GLOBALS_H__
diff --git a/src/coreclr/src/gc/vxsort/alignment.h b/src/coreclr/src/gc/vxsort/alignment.h
index df61c3a30f41..a32261be951f 100644
--- a/src/coreclr/src/gc/vxsort/alignment.h
+++ b/src/coreclr/src/gc/vxsort/alignment.h
@@ -4,8 +4,6 @@
#ifndef VXSORT_ALIGNNMENT_H
#define VXSORT_ALIGNNMENT_H
-//#include
-
namespace vxsort {
using namespace std;
diff --git a/src/coreclr/src/gc/vxsort/defs.h b/src/coreclr/src/gc/vxsort/defs.h
index 628315e5110a..0cc72b23fa24 100644
--- a/src/coreclr/src/gc/vxsort/defs.h
+++ b/src/coreclr/src/gc/vxsort/defs.h
@@ -45,4 +45,45 @@
#define NOINLINE __attribute__((noinline))
#endif
+namespace std {
+template
+class numeric_limits {
+ public:
+ static constexpr _Ty Max() { static_assert(sizeof(_Ty) != sizeof(_Ty), "func must be specialized!"); return _Ty(); }
+ static constexpr _Ty Min() { static_assert(sizeof(_Ty) != sizeof(_Ty), "func must be specialized!"); return _Ty(); }
+};
+
+template <>
+class numeric_limits {
+public:
+ static constexpr int32_t Max() { return 0x7fffffff; }
+ static constexpr int32_t Min() { return -0x7fffffff - 1; }
+};
+
+template <>
+class numeric_limits {
+public:
+ static constexpr uint32_t Max() { return 0xffffffff; }
+ static constexpr uint32_t Min() { return 0; }
+};
+
+template <>
+class numeric_limits {
+ public:
+ static constexpr int64_t Max() { return 0x7fffffffffffffffi64; }
+
+ static constexpr int64_t Min() { return -0x7fffffffffffffffi64 - 1; }
+};
+} // namespace std
+
+#ifndef max
+template
+T max(T a, T b) {
+ if (a > b)
+ return a;
+ else
+ return b;
+}
+#endif
+
#endif // VXSORT_DEFS_H
diff --git a/src/coreclr/src/gc/vxsort/do_vxsort.h b/src/coreclr/src/gc/vxsort/do_vxsort.h
index 50a5e1ef77a7..edd803f310f4 100644
--- a/src/coreclr/src/gc/vxsort/do_vxsort.h
+++ b/src/coreclr/src/gc/vxsort/do_vxsort.h
@@ -11,14 +11,6 @@ enum class InstructionSet
void InitSupportedInstructionSet (int32_t configSetting);
bool IsSupportedInstructionSet (InstructionSet instructionSet);
-void do_vxsort_avx2 (uint8_t** low, uint8_t** high);
-void do_vxsort_avx2 (int32_t* low, int32_t* high);
+void do_vxsort_avx2 (uint8_t** low, uint8_t** high, uint8_t *range_low, uint8_t *range_high);
-void do_pack_avx2 (uint8_t** mem, size_t len, uint8_t* base);
-void do_unpack_avx2 (int32_t* mem, size_t len, uint8_t* base);
-
-void do_vxsort_avx512 (uint8_t** low, uint8_t** high);
-void do_vxsort_avx512 (int32_t* low, int32_t* high);
-
-void do_pack_avx512 (uint8_t** mem, size_t len, uint8_t* base);
-void do_unpack_avx512 (int32_t* mem, size_t len, uint8_t* base);
+void do_vxsort_avx512 (uint8_t** low, uint8_t** high, uint8_t* range_low, uint8_t* range_high);
diff --git a/src/coreclr/src/gc/vxsort/do_vxsort_avx2.cpp b/src/coreclr/src/gc/vxsort/do_vxsort_avx2.cpp
index 3e4fd10d15f4..1f097ede355d 100644
--- a/src/coreclr/src/gc/vxsort/do_vxsort_avx2.cpp
+++ b/src/coreclr/src/gc/vxsort/do_vxsort_avx2.cpp
@@ -5,82 +5,15 @@
#include "vxsort_targets_enable_avx2.h"
-namespace std
-{
- template
- class numeric_limits
- {
- public:
- static _Ty Max()
- {
- return _Ty();
- }
- static _Ty Min()
- {
- return _Ty();
- }
- };
- template <>
- class numeric_limits
- {
- public:
- static int32_t Max()
- {
- return 0x7fffffff;
- }
- static int32_t Min()
- {
- return -0x7fffffff-1;
- }
- };
- template <>
- class numeric_limits
- {
- public:
- static int64_t Max()
- {
- return 0x7fffffffffffffffi64;
- }
-
- static int64_t Min()
- {
- return -0x7fffffffffffffffi64-1;
- }
- };
-}
-
-#ifndef max
-template
-T max (T a, T b)
-{
- if (a > b) return a; else return b;
-}
-#endif
#include "vxsort.h"
#include "machine_traits.avx2.h"
#include "packer.h"
-void do_vxsort_avx2 (uint8_t** low, uint8_t** high)
-{
- auto sorter = vxsort::vxsort();
- sorter.sort ((int64_t*)low, (int64_t*)high);
-}
-
-void do_vxsort_avx2 (int32_t* low, int32_t* high)
-{
- auto sorter = vxsort::vxsort();
- sorter.sort (low, high);
-}
-
-void do_pack_avx2 (uint8_t** mem, size_t len, uint8_t* base)
-{
- auto packer = vxsort::packer();
- packer.pack ((int64_t*)mem, len, (int64_t)base);
-}
-
-void do_unpack_avx2 (int32_t* mem, size_t len, uint8_t* base)
+void do_vxsort_avx2 (uint8_t** low, uint8_t** high, uint8_t* range_low, uint8_t* range_high)
{
- auto packer = vxsort::packer();
- packer.unpack (mem, len, (int64_t)base);
+ const int shift = 3;
+ assert((1 << shift) == sizeof(size_t));
+ auto sorter = vxsort::vxsort();
+ sorter.sort ((int64_t*)low, (int64_t*)high, (int64_t)range_low, (int64_t)(range_high+sizeof(uint8_t*)));
}
#include "vxsort_targets_disable.h"
diff --git a/src/coreclr/src/gc/vxsort/do_vxsort_avx512.cpp b/src/coreclr/src/gc/vxsort/do_vxsort_avx512.cpp
index aa0a8f99442e..792492046fd9 100644
--- a/src/coreclr/src/gc/vxsort/do_vxsort_avx512.cpp
+++ b/src/coreclr/src/gc/vxsort/do_vxsort_avx512.cpp
@@ -5,71 +5,14 @@
#include "vxsort_targets_enable_avx512.h"
-namespace std
-{
- template
- class numeric_limits
- {
- public:
- static _Ty Max()
- {
- return _Ty();
- }
- static _Ty Min()
- {
- return _Ty();
- }
- };
- template <>
- class numeric_limits
- {
- public:
- static int32_t Max()
- {
- return 0x7fffffff;
- }
- static int32_t Min()
- {
- return -0x7fffffff - 1;
- }
- };
- template <>
- class numeric_limits
- {
- public:
- static int64_t Max()
- {
- return 0x7fffffffffffffffi64;
- }
-
- static int64_t Min()
- {
- return -0x7fffffffffffffffi64 - 1;
- }
- };
-}
-
-#ifndef max
-template
-T max (T a, T b)
-{
- if (a > b) return a; else return b;
-}
-#endif
-
#include "vxsort.h"
#include "machine_traits.avx512.h"
-void do_vxsort_avx512 (uint8_t** low, uint8_t** high)
+void do_vxsort_avx512 (uint8_t** low, uint8_t** high, uint8_t* range_low, uint8_t* range_high)
{
- auto sorter = vxsort::vxsort();
- sorter.sort ((int64_t*)low, (int64_t*)high);
+ const int shift = 3;
+ assert((1 << shift) == sizeof(size_t));
+ auto sorter = vxsort::vxsort();
+ sorter.sort ((int64_t*)low, (int64_t*)high, (int64_t)range_low, (int64_t)(range_high+sizeof(uint8_t*)));
}
-
-void do_vxsort_avx512 (int32_t* low, int32_t* high)
-{
- auto sorter = vxsort::vxsort();
- sorter.sort (low, high);
-}
-
#include "vxsort_targets_disable.h"
diff --git a/src/coreclr/src/gc/vxsort/isa_detection.cpp b/src/coreclr/src/gc/vxsort/isa_detection.cpp
index ac469a615dde..2a60ea01207a 100644
--- a/src/coreclr/src/gc/vxsort/isa_detection.cpp
+++ b/src/coreclr/src/gc/vxsort/isa_detection.cpp
@@ -2,7 +2,11 @@
// The .NET Foundation licenses this file to you under the MIT license.
#include "common.h"
+
+#ifdef TARGET_WINDOWS
#include
+#include
+#endif
#include "do_vxsort.h"
@@ -17,13 +21,11 @@ enum class SupportedISA
static DWORD64 GetEnabledXStateFeaturesHelper()
{
- LIMITED_METHOD_CONTRACT;
-
// On Windows we have an api(GetEnabledXStateFeatures) to check if AVX is supported
typedef DWORD64(WINAPI* PGETENABLEDXSTATEFEATURES)();
PGETENABLEDXSTATEFEATURES pfnGetEnabledXStateFeatures = NULL;
- HMODULE hMod = WszLoadLibraryEx(WINDOWS_KERNEL32_DLLNAME_W, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
+ HMODULE hMod = LoadLibraryExW(L"kernel32.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
if (hMod == NULL)
return 0;
@@ -54,10 +56,11 @@ SupportedISA DetermineSupportedISA()
// bit definitions to make code more readable
enum bits
{
- OCXSAVE = 1<<27,
- AVX = 1<<28,
- AVX2 = 1<<5,
- AVX512F=1<<16,
+ OCXSAVE = 1<<27,
+ AVX = 1<<28,
+ AVX2 = 1<< 5,
+ AVX512F = 1<<16,
+ AVX512DQ = 1<<17,
};
int reg[COUNT];
@@ -80,8 +83,8 @@ SupportedISA DetermineSupportedISA()
// get processor extended feature flag info
__cpuid(reg, 7);
- // check if both AVX2 and AVX512F are supported by both processor and OS
- if ((reg[EBX] & (AVX2 | AVX512F)) == (AVX2 | AVX512F) &&
+ // check if all of AVX2, AVX512F and AVX512DQ are supported by both processor and OS
+ if ((reg[EBX] & (AVX2 | AVX512F | AVX512DQ)) == (AVX2 | AVX512F | AVX512DQ) &&
(xcr0 & 0xe6) == 0xe6 &&
(FeatureMask & (XSTATE_MASK_AVX | XSTATE_MASK_AVX512)) == (XSTATE_MASK_AVX | XSTATE_MASK_AVX512))
{
diff --git a/src/coreclr/src/gc/vxsort/isa_detection_dummy.cpp b/src/coreclr/src/gc/vxsort/isa_detection_dummy.cpp
deleted file mode 100644
index e277a7675a9a..000000000000
--- a/src/coreclr/src/gc/vxsort/isa_detection_dummy.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-#include "common.h"
-
-#include "do_vxsort.h"
-
-#if defined(TARGET_AMD64) && defined(TARGET_WINDOWS)
-
-void InitSupportedInstructionSet (int32_t)
-{
-}
-
-bool IsSupportedInstructionSet (InstructionSet)
-{
- return false;
-}
-#endif // defined(TARGET_AMD64) && defined(TARGET_WINDOWS)
-
diff --git a/src/coreclr/src/gc/vxsort/machine_traits.avx2.cpp b/src/coreclr/src/gc/vxsort/machine_traits.avx2.cpp
index d693d08ea414..e4e86d4b239c 100644
--- a/src/coreclr/src/gc/vxsort/machine_traits.avx2.cpp
+++ b/src/coreclr/src/gc/vxsort/machine_traits.avx2.cpp
@@ -2,8 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
#include "common.h"
-//#include
-
#include "machine_traits.avx2.h"
namespace vxsort {
diff --git a/src/coreclr/src/gc/vxsort/machine_traits.avx2.h b/src/coreclr/src/gc/vxsort/machine_traits.avx2.h
index 1944b57a18f1..3720e78668e4 100644
--- a/src/coreclr/src/gc/vxsort/machine_traits.avx2.h
+++ b/src/coreclr/src/gc/vxsort/machine_traits.avx2.h
@@ -11,9 +11,8 @@
#include "vxsort_targets_enable_avx2.h"
#include
-//#include
#include
-
+#include
#include "defs.h"
#include "machine_traits.h"
@@ -37,16 +36,24 @@ static void not_supported()
// in _DEBUG, we #define return to be something more complicated,
// containing a statement, so #define away constexpr for _DEBUG
#define constexpr
-#endif //_DEBUG
+#endif //_DEBUG
template <>
class vxsort_machine_traits {
public:
+ typedef int32_t T;
typedef __m256i TV;
typedef uint32_t TMASK;
+ typedef int32_t TPACK;
+ typedef typename std::make_unsigned::type TU;
static constexpr bool supports_compress_writes() { return false; }
+ static constexpr bool supports_packing() { return false; }
+
+ template
+ static constexpr bool can_pack(T span) { return false; }
+
static INLINE TV load_vec(TV* p) { return _mm256_lddqu_si256(p); }
static INLINE void store_vec(TV* ptr, TV v) { _mm256_storeu_si256(ptr, v); }
@@ -56,7 +63,7 @@ class vxsort_machine_traits {
static INLINE TV partition_vector(TV v, int mask) {
assert(mask >= 0);
assert(mask <= 255);
- return s2i(_mm256_permutevar8x32_ps(i2s(v), _mm256_cvtepu8_epi32(_mm_loadu_si128((__m128i*)(perm_table_32 + mask * 8)))));
+ return s2i(_mm256_permutevar8x32_ps(i2s(v), _mm256_cvtepi8_epi32(_mm_loadu_si128((__m128i*)(perm_table_32 + mask * 8)))));
}
static INLINE TV broadcast(int32_t pivot) { return _mm256_set1_epi32(pivot); }
@@ -67,82 +74,47 @@ class vxsort_machine_traits {
static INLINE TV add(TV a, TV b) { return _mm256_add_epi32(a, b); }
static INLINE TV sub(TV a, TV b) { return _mm256_sub_epi32(a, b); };
-};
-
-template <>
-class vxsort_machine_traits {
- public:
- typedef __m256i TV;
- typedef uint32_t TMASK;
-
- static constexpr bool supports_compress_writes() { return false; }
-
- static INLINE TV load_vec(TV* p) { return _mm256_lddqu_si256(p); }
- static INLINE void store_vec(TV* ptr, TV v) { _mm256_storeu_si256(ptr, v); }
-
- static void store_compress_vec(TV* ptr, TV v, TMASK mask) { not_supported(); }
+ static INLINE TV pack_ordered(TV a, TV b) { return a; }
+ static INLINE TV pack_unordered(TV a, TV b) { return a; }
+ static INLINE void unpack_ordered(TV p, TV& u1, TV& u2) { }
- static INLINE TV partition_vector(TV v, int mask) {
- assert(mask >= 0);
- assert(mask <= 255);
- return s2i(_mm256_permutevar8x32_ps(i2s(v), _mm256_cvtepu8_epi32(_mm_loadu_si128((__m128i*)(perm_table_32 + mask * 8)))));
+ template
+ static T shift_n_sub(T v, T sub) {
+ if (Shift > 0)
+ v >>= Shift;
+ v -= sub;
+ return v;
}
- static INLINE TV broadcast(uint32_t pivot) { return _mm256_set1_epi32(pivot); }
- static INLINE TMASK get_cmpgt_mask(TV a, TV b) {
- __m256i top_bit = _mm256_set1_epi32(1U << 31);
- return _mm256_movemask_ps(i2s(_mm256_cmpgt_epi32(_mm256_xor_si256(top_bit, a), _mm256_xor_si256(top_bit, b))));
+ template
+ static T unshift_and_add(TPACK from, T add) {
+ add += from;
+ if (Shift > 0)
+ add = (T) (((TU) add) << Shift);
+ return add;
}
-
- static TV shift_right(TV v, int i) { return _mm256_srli_epi32(v, i); }
- static TV shift_left(TV v, int i) { return _mm256_slli_epi32(v, i); }
-
- static INLINE TV add(TV a, TV b) { return _mm256_add_epi32(a, b); }
- static INLINE TV sub(TV a, TV b) { return _mm256_sub_epi32(a, b); };
};
template <>
-class vxsort_machine_traits {
+class vxsort_machine_traits {
public:
- typedef __m256 TV;
+ typedef int64_t T;
+ typedef __m256i TV;
typedef uint32_t TMASK;
+ typedef int32_t TPACK;
+ typedef typename std::make_unsigned::type TU;
static constexpr bool supports_compress_writes() { return false; }
- static INLINE TV load_vec(TV* p) { return _mm256_loadu_ps((float*)p); }
+ static constexpr bool supports_packing() { return true; }
- static INLINE void store_vec(TV* ptr, TV v) { _mm256_storeu_ps((float*)ptr, v); }
-
- static void store_compress_vec(TV* ptr, TV v, TMASK mask) { not_supported(); }
-
- static INLINE TV partition_vector(TV v, int mask) {
- assert(mask >= 0);
- assert(mask <= 255);
- return _mm256_permutevar8x32_ps(v, _mm256_cvtepu8_epi32(_mm_loadu_si128((__m128i*)(perm_table_32 + mask * 8))));
- }
-
- static INLINE TV broadcast(float pivot) { return _mm256_set1_ps(pivot); }
-
- static INLINE TMASK get_cmpgt_mask(TV a, TV b) {
- /// 0x0E: Greater-than (ordered, signaling) \n
- /// 0x1E: Greater-than (ordered, non-signaling)
- return _mm256_movemask_ps(_mm256_cmp_ps(a, b, _CMP_GT_OS));
+ template
+ static constexpr bool can_pack(T span) {
+ const auto PACK_LIMIT = (((TU) std::numeric_limits::Max() + 1)) << Shift;
+ return ((TU) span) < PACK_LIMIT;
}
- static INLINE TV add(TV a, TV b) { return _mm256_add_ps(a, b); }
- static INLINE TV sub(TV a, TV b) { return _mm256_sub_ps(a, b); };
-
-};
-
-template <>
-class vxsort_machine_traits {
- public:
- typedef __m256i TV;
- typedef uint32_t TMASK;
-
- static constexpr bool supports_compress_writes() { return false; }
-
static INLINE TV load_vec(TV* p) { return _mm256_lddqu_si256(p); }
static INLINE void store_vec(TV* ptr, TV v) { _mm256_storeu_si256(ptr, v); }
@@ -164,8 +136,6 @@ class vxsort_machine_traits {
static INLINE TV add(TV a, TV b) { return _mm256_add_epi64(a, b); }
static INLINE TV sub(TV a, TV b) { return _mm256_sub_epi64(a, b); };
-
-
static INLINE TV pack_ordered(TV a, TV b) {
a = _mm256_permute4x64_epi64(_mm256_shuffle_epi32(a, _MM_PERM_DBCA), _MM_PERM_DBCA);
b = _mm256_permute4x64_epi64(_mm256_shuffle_epi32(b, _MM_PERM_DBCA), _MM_PERM_CADB);
@@ -177,106 +147,31 @@ class vxsort_machine_traits {
return _mm256_blend_epi32(a, b, 0b10101010);
}
- static INLINE void unpack_ordered_signed(TV p, TV& u1, TV& u2) {
+ static INLINE void unpack_ordered(TV p, TV& u1, TV& u2) {
auto p01 = _mm256_extracti128_si256(p, 0);
auto p02 = _mm256_extracti128_si256(p, 1);
u1 = _mm256_cvtepi32_epi64(p01);
u2 = _mm256_cvtepi32_epi64(p02);
-
- }
-
- static INLINE void unpack_ordered_unsigned(TV p, TV& u1, TV& u2) {
- auto p01 = _mm256_extracti128_si256(p, 0);
- auto p02 = _mm256_extracti128_si256(p, 1);
-
- u1 = _mm256_cvtepu32_epi64(p01);
- u2 = _mm256_cvtepu32_epi64(p02);
-
}
-/*
- template<>
- static INLINE TV pack_ordered(TV a, TV b) {
- a = _mm256_permute4x64_epi64(_mm256_shuffle_epi32(a, _MM_PERM_DBCA), _MM_PERM_DBCA);
- b = _mm256_permute4x64_epi64(_mm256_shuffle_epi32(b, _MM_PERM_DBCA), _MM_PERM_CADB);
- return _mm256_blend_epi32(a, b, 0b11110000);
+ template
+ static T shift_n_sub(T v, T sub) {
+ if (Shift > 0)
+ v >>= Shift;
+ v -= sub;
+ return v;
}
- template<>
- static INLINE typename vxsort_machine_traits::TV pack_unordered(TV a, TV b) {
- b = _mm256_shuffle_epi32(b, _MM_PERM_CDAB);
- return _mm256_blend_epi32(a, b, 0b10101010);
+ template
+ static T unshift_and_add(TPACK from, T add) {
+ add += from;
+ if (Shift > 0)
+ add = (T) (((TU) add) << Shift);
+ return add;
}
-
- */
-
-
-
};
-template <>
-class vxsort_machine_traits {
- public:
- typedef __m256i TV;
- typedef uint32_t TMASK;
-
- static constexpr bool supports_compress_writes() { return false; }
-
- static INLINE TV load_vec(TV* p) { return _mm256_lddqu_si256(p); }
-
- static INLINE void store_vec(TV* ptr, TV v) { _mm256_storeu_si256(ptr, v); }
-
- static void store_compress_vec(TV* ptr, TV v, TMASK mask) { not_supported(); }
-
- static INLINE TV partition_vector(TV v, int mask) {
- assert(mask >= 0);
- assert(mask <= 15);
- return s2i(_mm256_permutevar8x32_ps(i2s(v), _mm256_cvtepu8_epi32(_mm_loadu_si128((__m128i*)(perm_table_64 + mask * 8)))));
- }
- static INLINE TV broadcast(int64_t pivot) { return _mm256_set1_epi64x(pivot); }
- static INLINE TMASK get_cmpgt_mask(TV a, TV b) {
- __m256i top_bit = _mm256_set1_epi64x(1LLU << 63);
- return _mm256_movemask_pd(i2d(_mm256_cmpgt_epi64(_mm256_xor_si256(top_bit, a), _mm256_xor_si256(top_bit, b))));
- }
-
- static INLINE TV shift_right(TV v, int i) { return _mm256_srli_epi64(v, i); }
- static INLINE TV shift_left(TV v, int i) { return _mm256_slli_epi64(v, i); }
-
- static INLINE TV add(TV a, TV b) { return _mm256_add_epi64(a, b); }
- static INLINE TV sub(TV a, TV b) { return _mm256_sub_epi64(a, b); };
-};
-
-template <>
-class vxsort_machine_traits {
- public:
- typedef __m256d TV;
- typedef uint32_t TMASK;
-
- static constexpr bool supports_compress_writes() { return false; }
-
- static INLINE TV load_vec(TV* p) { return _mm256_loadu_pd((double*)p); }
-
- static INLINE void store_vec(TV* ptr, TV v) { _mm256_storeu_pd((double*)ptr, v); }
-
- static void store_compress_vec(TV* ptr, TV v, TMASK mask) { not_supported(); }
-
- static INLINE TV partition_vector(TV v, int mask) {
- assert(mask >= 0);
- assert(mask <= 15);
- return s2d(_mm256_permutevar8x32_ps(d2s(v), _mm256_cvtepu8_epi32(_mm_loadu_si128((__m128i*)(perm_table_64 + mask * 8)))));
- }
-
- static INLINE TV broadcast(double pivot) { return _mm256_set1_pd(pivot); }
- static INLINE TMASK get_cmpgt_mask(TV a, TV b) {
- /// 0x0E: Greater-than (ordered, signaling) \n
- /// 0x1E: Greater-than (ordered, non-signaling)
- return _mm256_movemask_pd(_mm256_cmp_pd(a, b, _CMP_GT_OS));
- }
-
- static INLINE TV add(TV a, TV b) { return _mm256_add_pd(a, b); }
- static INLINE TV sub(TV a, TV b) { return _mm256_sub_pd(a, b); };
-};
}
diff --git a/src/coreclr/src/gc/vxsort/machine_traits.avx512.h b/src/coreclr/src/gc/vxsort/machine_traits.avx512.h
index 443654a39b60..8df8660aa13a 100644
--- a/src/coreclr/src/gc/vxsort/machine_traits.avx512.h
+++ b/src/coreclr/src/gc/vxsort/machine_traits.avx512.h
@@ -18,205 +18,137 @@
// in _DEBUG, we #define return to be something more complicated,
// containing a statement, so #define away constexpr for _DEBUG
#define constexpr
-#endif //_DEBUG
+#endif //_DEBUG
namespace vxsort {
template <>
class vxsort_machine_traits {
- public:
- typedef __m512i TV;
- typedef __mmask16 TMASK;
-
- static constexpr bool supports_compress_writes() { return true; }
+ public:
+ typedef int32_t T;
+ typedef __m512i TV;
+ typedef __mmask16 TMASK;
+ typedef int32_t TPACK;
+ typedef typename std::make_unsigned::type TU;
- static INLINE TV load_vec(TV* p) {
- return _mm512_loadu_si512(p);
- }
+ static constexpr bool supports_compress_writes() { return true; }
- static INLINE void store_vec(TV* ptr, TV v) {
- _mm512_storeu_si512(ptr, v);
- }
+ static constexpr bool supports_packing() { return false; }
- // Will never be called
- static INLINE TV partition_vector(TV v, int mask) { return v; }
+ template
+ static constexpr bool can_pack(T span) { return false; }
+ static INLINE TV load_vec(TV* p) { return _mm512_loadu_si512(p); }
- static void store_compress_vec(TV *ptr, TV v, TMASK mask) {
- _mm512_mask_compressstoreu_epi32(ptr, mask, v);
- }
+ static INLINE void store_vec(TV* ptr, TV v) { _mm512_storeu_si512(ptr, v); }
- static INLINE TV broadcast(int32_t pivot) {
- return _mm512_set1_epi32(pivot);
- }
+ // Will never be called
+ static INLINE TV partition_vector(TV v, int mask) { return v; }
- static INLINE TMASK get_cmpgt_mask(TV a, TV b) {
- return _mm512_cmp_epi32_mask(a, b, _MM_CMPINT_GT);
- }
-};
+ static void store_compress_vec(TV* ptr, TV v, TMASK mask) { _mm512_mask_compressstoreu_epi32(ptr, mask, v); }
-template <>
-class vxsort_machine_traits {
- public:
- typedef __m512i TV;
- typedef __mmask16 TMASK;
+ static INLINE TV broadcast(int32_t pivot) { return _mm512_set1_epi32(pivot); }
- static constexpr bool supports_compress_writes() { return true; }
+ static INLINE TMASK get_cmpgt_mask(TV a, TV b) { return _mm512_cmp_epi32_mask(a, b, _MM_CMPINT_GT); }
- static INLINE TV load_vec(TV* p) {
- return _mm512_loadu_si512(p);
- }
+ static TV shift_right(TV v, int i) { return _mm512_srli_epi32(v, i); }
+ static TV shift_left(TV v, int i) { return _mm512_slli_epi32(v, i); }
- static INLINE void store_vec(TV* ptr, TV v) {
- _mm512_storeu_si512(ptr, v);
- }
+ static INLINE TV add(TV a, TV b) { return _mm512_add_epi32(a, b); }
+ static INLINE TV sub(TV a, TV b) { return _mm512_sub_epi32(a, b); };
- // Will never be called
- static INLINE TV partition_vector(TV v, int mask) { return v; }
+ static INLINE TV pack_ordered(TV a, TV b) { return a; }
+ static INLINE TV pack_unordered(TV a, TV b) { return a; }
+ static INLINE void unpack_ordered(TV p, TV& u1, TV& u2) { }
+ template
+ static T shift_n_sub(T v, T sub) {
+ if (Shift > 0)
+ v >>= Shift;
+ v -= sub;
+ return v;
+ }
- static void store_compress_vec(TV *ptr, TV v, TMASK mask) {
- _mm512_mask_compressstoreu_epi32(ptr, mask, v);
- }
-
- static INLINE TV broadcast(uint32_t pivot) {
- return _mm512_set1_epi32(pivot);
- }
-
- static INLINE TMASK get_cmpgt_mask(TV a, TV b) {
- return _mm512_cmp_epu32_mask(a, b, _MM_CMPINT_GT);
- }
-};
-
-template <>
-class vxsort_machine_traits {
- public:
- typedef __m512 TV;
- typedef __mmask16 TMASK;
-
- static constexpr bool supports_compress_writes() { return true; }
-
- static INLINE TV load_vec(TV* p) {
- return _mm512_loadu_ps(p);
- }
-
- static INLINE void store_vec(TV* ptr, TV v) {
- _mm512_storeu_ps(ptr, v);
- }
-
- // Will never be called
- static INLINE TV partition_vector(TV v, int mask) { return v; }
-
-
- static void store_compress_vec(TV *ptr, TV v, TMASK mask) {
- _mm512_mask_compressstoreu_ps(ptr, mask, v);
- }
-
- static INLINE TV broadcast(float pivot) {
- return _mm512_set1_ps(pivot);
- }
-
- static INLINE TMASK get_cmpgt_mask(TV a, TV b) {
- return _mm512_cmp_ps_mask(a, b, _CMP_GT_OS);
- }
+ template
+ static T unshift_and_add(TPACK from, T add) {
+ add += from;
+ if (Shift > 0)
+ add = (T) (((TU) add) << Shift);
+ return add;
+ }
};
template <>
class vxsort_machine_traits {
- public:
- typedef __m512i TV;
- typedef __mmask8 TMASK;
-
- static bool supports_compress_writes() { return true; }
+ public:
+ typedef int64_t T;
+ typedef __m512i TV;
+ typedef __mmask8 TMASK;
+ typedef int32_t TPACK;
+ typedef typename std::make_unsigned::type TU;
- static INLINE TV load_vec(TV* p) {
- return _mm512_loadu_si512(p);
- }
+ static constexpr bool supports_compress_writes() { return true; }
- static INLINE void store_vec(TV* ptr, TV v) {
- _mm512_storeu_si512(ptr, v);
- }
+ static constexpr bool supports_packing() { return true; }
- // Will never be called
- static INLINE TV partition_vector(TV v, int mask) { return v; }
+ template