diff --git a/.config/1espt/PipelineAutobaseliningConfig.yml b/.config/1espt/PipelineAutobaseliningConfig.yml
new file mode 100644
index 000000000000..71a1098b1aa3
--- /dev/null
+++ b/.config/1espt/PipelineAutobaseliningConfig.yml
@@ -0,0 +1,21 @@
+## DO NOT MODIFY THIS FILE MANUALLY. This is part of auto-baselining from 1ES Pipeline Templates. Go to [https://aka.ms/1espt-autobaselining] for more details.
+
+pipelines:
+ 679:
+ retail:
+ binary:
+ credscan:
+ lastModifiedDate: 2024-04-11
+ binskim:
+ lastModifiedDate: 2024-04-11
+ spotbugs:
+ lastModifiedDate: 2024-04-11
+ source:
+ credscan:
+ lastModifiedDate: 2024-04-11
+ eslint:
+ lastModifiedDate: 2024-04-11
+ psscriptanalyzer:
+ lastModifiedDate: 2024-04-11
+ armory:
+ lastModifiedDate: 2024-04-11
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
index 9abee6864b8e..d66c4e34a7d3 100644
--- a/.config/dotnet-tools.json
+++ b/.config/dotnet-tools.json
@@ -9,13 +9,13 @@
]
},
"dotnet-reportgenerator-globaltool": {
- "version": "5.0.2",
+ "version": "5.3.0",
"commands": [
"reportgenerator"
]
},
"microsoft.dotnet.xharness.cli": {
- "version": "9.0.0-prerelease.24203.1",
+ "version": "9.0.0-prerelease.24266.1",
"commands": [
"xharness"
]
diff --git a/.config/guardian/.gdnbaselines b/.config/guardian/.gdnbaselines
new file mode 100644
index 000000000000..e2ec41852d17
--- /dev/null
+++ b/.config/guardian/.gdnbaselines
@@ -0,0 +1,61 @@
+{
+ "properties": {
+ "helpUri": "https://eng.ms/docs/microsoft-security/security/azure-security/cloudai-security-fundamentals-engineering/security-integration/guardian-wiki/microsoft-guardian/general/baselines"
+ },
+ "version": "1.0.0",
+ "baselines": {
+ "default": {
+ "name": "default",
+ "createdDate": "2024-04-10 20:32:31Z",
+ "lastUpdatedDate": "2024-04-10 20:32:31Z"
+ }
+ },
+ "results": {
+ "3b1bb0185d74dd310884a85ad1252953dab0747790f5aecd5bf5bb3c1e2b515c": {
+ "signature": "3b1bb0185d74dd310884a85ad1252953dab0747790f5aecd5bf5bb3c1e2b515c",
+ "alternativeSignatures": [],
+ "target": "src/libraries/System.Security.Cryptography/tests/X509Certificates/TestData.cs",
+ "line": 3441,
+ "memberOf": [
+ "default"
+ ],
+ "tool": "credscan",
+ "ruleId": "CSCAN-GENERAL0060",
+ "createdDate": "2024-04-10 20:32:31Z",
+ "expirationDate": "2024-09-28 00:14:56Z",
+ "justification": "This error is baselined with an expiration date of 180 days from 2024-04-11 00:14:56Z"
+ },
+ "2e4598005fdee72a4700697760c5f1b199c25d15a7c54de438ce939f125f3710": {
+ "signature": "2e4598005fdee72a4700697760c5f1b199c25d15a7c54de438ce939f125f3710",
+ "alternativeSignatures": [
+ "6b533da7f95704f4476b24f493f88b2b1fd7d3bba69105bf63530140e0b3c8f1"
+ ],
+ "target": "src/libraries/Common/tests/System/Net/Prerequisites/Deployment/setup_activedirectory_domaincontroller.ps1",
+ "line": 36,
+ "memberOf": [
+ "default"
+ ],
+ "tool": "psscriptanalyzer",
+ "ruleId": "PSAvoidUsingConvertToSecureStringWithPlainText",
+ "createdDate": "2024-04-10 20:32:31Z",
+ "expirationDate": "2024-09-28 00:14:56Z",
+ "justification": "This error is baselined with an expiration date of 180 days from 2024-04-11 00:14:56Z"
+ },
+ "df6d1096725378c354a363dbb40fca84b9eed42a724ffbde7de57a88fc4042df": {
+ "signature": "df6d1096725378c354a363dbb40fca84b9eed42a724ffbde7de57a88fc4042df",
+ "alternativeSignatures": [
+ "b090ab235a86ec5bc15243c19bc432f09e5aef816854bcbe120ab04c7c0332e1"
+ ],
+ "target": "src/libraries/Common/tests/System/Net/Prerequisites/Deployment/setup_iisserver.ps1",
+ "line": 82,
+ "memberOf": [
+ "default"
+ ],
+ "tool": "psscriptanalyzer",
+ "ruleId": "PSAvoidUsingConvertToSecureStringWithPlainText",
+ "createdDate": "2024-04-10 20:32:31Z",
+ "expirationDate": "2024-09-28 00:14:56Z",
+ "justification": "This error is baselined with an expiration date of 180 days from 2024-04-11 00:14:56Z"
+ }
+ }
+}
\ No newline at end of file
diff --git a/.devcontainer/scripts/onCreateCommand.sh b/.devcontainer/scripts/onCreateCommand.sh
index 6c2527c7d1ef..02e5878bab2d 100755
--- a/.devcontainer/scripts/onCreateCommand.sh
+++ b/.devcontainer/scripts/onCreateCommand.sh
@@ -3,9 +3,6 @@
set -e
function wasm_common() {
- # prebuild for WASM, so it is ready for wasm development
- make -C src/mono/browser provision-wasm
- export EMSDK_PATH=$PWD/src/mono/browser/emsdk
case "$1" in
wasm)
# Put your common commands for wasm here
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 000000000000..806f7fad67b0
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: daily
+ open-pull-requests-limit: 5
+ labels:
+ - area-codeflow
+ ignore:
+ - dependency-name: "actions/checkout"
+ update-types: ["version-update:semver-patch","version-update:semver-minor"]
diff --git a/.github/policies/resourceManagement.yml b/.github/policies/resourceManagement.yml
deleted file mode 100644
index bbfc4c3acb82..000000000000
--- a/.github/policies/resourceManagement.yml
+++ /dev/null
@@ -1,1881 +0,0 @@
-id:
-name: GitOps.PullRequestIssueManagement
-description: GitOps.PullRequestIssueManagement primitive
-owner:
-resource: repository
-disabled: false
-where:
-configuration:
- resourceManagementConfiguration:
- scheduledSearches:
- - description: Automated Issue cleanup
- frequencies:
- - hourly:
- hour: 6
- filters:
- - noActivitySince:
- days: 1644
- - isIssue
- - isOpen
- - isNotLabeledWith:
- label: backlog-cleanup-candidate
- actions:
- - addReply:
- reply: >-
- Due to lack of recent activity, this issue has been marked as a candidate for backlog cleanup. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will undo this process.
-
-
- This process is part of our [issue cleanup automation](https://github.com/dotnet/runtime/blob/main/docs/issue-cleanup.md).
- - addLabel:
- label: backlog-cleanup-candidate
- - addLabel:
- label: no-recent-activity
- - description: Add no-recent-activity label to issues
- frequencies:
- - hourly:
- hour: 6
- filters:
- - isIssue
- - isOpen
- - hasLabel:
- label: needs-author-action
- - noActivitySince:
- days: 14
- - isNotLabeledWith:
- label: no-recent-activity
- actions:
- - addLabel:
- label: no-recent-activity
- - addReply:
- reply: This issue has been automatically marked `no-recent-activity` because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove `no-recent-activity`.
- - description: Add no-recent-activity label to PRs
- frequencies:
- - hourly:
- hour: 6
- filters:
- - isPullRequest
- - isOpen
- - hasLabel:
- label: needs-author-action
- - noActivitySince:
- days: 14
- - isNotLabeledWith:
- label: no-recent-activity
- actions:
- - addLabel:
- label: no-recent-activity
- - addReply:
- reply: This pull request has been automatically marked `no-recent-activity` because it has not had any activity for 14 days. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will remove `no-recent-activity`.
- - description: Close issues with no recent activity
- frequencies:
- - hourly:
- hour: 6
- filters:
- - isIssue
- - isOpen
- - hasLabel:
- label: no-recent-activity
- - noActivitySince:
- days: 14
- actions:
- - addReply:
- reply: This issue will now be closed since it had been marked `no-recent-activity` but received no further activity in the past 14 days. It is still possible to reopen or comment on the issue, but please note that the issue will be locked if it remains inactive for another 30 days.
- - closeIssue
- - description: Close PRs with no-recent-activity
- frequencies:
- - hourly:
- hour: 6
- filters:
- - isPullRequest
- - isOpen
- - hasLabel:
- label: no-recent-activity
- - noActivitySince:
- days: 14
- actions:
- - addReply:
- reply: This pull request will now be closed since it had been marked `no-recent-activity` but received no further activity in the past 14 days. It is still possible to reopen or comment on the pull request, but please note that it will be locked if it remains inactive for another 30 days.
- - closeIssue
- - description: Close inactive Draft PRs
- frequencies:
- - hourly:
- hour: 6
- filters:
- - isDraftPullRequest
- - isOpen
- - noActivitySince:
- days: 30
- actions:
- - closeIssue
- - addReply:
- reply: Draft Pull Request was automatically closed for 30 days of inactivity. Please [let us know](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you'd like to reopen it.
- eventResponderTasks:
- - if:
- - or:
- - payloadType: Issues
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- then:
- - if:
- - hasLabel:
- label: area-AssemblyLoader-coreclr
- then:
- - mentionUsers:
- mentionees:
- - vitek-karas
- - agocke
- - vsadov
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-AssemblyLoader-mono
- then:
- - mentionUsers:
- mentionees: []
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-CodeGen-coreclr
- then:
- - mentionUsers:
- mentionees:
- - JulieLeeMSFT
- - jakobbotsch
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Codegen-Interpreter-mono
- then:
- - mentionUsers:
- mentionees:
- - brzvlad
- - kotlarmilos
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Codegen-JIT-Mono
- then:
- - mentionUsers:
- mentionees:
- - lambdageek
- - steveisok
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-CodeGen-LLVM-Mono
- then:
- - mentionUsers:
- mentionees:
- - lambdageek
- - steveisok
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Codegen-Intrinsics-mono
- then:
- - mentionUsers:
- mentionees:
- - fanyang-mono
- - steveisok
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-CodeGen-meta-Mono
- then:
- - mentionUsers:
- mentionees:
- - steveisok
- - lambdageek
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.DateTime
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-datetime
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Debugger-mono
- then:
- - mentionUsers:
- mentionees:
- - thaystg
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-DependencyModel
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-dependencymodel
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Diagnostics-coreclr
- then:
- - mentionUsers:
- mentionees:
- - tommcdon
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Extensions-Caching
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-extensions-caching
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Extensions-Configuration
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-extensions-configuration
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Extensions-DependencyInjection
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-extensions-dependencyinjection
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Extensions-FileSystem
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-extensions-filesystem
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Extensions-Hosting
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-extensions-hosting
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Extensions-HttpClientFactory
- then:
- - mentionUsers:
- mentionees:
- - dotnet/ncl
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Extensions-Logging
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-extensions-logging
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Extensions-Options
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-extensions-options
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Extensions-Primitives
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-extensions-primitives
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-GC-coreclr
- then:
- - mentionUsers:
- mentionees:
- - dotnet/gc
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-GC-mono
- then:
- - mentionUsers:
- mentionees:
- - brzvlad
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Host
- then:
- - mentionUsers:
- mentionees:
- - vitek-karas
- - agocke
- - vsadov
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-HostModel
- then:
- - mentionUsers:
- mentionees:
- - vitek-karas
- - agocke
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-ILTools-coreclr
- then:
- - mentionUsers:
- mentionees:
- - JulieLeeMSFT
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Tools-ILVerification
- then:
- - mentionUsers:
- mentionees:
- - JulieLeeMSFT
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Infrastructure
- then:
- - mentionUsers:
- mentionees:
- - dotnet/runtime-infrastructure
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Infrastructure-coreclr
- then:
- - mentionUsers:
- mentionees:
- - hoyosjs
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Infrastructure-libraries
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-infrastructure-libraries
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Infrastructure-mono
- then:
- - mentionUsers:
- mentionees:
- - directhex
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Meta
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-meta
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Microsoft.CSharp
- then:
- - mentionUsers:
- mentionees:
- - cston
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Microsoft.Extensions
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-microsoft-extensions
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Microsoft.VisualBasic
- then:
- - mentionUsers:
- mentionees:
- - cston
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Microsoft.Win32
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-microsoft-win32
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-NativeAOT-coreclr
- then:
- - mentionUsers:
- mentionees:
- - agocke
- - MichalStrehovsky
- - jkotas
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Single-File
- then:
- - mentionUsers:
- mentionees:
- - agocke
- - vitek-karas
- - vsadov
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Buffers
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-buffers
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.CodeDom
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-codedom
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Collections
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-collections
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.ComponentModel
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-componentmodel
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.ComponentModel.Composition
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-componentmodel-composition
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.ComponentModel.DataAnnotations
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-componentmodel-dataannotations
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Composition
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-composition
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Configuration
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-configuration
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Console
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-console
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Data
- then:
- - mentionUsers:
- mentionees:
- - roji
- - ajcvickers
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Data.Odbc
- then:
- - mentionUsers:
- mentionees:
- - roji
- - ajcvickers
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Data.OleDB
- then:
- - mentionUsers:
- mentionees:
- - roji
- - ajcvickers
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Data.SqlClient
- then:
- - mentionUsers:
- mentionees:
- - davoudeshtehari
- - david-engel
- - jrahnama
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Diagnostics
- then:
- - mentionUsers:
- mentionees:
- - tommcdon
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Diagnostics.Activity
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-diagnostics-activity
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Diagnostics.EventLog
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-diagnostics-eventlog
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Diagnostics.PerformanceCounter
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-diagnostics-performancecounter
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Diagnostics.Process
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-diagnostics-process
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Diagnostics.TraceSource
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-diagnostics-tracesource
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Diagnostics.Tracing
- then:
- - mentionUsers:
- mentionees:
- - tarekgh
- - tommcdon
- - pjanotti
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.DirectoryServices
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-directoryservices
- - jay98014
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Drawing
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-drawing
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Dynamic.Runtime
- then:
- - mentionUsers:
- mentionees:
- - cston
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Formats.Asn1
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-formats-asn1
- - bartonjs
- - vcsjones
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Formats.Cbor
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-formats-cbor
- - bartonjs
- - vcsjones
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Formats.Tar
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-formats-tar
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Globalization
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-globalization
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.IO
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-io
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.IO.Compression
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-io-compression
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.IO.Hashing
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-io-hashing
- - bartonjs
- - vcsjones
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.IO.Ports
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-io-ports
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Linq
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-linq
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Linq.Expressions
- then:
- - mentionUsers:
- mentionees:
- - cston
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Linq.Parallel
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-linq-parallel
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Management
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-management
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Memory
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-memory
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Net
- then:
- - mentionUsers:
- mentionees:
- - dotnet/ncl
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Net.Http
- then:
- - mentionUsers:
- mentionees:
- - dotnet/ncl
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Net.Quic
- then:
- - mentionUsers:
- mentionees:
- - dotnet/ncl
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Net.Security
- then:
- - mentionUsers:
- mentionees:
- - dotnet/ncl
- - bartonjs
- - vcsjones
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Net.Sockets
- then:
- - mentionUsers:
- mentionees:
- - dotnet/ncl
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Numerics
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-numerics
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Numerics.Tensors
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-numerics-tensors
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Reflection
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-reflection
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Reflection.Emit
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-reflection-emit
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Reflection.Metadata
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-reflection-metadata
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Resources
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-resources
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Runtime
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-runtime
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Runtime.CompilerServices
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-runtime-compilerservices
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Runtime.InteropServices
- then:
- - mentionUsers:
- mentionees:
- - dotnet/interop-contrib
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Runtime.Intrinsics
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-runtime-intrinsics
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Security
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-security
- - bartonjs
- - vcsjones
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.ServiceProcess
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-serviceprocess
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Speech
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-speech
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Text.Encoding
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-text-encoding
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Text.Encodings.Web
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-text-encodings-web
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Text.Json
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-text-json
- - gregsdennis
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Text.RegularExpressions
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-text-regularexpressions
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Threading
- then:
- - mentionUsers:
- mentionees:
- - mangod9
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Threading.Channels
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-threading-channels
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Threading.Tasks
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-threading-tasks
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Transactions
- then:
- - mentionUsers:
- mentionees:
- - roji
- - ajcvickers
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-System.Xml
- then:
- - mentionUsers:
- mentionees:
- - dotnet/area-system-xml
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-Tools-ILLink
- then:
- - mentionUsers:
- mentionees:
- - agocke
- - sbomer
- - vitek-karas
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- - if:
- - hasLabel:
- label: area-vm-coreclr
- then:
- - mentionUsers:
- mentionees:
- - mangod9
- replyTemplate: >-
- Tagging subscribers to this area: ${mentionees}
-
- See info in [area-owners.md](https://github.com/dotnet/runtime/blob/main/docs/area-owners.md) if you want to be subscribed.
- assignMentionees: False
- description: Area-owners
- - if:
- - payloadType: Issues
- - labelAdded:
- label: breaking-change
- then:
- - addLabel:
- label: needs-breaking-change-doc-created
- - addReply:
- reply: >-
- Added `needs-breaking-change-doc-created` label because this issue has the `breaking-change` label.
-
-
- 1. [ ] Create and link to this issue a matching issue in the dotnet/docs repo using the [breaking change documentation template](https://aka.ms/dotnet/docs/new-breaking-change-issue), then remove this `needs-breaking-change-doc-created` label.
-
-
- Tagging @dotnet/compat for awareness of the breaking change.
- description: Add breaking change doc label to issue
- - if:
- - payloadType: Pull_Request
- - labelAdded:
- label: breaking-change
- - isPullRequest
- then:
- - addLabel:
- label: needs-breaking-change-doc-created
- - addReply:
- reply: >-
- Added `needs-breaking-change-doc-created` label because this PR has the `breaking-change` label.
-
-
- When you commit this breaking change:
-
-
- 1. [ ] Create and link to this PR and the issue a matching issue in the dotnet/docs repo using the [breaking change documentation template](https://aka.ms/dotnet/docs/new-breaking-change-issue), then remove this `needs-breaking-change-doc-created` label.
-
- 2. [ ] Ask a committer to mail the `.NET Breaking Change Notification` DL.
-
-
- Tagging @dotnet/compat for awareness of the breaking change.
- description: Add breaking change doc label to PR
- - if:
- - or:
- - payloadType: Issues
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- then:
- - if:
- - hasLabel:
- label: linkable-framework
- then:
- - mentionUsers:
- mentionees:
- - eerhardt
- - vitek-karas
- - LakshanF
- - sbomer
- - joperezr
- - marek-safar
- replyTemplate: >-
- Tagging subscribers to 'linkable-framework': ${mentionees}
-
- See info in area-owners.md if you want to be subscribed.
- assignMentionees: False
- description: '@Mention for linkable-framework'
- - if:
- - or:
- - payloadType: Issues
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- then:
- - if:
- - hasLabel:
- label: size-reduction
- then:
- - mentionUsers:
- mentionees:
- - eerhardt
- - SamMonoRT
- - marek-safar
- replyTemplate: >-
- Tagging subscribers to 'size-reduction': ${mentionees}
-
- See info in area-owners.md if you want to be subscribed.
- assignMentionees: False
- description: '@Mention for size-reduction'
- - if:
- - or:
- - payloadType: Issues
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- then:
- - if:
- - hasLabel:
- label: arch-wasm
- then:
- - mentionUsers:
- mentionees:
- - lewing
- replyTemplate: >-
- Tagging subscribers to 'arch-wasm': ${mentionees}
-
- See info in area-owners.md if you want to be subscribed.
- assignMentionees: False
- description: '@Mention for wasm'
- - if:
- - or:
- - payloadType: Issues
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- then:
- - if:
- - hasLabel:
- label: os-ios
- then:
- - mentionUsers:
- mentionees:
- - steveisok
- - akoeplinger
- - kotlarmilos
- replyTemplate: >-
- Tagging subscribers to 'os-ios': ${mentionees}
-
- See info in area-owners.md if you want to be subscribed.
- assignMentionees: False
- description: '@Mention for ios'
- - if:
- - or:
- - payloadType: Issues
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- then:
- - if:
- - hasLabel:
- label: os-android
- then:
- - mentionUsers:
- mentionees:
- - steveisok
- - akoeplinger
- replyTemplate: >-
- Tagging subscribers to 'arch-android': ${mentionees}
-
- See info in area-owners.md if you want to be subscribed.
- assignMentionees: False
- description: '@Mention for android'
- - if:
- - payloadType: Pull_Request
- - or:
- - filesMatchPattern:
- pattern: .*ILLink.*
- - filesMatchPattern:
- pattern: .*illink.*
- - not:
- hasLabel:
- label: linkable-framework
- - isPullRequest
- - isOpen
- then:
- - addLabel:
- label: linkable-framework
- description: '[Linkable-framework workgroup] Add linkable-framework label to new Prs that touch files with *ILLink* that not have it already'
- - if:
- - payloadType: Pull_Request
- - or:
- - filesMatchPattern:
- pattern: .*ILLink.*
- - filesMatchPattern:
- pattern: .*illink.*
- - not:
- hasLabel:
- label: linkable-framework
- - isPullRequest
- - isOpen
- - isAction:
- action: Synchronize
- then:
- - addLabel:
- label: linkable-framework
- description: '[Linkable-framework workgroup] Add linkable-framework label to Prs that get changes pushed where they touch *ILLInk* files'
- - if:
- - payloadType: Issues
- - labelAdded:
- label: backlog-cleanup-candidate
- then:
- - addReply:
- reply: >-
- Due to lack of recent activity, this issue has been marked as a candidate for backlog cleanup. It will be closed if no further activity occurs within 14 more days. Any new comment (by anyone, not necessarily the author) will undo this process.
-
-
- This process is part of our [issue cleanup automation](https://github.com/dotnet/runtime/blob/main/docs/issue-cleanup.md).
- - addLabel:
- label: no-recent-activity
- description: Manual Issue Cleanup
- - if:
- - or:
- - payloadType: Issues
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- then:
- - if:
- - hasLabel:
- label: os-tvos
- then:
- - mentionUsers:
- mentionees:
- - steveisok
- - akoeplinger
- replyTemplate: >-
- Tagging subscribers to 'os-tvos': ${mentionees}
-
- See info in area-owners.md if you want to be subscribed.
- assignMentionees: False
- description: '@Mention for tvos'
- - if:
- - or:
- - payloadType: Issues
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- then:
- - if:
- - hasLabel:
- label: os-maccatalyst
- then:
- - mentionUsers:
- mentionees:
- - steveisok
- - akoeplinger
- replyTemplate: >-
- Tagging subscribers to 'os-maccatalyst': ${mentionees}
-
- See info in area-owners.md if you want to be subscribed.
- assignMentionees: False
- description: '@Mention for maccatalyst'
- - if:
- - payloadType: Issues
- - or:
- - isAction:
- action: Opened
- - isAction:
- action: Reopened
- - isOpen
- - not: isPartOfAnyMilestone
- - not:
- hasLabel:
- label: untriaged
- then:
- - addLabel:
- label: untriaged
- description: Add untriaged label to new/reopened issues without a milestone
- - if:
- - payloadType: Issues
- - or:
- - isAction:
- action: Closed
- - isPartOfAnyMilestone
- - hasLabel:
- label: untriaged
- then:
- - removeLabel:
- label: untriaged
- description: Remove untriaged label from issues when closed or added to a milestone
- - if:
- - payloadType: Pull_Request
- then:
- - inPrLabel:
- label: in-pr
- description: Add `in-pr` label on issue when an open pull request is targeting it
- - if:
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- - not:
- activitySenderHasPermission:
- permission: Read
- then:
- - assignTo:
- author: True
- description: Assign Team PRs to author
- - if:
- - payloadType: Pull_Request
- - isAction:
- action: Opened
- - isPullRequest
- - and:
- - not:
- activitySenderHasPermission:
- permission: Admin
- - not:
- activitySenderHasPermission:
- permission: Write
- - not:
- isActivitySender:
- user: github-actions[bot]
- issueAuthor: False
- - not:
- isActivitySender:
- user: dotnet-maestro[bot]
- issueAuthor: False
- - not:
- isActivitySender:
- user: dotnet-maestro-bot[bot]
- issueAuthor: False
- - not:
- isActivitySender:
- user: dotnet-maestro-bot
- issueAuthor: False
- - not:
- isActivitySender:
- user: dotnet-maestro
- issueAuthor: False
- - not:
- isActivitySender:
- user: github-actions
- issueAuthor: False
- then:
- - addLabel:
- label: community-contribution
- description: Label community PRs
- - if:
- - payloadType: Issues
- - labelAdded:
- label: needs-author-action
- then:
- - addReply:
- reply: This issue has been marked `needs-author-action` and may be missing some important information.
- description: Needs-author-action notification
- - if:
- - payloadType: Pull_Request_Review
- - not:
- activitySenderHasPermission:
- permission: Read
- - isPullRequest
- - isAction:
- action: Submitted
- - isReviewState:
- reviewState: Changes_requested
- then:
- - addLabel:
- label: needs-author-action
- description: PR reviews with "changes requested" applies the needs-author-action label
- - if:
- - payloadType: Issue_Comment
- - isAction:
- action: Created
- - isActivitySender:
- issueAuthor: True
- - hasLabel:
- label: needs-author-action
- - not:
- hasLabel:
- label: untriaged
- - isIssue
- - isOpen
- then:
- - addLabel:
- label: needs-further-triage
- - removeLabel:
- label: needs-author-action
- description: Replace `needs-author-action` label with `needs-further-triage` label when the author comments on an issue that is not still untriaged
- - if:
- - payloadType: Issue_Comment
- - isAction:
- action: Created
- - isActivitySender:
- issueAuthor: True
- - hasLabel:
- label: needs-author-action
- - hasLabel:
- label: untriaged
- - isIssue
- - isOpen
- then:
- - removeLabel:
- label: needs-author-action
- description: Remove `needs-author-action` label when the author comments on an `untriaged` issue
- - if:
- - payloadType: Pull_Request
- - isPullRequest
- - isAction:
- action: Synchronize
- - hasLabel:
- label: needs-author-action
- then:
- - removeLabel:
- label: needs-author-action
- description: Pushing changes to PR branch removes the needs-author-action label
- - if:
- - payloadType: Issue_Comment
- - isActivitySender:
- issueAuthor: True
- - isAction:
- action: Created
- - hasLabel:
- label: needs-author-action
- - isPullRequest
- - isOpen
- then:
- - removeLabel:
- label: needs-author-action
- description: Author commenting in PR removes the needs-author-action label
- - if:
- - payloadType: Pull_Request_Review
- - isActivitySender:
- issueAuthor: True
- - hasLabel:
- label: needs-author-action
- - isAction:
- action: Submitted
- - isPullRequest
- - isOpen
- then:
- - removeLabel:
- label: needs-author-action
- description: Author responding to a pull request review comment removes the needs-author-action label
- - if:
- - payloadType: Issues
- - not:
- isAction:
- action: Closed
- - hasLabel:
- label: no-recent-activity
- - not:
- labelAdded:
- label: no-recent-activity
- then:
- - removeLabel:
- label: no-recent-activity
- - removeLabel:
- label: backlog-cleanup-candidate
- description: Remove `no-recent-activity` label from issues when issue is modified
- - if:
- - payloadType: Issue_Comment
- - hasLabel:
- label: no-recent-activity
- - isIssue
- then:
- - removeLabel:
- label: no-recent-activity
- - removeLabel:
- label: backlog-cleanup-candidate
- description: Remove `no-recent-activity` label when an issue is commented on
- - if:
- - payloadType: Pull_Request
- - isPullRequest
- - isOpen
- - hasLabel:
- label: no-recent-activity
- - not:
- labelAdded:
- label: no-recent-activity
- then:
- - removeLabel:
- label: no-recent-activity
- - removeLabel:
- label: backlog-cleanup-candidate
- description: Remove `no-recent-activity` label from PRs when modified
- - if:
- - payloadType: Issue_Comment
- - hasLabel:
- label: no-recent-activity
- - isPullRequest
- - isOpen
- then:
- - removeLabel:
- label: no-recent-activity
- - removeLabel:
- label: backlog-cleanup-candidate
- description: Remove `no-recent-activity` label from PRs when commented on
- - if:
- - payloadType: Pull_Request_Review
- - hasLabel:
- label: no-recent-activity
- - isPullRequest
- - isOpen
- then:
- - removeLabel:
- label: no-recent-activity
- - removeLabel:
- label: backlog-cleanup-candidate
- description: Remove `no-recent-activity` label from PRs when new review is added
-onFailure:
-onSuccess:
diff --git a/.github/workflows/aspnetcore-sync.yml b/.github/workflows/aspnetcore-sync.yml
index 01aa3dfdabca..582f371cf9ab 100644
--- a/.github/workflows/aspnetcore-sync.yml
+++ b/.github/workflows/aspnetcore-sync.yml
@@ -16,14 +16,14 @@ jobs:
runs-on: windows-latest
steps:
- name: Checkout aspnetcore
- uses: actions/checkout@v2.0.0
+ uses: actions/checkout@v4
with:
# Test this script using changes in a fork
repository: 'dotnet/aspnetcore'
path: aspnetcore
ref: main
- name: Checkout runtime
- uses: actions/checkout@v2.0.0
+ uses: actions/checkout@v4
with:
# Test this script using changes in a fork
repository: 'dotnet/runtime'
@@ -42,7 +42,7 @@ jobs:
mkdir ..\artifacts
git status > ..\artifacts\status.txt
git diff > ..\artifacts\diff.txt
- - uses: actions/upload-artifact@v1
+ - uses: actions/upload-artifact@v4
with:
name: results
path: artifacts
@@ -57,7 +57,7 @@ jobs:
- name: Send PR
if: steps.check.outputs.changed == 'true'
# https://github.com/marketplace/actions/create-pull-request
- uses: dotnet/actions-create-pull-request@v3
+ uses: dotnet/actions-create-pull-request@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
path: .\runtime
diff --git a/.github/workflows/bump-chrome-version.yml b/.github/workflows/bump-chrome-version.yml
index 65427d63f657..e1d1e89658ca 100644
--- a/.github/workflows/bump-chrome-version.yml
+++ b/.github/workflows/bump-chrome-version.yml
@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Setup Branch
run: |
git config user.name github-actions[bot]
@@ -27,7 +27,7 @@ jobs:
run: >-
make -C src/mono/wasm build-tasks &&
PATH=$PWD/.dotnet:$PATH dotnet build eng/testing/bump-chrome-version.proj -p:Configuration=Release &&
- git add eng/testing/ChromeVersions.props &&
+ git add eng/testing/BrowserVersions.props &&
cat eng/testing/bump-chrome-pr.env >> "$GITHUB_ENV"
- name: Check for changes
@@ -47,7 +47,7 @@ jobs:
- name: Create PR
if: steps.check_changes.outputs.has_changes == 'true'
- uses: actions/github-script@v6
+ uses: actions/github-script@v7
with:
script: |
const { CHROME_LINUX_VER, CHROME_WIN_VER } = process.env;
diff --git a/.github/workflows/locker.yml b/.github/workflows/locker.yml
index 2b7ab0032758..bea3f2fa09f9 100644
--- a/.github/workflows/locker.yml
+++ b/.github/workflows/locker.yml
@@ -20,13 +20,14 @@ permissions:
jobs:
main:
runs-on: ubuntu-latest
+ if: ${{ github.repository_owner == 'dotnet' }}
steps:
- name: Checkout Actions
uses: actions/checkout@v4
with:
repository: "microsoft/vscode-github-triage-actions"
path: ./actions
- ref: cd16cd2aad6ba2da74bb6c6f7293adddd579a90e
+ ref: 066bee9cefa6f0b4bf306040ff36fc7d96a6d56d # locker action commit sha
- name: Install Actions
run: npm install --production --prefix ./actions
- name: Run Locker
diff --git a/.gitignore b/.gitignore
index 9931e9ae0ad3..4bbfe24b82e1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -187,6 +187,7 @@ node_modules/
*.metaproj
*.metaproj.tmp
bin.localpkg/
+.mono/
# RIA/Silverlight projects
Generated_Code/
diff --git a/Directory.Build.props b/Directory.Build.props
index 46c00ca53a38..9e94baffe87f 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -62,18 +62,22 @@
- eng/native/configurecompiler.cmake
- eng/native/build-commons.sh
- src/native/libs/build-native.sh
- - src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ObjectWriter.cs
+ - src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/ObjectWriter/MachObjectWriter.cs
- src/coreclr/nativeaot/BuildIntegration/Microsoft.NETCore.Native.Unix.targets
+ - src/mono/mono/tools/offsets-tool/offsets-tool.py
+ - src/mono/msbuild/apple/build/AppleBuild.targets
- src/installer/pkg/sfx/bundle/shared-framework-distribution-template-x64.xml
- src/installer/pkg/sfx/bundle/shared-framework-distribution-template-arm64.xml
+ - src/tasks/AotCompilerTask/MonoAOTCompiler.props
+ - src/tasks/AppleAppBuilder/Xcode.cs
- src/tasks/MobileBuildTasks/Apple/AppleProject.cs
- dotnet/installer repo > src/redist/targets/GeneratePKG.targets
-->
21
- 11.0
- 11.0
- 10.15
- 11.0
+ 12.2
+ 12.2
+ 12.0
+ 15.0
@@ -186,7 +190,9 @@
$([MSBuild]::NormalizePath('$(TestExclusionListTasksDir)', 'TestExclusionListTasks.dll'))
$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'coreclr', '$(TargetOS).$(TargetArchitecture).$(RuntimeConfiguration)'))
$(CoreCLRToolPath)
+
$([MSBuild]::NormalizeDirectory($(ArtifactsObjDir), 'wasmtime'))
true
$([MSBuild]::NormalizeDirectory($(WasmProjectRoot), 'build'))
@@ -329,7 +335,7 @@
true
- ClrFullNativeBuild;ClrRuntimeSubset;ClrJitSubset;ClrPalTestsSubset;ClrAllJitsSubset;ClrILToolsSubset;ClrNativeAotSubset;ClrSpmiSubset;ClrCrossComponentsSubset;ClrDebugSubset;HostArchitecture;PgoInstrument;NativeOptimizationDataSupported;CMakeArgs
+ ClrFullNativeBuild;ClrRuntimeSubset;ClrJitSubset;ClrPalTestsSubset;ClrAllJitsSubset;ClrILToolsSubset;ClrNativeAotSubset;ClrSpmiSubset;ClrCrossComponentsSubset;ClrDebugSubset;HostArchitecture;PgoInstrument;NativeOptimizationDataSupported;CMakeArgs;CxxStandardLibrary;CxxStandardLibraryStatic;CxxAbiLibrary
@@ -396,7 +402,6 @@
$(NoWarn),CS8969
portable
- true
true
false
@@ -409,12 +414,10 @@
true
true
- true
- true
- true
+ true
- false
+ false
@@ -425,7 +428,7 @@
'$(IsReferenceAssemblyProject)' != 'true' and
'$(IsGeneratorProject)' != 'true' and
'$(IsTestProject)' != 'true' and
- '$(IsPublishedAppTestProject)' != 'true' and
+ '$(IsTrimmingTestProject)' != 'true' and
'$(IsTestSupportProject)' != 'true' and
'$(UsingMicrosoftDotNetSharedFrameworkSdk)' != 'true' and
'$(MSBuildProjectExtension)' != '.pkgproj' and
@@ -476,7 +479,7 @@
-
+
true
diff --git a/Directory.Build.targets b/Directory.Build.targets
index f731eedc390c..1161d409dec1 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -86,9 +86,10 @@
-
+
$(SystemReflectionMetadataLoadContextVersion)
+ $(SystemTextJsonVersion)
Microsoft.Extensions.DependencyModel |
| area-Diagnostics-coreclr | @tommcdon | @tommcdon | |
-| area-Diagnostics-mono | @tommcdon | @tommcdon @mdh1418 | |
-| area-EnC-mono | @tommcdon | @mikelle-rogers | Hot Reload on WebAssembly, Android, iOS, etc . @lambdageek to consult |
+| area-Diagnostics-mono | @tommcdon | @tommcdon @mdh1418 @thaystg | |
+| area-EnC-mono | @tommcdon | @mikelle-rogers @thaystg | Hot Reload on WebAssembly, Android, iOS, etc . @lambdageek to consult |
| area-ExceptionHandling-coreclr | @mangod9 | @janvorli | |
| area-Extensions-Caching | @ericstj | @dotnet/area-extensions-caching | Consultants: @mgravell, @sebastienros |
| area-Extensions-Configuration | @ericstj | @dotnet/area-extensions-configuration | Consultants: @eerhardt |
@@ -141,7 +141,7 @@ Note: Editing this file doesn't update the mapping used by `@msftbot` for area-s
| area-Tools-ILLink | @agocke | @dotnet/illink | |
| area-Tools-ILVerification | @JulieLeeMSFT | @BruceForstall @dotnet/jit-contrib | |
| area-Tracing-coreclr | @tommcdon | @dotnet/area-tracing-coreclr | .NET runtime issues for EventPipe and ICorProfiler |
-| area-Tracing-mono | @tommcdon | @tommcdon | |
+| area-Tracing-mono | @tommcdon | @tommcdon @thaystg | |
| area-TypeSystem-coreclr | @steveisok | @davidwrighton @MichalStrehovsky @janvorli @mangod9 | |
| area-UWP | @tommcdon | @dotnet/area-uwp | UWP-specific issues including Microsoft.NETCore.UniversalWindowsPlatform and Microsoft.Net.UWPCoreRuntimeSdk |
| area-VM-coreclr | @mangod9 | @mangod9 | |
diff --git a/docs/coding-guidelines/coding-style.md b/docs/coding-guidelines/coding-style.md
index d584de831302..32dd1ec8bb65 100644
--- a/docs/coding-guidelines/coding-style.md
+++ b/docs/coding-guidelines/coding-style.md
@@ -36,7 +36,7 @@ The general rule we follow is "use Visual Studio defaults".
An [EditorConfig](https://editorconfig.org "EditorConfig homepage") file (`.editorconfig`) has been provided at the root of the runtime repository, enabling C# auto-formatting conforming to the above guidelines.
-We also use the [.NET Codeformatter Tool](https://github.com/dotnet/codeformatter) to ensure the code base maintains a consistent style over time, the tool automatically fixes the code base to conform to the guidelines outlined above.
+We also use the [dotnet-format tool](https://learn.microsoft.com/dotnet/core/tools/dotnet-format) to ensure the code base maintains a consistent style over time, the tool automatically fixes the code base to conform to the guidelines outlined above.
### Example File:
diff --git a/docs/design/coreclr/botr/vectors-and-intrinsics.md b/docs/design/coreclr/botr/vectors-and-intrinsics.md
index 6b15c16981c9..2fc93df7e8ee 100644
--- a/docs/design/coreclr/botr/vectors-and-intrinsics.md
+++ b/docs/design/coreclr/botr/vectors-and-intrinsics.md
@@ -156,6 +156,14 @@ private void SomeVectorizationHelper()
}
```
+#### Non-Deterministic Intrinsics in System.Private.Corelib
+
+Some APIs exposed in System.Private.Corelib are intentionally non-deterministic across hardware and instead only ensure determinism within the scope of a single process. To facilitate the support of such APIs, the JIT defines `Compiler::BlockNonDeterministicIntrinsics(bool mustExpand)` which should be used to help block such APIs from expanding in scenarios such as ReadyToRun. Additionally, such APIs should recursively call themselves so that indirect invocation (such as via a delegate, function pointer, reflection, etc) will compute the same result.
+
+An example of such a non-deterministic API is the `ConvertToIntegerNative` APIs exposed on `System.Single` and `System.Double`. These APIs convert from the source value to the target integer type using the fastest mechanism available for the underlying hardware. They exist due to the IEEE 754 specification leaving conversions undefined when the input cannot fit into the output (for example converting `float.MaxValue` to `int`) and thus different hardware having historically provided differing behaviors on these edge cases. They allow developers who do not need to be concerned with edge case handling but where the performance overhead of normalizing results for the default cast operator is too great.
+
+Another example is the various `*Estimate` APIs, such as `float.ReciprocalSqrtEstimate`. These APIs allow a user to likewise opt into a faster result at the cost of some inaccuracy, where the exact inaccuracy encountered depends on the input and the underlying hardware the instruction is executed against.
+
# 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)`.
diff --git a/docs/design/datacontracts/Thread.md b/docs/design/datacontracts/Thread.md
index 7bee0fe79fdc..2910dc8dbb82 100644
--- a/docs/design/datacontracts/Thread.md
+++ b/docs/design/datacontracts/Thread.md
@@ -22,9 +22,7 @@ enum ThreadState
TS_AbortRequested = 0x00000001, // Abort the thread
- TS_GCSuspendPending = 0x00000002, // ThreadSuspend::SuspendRuntime watches this thread to leave coop mode.
TS_GCSuspendRedirected = 0x00000004, // ThreadSuspend::SuspendRuntime has redirected the thread to suspention routine.
- TS_GCSuspendFlags = TS_GCSuspendPending | TS_GCSuspendRedirected, // used to track suspension progress. Only SuspendRuntime writes/resets these.
TS_DebugSuspendPending = 0x00000008, // Is the debugger suspending threads?
TS_GCOnTransitions = 0x00000010, // Force a GC on stub transitions (GCStress only)
diff --git a/docs/design/datacontracts/contract-descriptor.md b/docs/design/datacontracts/contract-descriptor.md
index 1e3ddabd6dd7..fbd58eb33eb9 100644
--- a/docs/design/datacontracts/contract-descriptor.md
+++ b/docs/design/datacontracts/contract-descriptor.md
@@ -24,9 +24,9 @@ struct DotNetRuntimeContractDescriptor
uint32_t flags;
uint32_t descriptor_size;
const char *descriptor;
- uint32_t aux_data_count;
+ uint32_t pointer_data_count;
uint32_t pad0;
- uintptr_t *aux_data;
+ uintptr_t *pointer_data;
};
```
@@ -45,7 +45,7 @@ reserved bits should be written as zero. Diagnostic tooling may ignore non-zero
The `descriptor` is a pointer to a UTF-8 JSON string described in [data descriptor physical layout](./data_descriptor.md#Physical_JSON_descriptor). The total number of bytes is given by `descriptor_size`.
-The auxiliary data for the JSON descriptor is stored at the location `aux_data` in `aux_data_count` pointer-sized slots.
+The auxiliary data for the JSON descriptor is stored at the location `pointer_data` in `pointer_data_count` pointer-sized slots.
### Architecture properties
@@ -83,7 +83,7 @@ a JSON integer constant.
"globals":
{
"FEATURE_COMINTEROP": 0,
- "s_pThreadStore": [ 0 ] // indirect from aux data offset 0
+ "s_pThreadStore": [ 0 ] // indirect from pointer data offset 0
},
"contracts": {"Thread": 1, "GCHandle": 1, "ThreadStore": 1}
}
diff --git a/docs/design/datacontracts/data/empty.jsonc b/docs/design/datacontracts/data/empty.jsonc
new file mode 100644
index 000000000000..29d15882a36b
--- /dev/null
+++ b/docs/design/datacontracts/data/empty.jsonc
@@ -0,0 +1,4 @@
+// the empty baseline data descriptor
+{
+ "version": 0
+}
diff --git a/docs/design/mono/mono-manpage-1.md b/docs/design/mono/mono-manpage-1.md
new file mode 100644
index 000000000000..8f5bd56abb3d
--- /dev/null
+++ b/docs/design/mono/mono-manpage-1.md
@@ -0,0 +1,2012 @@
+# Mono Manual Page
+
+Copyright 2003 Ximian, Inc. \
+Copyright 2004-2011 Novell, Inc. \
+Copyright 2011-2012 Xamarin Inc \
+Copyright 2013 7digital Media Ltd. \
+Copyright (c) .NET Foundation and Contributors
+
+Author: \
+Miguel de Icaza (miguel@gnu.org)
+
+## NAME
+
+mono - Mono's ECMA-CLI native code generator (Just-in-Time and
+Ahead-of-Time)
+
+## SYNOPSIS
+
+**mono \[options\] file \[arguments...\]**
+
+**mono-sgen \[options\] file \[arguments...\]**
+
+## DESCRIPTION
+
+*mono* is a runtime implementation of the ECMA Common Language
+Infrastructure. This can be used to run ECMA and .NET applications.
+
+The runtime loads the specified *file* and optionally passes the
+*arguments* to it. The *file* is an ECMA assembly. They typically have a
+.exe or .dll extension.
+
+These executables can reference additional functionality in the form of
+assembly references. By default those assembly references are resolved
+as follows: the **mscorlib.dll** is resolved from the system profile
+that is configured by Mono, and other assemblies are loaded from the
+Global Assembly Cache (GAC).
+
+The runtime contains a native code generator that transforms the Common
+Intermediate Language into native code.
+
+The code generator can operate in two modes: Just-in-time compilation
+(JIT) or Ahead-of-time compilation (AOT). Since code can be dynamically
+loaded, the runtime environment and the JIT are always present, even if
+code is compiled ahead of time.
+
+The runtime provides a number of configuration options for running
+applications, for developing and debugging, and for testing and
+debugging the runtime itself.
+
+The *mono* command uses the moving and generational SGen garbage
+collector while the *mono-boehm* command uses the conservative Boehm
+garbage collector.
+
+## PORTABILITY
+
+On Unix-based systems, Mono provides a mechanism to emulate the
+Windows-style file access, this includes providing a case insensitive
+view of the file system, directory separator mapping (from \\ to /) and
+stripping the drive letters.
+
+This functionality is enabled by setting the **MONO_IOMAP** environment
+variable to one of **all, drive** and **case.**
+
+See the description for **MONO_IOMAP** in the environment variables
+section for more details.
+
+## METHOD DESCRIPTIONS
+
+A number of diagnostic command line options take as argument a method
+description. A method description is a textual representation that can
+be used to uniquely identify a method. The syntax is as follows:
+
+ [W:][namespace]classname:methodname[(arguments)]
+
+The values in brackets are optional, like the namespace and the
+arguments. The arguments themselves are either empty, or a
+comma-separated list of arguments. Both the **classname** and
+**methodname** can be set to the special value '\*' to match any values
+(Unix shell users should escape the argument to avoid the shell
+interpreting this).
+
+The arguments, if present should be a comma separated list of types
+either a full typename, or for built-in types it should use the
+low-level ILAsm type names for the built-in types, like 'void', 'char',
+'bool', 'byte', 'sbyte', 'uint16', 'int16', 'uint',
+
+Pointer types should be the name of the type, followed by a '\*', arrays
+should be the typename followed by '\[' one or more commas (to indicate
+the rank of the array), and '\]'.
+
+Generic values should use '\<', one or more type names, separated by
+both a comma and a space and '\>'.
+
+By-reference arguments should include a "&" after the typename.
+
+If the method description is prefixed by 'W:' (or 'w:'), then it will
+match a *wrapper* method that may be created by the runtime for the
+specified method. (For example imported P/Invoke methods may have a
+wrapper generated by the runtime.)
+
+
+Examples:
+
+ *:ctor(int) // All constructors that take an int as an argument
+ *:Main // Methods named Main in any class
+ *:Main(string[]) // Methods named Main that take a string array in any class
+ W:UnixSignal:install // Wrappers for the UnixSignal.install DllImport
+
+## RUNTIME OPTIONS
+
+The following options are available:
+
+**--aot**, **--aot\[=options\]**
+This option is used to precompile the CIL code in the specified assembly
+to native code. The generated code is stored in a file with the
+extension .so. This file will be automatically picked up by the runtime
+when the assembly is executed.
+
+Ahead-of-Time compilation is most useful if you use it in combination
+with the -O=all,-shared flag which enables all of the optimizations in
+the code generator to be performed. Some of those optimizations are not
+practical for Just-in-Time compilation since they might be very time
+consuming.
+
+Unlike the .NET Framework, Ahead-of-Time compilation will not generate
+domain independent code: it generates the same code that the
+Just-in-Time compiler would produce. Since most applications use a
+single domain, this is fine. If you want to optimize the generated code
+for use in multi-domain applications, consider using the -O=shared flag.
+
+This pre-compiles the methods, but the original assembly is still
+required to execute as this one contains the metadata and exception
+information which is not available on the generated file. When
+precompiling code, you might want to compile with all optimizations
+(-O=all). Pre-compiled code is position independent code.
+
+Precompilation is just a mechanism to reduce startup time, increase code
+sharing across multiple mono processes and avoid just-in-time
+compilation program startup costs. The original assembly must still be
+present, as the metadata is contained there.
+
+AOT code typically can not be moved from one computer to another
+(CPU-specific optimizations that are detected at runtime) so you should
+not try to move the pre-generated assemblies or package the
+pre-generated assemblies for deployment.
+
+A few options are available as a parameter to the **--aot** command line
+option. The options are separated by commas, and more than one can be
+specified:
+
+> *asmonly*
+> Instructs the AOT compiler to output assembly code instead of an
+> object file.
+>
+> *bind-to-runtime-version*
+>
+> If specified, forces the generated AOT files to be bound to the
+> runtime version of the compiling Mono. This will prevent the AOT files
+> from being consumed by a different Mono runtime.
+>
+> *data-outfile=FILE.dll.aotdata*
+>
+> This instructs the AOT code generator to output certain data
+> constructs into a separate file. This can reduce the executable images
+> some five to twenty percent. Developers need to then ship the
+> resulting aotdata as a resource and register a hook to load the data
+> on demand by using the *mono_install_load_aot_data_hook* method.
+>
+> *direct-icalls*
+>
+> When this option is specified, icalls (internal calls made from the
+> standard library into the mono runtime code) are invoked directly
+> instead of going through the operating system symbol lookup operation.
+> This requires use of the *static* option.
+>
+> *direct-pinvoke*
+>
+> When this option is specified, P/Invoke methods are invoked directly
+> instead of going through the operating system symbol lookup operation.
+> This requires use of the *static* option.
+>
+> *dwarfdebug*
+> Instructs the AOT compiler to emit DWARF debugging information. When
+> used together with the nodebug option, only DWARF debugging
+> information is emitted, but not the information that can be used at
+> runtime.
+>
+> *full*
+>
+> This creates binaries which can be used with the --full-aot option.
+>
+> *hybrid*
+>
+> This creates binaries which can be used with the --hybrid-aot option.
+>
+> *llvm*
+> AOT will be performed with the LLVM backend instead of the Mono
+> backend where possible. This will be slower to compile but most likely
+> result in a performance improvement.
+>
+> *llvmonly*
+> AOT will be performed with the LLVM backend exclusively and the Mono
+> backend will not be used. The only output in this mode will be the
+> bitcode file normally specified with the *llvm-outfile* option. Use of
+> *llvmonly* automatically enables the *full* and *llvm* options. This
+> feature is experimental.
+>
+> *llvmopts=\[options\]*
+> Use this option to add more flags to the built-in set of flags passed
+> to the LLVM optimizer. When you invoke the *mono* command with the
+> *--aot=llvm* it displays the current list of flags that are being
+> passed to the *opt* command. *The list of possible flags that can be
+> passed can be* obtained by calling the bundled *opt* program that
+> comes with Mono, and calling it like this:
+>
+>
+>
+>
+> opt --help
+>
+> *llvmllc=\[options\]*
+> Use this option to add more flags to the built-in set of flags passed
+> to the LLVM static compiler (llc). The list of possible flags that can
+> be passed can be obtained by calling the bundled *llc* program that
+> comes with Mono, and calling it like this:
+>
+>
+>
+>
+> llc --help
+>
+> *mcpu=\[native o generic\]*
+> cpu=native allows AOT mode to use all instructions current CPU
+> supports, e.g. AVX2, SSE42, etc. Default value is 'generic'.
+> *mattr=\[cpu feature\]* Allows AOT code generator to use specified CPU
+> features where possible including \`System.Runtime.Intrinsics.\*'.
+> E.g. \`mattr=+avx2,mattr=-lzcnt' unlocks sse1-4.2, avx1-2 and disables
+> lzcnt. It's useful for cross-compilation or when it's not possible to
+> use \`-mcpu=native' (which enables all cpu feature current cpu has).
+> *llvm-outfile=\[filename\]* Gives the path for the temporary LLVM
+> bitcode file created during AOT. *dedup* Each AOT module will
+> typically contain the code for inflated methods and wrappers that are
+> called by code in that module. In dedup mode, we identify and skip
+> compiling all of those methods. When using this mode with fullaot,
+> dedup-include is required or these methods will remain missing.
+>
+> *dedup-include=\[filename\]*
+> In dedup-include mode, we are in the pass of compilation where we
+> compile the methods that we had previously skipped. All of them are
+> emitted into the assembly that is passed as this option. We
+> consolidate the many duplicate skipped copies of the same method into
+> one.
+>
+>
+>
+> *info*
+> Print the architecture the AOT in this copy of Mono targets and quit.
+>
+> *interp*
+> Generates all required wrappers, so that it is possible to run
+> --interpreter without any code generation at runtime. This option only
+> makes sense with **mscorlib.dll**. Embedders can set
+>
+> *depfile=\[filename\]*
+> Outputs a gcc -M style dependency file.
+>
+> mono_jit_set_aot_mode (MONO_AOT_MODE_INTERP);
+>
+>
+>
+> *ld-flags*
+> Additional flags to pass to the C linker (if the current AOT mode
+> calls for invoking it).
+>
+> *llvm-path=\*
+> Same for the llvm tools 'opt' and 'llc'.
+>
+> *msym-dir=\*
+> Instructs the AOT compiler to generate offline sequence points .msym
+> files. The generated .msym files will be stored into a subfolder of
+> \ named as the compilation AOTID.
+>
+> *mtriple=\*
+> Use the GNU style target triple \ to determine some code
+> generation options, i.e. --mtriple=armv7-linux-gnueabi will generate
+> code that targets ARMv7. This is currently only supported by the ARM
+> backend. In LLVM mode, this triple is passed on to the LLVM llc
+> compiler.
+>
+> *nimt-trampolines=\[number\]*
+> When compiling in full aot mode, the IMT trampolines must be
+> precreated in the AOT image. You can add additional method trampolines
+> with this argument. Defaults to 512.
+>
+> *ngsharedvt-trampolines=\[number\]*
+> When compiling in full aot mode, the value type generic sharing
+> trampolines must be precreated in the AOT image. You can add
+> additional method trampolines with this argument. Defaults to 512.
+>
+> *nodebug*
+> Instructs the AOT compiler to not output any debugging information.
+>
+> *no-direct-calls*
+> This prevents the AOT compiler from generating a direct calls to a
+> method. The AOT compiler usually generates direct calls for certain
+> methods that do not require going through the PLT (for example,
+> methods that are known to not require a hook like a static
+> constructor) or call into simple internal calls.
+>
+> *nrgctx-trampolines=\[number\]*
+> When compiling in full aot mode, the generic sharing trampolines must
+> be precreated in the AOT image. You can add additional method
+> trampolines with this argument. Defaults to 4096.
+>
+> *nrgctx-fetch-trampolines=\[number\]*
+> When compiling in full aot mode, the generic sharing fetch trampolines
+> must be precreated in the AOT image. You can add additional method
+> trampolines with this argument. Defaults to 128.
+>
+> *ntrampolines=\[number\]*
+> When compiling in full aot mode, the method trampolines must be
+> precreated in the AOT image. You can add additional method trampolines
+> with this argument. Defaults to 4096.
+>
+> *outfile=\[filename\]*
+> Instructs the AOT compiler to save the output to the specified file.
+>
+> *print-skipped-methods*
+> If the AOT compiler cannot compile a method for any reason, enabling
+> this flag will output the skipped methods to the console.
+>
+> *profile=\[file\]*
+> Specify a file to use for profile-guided optimization. See the **AOT
+> profiler** sub-section. To specify multiple files, include the
+> *profile* option multiple times.
+>
+> *profile-only*
+> AOT \*only\* the methods described in the files specified with the
+> *profile* option. See the **AOT profiler** sub-section.
+>
+> *readonly-value=namespace.typename.fieldname=type/value*
+> Override the value of a static readonly field. Usually, during JIT
+> compilation, the static constructor is ran eagerly, so the value of a
+> static readonly field is known at compilation time and the compiler
+> can do a number of optimizations based on it. During AOT, instead, the
+> static constructor can't be ran, so this option can be used to set the
+> value of such a field and enable the same set of optimizations. Type
+> can be any of i1, i2, i4 for integers of the respective sizes (in
+> bytes). Note that signed/unsigned numbers do not matter here, just the
+> storage size. This option can be specified multiple times and it
+> doesn't prevent the static constructor for the type defining the field
+> to execute with the usual rules at runtime (hence possibly computing a
+> different value for the field).
+>
+> *save-temps,keep-temps*
+> Instructs the AOT compiler to keep temporary files.
+>
+> *soft-debug*
+> This instructs the compiler to generate sequence point checks that
+> allow Mono's soft debugger to debug applications even on systems where
+> it is not possible to set breakpoints or to single step (certain
+> hardware configurations like the cell phones and video gaming
+> consoles).
+>
+> *static*
+> Create an ELF object file (.o) or .s file which can be statically
+> linked into an executable when embedding the mono runtime. When this
+> option is used, the object file needs to be registered with the
+> embedded runtime using the mono_aot_register_module function which
+> takes as its argument the mono_aot_module\_\\_info
+> global symbol from the object file:
+>
+> extern void *mono_aot_module_hello_info;
+>
+> mono_aot_register_module (mono_aot_module_hello_info);
+>
+>
+>
+> *stats*
+> Print various stats collected during AOT compilation.
+>
+> *temp-path=\[path\]*
+> Explicitly specify path to store temporary files created during AOT
+> compilation.
+>
+> *threads=\[number\]*
+> This is an experimental option for the AOT compiler to use multiple
+> threads when compiling the methods.
+>
+> *tool-prefix=\*
+> Prepends \ to the name of tools ran by the AOT compiler, i.e.
+> 'as'/'ld'. For example, --tool=prefix=arm-linux-gnueabi- will make the
+> AOT compiler run
+>
+>
+>
+> *ld-name=NAME*
+> One of the tools used for AOT builds is the linker. Its name differs
+> between various systems and it may happen that the assumed default
+> name of the binary is not present. If the toolchain used does not have
+> a linker with the default name (e.g. Android NDK r22 does not have the
+> default 'ld' linker prefixed with 'tool-prefix' above, instead it has
+> prefixed 'ld.gold' and 'ld.bfd' linkers) this option can be used to
+> set the linker binary name. It will be prefixed with 'tool-prefix' to
+> form the full linker executable name.
+>
+> *verbose*
+> Prints additional information about type loading failures.
+>
+> *write-symbols,no-write-symbols*
+> Instructs the AOT compiler to emit (or not emit) debug symbol
+> information.
+>
+> *no-opt*
+> Instructs the AOT compiler tot no call opt when compiling with LLVM.
+>
+> For more information about AOT, see:
+> http://www.mono-project.com/docs/advanced/aot/
+
+**--aot-path=PATH**
+List of additional directories to search for AOT images.
+
+**--apply-bindings=FILE**
+Apply the assembly bindings from the specified configuration file when
+running the AOT compiler. This is useful when compiling an auxiliary
+assembly that is referenced by a main assembly that provides a
+configuration file. For example, if app.exe uses lib.dll then in order
+to make the assembly bindings from app.exe.config available when
+compiling lib.dll ahead of time, use:
+
+
+
+ mono --apply-bindings=app.exe.config --aot lib.dll
+
+**--assembly-loader=MODE**
+If mode is **strict**, Mono will check that the public key token,
+culture and version of a candidate assembly matches the requested strong
+name. If mode is **legacy**, as long as the name matches, the candidate
+will be allowed. **strict** is the behavior consistent with .NET
+Framework but may break some existing mono-based applications. The
+default is **legacy**.
+
+**--attach=\[options\]**
+Currently the only option supported by this command line argument is
+**disable** which disables the attach functionality.
+
+**--config filename**
+Load the specified configuration file instead of the default one(s). The
+default files are /etc/mono/config and ~/.mono/config or the file
+specified in the MONO_CONFIG environment variable, if set. See the
+mono-config(5) man page for details on the format of this file.
+
+**--debugger-agent=\[options\]**
+This instructs the Mono runtime to start a debugging agent inside the
+Mono runtime and connect it to a client user interface will control the
+Mono process. This option is typically used by IDEs, like the
+MonoDevelop or Visual Studio IDEs.
+
+The configuration is specified using one of more of the following
+options:
+
+> *address=host:port*
+>
+> Use this option to specify the IP address where your debugger client
+> is listening to.
+>
+> *loglevel=LEVEL*
+>
+> Specifies the diagnostics log level for
+>
+> *logfile=filename*
+>
+> Used to specify the file where the log will be stored, it defaults to
+> standard output.
+>
+> *server=\[y/n\]*
+> Defaults to no, with the default option Mono will actively connect to
+> the host/port configured with the **address** option. If you set it to
+> 'y', it instructs the Mono runtime to start debugging in server mode,
+> where Mono actively waits for the debugger front end to connect to the
+> Mono process. Mono will print out to stdout the IP address and port
+> where it is listening.
+>
+> *setpgid=\[y/n\]*
+> If set to yes, Mono will call **setpgid(0, 0)** on startup, if that
+> function is available on the system. This is useful for ensuring that
+> signals delivered to a process that is executing the debuggee are not
+> propagated to the debuggee, e.g. when Ctrl-C sends **SIGINT** to the
+> **sdb** tool.
+>
+> *suspend=\[y/n\]*
+> Defaults to yes, with the default option Mono will suspend the vm on
+> startup until it connects successfully to a debugger front end. If you
+> set it to 'n', in conjunction with **server=y**, it instructs the Mono
+> runtime to run as normal, while caching metadata to send to the
+> debugger front end on connection..
+>
+> *transport=transport_name*
+>
+> This is used to specify the transport that the debugger will use to
+> communicate. It must be specified and currently requires this to be
+> 'dt_socket'.
+
+**--desktop**
+Configures the virtual machine to be better suited for desktop
+applications. Currently this sets the GC system to avoid expanding the
+heap as much as possible at the expense of slowing down garbage
+collection a bit.
+
+**--full-aot**
+This flag instructs the Mono runtime to not generate any code at runtime
+and depend exclusively on the code generated from using mono --aot=full
+previously. This is useful for platforms that do not permit dynamic code
+generation, or if you need to run assemblies that have been stripped of
+IL (for example using mono-cil-strip).
+
+Notice that this feature will abort execution at runtime if a codepath
+in your program, or Mono's class libraries attempts to generate code
+dynamically. You should test your software upfront and make sure that
+you do not use any dynamic features.
+
+**--full-aot-interp**
+Same as --full-aot with fallback to the interpreter.
+
+**--gc=boehm**, **--gc=sgen**
+Selects the Garbage Collector engine for Mono to use, Boehm or SGen.
+Currently this merely ensures that you are running either the *mono* or
+*mono-sgen* commands. This flag can be set in the **MONO_ENV_OPTIONS**
+environment variable to force all of your child processes to use one
+particular kind of GC with the Mono runtime.
+
+**--gc-debug=\[options\]**
+Command line equivalent of the **MONO_GC_DEBUG** environment variable.
+
+**--gc-params=\[options\]**
+Command line equivalent of the **MONO_GC_PARAMS** environment variable.
+
+**--arch=32**, **--arch=64**
+(Mac OS X only): Selects the bitness of the Mono binary used, if
+available. If the binary used is already for the selected bitness,
+nothing changes. If not, the execution switches to a binary with the
+selected bitness suffix installed side by side (for example, '/bin/mono
+--arch=64' will switch to '/bin/mono64' iff '/bin/mono' is a 32-bit
+build).
+
+**--help**, **-h**
+Displays usage instructions.
+
+**--interpreter**
+The Mono runtime will use its interpreter to execute a given assembly.
+The interpreter is usually slower than the JIT, but it can be useful on
+platforms where code generation at runtime is not allowed.
+
+**--hybrid-aot**
+This flag allows the Mono runtime to run assemblies that have been
+stripped of IL, for example using mono-cil-strip. For this to work, the
+assembly must have been AOT compiled with --aot=hybrid.
+
+This flag is similar to --full-aot, but it does not disable the JIT.
+This means you can use dynamic features such as System.Reflection.Emit.
+
+**--llvm**
+If the Mono runtime has been compiled with LLVM support (not available
+in all configurations), Mono will use the LLVM optimization and code
+generation engine to JIT or AOT compile.
+
+For more information, consult:
+http://www.mono-project.com/docs/advanced/mono-llvm/
+
+**--ffast-math**
+This flag allows Mono and LLVM to apply aggressive floating point
+optimizations. Can break IEEE754 compliance.
+
+**--nollvm**
+When using a Mono that has been compiled with LLVM support, it forces
+Mono to fallback to its JIT engine and not use the LLVM backend.
+
+**--optimize=MODE**, **-O=MODE**
+MODE is a comma separated list of optimizations. They also allow
+optimizations to be turned off by prefixing the optimization name with a
+minus sign.
+
+In general, Mono has been tuned to use the default set of flags, before
+using these flags for a deployment setting, you might want to actually
+measure the benefits of using them.
+
+The following optimization flags are implemented in the core engine:
+
+ abcrem Array bound checks removal
+ all Turn on all optimizations
+ aot Usage of Ahead Of Time compiled code
+ branch Branch optimizations
+ cfold Constant folding
+ cmov Conditional moves [arch-dependency]
+ deadce Dead code elimination
+ consprop Constant propagation
+ copyprop Copy propagation
+ fcmov Fast x86 FP compares [arch-dependency]
+ float32 Perform 32-bit float arithmetic using 32-bit operations
+ gshared Enable generic code sharing.
+ inline Inline method calls
+ intrins Intrinsic method implementations
+ linears Linear scan global reg allocation
+ leaf Leaf procedures optimizations
+ loop Loop related optimizations
+ peephole Peephole postpass
+ precomp Precompile all methods before executing Main
+ sched Instruction scheduling
+ shared Emit per-domain code
+ sse2 SSE2 instructions on x86 [arch-dependency]
+ tailc Tail recursion and tail calls
+
+For example, to enable all the optimization but dead code elimination
+and inlining, you can use:
+
+ -O=all,-deadce,-inline
+
+The flags that are flagged with \[arch-dependency\] indicate that the
+given option if used in combination with Ahead of Time compilation
+(--aot flag) would produce pre-compiled code that will depend on the
+current CPU and might not be safely moved to another computer.
+
+> The following optimizations are supported
+>
+> *float32*
+> Requests that the runtime performn 32-bit floating point operations
+> using only 32-bits. By default the Mono runtime tries to use the
+> highest precision available for floating point operations, but while
+> this might render better results, the code might run slower. This
+> options also affects the code generated by the LLVM backend.
+>
+> *inline*
+> Controls whether the runtime should attempt to inline (the default),
+> or not inline methods invocations
+
+**--response=FILE** Provides a response file, this instructs the Mono
+command to read other command line options from the specified file, as
+if the options had been specified on the command line. Useful when you
+have very long command lines.
+
+**--runtime=VERSION**
+Mono supports different runtime versions. The version used depends on
+the program that is being run or on its configuration file (named
+program.exe.config). This option can be used to override such
+autodetection, by forcing a different runtime version to be used. Note
+that this should only be used to select a later compatible runtime
+version than the one the program was compiled against. A typical usage
+is for running a 1.1 program on a 2.0 version:
+
+ mono --runtime=v2.0.50727 program.exe
+
+**--server**
+Configures the virtual machine to be better suited for server operations
+(currently, allows a heavier threadpool initialization).
+
+**--use-map-jit**
+Instructs Mono to generate code using MAP_JIT on MacOS. Necessary for
+bundled applications.
+
+**--verify-all**
+Verifies mscorlib and assemblies in the global assembly cache for valid
+IL, and all user code for IL verifiability.
+
+This is different from **--security**'s verifiable or validil in that
+these options only check user code and skip mscorlib and assemblies
+located on the global assembly cache.
+
+**-V**, **--version**
+Prints JIT version information (system configuration, release number and
+branch names if available).
+
+**--version=number**
+Print version number only.
+
+## DEVELOPMENT OPTIONS
+
+The following options are used to help when developing a JITed
+application.
+
+**--debug**, **--debug=OPTIONS**
+Turns on the debugging mode in the runtime. If an assembly was compiled
+with debugging information, it will produce line number information for
+stack traces.
+
+The optional OPTIONS argument is a comma separated list of debugging
+options. These options are turned off by default since they generate
+much larger and slower code at runtime.
+
+The following options are supported:
+*casts*
+Produces a detailed error when throwing a InvalidCastException. This
+option needs to be enabled as this generates more verbose code at
+execution time.
+
+*mdb-optimizations*
+Disable some JIT optimizations which are usually only disabled when
+running inside the debugger. This can be helpful if you want to attach
+to the running process with mdb.
+
+*gdb*
+Generate and register debugging information with gdb. This is only
+supported on some platforms, and only when using gdb 7.0 or later.
+
+**--profile**\[=*profiler*\[:*profiler_args*\]\]
+Loads a profiler module with the given arguments. For more information,
+see the **PROFILING** section.
+
+This option can be used multiple times; each time will load an
+additional profiler module.
+
+**--trace\[=expression\]**
+Shows method names as they are invoked. By default all methods are
+traced.
+
+The trace can be customized to include or exclude methods, classes or
+assemblies. A trace expression is a comma separated list of targets,
+each target can be prefixed with a minus sign to turn off a particular
+target. The words \`program', \`all' and \`disabled' have special
+meaning. \`program' refers to the main program being executed, and
+\`all' means all the method calls.
+
+The \`disabled' option is used to start up with tracing disabled. It can
+be enabled at a later point in time in the program by sending the
+SIGUSR2 signal to the runtime.
+
+Assemblies are specified by their name, for example, to trace all calls
+in the System assembly, use:
+
+
+ mono --trace=System app.exe
+
+Classes are specified with the T: prefix. For example, to trace all
+calls to the System.String class, use:
+
+
+ mono --trace=T:System.String app.exe
+
+And individual methods are referenced with the M: prefix, and the
+standard method notation:
+
+
+ mono --trace=M:System.Console:WriteLine app.exe
+
+Exceptions can also be traced, it will cause a stack trace to be printed
+every time an exception of the specified type is thrown. The exception
+type can be specified with or without the namespace, and to trace all
+exceptions, specify 'all' as the type name.
+
+
+ mono --trace=E:System.Exception app.exe
+
+As previously noted, various rules can be specified at once:
+
+
+ mono --trace=T:System.String,T:System.Random app.exe
+
+You can exclude pieces, the next example traces calls to System.String
+except for the System.String:Concat method.
+
+
+ mono --trace=T:System.String,-M:System.String:Concat
+
+You can trace managed to unmanaged transitions using the wrapper
+qualifier:
+
+
+ mono --trace=wrapper app.exe
+
+Finally, namespaces can be specified using the N: prefix:
+
+
+ mono --trace=N:System.Xml
+
+**--no-x86-stack-align**
+Don't align stack frames on the x86 architecture. By default, Mono
+aligns stack frames to 16 bytes on x86, so that local floating point and
+SIMD variables can be properly aligned. This option turns off the
+alignment, which usually saves one instruction per call, but might
+result in significantly lower floating point and SIMD performance.
+
+**--jitmap**
+Generate a JIT method map in a /tmp/perf-PID.map file. This file is then
+used, for example, by the perf tool included in recent Linux kernels.
+Each line in the file has:
+
+
+
+
+ HEXADDR HEXSIZE methodname
+
+Currently this option is only supported on Linux.
+
+## JIT MAINTAINER OPTIONS
+
+The maintainer options are only used by those developing the runtime
+itself, and not typically of interest to runtime users or developers.
+
+**--bisect=optimization:filename**
+This flag is used by the automatic optimization bug bisector. It takes
+an optimization flag and a filename of a file containing a list of full
+method names, one per line. When it compiles one of the methods in the
+file it will use the optimization given, in addition to the
+optimizations that are otherwise enabled. Note that if the optimization
+is enabled by default, you should disable it with \`-O\`, otherwise it
+will just apply to every method, whether it's in the file or not.
+
+**--break method**
+Inserts a breakpoint before the method whose name is \`method'
+(namespace.class:methodname). Use \`Main' as method name to insert a
+breakpoint on the application's main method. You can use it also with
+generics, for example "System.Collections.Generic.Queue\`1:Peek"
+
+**--breakonex**
+Inserts a breakpoint on exceptions. This allows you to debug your
+application with a native debugger when an exception is thrown.
+
+**--compile name**
+This compiles a method (namespace.name:methodname), this is used for
+testing the compiler performance or to examine the output of the code
+generator.
+
+**--compile-all**
+Compiles all the methods in an assembly. This is used to test the
+compiler performance or to examine the output of the code generator
+
+**--graph=TYPE METHOD**
+This generates a postscript file with a graph with the details about the
+specified method (namespace.name:methodname). This requires \`dot' and
+ghostview to be installed (it expects Ghostview to be called "gv").
+
+The following graphs are available:
+
+ cfg Control Flow Graph (CFG)
+ dtree Dominator Tree
+ code CFG showing code
+ ssa CFG showing code after SSA translation
+ optcode CFG showing code after IR optimizations
+
+Some graphs will only be available if certain optimizations are turned
+on.
+
+**--ncompile**
+Instruct the runtime on the number of times that the method specified by
+--compile (or all the methods if --compile-all is used) to be compiled.
+This is used for testing the code generator performance.
+
+**--stats=\[method\]**
+Displays information about the work done by the runtime during the
+execution of an application. If a method (namespace.name:methodname) is
+specified, it will display that information when the method is first run
+in addition to the end of program execution.
+
+**--wapi=hps\|semdel**
+Perform maintenance of the process shared data.
+
+semdel will delete the global semaphore.
+
+hps will list the currently used handles.
+
+**-v**, **--verbose**
+Increases the verbosity level, each time it is listed, increases the
+verbosity level to include more information (including, for example, a
+disassembly of the native code produced, code selector info etc.).
+
+## ATTACH SUPPORT
+
+The Mono runtime allows external processes to attach to a running
+process and load assemblies into the running program. To attach to the
+process, a special protocol is implemented in the Mono.Management
+assembly.
+
+With this support it is possible to load assemblies that have an entry
+point (they are created with -target:exe or -target:winexe) to be loaded
+and executed in the Mono process.
+
+The code is loaded into the root domain, and it starts execution on the
+special runtime attach thread. The attached program should create its
+own threads and return after invocation.
+
+This support allows for example debugging applications by having the
+csharp shell attach to running processes.
+
+## PROFILING
+
+The Mono runtime includes a profiler API that dynamically loaded
+profiler modules and embedders can use to collect performance-related
+data about an application. Profiler modules are loaded by passing the
+**--profile** command line argument to the Mono runtime.
+
+Mono ships with a few profiler modules, of which the **log** profiler is
+the most feature-rich. It is also the default profiler if the *profiler*
+argument is not given, or if **default** is given. It is possible to
+write your own profiler modules; see the **Custom profilers**
+sub-section.
+
+### Log profiler
+
+The log profiler can be used to collect a lot of information about a
+program running in the Mono runtime. This data can be used (both while
+the process is running and later) to do analyses of the program
+behavior, determine resource usage, performance issues or even look for
+particular execution patterns.
+
+This is accomplished by logging the events provided by the Mono runtime
+through the profiler API and periodically writing them to a file which
+can later be inspected with the **mprof-report**(1) tool.
+
+More information about how to use the log profiler is available on the
+**mono-profilers**(1) page, under the **LOG PROFILER** section, as well
+as the **mprof-report**(1) page.
+
+### Coverage profiler
+
+The code coverage profiler can instrument a program to help determine
+which classes, methods, code paths, etc are actually executed. This is
+most useful when running a test suite to determine whether the tests
+actually cover the code they're expected to.
+
+More information about how to use the coverage profiler is available on
+the **mono-profilers**(1) page, under the **COVERAGE** PROFILER section.
+
+### AOT profiler
+
+The AOT profiler can help improve startup performance by logging which
+generic instantiations are used by a program, which the AOT compiler can
+then use to compile those instantiations ahead of time so that they
+won't have to be JIT compiled at startup.
+
+More information about how to use the AOT profiler is available on the
+**mono-profilers**(1) page, under the **AOT PROFILER** section.
+
+### Custom profilers
+
+Custom profiler modules can be loaded in exactly the same way as the
+standard modules that ship with Mono. They can also access the same
+profiler API to gather all kinds of information about the code being
+executed.
+
+For example, to use a third-party profiler called **custom**, you would
+load it like this:
+
+ mono --profile=custom program.exe
+
+You could also pass arguments to it:
+
+ mono --profile=custom:arg1,arg2=arg3 program.exe
+
+In the above example, Mono will load the profiler from the shared
+library called *libmono-profiler-custom.so* (name varies based on
+platform, e.g., *libmono-profiler-custom.dylib* on OS X). This profiler
+module must be on your dynamic linker library path (**LD_LIBRARY_PATH**
+on most systems, **DYLD_LIBRARY_PATH** on OS X).
+
+For a sample of how to write your own custom profiler, look at the
+*samples/profiler/sample.c* file in the Mono source tree.
+
+## DEBUGGING AIDS
+
+To debug managed applications, you can use the **mdb** command, a
+command line debugger.
+
+It is possible to obtain a stack trace of all the active threads in Mono
+by sending the QUIT signal to Mono, you can do this from the command
+line, like this:
+
+
+ kill -QUIT pid
+
+Where pid is the Process ID of the Mono process you want to examine. The
+process will continue running afterwards, but its state is not
+guaranteed.
+
+**Important:** this is a last-resort mechanism for debugging
+applications and should not be used to monitor or probe a production
+application. The integrity of the runtime after sending this signal is
+not guaranteed and the application might crash or terminate at any given
+point afterwards.
+
+The **--debug=casts** option can be used to get more detailed
+information for Invalid Cast operations, it will provide information
+about the types involved.
+
+You can use the MONO_LOG_LEVEL and MONO_LOG_MASK environment variables
+to get verbose debugging output about the execution of your application
+within Mono.
+
+The *MONO_LOG_LEVEL* environment variable if set, the logging level is
+changed to the set value. Possible values are "error", "critical",
+"warning", "message", "info", "debug". The default value is "error".
+Messages with a logging level greater then or equal to the log level
+will be printed to stdout/stderr.
+
+Use "info" to track the dynamic loading of assemblies.
+
+Use the *MONO_LOG_MASK* environment variable to limit the extent of the
+messages you get: If set, the log mask is changed to the set value.
+Possible values are "asm" (assembly loader), "type", "dll" (native
+library loader), "gc" (garbage collector), "cfg" (config file loader),
+"aot" (precompiler), "security" (e.g. Moonlight CoreCLR support),
+"threadpool" (thread pool generic), "io-selector" (async socket
+operations), "io-layer" (I/O layer - processes, files, sockets, events,
+semaphores, mutexes and handles), "io-layer-process", "io-layer-file",
+"io-layer-socket", "io-layer-event", "io-layer-semaphore",
+"io-layer-mutex", "io-layer-handle" and "all". The default value is
+"all". Changing the mask value allows you to display only messages for a
+certain component. You can use multiple masks by comma separating them.
+For example to see config file messages and assembly loader messages set
+you mask to "asm,cfg".
+
+The following is a common use to track down problems with P/Invoke:
+
+
+ $ MONO_LOG_LEVEL="debug" MONO_LOG_MASK="dll" mono glue.exe
+
+## DEBUGGING WITH LLDB
+
+If you are using LLDB, you can use the **mono.py** script to print some
+internal data structures with it. To use this, add this to your
+**\$HOME/.lldbinit** file:
+
+ command script import $PREFIX/lib/mono/lldb/mono.py
+
+Where \$PREFIX is the prefix value that you used when you configured
+Mono (typically /usr).
+
+Once this is done, then you can inspect some Mono Runtime data
+structures, for example:
+
+ (lldb) p method
+
+ (MonoMethod *) $0 = 0x05026ac0 [mscorlib]System.OutOfMemoryException:.ctor()
+
+## SERIALIZATION
+
+Mono's XML serialization engine by default will use a reflection-based
+approach to serialize which might be slow for continuous processing (web
+service applications). The serialization engine will determine when a
+class must use a hand-tuned serializer based on a few parameters and if
+needed it will produce a customized C# serializer for your types at
+runtime. This customized serializer then gets dynamically loaded into
+your application.
+
+You can control this with the MONO_XMLSERIALIZER_THS environment
+variable.
+
+The possible values are **\`no'** to disable the use of a C# customized
+serializer, or an integer that is the minimum number of uses before the
+runtime will produce a custom serializer (0 will produce a custom
+serializer on the first access, 50 will produce a serializer on the 50th
+use). Mono will fallback to an interpreted serializer if the serializer
+generation somehow fails. This behavior can be disabled by setting the
+option **\`nofallback'** (for example:
+MONO_XMLSERIALIZER_THS=0,nofallback).
+
+## ENVIRONMENT VARIABLES
+
+**GC_DONT_GC**
+Turns off the garbage collection in Mono. This should be only used for
+debugging purposes
+
+**HTTP_PROXY**
+(Also **http_proxy**) If set, web requests using the Mono Class Library
+will be automatically proxied through the given URL. Not supported on
+Windows, Mac OS, iOS or Android. See also **NO_PROXY**.
+
+**LLVM_COUNT**
+When Mono is compiled with LLVM support, this instructs the runtime to
+stop using LLVM after the specified number of methods are JITed. This is
+a tool used in diagnostics to help isolate problems in the code
+generation backend. For example **LLVM_COUNT=10** would only compile 10
+methods with LLVM and then switch to the Mono JIT engine.
+**LLVM_COUNT=0** would disable the LLVM engine altogether.
+
+**MONO_ASPNET_INHIBIT_SETTINGSMAP**
+Mono contains a feature which allows modifying settings in the .config
+files shipped with Mono by using config section mappers. The mappers and
+the mapping rules are defined in the \$prefix/etc/mono/2.0/settings.map
+file and, optionally, in the settings.map file found in the top-level
+directory of your ASP.NET application. Both files are read by System.Web
+on application startup, if they are found at the above locations. If you
+don't want the mapping to be performed you can set this variable in your
+environment before starting the application and no action will be taken.
+
+**MONO_ASPNET_WEBCONFIG_CACHESIZE**
+Mono has a cache of ConfigSection objects for speeding up
+WebConfigurationManager queries. Its default size is 100 items, and when
+more items are needed, cache evictions start happening. If evictions are
+too frequent this could impose unnecessary overhead, which could be
+avoided by using this environment variable to set up a higher cache size
+(or to lower memory requirements by decreasing it).
+
+**MONO_CAIRO_DEBUG_DISPOSE**
+If set, causes Mono.Cairo to collect stack traces when objects are
+allocated, so that the finalization/Dispose warnings include information
+about the instance's origin.
+
+**MONO_CFG_DIR**
+If set, this variable overrides the default system configuration
+directory (\$PREFIX/etc). It's used to locate machine.config file.
+
+**MONO_COM**
+Sets the style of COM interop. If the value of this variable is "MS"
+Mono will use string marhsalling routines from the liboleaut32 for the
+BSTR type library, any other values will use the mono-builtin BSTR
+string marshalling.
+
+**MONO_CONFIG**
+If set, this variable overrides the default runtime configuration file
+(\$PREFIX/etc/mono/config). The --config command line options overrides
+the environment variable.
+
+**MONO_CPU_ARCH**
+Override the automatic cpu detection mechanism. Currently used only on
+arm. The format of the value is as follows:
+
+
+
+
+ "armvV [thumb[2]]"
+
+where V is the architecture number 4, 5, 6, 7 and the options can be
+currently be "thumb" or "thumb2". Example:
+
+
+ MONO_CPU_ARCH="armv4 thumb" mono ...
+
+**MONO_ARM_FORCE_SOFT_FLOAT**
+When Mono is built with a soft float fallback on ARM and this variable
+is set to "1", Mono will always emit soft float code, even if a VFP unit
+is detected.
+
+**MONO_DARWIN_USE_KQUEUE_FSW**
+Fall back on the kqueue FileSystemWatcher implementation in Darwin. The
+default is the FSEvent implementation.
+
+**MONO_DARWIN_WATCHER_MAXFDS**
+This is a debugging aid used to force limits on the kqueue
+FileSystemWatcher implementation in Darwin. There is no limit by
+default.
+
+**MONO_DISABLE_MANAGED_COLLATION**
+If this environment variable is \`yes', the runtime uses unmanaged
+collation (which actually means no culture-sensitive collation). It
+internally disables managed collation functionality invoked via the
+members of System.Globalization.CompareInfo class. Collation is enabled
+by default.
+
+**MONO_DISABLE_SHARED_AREA**
+Unix only: If set, disable usage of shared memory for exposing
+performance counters. This means it will not be possible to both
+externally read performance counters from this processes or read those
+of external processes.
+
+**MONO_DNS**
+When set, enables the use of a fully managed DNS resolver instead of the
+regular libc functions. This resolver performs much better when multiple
+queries are run in parallel.
+
+Note that /etc/nsswitch.conf will be ignored.
+
+**MONO_EGD_SOCKET**
+For platforms that do not otherwise have a way of obtaining random bytes
+this can be set to the name of a file system socket on which an egd or
+prngd daemon is listening.
+
+**MONO_ENABLE_AIO**
+If set, tells mono to attempt using native asynchronous I/O services. If
+not set, a default select/poll implementation is used. Currently epoll
+and kqueue are supported.
+
+**MONO_THREADS_SUSPEND** Selects a mechanism that Mono will use to suspend
+threads. May be set to "preemptive", "coop", or "hybrid". Threads may
+need to be suspended by the debugger, or using some .NET threading APIs,
+and most commonly when the SGen garbage collector needs to stop all
+threads during a critical phase of garbage collection. Preemptive mode
+is the mode that Mono has used historically, going back to the Boehm
+days, where the garbage collector would run at any point and suspend
+execution of all threads as required to perform a garbage collection.
+The cooperative mode on the other hand requires the cooperation of all
+threads to stop at a safe point. This makes for an easier to debug
+garbage collector and it improves the stability of the runtime because
+threads are not suspended when accessing critical resources. In
+scenarios where Mono is embedded in another application, cooperative
+suspend requires the embedder code to follow coding guidelines in order
+to cooperate with the garbage collector. Cooperative suspend in embedded
+Mono is currently experimental. Hybrid mode is a combination of the two
+that retains better compatability with scenarios where Mono is embedded
+in another application: threads that are running managed code or code
+that comprises the Mono runtime will be cooperatively suspended, while
+threads running embedder code will be preemptively suspended. Hybrid
+suspend is the default on some desktop platforms.
+
+Alternatively, coop and hybrid mode can be enabled at compile time by
+using the --enable-cooperative-suspend or --enable-hybrid-suspend flags,
+respectively, when calling configure. The **MONO_THREADS_SUSPEND**
+environment variable takes priority over the compiled default.
+
+**MONO_ENABLE_COOP_SUSPEND**
+This environment variable is obsolete, but retained for backward
+compatibility. Use **MONO_THREADS_SUSPEND** set to "coop" instead. Note
+that if configure flags were provided to enable cooperative or hybrid
+suspend, this variable is ignored.
+
+**MONO_ENV_OPTIONS**
+This environment variable allows you to pass command line arguments to a
+Mono process through the environment. This is useful for example to
+force all of your Mono processes to use LLVM or SGEN without having to
+modify any launch scripts.
+
+**MONO_SDB_ENV_OPTIONS**
+Used to pass extra options to the debugger agent in the runtime, as they
+were passed using --debugger-agent=.
+
+**MONO_EVENTLOG_TYPE**
+Sets the type of event log provider to use (for
+System.Diagnostics.EventLog).
+
+Possible values are:
+
+> *local\[:path\]*
+>
+> Persists event logs and entries to the local file system.
+>
+> The directory in which to persist the event logs, event sources and
+> entries can be specified as part of the value.
+>
+> If the path is not explicitly set, it defaults to
+> "/var/lib/mono/eventlog" on unix and "%APPDATA%no\ventlog" on Windows.
+>
+> *win32*
+>
+> **Uses the native win32 API to write events and registers event logs
+> and** event sources in the registry. This is only available on
+> Windows.
+>
+> On Unix, the directory permission for individual event log and event
+> source directories is set to 777 (with +t bit) allowing everyone to
+> read and write event log entries while only allowing entries to be
+> deleted by the user(s) that created them.
+>
+> *null*
+>
+> Silently discards any events.
+>
+> The default is "null" on Unix (and versions of Windows before NT), and
+> "win32" on Windows NT (and higher).
+
+**MONO_EXTERNAL_ENCODINGS**
+If set, contains a colon-separated list of text encodings to try when
+turning externally-generated text (e.g. command-line arguments or
+filenames) into Unicode. The encoding names come from the list provided
+by iconv, and the special case "default_locale" which refers to the
+current locale's default encoding.
+
+When reading externally-generated text strings UTF-8 is tried first, and
+then this list is tried in order with the first successful conversion
+ending the search. When writing external text (e.g. new filenames or
+arguments to new processes) the first item in this list is used, or
+UTF-8 if the environment variable is not set.
+
+The problem with using MONO_EXTERNAL_ENCODINGS to process your files is
+that it results in a problem: although its possible to get the right
+file name it is not necessarily possible to open the file. In general if
+you have problems with encodings in your filenames you should use the
+"convmv" program.
+
+**MONO_GC_PARAMS**
+When using Mono with the SGen garbage collector this variable controls
+several parameters of the collector. The variable's value is a comma
+separated list of words.
+
+**max-heap-size=***size*
+Sets the maximum size of the heap. The size is specified in bytes and
+must be a power of two. The suffixes \`k', \`m' and \`g' can be used to
+specify kilo-, mega- and gigabytes, respectively. The limit is the sum
+of the nursery, major heap and large object heap. Once the limit is
+reached the application will receive OutOfMemoryExceptions when trying
+to allocate. Not the full extent of memory set in max-heap-size could be
+available to satisfy a single allocation due to internal fragmentation.
+By default heap limits is disabled and the GC will try to use all
+available memory.
+
+**nursery-size=***size*
+Sets the size of the nursery. The size is specified in bytes and must be
+a power of two. The suffixes \`k', \`m' and \`g' can be used to specify
+kilo-, mega- and gigabytes, respectively. The nursery is the first
+generation (of two). A larger nursery will usually speed up the program
+but will obviously use more memory. The default nursery size 4 MB.
+
+**major=***collector*
+Specifies which major collector to use. Options are \`marksweep' for the
+Mark&Sweep collector, \`marksweep-conc' for concurrent Mark&Sweep and
+\`marksweep-conc-par' for parallel and concurrent Mark&Sweep. The
+concurrent Mark&Sweep collector is the default.
+
+**mode=balanced\|throughput\|pause**\[:*max-pause*\]
+Specifies what should be the garbage collector's target. The
+\`throughput' mode aims to reduce time spent in the garbage collector
+and improve application speed, the \`pause' mode aims to keep pause
+times to a minimum and it receives the argument *max-pause* which
+specifies the maximum pause time in milliseconds that is acceptable and
+the \`balanced' mode which is a general purpose optimal mode.
+
+**soft-heap-limit=***size*
+Once the heap size gets larger than this size, ignore what the default
+major collection trigger metric says and only allow four nursery size's
+of major heap growth between major collections.
+
+**evacuation-threshold=***threshold*
+Sets the evacuation threshold in percent. This option is only available
+on the Mark&Sweep major collectors. The value must be an integer in the
+range 0 to 100. The default is 66. If the sweep phase of the collection
+finds that the occupancy of a specific heap block type is less than this
+percentage, it will do a copying collection for that block type in the
+next major collection, thereby restoring occupancy to close to 100
+percent. A value of 0 turns evacuation off.
+
+**(no-)lazy-sweep**
+Enables or disables lazy sweep for the Mark&Sweep collector. If enabled,
+the sweeping of individual major heap blocks is done piecemeal whenever
+the need arises, typically during nursery collections. Lazy sweeping is
+enabled by default.
+
+**(no-)concurrent-sweep**
+Enables or disables concurrent sweep for the Mark&Sweep collector. If
+enabled, the iteration of all major blocks to determine which ones can
+be freed and which ones have to be kept and swept, is done concurrently
+with the running program. Concurrent sweeping is enabled by default.
+
+**stack-mark=***mark-mode*
+Specifies how application threads should be scanned. Options are
+\`precise\` and \`conservative\`. Precise marking allow the collector to
+know what values on stack are references and what are not. Conservative
+marking threats all values as potentially references and leave them
+untouched. Precise marking reduces floating garbage and can speed up
+nursery collection and allocation rate, it has the downside of requiring
+a significant extra memory per compiled method. The right option,
+unfortunately, requires experimentation.
+
+**save-target-ratio=***ratio*
+Specifies the target save ratio for the major collector. The collector
+lets a given amount of memory to be promoted from the nursery due to
+minor collections before it triggers a major collection. This amount is
+based on how much memory it expects to free. It is represented as a
+ratio of the size of the heap after a major collection. Valid values are
+between 0.1 and 2.0. The default is 0.5. Smaller values will keep the
+major heap size smaller but will trigger more major collections.
+Likewise, bigger values will use more memory and result in less frequent
+major collections. This option is EXPERIMENTAL, so it might disappear in
+later versions of mono.
+
+**default-allowance-ratio=***ratio*
+Specifies the default allocation allowance when the calculated size is
+too small. The allocation allowance is how much memory the collector let
+be promoted before triggered a major collection. It is a ratio of the
+nursery size. Valid values are between 1.0 and 10.0. The default is 4.0.
+Smaller values lead to smaller heaps and more frequent major
+collections. Likewise, bigger values will allow the heap to grow faster
+but use more memory when it reaches a stable size. This option is
+EXPERIMENTAL, so it might disappear in later versions of mono.
+
+**minor=***minor-collector*
+Specifies which minor collector to use. Options are \`simple' which
+promotes all objects from the nursery directly to the old generation,
+\`simple-par' which has same promotion behavior as \`simple' but using
+multiple workers and \`split' which lets objects stay longer on the
+nursery before promoting.
+
+**alloc-ratio=***ratio*
+Specifies the ratio of memory from the nursery to be use by the alloc
+space. This only can only be used with the split minor collector. Valid
+values are integers between 1 and 100. Default is 60.
+
+**promotion-age=***age*
+Specifies the required age of an object must reach inside the nursery
+before been promoted to the old generation. This only can only be used
+with the split minor collector. Valid values are integers between 1
+and 14. Default is 2.
+
+**(no-)cementing**
+Enables or disables cementing. This can dramatically shorten nursery
+collection times on some benchmarks where pinned objects are referred to
+from the major heap.
+
+**allow-synchronous-major**
+This forbids the major collector from performing synchronous major
+collections. The major collector might want to do a synchronous
+collection due to excessive fragmentation. Disabling this might trigger
+OutOfMemory error in situations that would otherwise not happen.
+
+**MONO_GC_DEBUG**
+When using Mono with the SGen garbage collector this environment
+variable can be used to turn on various debugging features of the
+collector. The value of this variable is a comma separated list of
+words. Do not use these options in production.
+
+*number*
+Sets the debug level to the specified number.
+
+**print-allowance**
+After each major collection prints memory consumption for before and
+after the collection and the allowance for the minor collector, i.e. how
+much the heap is allowed to grow from minor collections before the next
+major collection is triggered.
+
+**print-pinning**
+Gathers statistics on the classes whose objects are pinned in the
+nursery and for which global remset entries are added. Prints those
+statistics when shutting down.
+
+**collect-before-allocs**
+**check-remset-consistency**
+This performs a remset consistency check at various opportunities, and
+also clears the nursery at collection time, instead of the default, when
+buffers are allocated (clear-at-gc). The consistency check ensures that
+there are no major to minor references that are not on the remembered
+sets.
+
+**mod-union-consistency-check**
+Checks that the mod-union cardtable is consistent before each finishing
+major collection pause. This check is only applicable to concurrent
+major collectors.
+
+**check-mark-bits**
+Checks that mark bits in the major heap are consistent at the end of
+each major collection. Consistent mark bits mean that if an object is
+marked, all objects that it had references to must also be marked.
+
+**check-nursery-untag**
+After garbage collections, check whether all vtable pointers are no
+longer tagged.
+
+**xdomain-checks**
+Performs a check to make sure that no references are left to an unloaded
+AppDomain.
+
+**clear-at-tlab-creation**
+Clears the nursery incrementally when the thread local allocation
+buffers (TLAB) are created. The default setting clears the whole nursery
+at GC time.
+
+**debug-clear-at-tlab-creation**
+Clears the nursery incrementally when the thread local allocation
+buffers (TLAB) are created, but at GC time fills it with the byte
+\`0xff\`, which should result in a crash more quickly if
+\`clear-at-tlab-creation\` doesn't work properly.
+
+**clear-at-gc**
+This clears the nursery at GC time instead of doing it when the thread
+local allocation buffer (TLAB) is created. The default is to clear the
+nursery at TLAB creation time.
+
+**disable-minor**
+Don't do minor collections. If the nursery is full, a major collection
+is triggered instead, unless it, too, is disabled.
+
+**disable-major**
+Don't do major collections.
+
+**conservative-stack-mark**
+Forces the GC to scan the stack conservatively, even if precise scanning
+is available.
+
+**no-managed-allocator**
+Disables the managed allocator.
+
+**managed-allocator**
+Enables the managed allocator.
+
+**check-scan-starts**
+If set, does a plausibility check on the scan_starts before and after
+each collection
+
+**verify-nursery-at-minor-gc**
+If set, does a complete object walk of the nursery at the start of each
+minor collection.
+
+**dump-nursery-at-minor-gc**
+If set, dumps the contents of the nursery at the start of each minor
+collection. Requires verify-nursery-at-minor-gc to be set.
+
+**heap-dump=***file*
+Dumps the heap contents to the specified file. To visualize the
+information, use the mono-heapviz tool.
+
+**binary-protocol=***file*
+Outputs the debugging output to the specified file. For this to work,
+Mono needs to be compiled with the BINARY_PROTOCOL define on sgen-gc.c.
+You can then use this command to explore the output
+
+ sgen-grep-binprot 0x1234 0x5678 < file
+
+**nursery-canaries**
+If set, objects allocated in the nursery are suffixed with a canary
+(guard) word, which is checked on each minor collection. Can be used to
+detect/debug heap corruption issues. This disables the usage of the
+managed allocator, because allocation from full aot code is inconsistent
+with this option. If the application is guaranteed not to use aot code,
+the managed allocator can be enabled back with managed-allocator option.
+
+**do-not-finalize(=***classes***)**
+If enabled, finalizers will not be run. Everything else will be
+unaffected: finalizable objects will still be put into the finalization
+queue where they survive until they're scheduled to finalize. Once
+they're not in the queue anymore they will be collected regularly. If a
+list of comma-separated class names is given, only objects from those
+classes will not be finalized.
+
+**log-finalizers**
+Log verbosely around the finalization process to aid debugging.
+
+**MONO_GAC_PREFIX**
+Provides a prefix the runtime uses to look for Global Assembly Caches.
+Directories are separated by the platform path separator (colons on
+unix). MONO_GAC_PREFIX should point to the top directory of a prefixed
+install. Or to the directory provided in the gacutil /gacdir command.
+Example: **/home/username/.mono:/usr/local/mono/**
+
+**MONO_IOMAP**
+(deprecated) Enabled some filename rewriting support to assist
+badly-written applications that hard-code Windows paths. It no longer
+works as of Mono 6.0.
+
+**MONO_LLVM**
+When Mono is using the LLVM code generation backend you can use this
+environment variable to pass code generation options to the LLVM
+compiler.
+
+**MONO_MANAGED_WATCHER**
+If set to "disabled", System.IO.FileSystemWatcher will use a file
+watcher implementation which silently ignores all the watching requests.
+If set to any other value, System.IO.FileSystemWatcher will use the
+default managed implementation (slow). If unset, mono will try to use
+inotify, FAM, Gamin, kevent under Unix systems and native API calls on
+Windows, falling back to the managed implementation on error.
+
+**MONO_MESSAGING_PROVIDER**
+Mono supports a plugin model for its implementation of System.Messaging
+making it possible to support a variety of messaging implementations
+(e.g. AMQP, ActiveMQ). To specify which messaging implementation is to
+be used the evironement variable needs to be set to the full class name
+for the provider. E.g. to use the RabbitMQ based AMQP implementation the
+variable should be set to:
+
+ Mono.Messaging.RabbitMQ.RabbitMQMessagingProvider,Mono.Messaging.RabbitMQ
+ MONO_NO_SMP
+ If set causes the mono process to be bound to a single processor. This may be
+ useful when debugging or working around race conditions.
+ MONO_NO_TLS
+ Disable inlining of thread local accesses. Try setting this if you get a segfault
+ early on in the execution of mono.
+ MONO_PATH
+ Provides a search path to the runtime where to look for library
+ files. This is a tool convenient for debugging applications, but
+ should not be used by deployed applications as it breaks the assembly
+ loader in subtle ways.
+ Directories are separated by the platform path separator (colons on unix). Example:
+ /home/username/lib:/usr/local/mono/lib
+ Relative paths are resolved based on the launch-time current directory.
+ Alternative solutions to MONO_PATH include: installing libraries into
+ the Global Assembly Cache (see gacutil(1)) or having the dependent
+ libraries side-by-side with the main executable.
+ For a complete description of recommended practices for application
+ deployment, see
+ http://www.mono-project.com/docs/getting-started/application-deployment/
+ MONO_SHARED_DIR
+ If set its the directory where the ".wapi" handle state is stored.
+ This is the directory where the Windows I/O Emulation layer stores its
+ shared state data (files, events, mutexes, pipes). By default Mono
+ will store the ".wapi" directory in the users's home directory.
+ MONO_SHARED_HOSTNAME
+ Uses the string value of this variable as a replacement for the host name when
+ creating file names in the ".wapi" directory. This helps if the host name of
+ your machine is likely to be changed when a mono application is running or if
+ you have a .wapi directory shared among several different computers.
+ Mono typically uses the hostname to create the files that are used to
+ share state across multiple Mono processes. This is done to support
+ home directories that might be shared over the network.
+ MONO_STRICT_IO_EMULATION
+ If set, extra checks are made during IO operations. Currently, this
+ includes only advisory locks around file writes.
+ MONO_TLS_PROVIDER
+ This environment variable controls which TLS/SSL provider Mono will
+ use. The options are usually determined by the operating system where
+ Mono was compiled and the configuration options that were used for
+ it.
+ default
+ Uses the default TLS stack that the Mono runtime was configured with.
+ Usually this is configured to use Apple's SSL stack on Apple
+ platforms, and Boring SSL on other platforms.
+ apple
+ Forces the use of the Apple SSL stack, only works on Apple platforms.
+ btls
+ Forces the use of the BoringSSL stack. See
+ https://opensource.google.com/projects/boringssl for more information
+ about this stack.
+ legacy
+ This is the old Mono stack, which only supports SSL and TLS up to
+ version 1.0. It is deprecated and will be removed in the future.
+ MONO_TLS_SESSION_CACHE_TIMEOUT
+ The time, in seconds, that the SSL/TLS session cache will keep it's entry to
+ avoid a new negotiation between the client and a server. Negotiation are very
+ CPU intensive so an application-specific custom value may prove useful for
+ small embedded systems.
+ The default is 180 seconds.
+ MONO_THREADS_PER_CPU
+ The minimum number of threads in the general threadpool will be
+ MONO_THREADS_PER_CPU * number of CPUs. The default value for this
+ variable is 1.
+ MONO_XMLSERIALIZER_THS
+ Controls the threshold for the XmlSerializer to produce a custom
+ serializer for a given class instead of using the Reflection-based
+ interpreter. The possible values are `no' to disable the use of a
+ custom serializer or a number to indicate when the XmlSerializer
+ should start serializing. The default value is 50, which means that
+ the a custom serializer will be produced on the 50th use.
+ MONO_X509_REVOCATION_MODE
+ Sets the revocation mode used when validating a X509 certificate chain (https,
+ ftps, smtps...). The default is 'nocheck', which performs no revocation check
+ at all. The other possible values are 'offline', which performs CRL check (not
+ implemented yet) and 'online' which uses OCSP and CRL to verify the revocation
+ status (not implemented yet).
+ NO_PROXY
+ (Also no_proxy) If both HTTP_PROXY and NO_PROXY are
+ set, NO_PROXY will be treated as a comma-separated list of "bypass" domains
+ which will not be sent through the proxy. Domains in NO_PROXY may contain
+ wildcards, as in "*.mono-project.com" or "build????.local". Not supported on
+ Windows, Mac OS, iOS or Android.
+
+## ENVIRONMENT VARIABLES FOR DEBUGGING
+
+**MONO_ASPNET_NODELETE**
+If set to any value, temporary source files generated by ASP.NET support
+classes will not be removed. They will be kept in the user's temporary
+directory.
+
+**MONO_DEBUG**
+If set, enables some features of the runtime useful for debugging. This
+variable should contain a comma separated list of debugging options.
+Currently, the following options are supported:
+
+**align-small-structs**
+Enables small structs alignment to 4/8 bytes.
+
+**arm-use-fallback-tls**
+When this option is set on ARM, a fallback thread local store will be
+used instead of the default fast thread local storage primitives.
+
+**break-on-unverified**
+If this variable is set, when the Mono VM runs into a verification
+problem, instead of throwing an exception it will break into the
+debugger. This is useful when debugging verifier problems
+
+**casts**
+This option can be used to get more detailed information from
+InvalidCast exceptions, it will provide information about the types
+involved.
+
+**check-pinvoke-callconv**
+This option causes the runtime to check for calling convention
+mismatches when using pinvoke, i.e. mixing cdecl/stdcall. It only works
+on windows. If a mismatch is detected, an ExecutionEngineException is
+thrown.
+
+**collect-pagefault-stats**
+Collects information about pagefaults. This is used internally to track
+the number of page faults produced to load metadata. To display this
+information you must use this option with "--stats" command line option.
+
+**debug-domain-unload**
+When this option is set, the runtime will invalidate the domain memory
+pool instead of destroying it.
+
+**disable_omit_fp**
+Disables a compiler optimization where the frame pointer is omitted from
+the stack. This optimization can interact badly with debuggers.
+
+**dont-free-domains**
+This is an Optimization for multi-AppDomain applications (most commonly
+ASP.NET applications). Due to internal limitations Mono, Mono by default
+does not use typed allocations on multi-appDomain applications as they
+could leak memory when a domain is unloaded.
+
+Although this is a fine default, for applications that use more than on
+AppDomain heavily (for example, ASP.NET applications) it is worth
+trading off the small leaks for the increased performance (additionally,
+since ASP.NET applications are not likely going to unload the
+application domains on production systems, it is worth using this
+feature).
+
+**dyn-runtime-invoke**
+Instructs the runtime to try to use a generic runtime-invoke wrapper
+instead of creating one invoke wrapper.
+
+**explicit-null-checks**
+Makes the JIT generate an explicit NULL check on variable dereferences
+instead of depending on the operating system to raise a SIGSEGV or
+another form of trap event when an invalid memory location is accessed.
+
+**gdb**
+Equivalent to setting the **MONO_XDEBUG** variable, this emits symbols
+into a shared library as the code is JITed that can be loaded into GDB
+to inspect symbols.
+
+**gen-seq-points**
+Automatically generates sequence points where the IL stack is empty.
+These are places where the debugger can set a breakpoint.
+
+**llvm-disable-implicit-null-checks**
+Makes the LLVM backend use explicit NULL checks on variable dereferences
+instead of depending on operating system support for signals or traps
+when an invalid memory location is accessed. Unconditionally enabled by
+explicit-null-checks.
+
+**no-compact-seq-points**
+Unless the option is used, the runtime generates sequence points data
+that maps native offsets to IL offsets. Sequence point data is used to
+display IL offset in stacktraces. Stacktraces with IL offsets can be
+symbolicated using mono-symbolicate tool.
+
+**handle-sigint**
+Captures the interrupt signal (Control-C) and displays a stack trace
+when pressed. Useful to find out where the program is executing at a
+given point. This only displays the stack trace of a single thread.
+
+**init-stacks**
+Instructs the runtime to initialize the stack with some known values
+(0x2a on x86-64) at the start of a method to assist in debuggin the JIT
+engine.
+
+**keep-delegates**
+This option will leak delegate trampolines that are no longer referenced
+as to present the user with more information about a delegate misuse.
+Basically a delegate instance might be created, passed to unmanaged
+code, and no references kept in managed code, which will garbage collect
+the code. With this option it is possible to track down the source of
+the problems.
+
+**no-gdb-backtrace**
+This option will disable the GDB backtrace emitted by the runtime after
+a SIGSEGV or SIGABRT in unmanaged code.
+
+**partial-sharing**
+When this option is set, the runtime can share generated code between
+generic types effectively reducing the amount of code generated.
+
+**reverse-pinvoke-exceptions**
+This option will cause mono to abort with a descriptive message when
+during stack unwinding after an exception it reaches a native stack
+frame. This happens when a managed delegate is passed to native code,
+and the managed delegate throws an exception. Mono will normally try to
+unwind the stack to the first (managed) exception handler, and it will
+skip any native stack frames in the process. This leads to undefined
+behaviour (since mono doesn't know how to process native frames), leaks,
+and possibly crashes too.
+
+**single-imm-size**
+This guarantees that each time managed code is compiled the same
+instructions and registers are used, regardless of the size of used
+values.
+
+**soft-breakpoints**
+This option allows using single-steps and breakpoints in hardware where
+we cannot do it with signals.
+
+**suspend-on-native-crash**
+This option will suspend the program when a native crash occurs
+(SIGSEGV, SIGILL, ...). This is useful for debugging crashes which do
+not happen under gdb, since a live process contains more information
+than a core file.
+
+**suspend-on-sigsegv**
+Same as **suspend-on-native-crash**.
+
+**suspend-on-exception**
+This option will suspend the program when an exception occurs.
+
+**suspend-on-unhandled**
+This option will suspend the program when an unhandled exception occurs.
+
+**thread-dump-dir=DIR**
+Use DIR for storage thread dumps created by SIGQUIT.
+
+**weak-memory-model**
+Don't enforce the CLR memory model on platforms with weak memory models.
+This can introduce random crashes in some rare cases, for multithreaded
+environments. This can be used for a performance boost on applications
+that are single threaded.
+
+**verbose-gdb**
+Make gdb output on native crashes more verbose.
+
+**MONO_LOG_LEVEL**
+The logging level, possible values are \`error', \`critical',
+\`warning', \`message', \`info' and \`debug'. See the DEBUGGING section
+for more details.
+
+**MONO_LOG_MASK**
+Controls the domain of the Mono runtime that logging will apply to. If
+set, the log mask is changed to the set value. Possible values are "asm"
+(assembly loader), "type", "dll" (native library loader), "gc" (garbage
+collector), "cfg" (config file loader), "aot" (precompiler), "security"
+(e.g. Moonlight CoreCLR support) and "all". The default value is "all".
+Changing the mask value allows you to display only messages for a
+certain component. You can use multiple masks by comma separating them.
+For example to see config file messages and assembly loader messages set
+you mask to "asm,cfg".
+
+**MONO_LOG_DEST**
+Controls where trace log messages are written. If not set then the
+messages go to stdout. If set, the string either specifies a path to a
+file that will have messages appended to it, or the string "syslog" in
+which case the messages will be written to the system log. Under
+Windows, this is simulated by writing to a file called "mono.log".
+**MONO_LOG_HEADER** Controls whether trace log messages not directed to
+syslog have the id, timestamp, and pid as the prefix to the log message.
+To enable a header this environment variable need just be non-null.
+
+**MONO_TRACE**
+Used for runtime tracing of method calls. The format of the comma
+separated trace options is:
+
+
+
+
+ [-]M:method name
+ [-]N:namespace
+ [-]T:class name
+ [-]all
+ [-]program
+ disabled Trace output off upon start.
+
+You can toggle trace output on/off sending a SIGUSR2 signal to the
+program.
+
+**MONO_TRACE_LISTENER**
+If set, enables the System.Diagnostics.DefaultTraceListener, which will
+print the output of the System.Diagnostics Trace and Debug classes. It
+can be set to a filename, and to Console.Out or Console.Error to display
+output to standard output or standard error, respectively. If it's set
+to Console.Out or Console.Error you can append an optional prefix that
+will be used when writing messages like this:
+Console.Error:MyProgramName. See the
+System.Diagnostics.DefaultTraceListener documentation for more
+information.
+
+**MONO_WCF_TRACE**
+This eases WCF diagnostics functionality by simply outputs all log
+messages from WCF engine to "stdout", "stderr" or any file passed to
+this environment variable. The log format is the same as usual
+diagnostic output.
+
+**MONO_XEXCEPTIONS**
+This throws an exception when a X11 error is encountered; by default a
+message is displayed but execution continues
+
+**MONO_XMLSERIALIZER_DEBUG**
+Set this value to 1 to prevent the serializer from removing the
+temporary files that are created for fast serialization; This might be
+useful when debugging.
+
+**MONO_XSYNC**
+This is used in the System.Windows.Forms implementation when running
+with the X11 backend. This is used to debug problems in Windows.Forms as
+it forces all of the commands send to X11 server to be done
+synchronously. The default mode of operation is asynchronous which makes
+it hard to isolate the root of certain problems.
+
+**MONO_XDEBUG**
+When the the MONO_XDEBUG env var is set, debugging info for JITted code
+is emitted into a shared library, loadable into gdb. This enables, for
+example, to see managed frame names on gdb backtraces.
+
+**MONO_VERBOSE_METHOD**
+Enables the maximum JIT verbosity for the specified method. This is very
+helpfull to diagnose a miscompilation problems of a specific method.
+This can be a semicolon-separated list of method names to match. If the
+name is simple, this applies to any method with that name, otherwise you
+can use a mono method description (see the section METHOD DESCRIPTIONS).
+
+**MONO_JIT_DUMP_METHOD**
+Enables sending of the JITs intermediate representation for a specified
+method to the IdealGraphVisualizer tool.
+
+**MONO_VERBOSE_HWCAP**
+If set, makes the JIT output information about detected CPU features
+(such as SSE, CMOV, FCMOV, etc) to stdout.
+
+**MONO_CONSERVATIVE_HWCAP**
+If set, the JIT will not perform any hardware capability detection. This
+may be useful to pinpoint the cause of JIT issues. This is the default
+when Mono is built as an AOT cross compiler, so that the generated code
+will run on most hardware.
+
+**MONO_PROFILE**
+Equivalent to **--profile** argument.
+
+## VALGRIND
+
+If you want to use Valgrind, you will find the file \`mono.supp' useful,
+it contains the suppressions for the GC which trigger incorrect
+warnings. Use it like this:
+
+ valgrind --suppressions=mono.supp mono ...
+
+## DTRACE
+
+On some platforms, Mono can expose a set of DTrace probes (also known as
+user-land statically defined, USDT Probes).
+
+They are defined in the file \`mono.d'.
+**ves-init-begin, ves-init-end**
+
+Begin and end of runtime initialization.
+
+**method-compile-begin, method-compile-end**
+
+Begin and end of method compilation. The probe arguments are class name,
+method name and signature, and in case of method-compile-end success or
+failure of compilation.
+
+**gc-begin, gc-end**
+
+Begin and end of Garbage Collection.
+
+To verify the availability of the probes, run:
+ dtrace -P mono'$target' -l -c mono
+
+## PERMISSIONS
+
+Mono's Ping implementation for detecting network reachability can create
+the ICMP packets itself without requiring the system ping command to do
+the work. If you want to enable this on Linux for non-root users, you
+need to give the Mono binary special permissions.
+
+As root, run this command:
+
+ # setcap cap_net_raw=+ep /usr/bin/mono
+
+## FILES
+
+On Unix assemblies are loaded from the installation lib directory. If
+you set \`prefix' to /usr, the assemblies will be located in /usr/lib.
+On Windows, the assemblies are loaded from the directory where mono and
+mint live.
+
+**~/.mono/aot-cache**
+
+The directory for the ahead-of-time compiler demand creation assemblies
+are located.
+
+**/etc/mono/config, ~/.mono/config**
+
+Mono runtime configuration file. See the mono-config(5) manual page for
+more information.
+
+**~/.config/.mono/certs, /usr/share/.mono/certs**
+
+Contains Mono certificate stores for users / machine. See the certmgr(1)
+manual page for more information on managing certificate stores and the
+mozroots(1) page for information on how to import the Mozilla root
+certificates into the Mono certificate store.
+
+**~/.mono/assemblies/ASSEMBLY/ASSEMBLY.config**
+
+Files in this directory allow a user to customize the configuration for
+a given system assembly, the format is the one described in the
+mono-config(5) page.
+
+**~/.config/.mono/keypairs, /usr/share/.mono/keypairs**
+
+Contains Mono cryptographic keypairs for users / machine. They can be
+accessed by using a CspParameters object with DSACryptoServiceProvider
+and RSACryptoServiceProvider classes.
+
+**~/.config/.isolatedstorage, ~/.local/share/.isolatedstorage, /usr/share/.isolatedstorage**
+
+Contains Mono isolated storage for non-roaming users, roaming users and
+local machine. Isolated storage can be accessed using the classes from
+the System.IO.IsolatedStorage namespace.
+
+**\.config**
+
+Configuration information for individual assemblies is loaded by the
+runtime from side-by-side files with the .config files, see the
+http://www.mono-project.com/Config for more information.
+
+**Web.config, web.config**
+
+ASP.NET applications are configured through these files, the
+configuration is done on a per-directory basis. For more information on
+this subject see the http://www.mono-project.com/Config_system.web page.
+
+## MAILING LISTS
+
+Mailing lists are listed at the
+http://www.mono-project.com/community/help/mailing-lists/
+
+## WEB SITE
+
+http://www.mono-project.com
+
+## SEE ALSO
+
+**certmgr**(1), **cert-sync**(1), **csharp**(1), **gacutil**(1),
+**mcs**(1), **monodis**(1), **mono-config**(5), **mono-profilers**(1),
+**mprof-report**(1), **pdb2mdb**(1), **xsp**(1), **mod_mono**(8)
+
+For more information on AOT:
+http://www.mono-project.com/docs/advanced/aot/
+
+For ASP.NET-related documentation, see the xsp(1) manual page
diff --git a/docs/project/list-of-diagnostics.md b/docs/project/list-of-diagnostics.md
index 9ad0f02f5f88..41d5a78f3f17 100644
--- a/docs/project/list-of-diagnostics.md
+++ b/docs/project/list-of-diagnostics.md
@@ -109,6 +109,7 @@ The PR that reveals the implementation of the `true` and set one of the attributes in the following section.
+
+### Disabling runtime tests (src/tests) with issues.targets
+
+Out-of-process tests are disabled by adding the test to the appropriate place, under the appropriate configuration condition,
+in the [issues.targets](../../../src/tests/issues.targets) file. Additionally, tests that are the only `[Fact]`-attributed method in their assembly may be disabled through issues.targets. All temporarily disabled tests must have a
link to a GitHub issue in the `` element. Disabling a test here can be conditioned on processor
architecture, runtime, and operating system.
@@ -64,15 +82,8 @@ Note that these properties can be conditional, e.g.:
More information about writing/adding tests to src/tests can be found [here](../testing/coreclr/test-configuration.md).
-## Disabling runtime tests (src/tests) with xunit attributes
-
-When this document was written, the src/tests tree was in the process of being converted to a new
-execution model (see [dotnet/runtime#54512](https://github.com/dotnet/runtime/issues/54512)). This model annotates tests with xunit-style
-`[Fact]` attributes. For tests which have been converted to this form, all the xunit attributes related to test disabling
-described in the "src/libraries" section below are also applicable.
-
## Disabling libraries tests (src/libraries)
Information on disabling libraries tests is found [here](../testing/libraries/filtering-tests.md).
-In particular, look at `ActiveIssueAttribute`, `SkipOnCoreClrAttribute`, and `SkipOnMonoAttribute`.
\ No newline at end of file
+In particular, look at `ActiveIssueAttribute`, `SkipOnCoreClrAttribute`, and `SkipOnMonoAttribute`.
diff --git a/docs/workflow/testing/coreclr/testing.md b/docs/workflow/testing/coreclr/testing.md
index a09ef364ae53..46de9e022311 100644
--- a/docs/workflow/testing/coreclr/testing.md
+++ b/docs/workflow/testing/coreclr/testing.md
@@ -7,11 +7,13 @@
* [Building an Individual Test](#building-an-individual-test)
* [Building a Test Directory](#building-a-test-directory)
* [Building a Test Subtree](#building-a-test-subtree)
+ * [Test Executors](#test-executors)
+ * [The Standalone Test Runner and Build Time Test Filtering](#the-standalone-test-runner-and-build-time-test-filtering)
+ * [Building all tests with the Standalone Runner](#building-all-tests-with-the-standalone-runner)
* [Building C++/CLI Native Test Components Against the Live Ref Assemblies](#building-ccli-native-test-components-against-the-live-ref-assemblies)
* [Test Priorities](#test-priorities)
* [Running the Tests](#running-the-tests)
* [Running Individual Tests](#running-individual-tests)
- * [Tests Without a Main Method](#tests-without-a-main-method)
* [PAL Tests (macOS and Linux only)](#pal-tests-macos-and-linux-only)
* [Building PAL Tests](#building-pal-tests)
* [Running PAL Tests](#running-pal-tests)
@@ -62,7 +64,7 @@ This example assumes you built CoreCLR on _Debug_ mode and the Libraries on _Rel
The following subsections will explain how to segment the test suite according to your needs. There are three main scopes of building tests:
-* Individual Test
+* Individual Test Runner
* Full Directory
* Entire Subtree
@@ -83,19 +85,19 @@ To build an individual test, you have to pass the `-test` flag along with the pa
On Windows:
```cmd
-.\src\tests\build.cmd test JIT\Intrinsics\MathRoundDouble_ro.csproj test JIT\Intrinsics\MathFloorDouble_ro.csproj
+.\src\tests\build.cmd test JIT\Methodical\Methodical_d1.csproj test JIT\JIT_ro.csproj
```
On macOS and Linux:
```bash
-./src/tests/build.sh -test:JIT/Intrinsics/MathRoundDouble_ro.csproj -test:JIT/Intrinsics/MathFloorDouble_ro.csproj
+./src/tests/build.sh -test:JIT/Methodical/Methodical_d1.csproj -test:JIT/JIT_ro.csproj
```
Alternatively, you can call _build_ directly using the `dotnet.cmd/dotnet.sh` script at the root of the repo and pass all arguments directly yourself:
```bash
-./dotnet.sh build -c src/tests/path/to/test/csproj
+./dotnet.sh build -c src/tests/path/to/test.csproj
```
### Building a Test Directory
@@ -105,13 +107,13 @@ To build all the tests contained in an individual directory, you have to pass th
On Windows:
```cmd
-.\src\tests\build.cmd dir JIT\Methodical\Arrays\lcs dir JIT\Methodical\cctor\misc\Desktop
+.\src\tests\build.cmd dir JIT dir Loader
```
On macOS and Linux:
```bash
-./src/tests/build.sh -dir:JIT/Methodical/Arrays/lcs -dir:JIT/Methodical/cctor/misc/Desktop
+./src/tests/build.sh -dir:JIT -dir:Loader
```
### Building a Test Subtree
@@ -130,6 +132,24 @@ On macOS and Linux:
./src/tests/build.sh -tree:baseservices/exceptions -tree:JIT/Methodical
```
+### Test Executors
+
+We have multiple different mechanisms of executing tests.
+
+Our test entrypoints are generally what we call "merged test runners", as they provide an executable runner project for multiple different test assemblies. These projects can be identified by the `` line in their .csproj file. These projects provide a simple experience for running tests. When executing a merged runner project, it will run each test sequentially and record if it passes or fails in an xunit results file. The merged test runner support runtime test filtering. If specified, the first argument to the test runner is treated as a `dotnet test --filter` argument following the xUnit rules in their documentation. Today, the runner only supports the simple form, a substring of a test's fully-qualified name, in the format `Namespace.ContainingTypeName.TypeName.Method`. If support for further filtering options is desired, please open an issue requesting it.
+
+Some tests need to be run in their own process as they interact with global process state, they have a custom test entrypoint, or they interact poorly with other tests in the same process. These tests are generally marked with `true` in their project files. These tests can be run directly, but they can also be invoked through their corresponding merged test runner. The merged test runner will invoke them as a subprocess in the same manner as if they were run individually.
+
+#### The Standalone Test Runner and Build Time Test Filtering
+
+Sometimes you may want to run a test with the least amount of code before actually executing the test. In addition to the merged test runner, we have another runner mode known as the "Standalone" runner. This runner is used by default in tests that require process isolation. This runner consists of a simple `try-catch` around executing each test sequentially, with no test results file or runtime test filtering.
+
+To filter tests on a merged test runner built as standalone, you can set the `TestFilter` property, like so: `./dotnet.sh build -c Checked src/tests/path/to/test.csproj -p:TestFilter=SubstringOfFullyQualifiedTestName`. This mechanism supports the same filtering as the runtime test filtering. Using this mechanism will allow you to skip individual test cases at build time instead of at runtime.
+
+#### Building all tests with the Standalone Runner
+
+If you wish to use the Standalone runner described in the [previous section](#the-standalone-test-runner-and-build-time-test-filtering), you can set the `BuildAllTestsAsStandalone` environment variable to `true` when invoking the `./src/tests/build.sh` or `./src/tests/build.cmd` scripts (for example, `export BuildAllTestsAsStandalone=true` or `set BuildAllTestsAsStandalone=true`). This will build all tests that are not directly in a merged test runner's project as separate executable tests and build only the tests that are compiled into the runner directly. If a runner has no tests that are built directly into the runner, then it will be excluded.
+
### Building C++/CLI Native Test Components Against the Live Ref Assemblies
By default, the _C++/CLI_ native test components build against the _ref pack_ from the SDK specified in the `global.json` file in the root of the repository. To build these components against the _ref assemblies_ produced in the build, pass the `-cmakeargs -DCPP_CLI_LIVE_REF_ASSEMBLIES=1` parameters to the test build. For example:
@@ -233,9 +253,7 @@ cd path/to/JIT/Intrinsics/MathRoundDouble_ro
./MathRoundDouble_ro.sh -coreroot=/artifacts/tests/coreclr/../Tests/Core_Root
```
-#### Tests Without a Main Method
-
-Guide on how to run tests without a `Main()` Method coming soon!
+If you want to run an individual test from a test runner, use the filtering capabilities described in the [Test Executors section](#test-executors).
### PAL Tests (macOS and Linux only)
diff --git a/docs/workflow/testing/testing-managed-tools.md b/docs/workflow/testing/testing-managed-tools.md
new file mode 100644
index 000000000000..6e2fddbdbd77
--- /dev/null
+++ b/docs/workflow/testing/testing-managed-tools.md
@@ -0,0 +1,45 @@
+# Testing managed tools
+
+There are managed unit and functional tests for a number of tools including the
+compiler for NativeAOT (`ILCompiler`), and the trimmer (`illink`).
+
+## Adding new testsuites
+
+To add a new test suite, create a new `.csproj` with a name that ends in `Tests`, such as:
+`MyTool.Tests.csproj`. The property `IsTestProject` will be set by the `Directories.Build.props` in
+the repository root. The property will, in turn, add references to the xunit package and the
+apropriate test runner.
+
+Now add a `ProjectToBuild` item in `eng/Substes.props` to one of the existing subsets, such as
+`clr.toolstests`, or a new subset.
+
+## Adding new testsuites to CI
+
+To run the tests in CI, add a new pipeline or add to an exsiting pipeline such as `CLR_Tools_Tests`
+in `eng/pipelines/runtime.yml`. Update the trigger condition, perhaps by adding a new set of paths
+to `eng/pipelines/common/evaluate-default-paths.yml` in order to run the tests when the tool source
+or the test sources change.
+
+## Running tests locally
+
+Build and run the tests locally either with
+
+```console
+./build.[sh|cmd] -s clr.toolstests -c [Release|Debug] -build -test
+```
+
+or
+
+```console
+./dotnet.[sh|cmd] test .../MyTool.Tests.csproj -c [Release|Debug]
+```
+
+The `dotnet-test` xunit filter mechanisms work to run a single test or a subset of the tests
+
+```console
+./dotnet.[sh|cmd] test .../MyTool.Tests.csproj -c [Release|Debug] --filter "FullyQualifiedName~MyTest"
+```
+
+The above command runs all tests whose fully-qualified name contains the substring `MyTest`. See
+[dotnet test - Run selective unit tests](https://learn.microsoft.com/en-us/dotnet/core/testing/selective-unit-tests?pivots=mstest#syntax)
+for the full syntax.
diff --git a/docs/workflow/trimming/feature-switches.md b/docs/workflow/trimming/feature-switches.md
index 2c25a36230d4..46e7452fad2c 100644
--- a/docs/workflow/trimming/feature-switches.md
+++ b/docs/workflow/trimming/feature-switches.md
@@ -35,6 +35,9 @@ configurations but their defaults might vary as any SDK can set the defaults dif
| JsonSerializerIsReflectionEnabledByDefault | System.Text.Json.JsonSerializer.IsReflectionEnabledByDefault | When set to false, disables using reflection as the default contract resolver in System.Text.Json |
| EnableGeneratedComInterfaceComImportInterop | System.Runtime.InteropServices.Marshalling.EnableGeneratedComInterfaceComImportInterop | When set to true, enables casting source-generated COM object wrappers to built-in COM-based COM interfaces. |
| _UseManagedNtlm | System.Net.Security.UseManagedNtlm | When set to true, uses built-in managed implementation of NTLM and SPNEGO algorithm for HTTP, SMTP authentication, and NegotiateAuthentication API instead of system provided GSSAPI implementation. |
+| _ComObjectDescriptorSupport | System.ComponentModel.TypeDescriptor.IsComObjectDescriptorSupported | When set to true, supports creating a TypeDescriptor based view of COM objects. |
+| _DesignerHostSupport | System.ComponentModel.Design.IDesignerHost.IsSupported | When set to true, supports creating design components at runtime. |
+| _DefaultValueAttributeSupport | System.ComponentModel.DefaultValueAttribute.IsSupported | When set to true, supports creating a DefaultValueAttribute at runtime. |
Any feature-switch which defines property can be set in csproj file or
on the command line as any other MSBuild property. Those without predefined property name
diff --git a/eng/DotNetBuild.props b/eng/DotNetBuild.props
index 06ea2ee04665..9d68b8265b0c 100644
--- a/eng/DotNetBuild.props
+++ b/eng/DotNetBuild.props
@@ -65,6 +65,9 @@
$(InnerBuildArgs) /p:WasmEnableThreads=true
$(InnerBuildArgs) $(FlagParameterPrefix)s clr.nativeaotlibs+clr.nativeaotruntime+libs+packs /p:BuildNativeAOTRuntimePack=true /p:SkipLibrariesNativeRuntimePackages=true
+ $(InnerBuildArgs) /p:MonoEnableLLVM=$(DotNetBuildMonoEnableLLVM)
+ $(InnerBuildArgs) /p:MonoAOTEnableLLVM=$(DotNetBuildMonoAOTEnableLLVM)
+ $(InnerBuildArgs) /p:MonoBundleLLVMOptimizer=$(DotNetBuildMonoBundleLLVMOptimizer)
$(InnerBuildArgs) $(FlagParameterPrefix)pgoinstrument
@@ -81,6 +84,7 @@
$(InnerBuildArgs) /p:SourceBuiltNonShippingPackagesDir=$(SourceBuiltNonShippingPackagesDir)
$(InnerBuildArgs) /p:SourceBuiltAssetManifestsDir=$(SourceBuiltAssetManifestsDir)
$(InnerBuildArgs) /p:SourceBuiltSymbolsDir=$(SourceBuiltSymbolsDir)
+ $(InnerBuildArgs) /p:GitHubRepositoryName=$(GitHubRepositoryName)
diff --git a/eng/Subsets.props b/eng/Subsets.props
index 8026bf97e046..b55ead61e3be 100644
--- a/eng/Subsets.props
+++ b/eng/Subsets.props
@@ -129,6 +129,13 @@
true
+
+
+ CxxStandardLibrary=$(TargetCxxStandardLibrary)
+ $(TargetCxxLibraryProperties);CxxStandardLibraryStatic=$(TargetCxxStandardLibraryStatic)
+ $(TargetCxxLibraryProperties);CxxAbiLibrary=$(TargetCxxAbiLibrary)
+
+
@@ -180,6 +187,8 @@
+
+
@@ -274,7 +283,7 @@
@@ -369,6 +378,8 @@
+
+
@@ -380,6 +391,10 @@
Test="true" Category="clr" Condition="'$(DotNetBuildSourceOnly)' != 'true' and '$(NativeAotSupported)' == 'true'"/>
+
+
+
+
@@ -463,7 +478,7 @@
-
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index b5717f05a5f5..00c0be13ebbe 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -1,8 +1,8 @@
-
+
https://github.com/dotnet/icu
- 1441a3fcbfa87c94b98a27605b06db7dd862f3e4
+ 55fed7b2b261aee7f921b13a18dad562c6080014
https://github.com/dotnet/msquic
@@ -12,41 +12,41 @@
https://github.com/dotnet/wcf
7f504aabb1988e9a093c1e74d8040bd52feb2f01
-
+
https://github.com/dotnet/emsdk
- 9ad7c262f14dc5e40a64030ade7788b36e74adf0
+ 53c4a109e2abc0112996e2bc4a7f830f572f4efd
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
https://github.com/dotnet/command-line-api
@@ -58,351 +58,351 @@
a045dd54a4c44723c215d992288160eb1401bb7f
-
+
https://github.com/dotnet/cecil
- 9c8ea966df62f764523b51772763e74e71040a92
+ 7a4a59f9f66baf6711a6ce2de01d3b2c62ed72d8
-
+
https://github.com/dotnet/cecil
- 9c8ea966df62f764523b51772763e74e71040a92
+ 7a4a59f9f66baf6711a6ce2de01d3b2c62ed72d8
-
+
https://github.com/dotnet/emsdk
- 9ad7c262f14dc5e40a64030ade7788b36e74adf0
+ 53c4a109e2abc0112996e2bc4a7f830f572f4efd
-
+
https://github.com/dotnet/emsdk
- 9ad7c262f14dc5e40a64030ade7788b36e74adf0
+ 53c4a109e2abc0112996e2bc4a7f830f572f4efd
-
+
https://github.com/dotnet/source-build-reference-packages
- c0b5d69a1a1513528c77fffff708c7502d57c35c
+ a4c02499bef24d0e16255657ccdb160d26c82c32
-
+
https://github.com/dotnet/source-build-externals
- 1e2e91d2544726b2cf68109f946178ef6bef3ad9
+ 59204e5b14e6e197b3c942f992f6e3ec9196e50b
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/llvm-project
- 8b4f10702e13ea221a33e91c2ef46c4b7910b56c
+ 26f8c30340764cfa7fa9090dc01a36c222bf09c1
-
+
https://github.com/dotnet/runtime
- ec4437be46d8b90bc9fa6740c556bd860d9fe5ab
+ 073e35e7e32624e0f841d94364d2f28c73662ff7
-
+
https://github.com/dotnet/runtime
- ec4437be46d8b90bc9fa6740c556bd860d9fe5ab
+ 073e35e7e32624e0f841d94364d2f28c73662ff7
-
+
https://github.com/dotnet/runtime
- ec4437be46d8b90bc9fa6740c556bd860d9fe5ab
+ 073e35e7e32624e0f841d94364d2f28c73662ff7
-
+
https://github.com/dotnet/runtime
- ec4437be46d8b90bc9fa6740c556bd860d9fe5ab
+ 073e35e7e32624e0f841d94364d2f28c73662ff7
-
+
https://github.com/dotnet/runtime
- ec4437be46d8b90bc9fa6740c556bd860d9fe5ab
+ 073e35e7e32624e0f841d94364d2f28c73662ff7
-
+
https://github.com/dotnet/runtime
- ec4437be46d8b90bc9fa6740c556bd860d9fe5ab
+ 073e35e7e32624e0f841d94364d2f28c73662ff7
-
+
https://github.com/dotnet/runtime
- ec4437be46d8b90bc9fa6740c556bd860d9fe5ab
+ 073e35e7e32624e0f841d94364d2f28c73662ff7
-
+
https://github.com/dotnet/runtime
- ec4437be46d8b90bc9fa6740c556bd860d9fe5ab
+ 073e35e7e32624e0f841d94364d2f28c73662ff7
-
+
https://github.com/dotnet/runtime
- ec4437be46d8b90bc9fa6740c556bd860d9fe5ab
+ 073e35e7e32624e0f841d94364d2f28c73662ff7
-
+
https://github.com/dotnet/xharness
- 28af9496b0e260f7e66ec549b39f1410ee9743d1
+ 8cbf240a033d37ab8ebae11726bb3f867cfeb9e3
-
+
https://github.com/dotnet/xharness
- 28af9496b0e260f7e66ec549b39f1410ee9743d1
+ 8cbf240a033d37ab8ebae11726bb3f867cfeb9e3
-
+
https://github.com/dotnet/xharness
- 28af9496b0e260f7e66ec549b39f1410ee9743d1
+ 8cbf240a033d37ab8ebae11726bb3f867cfeb9e3
-
+
https://github.com/dotnet/arcade
- 541820fbd313f9bb82b756b66d258fe316d5e48b
+ ed14da5934ffb536cff8f41f8b5719334524cbed
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- 78a5b978e1965c1335edb4b9a22bc4d6ff5a77a6
+ c3acfd159662959ff09f3a0d7663023db48bb78a
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- 78a5b978e1965c1335edb4b9a22bc4d6ff5a77a6
+ c3acfd159662959ff09f3a0d7663023db48bb78a
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- 78a5b978e1965c1335edb4b9a22bc4d6ff5a77a6
+ c3acfd159662959ff09f3a0d7663023db48bb78a
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- 78a5b978e1965c1335edb4b9a22bc4d6ff5a77a6
+ c3acfd159662959ff09f3a0d7663023db48bb78a
-
+
https://github.com/dotnet/hotreload-utils
- 668ee30182fea845064853c46be5f54ac6efd110
+ 7d4a7804532307d4eef18ce48ae655ac8a6c6fcd
-
+
https://github.com/dotnet/runtime-assets
- ad97a45c2567fa7c3a067079f166c3f3c9fecd60
+ 587c756690070927e81cba864f0db27f0a74e44a
-
+
https://github.com/dotnet/roslyn
- cbca41cad4e21c29548e9e57d7135740b6f78df9
+ dd1d6535773f71c1f921589cf59d1d62f6e8c27f
-
+
https://github.com/dotnet/roslyn
- cbca41cad4e21c29548e9e57d7135740b6f78df9
+ dd1d6535773f71c1f921589cf59d1d62f6e8c27f
-
+
https://github.com/dotnet/roslyn
- cbca41cad4e21c29548e9e57d7135740b6f78df9
+ dd1d6535773f71c1f921589cf59d1d62f6e8c27f
-
+
https://github.com/dotnet/roslyn-analyzers
- ad732e236e7ffcb66de4b45a1b736aad4ccdcd83
+ 8dccccec1ce3bd2fb532ec77d7e092ab9d684db7
-
+
https://github.com/dotnet/roslyn-analyzers
- ad732e236e7ffcb66de4b45a1b736aad4ccdcd83
+ 8dccccec1ce3bd2fb532ec77d7e092ab9d684db7
-
+
https://github.com/dotnet/roslyn
- cbca41cad4e21c29548e9e57d7135740b6f78df9
+ dd1d6535773f71c1f921589cf59d1d62f6e8c27f
-
+
https://github.com/dotnet/sdk
- 219a6fc9954d632d7c119b31d59ff1516ff04d98
+ 190723c80d85721cdc58fd906e645c4029b947bb
-
+
https://github.com/dotnet/sdk
- 219a6fc9954d632d7c119b31d59ff1516ff04d98
+ 190723c80d85721cdc58fd906e645c4029b947bb
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- 78a5b978e1965c1335edb4b9a22bc4d6ff5a77a6
+ c3acfd159662959ff09f3a0d7663023db48bb78a
-
+
https://dev.azure.com/dnceng/internal/_git/dotnet-optimization
- 78a5b978e1965c1335edb4b9a22bc4d6ff5a77a6
+ c3acfd159662959ff09f3a0d7663023db48bb78a
@@ -410,9 +410,41 @@
https://github.com/NuGet/NuGet.Client
8fef55f5a55a3b4f2c96cd1a9b5ddc51d4b927f8
-
+
https://github.com/dotnet/installer
- dc43d363d284c26cb1b463683d6ebb2c88ab0b58
+ fa261b952d702c6bd604728fcbdb58ac071a22b1
+
+
+ https://github.com/dotnet/node
+ 308c7d0f1fa19bd1e7b768ad13646f5206133cdb
+
+
+ https://github.com/dotnet/node
+ 308c7d0f1fa19bd1e7b768ad13646f5206133cdb
+
+
+ https://github.com/dotnet/node
+ 308c7d0f1fa19bd1e7b768ad13646f5206133cdb
+
+
+ https://github.com/dotnet/node
+ 308c7d0f1fa19bd1e7b768ad13646f5206133cdb
+
+
+ https://github.com/dotnet/node
+ 308c7d0f1fa19bd1e7b768ad13646f5206133cdb
+
+
+ https://github.com/dotnet/node
+ 308c7d0f1fa19bd1e7b768ad13646f5206133cdb
+
+
+ https://github.com/dotnet/node
+ 308c7d0f1fa19bd1e7b768ad13646f5206133cdb
+
+
+ https://github.com/dotnet/node
+ 308c7d0f1fa19bd1e7b768ad13646f5206133cdb
diff --git a/eng/Versions.props b/eng/Versions.props
index cd1960205b4f..631dd7d8c2a4 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -7,11 +7,11 @@
0
0
9.0.100
- 8.0.2
- 7.0.$([MSBuild]::Add($([System.Version]::Parse('$(PackageVersionNet8)').Build),14))
- 6.0.$([MSBuild]::Add($([System.Version]::Parse('$(PackageVersionNet7)').Build),11))
+ 8.0.5
+ 7.0.19
+ 6.0.$([MSBuild]::Add($([System.Version]::Parse('$(PackageVersionNet8)').Build),25))
preview
- 4
+ 5
false
release
@@ -34,17 +34,17 @@
- 3.11.0-beta1.24177.1
- 9.0.0-preview.24177.1
+ 3.11.0-beta1.24225.1
+ 9.0.0-preview.24225.1
- 4.10.0-3.24202.15
- 4.10.0-3.24202.15
- 4.10.0-3.24202.15
+ 4.11.0-2.24269.3
+ 4.11.0-2.24269.3
+ 4.11.0-2.24269.3
- 9.0.100-preview.4.24175.4
+ 9.0.100-preview.5.24263.1
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 2.6.7-beta.24205.4
- 9.0.0-beta.24205.4
- 2.6.7-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
- 9.0.0-beta.24205.4
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 2.6.7-beta.24266.1
+ 9.0.0-beta.24266.1
+ 2.6.7-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
+ 9.0.0-beta.24266.1
1.4.0
6.0.0-preview.1.102
- 9.0.0-preview.4.24201.1
+ 9.0.0-preview.5.24262.2
6.0.0
- 9.0.0-preview.4.24201.1
+ 9.0.0-preview.5.24262.2
6.0.0
1.1.1
@@ -119,45 +119,46 @@
8.0.0
5.0.0
4.5.5
- 9.0.0-preview.4.24201.1
- 9.0.0-preview.4.24201.1
+ 9.0.0-preview.5.24262.2
+ 9.0.0-preview.5.24262.2
6.0.0
5.0.0
5.0.0
5.0.0
7.0.0
- 9.0.0-preview.4.24201.1
+ 9.0.0-preview.5.24262.2
6.0.0
7.0.0
4.5.4
4.5.0
- 9.0.0-preview.4.24201.1
+ 9.0.0-preview.5.24262.2
8.0.0
+ 8.0.0
8.0.0
8.0.0
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
- 9.0.0-beta.24203.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
+ 9.0.0-beta.24263.1
- 1.0.0-prerelease.24106.4
- 1.0.0-prerelease.24106.4
- 1.0.0-prerelease.24106.4
- 1.0.0-prerelease.24106.4
- 1.0.0-prerelease.24106.4
- 1.0.0-prerelease.24106.4
+ 1.0.0-prerelease.24223.3
+ 1.0.0-prerelease.24223.3
+ 1.0.0-prerelease.24223.3
+ 1.0.0-prerelease.24223.3
+ 1.0.0-prerelease.24223.3
+ 1.0.0-prerelease.24223.3
2.0.0
17.8.0-beta1.23475.2
@@ -178,10 +179,10 @@
1.4.0
17.4.0-preview-20220707-01
- 9.0.0-prerelease.24203.1
- 9.0.0-prerelease.24203.1
- 9.0.0-prerelease.24203.1
- 9.0.0-alpha.0.24201.1
+ 9.0.0-prerelease.24266.1
+ 9.0.0-prerelease.24266.1
+ 9.0.0-prerelease.24266.1
+ 9.0.0-alpha.0.24263.1
3.12.0
4.5.0
6.0.0
@@ -207,53 +208,57 @@
8.0.0-preview-20230918.1
- 0.11.4-alpha.24168.1
+ 0.11.4-alpha.24230.1
- 9.0.0-preview.4.24201.1
+ 9.0.0-preview.5.24262.2
- 9.0.0-preview.4.24201.1
+ 9.0.0-preview.5.24263.1
2.3.5
9.0.0-alpha.1.24167.3
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
- 9.0.0-preview.4.24204.9
+ 9.0.0-preview.5.24264.2
$(MicrosoftNETWorkloadEmscriptenCurrentManifest90100TransportVersion)
- 9.0.0-preview.4.24204.9
+ 9.0.0-preview.5.24264.2
1.1.87-gba258badda
1.0.0-v3.14.0.5722
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
- 16.0.5-alpha.1.24203.4
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
+ 16.0.5-alpha.1.24204.1
3.1.7
1.0.406601
- 9.0.100-preview.4.24175.5
+ 9.0.100-preview.5.24253.16
$(MicrosoftDotnetSdkInternalVersion)
+ 9.0.0-alpha.1.24175.1
+ $(MicrosoftNETRuntimeEmscriptenVersion)
+ $(runtimewinx64MicrosoftNETCoreRuntimeWasmNodeTransportPackageVersion)
+ 3.1.34
diff --git a/eng/common/build.ps1 b/eng/common/build.ps1
index 2a115068a927..a7363df316dc 100644
--- a/eng/common/build.ps1
+++ b/eng/common/build.ps1
@@ -19,7 +19,6 @@ Param(
[switch] $pack,
[switch] $publish,
[switch] $clean,
- [switch] $verticalBuild,
[switch][Alias('pb')]$productBuild,
[switch][Alias('bl')]$binaryLog,
[switch][Alias('nobl')]$excludeCIBinarylog,
@@ -60,7 +59,6 @@ function Print-Usage() {
Write-Host " -sign Sign build outputs"
Write-Host " -publish Publish artifacts (e.g. symbols)"
Write-Host " -clean Clean the solution"
- Write-Host " -verticalBuild Run in 'vertical build' infra mode."
Write-Host " -productBuild Build the solution in the way it will be built in the full .NET product (VMR) build (short: -pb)"
Write-Host ""
@@ -124,7 +122,7 @@ function Build {
/p:Deploy=$deploy `
/p:Test=$test `
/p:Pack=$pack `
- /p:DotNetBuildRepo=$($productBuild -or $verticalBuild) `
+ /p:DotNetBuildRepo=$productBuild `
/p:IntegrationTest=$integrationTest `
/p:PerformanceTest=$performanceTest `
/p:Sign=$sign `
diff --git a/eng/common/build.sh b/eng/common/build.sh
index d82ebf742808..ac1ee8620cd2 100755
--- a/eng/common/build.sh
+++ b/eng/common/build.sh
@@ -62,7 +62,6 @@ scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
restore=false
build=false
source_build=false
-vertical_build=false
product_build=false
rebuild=false
test=false
@@ -141,13 +140,6 @@ while [[ $# > 0 ]]; do
restore=true
pack=true
;;
- -verticalbuild|-vb)
- build=true
- vertical_build=true
- product_build=true
- restore=true
- pack=true
- ;;
-test|-t)
test=true
;;
diff --git a/eng/common/core-templates/job/job.yml b/eng/common/core-templates/job/job.yml
new file mode 100644
index 000000000000..dc3bd560a50e
--- /dev/null
+++ b/eng/common/core-templates/job/job.yml
@@ -0,0 +1,266 @@
+parameters:
+# Job schema parameters - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
+ cancelTimeoutInMinutes: ''
+ condition: ''
+ container: ''
+ continueOnError: false
+ dependsOn: ''
+ displayName: ''
+ pool: ''
+ steps: []
+ strategy: ''
+ timeoutInMinutes: ''
+ variables: []
+ workspace: ''
+ templateContext: {}
+
+# Job base template specific parameters
+ # See schema documentation - https://github.com/dotnet/arcade/blob/master/Documentation/AzureDevOps/TemplateSchema.md
+ # publishing defaults
+ artifacts: ''
+ enableMicrobuild: false
+ enablePublishBuildArtifacts: false
+ enablePublishBuildAssets: false
+ enablePublishTestResults: false
+ enablePublishUsingPipelines: false
+ enableBuildRetry: false
+ disableComponentGovernance: ''
+ componentGovernanceIgnoreDirectories: ''
+ mergeTestResults: false
+ testRunTitle: ''
+ testResultsFormat: ''
+ name: ''
+ preSteps: []
+ artifactPublishSteps: []
+ runAsPublic: false
+
+# Sbom related params
+ enableSbom: true
+ PackageVersion: 9.0.0
+ BuildDropPath: '$(Build.SourcesDirectory)/artifacts'
+
+# 1es specific parameters
+ is1ESPipeline: ''
+
+jobs:
+- job: ${{ parameters.name }}
+
+ ${{ if ne(parameters.cancelTimeoutInMinutes, '') }}:
+ cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }}
+
+ ${{ if ne(parameters.condition, '') }}:
+ condition: ${{ parameters.condition }}
+
+ ${{ if ne(parameters.container, '') }}:
+ container: ${{ parameters.container }}
+
+ ${{ if ne(parameters.continueOnError, '') }}:
+ continueOnError: ${{ parameters.continueOnError }}
+
+ ${{ if ne(parameters.dependsOn, '') }}:
+ dependsOn: ${{ parameters.dependsOn }}
+
+ ${{ if ne(parameters.displayName, '') }}:
+ displayName: ${{ parameters.displayName }}
+
+ ${{ if ne(parameters.pool, '') }}:
+ pool: ${{ parameters.pool }}
+
+ ${{ if ne(parameters.strategy, '') }}:
+ strategy: ${{ parameters.strategy }}
+
+ ${{ if ne(parameters.timeoutInMinutes, '') }}:
+ timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
+
+ ${{ if ne(parameters.templateContext, '') }}:
+ templateContext: ${{ parameters.templateContext }}
+
+ variables:
+ - ${{ if ne(parameters.enableTelemetry, 'false') }}:
+ - name: DOTNET_CLI_TELEMETRY_PROFILE
+ value: '$(Build.Repository.Uri)'
+ - ${{ if eq(parameters.enableRichCodeNavigation, 'true') }}:
+ - name: EnableRichCodeNavigation
+ value: 'true'
+ # Retry signature validation up to three times, waiting 2 seconds between attempts.
+ # See https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3028#retry-untrusted-root-failures
+ - name: NUGET_EXPERIMENTAL_CHAIN_BUILD_RETRY_POLICY
+ value: 3,2000
+ - ${{ each variable in parameters.variables }}:
+ # handle name-value variable syntax
+ # example:
+ # - name: [key]
+ # value: [value]
+ - ${{ if ne(variable.name, '') }}:
+ - name: ${{ variable.name }}
+ value: ${{ variable.value }}
+
+ # handle variable groups
+ - ${{ if ne(variable.group, '') }}:
+ - group: ${{ variable.group }}
+
+ # handle template variable syntax
+ # example:
+ # - template: path/to/template.yml
+ # parameters:
+ # [key]: [value]
+ - ${{ if ne(variable.template, '') }}:
+ - template: ${{ variable.template }}
+ ${{ if ne(variable.parameters, '') }}:
+ parameters: ${{ variable.parameters }}
+
+ # handle key-value variable syntax.
+ # example:
+ # - [key]: [value]
+ - ${{ if and(eq(variable.name, ''), eq(variable.group, ''), eq(variable.template, '')) }}:
+ - ${{ each pair in variable }}:
+ - name: ${{ pair.key }}
+ value: ${{ pair.value }}
+
+ # DotNet-HelixApi-Access provides 'HelixApiAccessToken' for internal builds
+ - ${{ if and(eq(parameters.enableTelemetry, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
+ - group: DotNet-HelixApi-Access
+
+ ${{ if ne(parameters.workspace, '') }}:
+ workspace: ${{ parameters.workspace }}
+
+ steps:
+ - ${{ if eq(parameters.is1ESPipeline, '') }}:
+ - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error
+
+ - ${{ if ne(parameters.preSteps, '') }}:
+ - ${{ each preStep in parameters.preSteps }}:
+ - ${{ preStep }}
+
+ - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
+ - ${{ if eq(parameters.enableMicrobuild, 'true') }}:
+ - task: MicroBuildSigningPlugin@4
+ displayName: Install MicroBuild plugin
+ inputs:
+ signType: $(_SignType)
+ zipSources: false
+ feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json
+ env:
+ TeamName: $(_TeamName)
+ MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)'
+ continueOnError: ${{ parameters.continueOnError }}
+ condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT'))
+
+ - ${{ if and(eq(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'internal')) }}:
+ - task: NuGetAuthenticate@1
+
+ - ${{ if and(ne(parameters.artifacts.download, 'false'), ne(parameters.artifacts.download, '')) }}:
+ - task: DownloadPipelineArtifact@2
+ inputs:
+ buildType: current
+ artifactName: ${{ coalesce(parameters.artifacts.download.name, 'Artifacts_$(Agent.OS)_$(_BuildConfig)') }}
+ targetPath: ${{ coalesce(parameters.artifacts.download.path, 'artifacts') }}
+ itemPattern: ${{ coalesce(parameters.artifacts.download.pattern, '**') }}
+
+ - ${{ each step in parameters.steps }}:
+ - ${{ step }}
+
+ - ${{ if eq(parameters.enableRichCodeNavigation, true) }}:
+ - task: RichCodeNavIndexer@0
+ displayName: RichCodeNav Upload
+ inputs:
+ languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }}
+ environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'internal') }}
+ richNavLogOutputDirectory: $(Build.SourcesDirectory)/artifacts/bin
+ uploadRichNavArtifacts: ${{ coalesce(parameters.richCodeNavigationUploadArtifacts, false) }}
+ continueOnError: true
+
+ - template: /eng/common/core-templates/steps/component-governance.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ ${{ if eq(parameters.disableComponentGovernance, '') }}:
+ ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.runAsPublic, 'false'), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/dotnet/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/microsoft/'), eq(variables['Build.SourceBranch'], 'refs/heads/main'))) }}:
+ disableComponentGovernance: false
+ ${{ else }}:
+ disableComponentGovernance: true
+ ${{ else }}:
+ disableComponentGovernance: ${{ parameters.disableComponentGovernance }}
+ componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
+
+ - ${{ if eq(parameters.enableMicrobuild, 'true') }}:
+ - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
+ - task: MicroBuildCleanup@1
+ displayName: Execute Microbuild cleanup tasks
+ condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT'))
+ continueOnError: ${{ parameters.continueOnError }}
+ env:
+ TeamName: $(_TeamName)
+ - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.enableSbom, 'true')) }}:
+ - template: /eng/common/core-templates/steps/generate-sbom.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ PackageVersion: ${{ parameters.packageVersion}}
+ BuildDropPath: ${{ parameters.buildDropPath }}
+ IgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
+ publishArtifacts: false
+
+ # Publish test results
+ - ${{ if and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')) }}:
+ - ${{ if eq(parameters.testResultsFormat, 'xunit') }}:
+ - task: PublishTestResults@2
+ displayName: Publish XUnit Test Results
+ inputs:
+ testResultsFormat: 'xUnit'
+ testResultsFiles: '*.xml'
+ searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
+ testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-xunit
+ mergeTestResults: ${{ parameters.mergeTestResults }}
+ continueOnError: true
+ condition: always()
+ - ${{ if 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()
+
+ # gather artifacts
+ - ${{ if ne(parameters.artifacts.publish, '') }}:
+ - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}:
+ - task: CopyFiles@2
+ displayName: Gather binaries for publish to artifacts
+ inputs:
+ SourceFolder: 'artifacts/bin'
+ Contents: '**'
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/bin'
+ - task: CopyFiles@2
+ displayName: Gather packages for publish to artifacts
+ inputs:
+ SourceFolder: 'artifacts/packages'
+ Contents: '**'
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/packages'
+ - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}:
+ - task: CopyFiles@2
+ displayName: Gather logs for publish to artifacts
+ inputs:
+ SourceFolder: 'artifacts/log'
+ Contents: '**'
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/log'
+
+ - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}:
+ - task: CopyFiles@2
+ displayName: Gather logs for publish to artifacts
+ inputs:
+ SourceFolder: 'artifacts/log/$(_BuildConfig)'
+ Contents: '**'
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/log/$(_BuildConfig)'
+ - ${{ if eq(parameters.enableBuildRetry, 'true') }}:
+ - task: CopyFiles@2
+ displayName: Gather buildconfiguration for build retry
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/eng/common/BuildConfiguration'
+ Contents: '**'
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/eng/common/BuildConfiguration'
+
+ - ${{ each step in parameters.artifactPublishSteps }}:
+ - ${{ step }}
diff --git a/eng/common/core-templates/job/onelocbuild.yml b/eng/common/core-templates/job/onelocbuild.yml
new file mode 100644
index 000000000000..00feec8ebbc3
--- /dev/null
+++ b/eng/common/core-templates/job/onelocbuild.yml
@@ -0,0 +1,121 @@
+parameters:
+ # Optional: dependencies of the job
+ dependsOn: ''
+
+ # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool
+ pool: ''
+
+ CeapexPat: $(dn-bot-ceapex-package-r) # PAT for the loc AzDO instance https://dev.azure.com/ceapex
+ GithubPat: $(BotAccount-dotnet-bot-repo-PAT)
+
+ SourcesDirectory: $(Build.SourcesDirectory)
+ CreatePr: true
+ AutoCompletePr: false
+ ReusePr: true
+ UseLfLineEndings: true
+ UseCheckedInLocProjectJson: false
+ SkipLocProjectJsonGeneration: false
+ LanguageSet: VS_Main_Languages
+ LclSource: lclFilesInRepo
+ LclPackageId: ''
+ RepoType: gitHub
+ GitHubOrg: dotnet
+ MirrorRepo: ''
+ MirrorBranch: main
+ condition: ''
+ JobNameSuffix: ''
+ is1ESPipeline: ''
+jobs:
+- job: OneLocBuild${{ parameters.JobNameSuffix }}
+
+ dependsOn: ${{ parameters.dependsOn }}
+
+ displayName: OneLocBuild${{ parameters.JobNameSuffix }}
+
+ variables:
+ - group: OneLocBuildVariables # Contains the CeapexPat and GithubPat
+ - name: _GenerateLocProjectArguments
+ value: -SourcesDirectory ${{ parameters.SourcesDirectory }}
+ -LanguageSet "${{ parameters.LanguageSet }}"
+ -CreateNeutralXlfs
+ - ${{ if eq(parameters.UseCheckedInLocProjectJson, 'true') }}:
+ - name: _GenerateLocProjectArguments
+ value: ${{ variables._GenerateLocProjectArguments }} -UseCheckedInLocProjectJson
+ - template: /eng/common/core-templates/variables/pool-providers.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+
+ ${{ if ne(parameters.pool, '') }}:
+ pool: ${{ parameters.pool }}
+ ${{ if eq(parameters.pool, '') }}:
+ pool:
+ # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
+ ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
+ name: AzurePipelines-EO
+ image: 1ESPT-Windows2022
+ demands: Cmd
+ os: windows
+ # If it's not devdiv, it's dnceng
+ ${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
+ name: $(DncEngInternalBuildPool)
+ image: 1es-windows-2022
+ os: windows
+
+ steps:
+ - ${{ if eq(parameters.is1ESPipeline, '') }}:
+ - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error
+
+ - ${{ if ne(parameters.SkipLocProjectJsonGeneration, 'true') }}:
+ - task: Powershell@2
+ inputs:
+ filePath: $(Build.SourcesDirectory)/eng/common/generate-locproject.ps1
+ arguments: $(_GenerateLocProjectArguments)
+ displayName: Generate LocProject.json
+ condition: ${{ parameters.condition }}
+
+ - task: OneLocBuild@2
+ displayName: OneLocBuild
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ inputs:
+ locProj: eng/Localize/LocProject.json
+ outDir: $(Build.ArtifactStagingDirectory)
+ lclSource: ${{ parameters.LclSource }}
+ lclPackageId: ${{ parameters.LclPackageId }}
+ isCreatePrSelected: ${{ parameters.CreatePr }}
+ isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }}
+ ${{ if eq(parameters.CreatePr, true) }}:
+ isUseLfLineEndingsSelected: ${{ parameters.UseLfLineEndings }}
+ ${{ if eq(parameters.RepoType, 'gitHub') }}:
+ isShouldReusePrSelected: ${{ parameters.ReusePr }}
+ packageSourceAuth: patAuth
+ patVariable: ${{ parameters.CeapexPat }}
+ ${{ if eq(parameters.RepoType, 'gitHub') }}:
+ repoType: ${{ parameters.RepoType }}
+ gitHubPatVariable: "${{ parameters.GithubPat }}"
+ ${{ if ne(parameters.MirrorRepo, '') }}:
+ isMirrorRepoSelected: true
+ gitHubOrganization: ${{ parameters.GitHubOrg }}
+ mirrorRepo: ${{ parameters.MirrorRepo }}
+ mirrorBranch: ${{ parameters.MirrorBranch }}
+ condition: ${{ parameters.condition }}
+
+ - template: /eng/common/core-templates/steps/publish-build-artifacts.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ args:
+ displayName: Publish Localization Files
+ pathToPublish: '$(Build.ArtifactStagingDirectory)/loc'
+ publishLocation: Container
+ artifactName: Loc
+ condition: ${{ parameters.condition }}
+
+ - template: /eng/common/core-templates/steps/publish-build-artifacts.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ args:
+ displayName: Publish LocProject.json
+ pathToPublish: '$(Build.SourcesDirectory)/eng/Localize/'
+ publishLocation: Container
+ artifactName: Loc
+ condition: ${{ parameters.condition }}
\ No newline at end of file
diff --git a/eng/common/core-templates/job/publish-build-assets.yml b/eng/common/core-templates/job/publish-build-assets.yml
new file mode 100644
index 000000000000..8fe9299542c5
--- /dev/null
+++ b/eng/common/core-templates/job/publish-build-assets.yml
@@ -0,0 +1,172 @@
+parameters:
+ configuration: 'Debug'
+
+ # Optional: condition for the job to run
+ condition: ''
+
+ # Optional: 'true' if future jobs should run even if this job fails
+ continueOnError: false
+
+ # Optional: dependencies of the job
+ dependsOn: ''
+
+ # Optional: Include PublishBuildArtifacts task
+ enablePublishBuildArtifacts: false
+
+ # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool
+ pool: {}
+
+ # Optional: should run as a public build even in the internal project
+ # 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: whether the build's artifacts will be published using release pipelines or direct feed publishing
+ publishUsingPipelines: false
+
+ # Optional: whether the build's artifacts will be published using release pipelines or direct feed publishing
+ publishAssetsImmediately: false
+
+ artifactsPublishingAdditionalParameters: ''
+
+ signingValidationAdditionalParameters: ''
+
+ is1ESPipeline: ''
+
+jobs:
+- job: Asset_Registry_Publish
+
+ dependsOn: ${{ parameters.dependsOn }}
+ timeoutInMinutes: 150
+
+ ${{ if eq(parameters.publishAssetsImmediately, 'true') }}:
+ displayName: Publish Assets
+ ${{ else }}:
+ displayName: Publish to Build Asset Registry
+
+ variables:
+ - template: /eng/common/core-templates/variables/pool-providers.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
+ - group: Publish-Build-Assets
+ - group: AzureDevOps-Artifact-Feeds-Pats
+ - name: runCodesignValidationInjection
+ value: false
+ # unconditional - needed for logs publishing (redactor tool version)
+ - template: /eng/common/core-templates/post-build/common-variables.yml
+
+ pool:
+ # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
+ ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
+ name: AzurePipelines-EO
+ image: 1ESPT-Windows2022
+ demands: Cmd
+ os: windows
+ # If it's not devdiv, it's dnceng
+ ${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
+ name: NetCore1ESPool-Publishing-Internal
+ image: windows.vs2019.amd64
+ os: windows
+ steps:
+ - ${{ if eq(parameters.is1ESPipeline, '') }}:
+ - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error
+
+ - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
+ - checkout: self
+ fetchDepth: 3
+ clean: true
+
+ - task: DownloadBuildArtifacts@0
+ displayName: Download artifact
+ inputs:
+ artifactName: AssetManifests
+ downloadPath: '$(Build.StagingDirectory)/Download'
+ checkDownloadedFiles: true
+ condition: ${{ parameters.condition }}
+ continueOnError: ${{ parameters.continueOnError }}
+
+ - task: NuGetAuthenticate@1
+
+ - task: PowerShell@2
+ displayName: Publish Build Assets
+ inputs:
+ filePath: eng\common\sdk-task.ps1
+ arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet
+ /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests'
+ /p:BuildAssetRegistryToken=$(MaestroAccessToken)
+ /p:MaestroApiEndpoint=https://maestro.dot.net
+ /p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }}
+ /p:OfficialBuildId=$(Build.BuildNumber)
+ condition: ${{ parameters.condition }}
+ continueOnError: ${{ parameters.continueOnError }}
+
+ - task: powershell@2
+ displayName: Create ReleaseConfigs Artifact
+ inputs:
+ targetType: inline
+ script: |
+ New-Item -Path "$(Build.StagingDirectory)/ReleaseConfigs" -ItemType Directory -Force
+ $filePath = "$(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt"
+ Add-Content -Path $filePath -Value $(BARBuildId)
+ Add-Content -Path $filePath -Value "$(DefaultChannels)"
+ Add-Content -Path $filePath -Value $(IsStableBuild)
+
+ - template: /eng/common/core-templates/steps/publish-build-artifacts.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ args:
+ displayName: Publish ReleaseConfigs Artifact
+ pathToPublish: '$(Build.StagingDirectory)/ReleaseConfigs'
+ publishLocation: Container
+ artifactName: ReleaseConfigs
+
+ - task: powershell@2
+ displayName: Check if SymbolPublishingExclusionsFile.txt exists
+ inputs:
+ targetType: inline
+ script: |
+ $symbolExclusionfile = "$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt"
+ if(Test-Path -Path $symbolExclusionfile)
+ {
+ Write-Host "SymbolExclusionFile exists"
+ Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]true"
+ }
+ else{
+ Write-Host "Symbols Exclusion file does not exist"
+ Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]false"
+ }
+
+ - template: /eng/common/core-templates/steps/publish-build-artifacts.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ args:
+ displayName: Publish SymbolPublishingExclusionsFile Artifact
+ condition: eq(variables['SymbolExclusionFile'], 'true')
+ pathToPublish: '$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt'
+ publishLocation: Container
+ artifactName: ReleaseConfigs
+
+ - ${{ if eq(parameters.publishAssetsImmediately, 'true') }}:
+ - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+
+ - task: PowerShell@2
+ displayName: Publish Using Darc
+ inputs:
+ filePath: $(Build.SourcesDirectory)/eng/common/post-build/publish-using-darc.ps1
+ arguments: -BuildId $(BARBuildId)
+ -PublishingInfraVersion 3
+ -AzdoToken '$(publishing-dnceng-devdiv-code-r-build-re)'
+ -MaestroToken '$(MaestroApiAccessToken)'
+ -WaitPublishingFinish true
+ -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}'
+ -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}'
+
+ - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}:
+ - template: /eng/common/core-templates/steps/publish-logs.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ JobLabel: 'Publish_Artifacts_Logs'
diff --git a/eng/common/core-templates/job/source-build.yml b/eng/common/core-templates/job/source-build.yml
new file mode 100644
index 000000000000..c0ce4b3c8618
--- /dev/null
+++ b/eng/common/core-templates/job/source-build.yml
@@ -0,0 +1,80 @@
+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.
+ # skipPublishValidation: false
+ # Disables publishing validation. By default, a check is performed to ensure no packages are
+ # published by source-build.
+ # 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: {}
+
+ is1ESPipeline: ''
+
+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 eq(parameters.platform.pool, '') }}:
+ # The default VM host AzDO pool. This should be capable of running Docker containers: almost all
+ # source-build builds run in Docker, including the default managed platform.
+ # /eng/common/core-templates/variables/pool-providers.yml can't be used here (some customers declare variables already), so duplicate its logic
+ ${{ if eq(parameters.is1ESPipeline, 'true') }}:
+ pool:
+ ${{ if eq(variables['System.TeamProject'], 'public') }}:
+ name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore-Svc-Public' ), False, 'NetCore-Public')]
+ demands: ImageOverride -equals build.ubuntu.2004.amd64
+ ${{ if eq(variables['System.TeamProject'], 'internal') }}:
+ name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')]
+ image: 1es-mariner-2
+ os: linux
+ ${{ else }}:
+ pool:
+ ${{ if eq(variables['System.TeamProject'], 'public') }}:
+ name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore-Svc-Public' ), False, 'NetCore-Public')]
+ demands: ImageOverride -equals Build.Ubuntu.2204.Amd64.Open
+ ${{ if eq(variables['System.TeamProject'], 'internal') }}:
+ name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')]
+ demands: ImageOverride -equals Build.Ubuntu.2204.Amd64
+ ${{ if ne(parameters.platform.pool, '') }}:
+ pool: ${{ parameters.platform.pool }}
+
+ workspace:
+ clean: all
+
+ steps:
+ - ${{ if eq(parameters.is1ESPipeline, '') }}:
+ - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error
+
+ - template: /eng/common/core-templates/steps/source-build.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ platform: ${{ parameters.platform }}
diff --git a/eng/common/core-templates/job/source-index-stage1.yml b/eng/common/core-templates/job/source-index-stage1.yml
new file mode 100644
index 000000000000..f1938eec1020
--- /dev/null
+++ b/eng/common/core-templates/job/source-index-stage1.yml
@@ -0,0 +1,91 @@
+parameters:
+ runAsPublic: false
+ sourceIndexUploadPackageVersion: 2.0.0-20240502.12
+ sourceIndexProcessBinlogPackageVersion: 1.0.1-20240129.2
+ sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json
+ sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci"
+ preSteps: []
+ binlogPath: artifacts/log/Debug/Build.binlog
+ condition: ''
+ dependsOn: ''
+ pool: ''
+ is1ESPipeline: ''
+
+jobs:
+- job: SourceIndexStage1
+ dependsOn: ${{ parameters.dependsOn }}
+ condition: ${{ parameters.condition }}
+ variables:
+ - name: SourceIndexUploadPackageVersion
+ value: ${{ parameters.sourceIndexUploadPackageVersion }}
+ - name: SourceIndexProcessBinlogPackageVersion
+ value: ${{ parameters.sourceIndexProcessBinlogPackageVersion }}
+ - name: SourceIndexPackageSource
+ value: ${{ parameters.sourceIndexPackageSource }}
+ - name: BinlogPath
+ value: ${{ parameters.binlogPath }}
+ - template: /eng/common/core-templates/variables/pool-providers.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+
+ ${{ if ne(parameters.pool, '') }}:
+ pool: ${{ parameters.pool }}
+ ${{ if eq(parameters.pool, '') }}:
+ pool:
+ ${{ if eq(variables['System.TeamProject'], 'public') }}:
+ name: $(DncEngPublicBuildPool)
+ image: windows.vs2022.amd64.open
+ ${{ if eq(variables['System.TeamProject'], 'internal') }}:
+ name: $(DncEngInternalBuildPool)
+ image: windows.vs2022.amd64
+
+ steps:
+ - ${{ if eq(parameters.is1ESPipeline, '') }}:
+ - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error
+
+ - ${{ each preStep in parameters.preSteps }}:
+ - ${{ preStep }}
+
+ - task: UseDotNet@2
+ displayName: Use .NET 8 SDK
+ inputs:
+ packageType: sdk
+ version: 8.0.x
+ installationPath: $(Agent.TempDirectory)/dotnet
+ workingDirectory: $(Agent.TempDirectory)
+
+ - script: |
+ $(Agent.TempDirectory)/dotnet/dotnet tool install BinLogToSln --version $(sourceIndexProcessBinlogPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools
+ $(Agent.TempDirectory)/dotnet/dotnet tool install UploadIndexStage1 --version $(sourceIndexUploadPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools
+ displayName: Download Tools
+ # Set working directory to temp directory so 'dotnet' doesn't try to use global.json and use the repo's sdk.
+ workingDirectory: $(Agent.TempDirectory)
+
+ - script: ${{ parameters.sourceIndexBuildCommand }}
+ displayName: Build Repository
+
+ - script: $(Agent.TempDirectory)/.source-index/tools/BinLogToSln -i $(BinlogPath) -r $(Build.SourcesDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output
+ displayName: Process Binlog into indexable sln
+
+ - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
+ - task: AzureCLI@2
+ displayName: Get stage 1 auth token
+ inputs:
+ azureSubscription: 'SourceDotNet Stage1 Publish'
+ addSpnToEnvironment: true
+ scriptType: 'ps'
+ scriptLocation: 'inlineScript'
+ inlineScript: |
+ echo "##vso[task.setvariable variable=ARM_CLIENT_ID]$env:servicePrincipalId"
+ echo "##vso[task.setvariable variable=ARM_ID_TOKEN]$env:idToken"
+ echo "##vso[task.setvariable variable=ARM_TENANT_ID]$env:tenantId"
+
+ - script: |
+ echo "Client ID: $(ARM_CLIENT_ID)"
+ echo "ID Token: $(ARM_ID_TOKEN)"
+ echo "Tenant ID: $(ARM_TENANT_ID)"
+ az login --service-principal -u $(ARM_CLIENT_ID) --tenant $(ARM_TENANT_ID) --allow-no-subscriptions --federated-token $(ARM_ID_TOKEN)
+ displayName: "Login to Azure"
+
+ - script: $(Agent.TempDirectory)/.source-index/tools/UploadIndexStage1 -i .source-index/stage1output -n $(Build.Repository.Name) -s netsourceindexstage1 -b stage1
+ displayName: Upload stage1 artifacts to source index
\ No newline at end of file
diff --git a/eng/common/core-templates/jobs/codeql-build.yml b/eng/common/core-templates/jobs/codeql-build.yml
new file mode 100644
index 000000000000..f2144252cc65
--- /dev/null
+++ b/eng/common/core-templates/jobs/codeql-build.yml
@@ -0,0 +1,33 @@
+parameters:
+ # See schema documentation in /Documentation/AzureDevOps/TemplateSchema.md
+ continueOnError: false
+ # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
+ jobs: []
+ # Optional: if specified, restore and use this version of Guardian instead of the default.
+ overrideGuardianVersion: ''
+ is1ESPipeline: ''
+
+jobs:
+- template: /eng/common/core-templates/jobs/jobs.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ enableMicrobuild: false
+ enablePublishBuildArtifacts: false
+ enablePublishTestResults: false
+ enablePublishBuildAssets: false
+ enablePublishUsingPipelines: false
+ enableTelemetry: true
+
+ variables:
+ - group: Publish-Build-Assets
+ # The Guardian version specified in 'eng/common/sdl/packages.config'. This value must be kept in
+ # sync with the packages.config file.
+ - name: DefaultGuardianVersion
+ value: 0.109.0
+ - name: GuardianPackagesConfigFile
+ value: $(Build.SourcesDirectory)\eng\common\sdl\packages.config
+ - name: GuardianVersion
+ value: ${{ coalesce(parameters.overrideGuardianVersion, '$(DefaultGuardianVersion)') }}
+
+ jobs: ${{ parameters.jobs }}
+
diff --git a/eng/common/core-templates/jobs/jobs.yml b/eng/common/core-templates/jobs/jobs.yml
new file mode 100644
index 000000000000..ea69be4341c6
--- /dev/null
+++ b/eng/common/core-templates/jobs/jobs.yml
@@ -0,0 +1,119 @@
+parameters:
+ # See schema documentation in /Documentation/AzureDevOps/TemplateSchema.md
+ continueOnError: false
+
+ # Optional: Include PublishBuildArtifacts task
+ enablePublishBuildArtifacts: false
+
+ # Optional: Enable publishing using release pipelines
+ enablePublishUsingPipelines: false
+
+ # Optional: Enable running the source-build jobs to build repo from source
+ enableSourceBuild: false
+
+ # Optional: Parameters for source-build template.
+ # See /eng/common/core-templates/jobs/source-build.yml for options
+ sourceBuildParameters: []
+
+ graphFileGeneration:
+ # Optional: Enable generating the graph files at the end of the build
+ enabled: false
+ # Optional: Include toolset dependencies in the generated graph files
+ includeToolset: false
+
+ # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
+ jobs: []
+
+ # Optional: Override automatically derived dependsOn value for "publish build assets" job
+ publishBuildAssetsDependsOn: ''
+
+ # Optional: Publish the assets as soon as the publish to BAR stage is complete, rather doing so in a separate stage.
+ publishAssetsImmediately: false
+
+ # Optional: If using publishAssetsImmediately and additional parameters are needed, can be used to send along additional parameters (normally sent to post-build.yml)
+ artifactsPublishingAdditionalParameters: ''
+ signingValidationAdditionalParameters: ''
+
+ # Optional: should run as a public build even in the internal project
+ # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects.
+ runAsPublic: false
+
+ enableSourceIndex: false
+ sourceIndexParams: {}
+
+ artifacts: {}
+ is1ESPipeline: ''
+
+# 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.
+
+jobs:
+- ${{ each job in parameters.jobs }}:
+ - ${{ if eq(parameters.is1ESPipeline, 'true') }}:
+ - template: /eng/common/templates-official/job/job.yml
+ parameters:
+ # pass along parameters
+ ${{ each parameter in parameters }}:
+ ${{ if ne(parameter.key, 'jobs') }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
+
+ # pass along job properties
+ ${{ each property in job }}:
+ ${{ if ne(property.key, 'job') }}:
+ ${{ property.key }}: ${{ property.value }}
+
+ name: ${{ job.job }}
+
+ - ${{ else }}:
+ - template: /eng/common/templates/job/job.yml
+ parameters:
+ # pass along parameters
+ ${{ each parameter in parameters }}:
+ ${{ if ne(parameter.key, 'jobs') }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
+
+ # pass along job properties
+ ${{ each property in job }}:
+ ${{ if ne(property.key, 'job') }}:
+ ${{ property.key }}: ${{ property.value }}
+
+ name: ${{ job.job }}
+
+- ${{ if eq(parameters.enableSourceBuild, true) }}:
+ - template: /eng/common/core-templates/jobs/source-build.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ allCompletedJobId: Source_Build_Complete
+ ${{ each parameter in parameters.sourceBuildParameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
+
+- ${{ if eq(parameters.enableSourceIndex, 'true') }}:
+ - template: ../job/source-index-stage1.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ runAsPublic: ${{ parameters.runAsPublic }}
+ ${{ each parameter in parameters.sourceIndexParams }}:
+ ${{ 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
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ continueOnError: ${{ parameters.continueOnError }}
+ dependsOn:
+ - ${{ if ne(parameters.publishBuildAssetsDependsOn, '') }}:
+ - ${{ each job in parameters.publishBuildAssetsDependsOn }}:
+ - ${{ job.job }}
+ - ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}:
+ - ${{ each job in parameters.jobs }}:
+ - ${{ job.job }}
+ - ${{ if eq(parameters.enableSourceBuild, true) }}:
+ - Source_Build_Complete
+
+ runAsPublic: ${{ parameters.runAsPublic }}
+ publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }}
+ publishAssetsImmediately: ${{ parameters.publishAssetsImmediately }}
+ enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }}
+ artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
+ signingValidationAdditionalParameters: ${{ parameters.signingValidationAdditionalParameters }}
diff --git a/eng/common/core-templates/jobs/source-build.yml b/eng/common/core-templates/jobs/source-build.yml
new file mode 100644
index 000000000000..d8e5d0085226
--- /dev/null
+++ b/eng/common/core-templates/jobs/source-build.yml
@@ -0,0 +1,50 @@
+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/core-templates/job/source-build.yml
+ jobNamePrefix: 'Source_Build'
+
+ # This is the default platform provided by Arcade, intended for use by a managed-only repo.
+ defaultManagedPlatform:
+ name: 'Managed'
+ container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9'
+
+ # 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'. If no platforms are specified,
+ # one job runs on 'defaultManagedPlatform'.
+ platforms: []
+
+ is1ESPipeline: ''
+
+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(length(parameters.platforms), 0) }}:
+ - ${{ parameters.jobNamePrefix }}_${{ parameters.defaultManagedPlatform.name }}
+
+- ${{ each platform in parameters.platforms }}:
+ - template: /eng/common/core-templates/job/source-build.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ jobNamePrefix: ${{ parameters.jobNamePrefix }}
+ platform: ${{ platform }}
+
+- ${{ if eq(length(parameters.platforms), 0) }}:
+ - template: /eng/common/core-templates/job/source-build.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ jobNamePrefix: ${{ parameters.jobNamePrefix }}
+ platform: ${{ parameters.defaultManagedPlatform }}
diff --git a/eng/common/core-templates/post-build/common-variables.yml b/eng/common/core-templates/post-build/common-variables.yml
new file mode 100644
index 000000000000..b9ede10bf099
--- /dev/null
+++ b/eng/common/core-templates/post-build/common-variables.yml
@@ -0,0 +1,24 @@
+variables:
+ - group: Publish-Build-Assets
+
+ # Whether the build is internal or not
+ - name: IsInternalBuild
+ value: ${{ and(ne(variables['System.TeamProject'], 'public'), contains(variables['Build.SourceBranch'], 'internal')) }}
+
+ # Default Maestro++ API Endpoint and API Version
+ - name: MaestroApiEndPoint
+ value: "https://maestro.dot.net"
+ - name: MaestroApiAccessToken
+ value: $(MaestroAccessToken)
+ - name: MaestroApiVersion
+ value: "2020-02-20"
+
+ - name: SourceLinkCLIVersion
+ value: 3.0.0
+ - name: SymbolToolVersion
+ value: 1.0.1
+ - name: BinlogToolVersion
+ value: 1.0.11
+
+ - name: runCodesignValidationInjection
+ value: false
diff --git a/eng/common/core-templates/post-build/post-build.yml b/eng/common/core-templates/post-build/post-build.yml
new file mode 100644
index 000000000000..865bc1ecb4f0
--- /dev/null
+++ b/eng/common/core-templates/post-build/post-build.yml
@@ -0,0 +1,314 @@
+parameters:
+ # Which publishing infra should be used. THIS SHOULD MATCH THE VERSION ON THE BUILD MANIFEST.
+ # Publishing V1 is no longer supported
+ # Publishing V2 is no longer supported
+ # Publishing V3 is the default
+ - name: publishingInfraVersion
+ displayName: Which version of publishing should be used to promote the build definition?
+ type: number
+ default: 3
+ values:
+ - 3
+
+ - name: BARBuildId
+ displayName: BAR Build Id
+ type: number
+ default: 0
+
+ - name: PromoteToChannelIds
+ displayName: Channel to promote BARBuildId to
+ type: string
+ default: ''
+
+ - name: enableSourceLinkValidation
+ displayName: Enable SourceLink validation
+ type: boolean
+ default: false
+
+ - name: enableSigningValidation
+ displayName: Enable signing validation
+ type: boolean
+ default: true
+
+ - name: enableSymbolValidation
+ displayName: Enable symbol validation
+ type: boolean
+ default: false
+
+ - name: enableNugetValidation
+ displayName: Enable NuGet validation
+ type: boolean
+ default: true
+
+ - name: publishInstallersAndChecksums
+ displayName: Publish installers and checksums
+ type: boolean
+ default: true
+
+ - name: SDLValidationParameters
+ type: object
+ default:
+ enable: false
+ publishGdn: false
+ continueOnError: false
+ params: ''
+ artifactNames: ''
+ downloadArtifacts: true
+
+ # These parameters let the user customize the call to sdk-task.ps1 for publishing
+ # symbols & general artifacts as well as for signing validation
+ - name: symbolPublishingAdditionalParameters
+ displayName: Symbol publishing additional parameters
+ type: string
+ default: ''
+
+ - name: artifactsPublishingAdditionalParameters
+ displayName: Artifact publishing additional parameters
+ type: string
+ default: ''
+
+ - name: signingValidationAdditionalParameters
+ displayName: Signing validation additional parameters
+ type: string
+ default: ''
+
+ # Which stages should finish execution before post-build stages start
+ - name: validateDependsOn
+ type: object
+ default:
+ - build
+
+ - name: publishDependsOn
+ type: object
+ default:
+ - Validate
+
+ # Optional: Call asset publishing rather than running in a separate stage
+ - name: publishAssetsImmediately
+ type: boolean
+ default: false
+
+ - name: is1ESPipeline
+ type: boolean
+ default: false
+
+stages:
+- ${{ if or(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
+ variables:
+ - template: /eng/common/core-templates/post-build/common-variables.yml
+ - template: /eng/common/core-templates/variables/pool-providers.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ jobs:
+ - job:
+ displayName: NuGet Validation
+ condition: and(succeededOrFailed(), eq( ${{ parameters.enableNugetValidation }}, 'true'))
+ pool:
+ # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
+ ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
+ name: AzurePipelines-EO
+ image: 1ESPT-Windows2022
+ demands: Cmd
+ os: windows
+ # If it's not devdiv, it's dnceng
+ ${{ else }}:
+ ${{ if eq(parameters.is1ESPipeline, true) }}:
+ name: $(DncEngInternalBuildPool)
+ image: windows.vs2022.amd64
+ os: windows
+ ${{ else }}:
+ name: $(DncEngInternalBuildPool)
+ demands: ImageOverride -equals windows.vs2022.amd64
+
+ steps:
+ - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+
+ - task: DownloadBuildArtifacts@0
+ displayName: Download Package Artifacts
+ inputs:
+ buildType: specific
+ buildVersionToDownload: specific
+ project: $(AzDOProjectName)
+ pipeline: $(AzDOPipelineId)
+ buildId: $(AzDOBuildId)
+ artifactName: PackageArtifacts
+ checkDownloadedFiles: true
+
+ - task: PowerShell@2
+ displayName: Validate
+ inputs:
+ filePath: $(Build.SourcesDirectory)/eng/common/post-build/nuget-validation.ps1
+ arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/
+ -ToolDestinationPath $(Agent.BuildDirectory)/Extract/
+
+ - job:
+ displayName: Signing Validation
+ condition: and( eq( ${{ parameters.enableSigningValidation }}, 'true'), ne( variables['PostBuildSign'], 'true'))
+ pool:
+ # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
+ ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
+ name: AzurePipelines-EO
+ image: 1ESPT-Windows2022
+ demands: Cmd
+ os: windows
+ # If it's not devdiv, it's dnceng
+ ${{ else }}:
+ ${{ if eq(parameters.is1ESPipeline, true) }}:
+ name: $(DncEngInternalBuildPool)
+ image: 1es-windows-2022
+ os: windows
+ ${{ else }}:
+ name: $(DncEngInternalBuildPool)
+ demands: ImageOverride -equals windows.vs2022.amd64
+ steps:
+ - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+
+ - task: DownloadBuildArtifacts@0
+ displayName: Download Package Artifacts
+ inputs:
+ buildType: specific
+ buildVersionToDownload: specific
+ project: $(AzDOProjectName)
+ pipeline: $(AzDOPipelineId)
+ buildId: $(AzDOBuildId)
+ artifactName: PackageArtifacts
+ checkDownloadedFiles: true
+ itemPattern: |
+ **
+ !**/Microsoft.SourceBuild.Intermediate.*.nupkg
+
+ # This is necessary whenever we want to publish/restore to an AzDO private feed
+ # Since sdk-task.ps1 tries to restore packages we need to do this authentication here
+ # otherwise it'll complain about accessing a private feed.
+ - task: NuGetAuthenticate@1
+ displayName: 'Authenticate to AzDO Feeds'
+
+ # Signing validation will optionally work with the buildmanifest file which is downloaded from
+ # Azure DevOps above.
+ - task: PowerShell@2
+ displayName: Validate
+ inputs:
+ filePath: eng\common\sdk-task.ps1
+ arguments: -task SigningValidation -restore -msbuildEngine vs
+ /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts'
+ /p:SignCheckExclusionsFile='$(Build.SourcesDirectory)/eng/SignCheckExclusionsFile.txt'
+ ${{ parameters.signingValidationAdditionalParameters }}
+
+ - template: /eng/common/core-templates/steps/publish-logs.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ StageLabel: 'Validation'
+ JobLabel: 'Signing'
+ BinlogToolVersion: $(BinlogToolVersion)
+
+ - job:
+ displayName: SourceLink Validation
+ condition: eq( ${{ parameters.enableSourceLinkValidation }}, 'true')
+ pool:
+ # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
+ ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
+ name: AzurePipelines-EO
+ image: 1ESPT-Windows2022
+ demands: Cmd
+ os: windows
+ # If it's not devdiv, it's dnceng
+ ${{ else }}:
+ ${{ if eq(parameters.is1ESPipeline, true) }}:
+ name: $(DncEngInternalBuildPool)
+ image: 1es-windows-2022
+ os: windows
+ ${{ else }}:
+ name: $(DncEngInternalBuildPool)
+ demands: ImageOverride -equals windows.vs2022.amd64
+ steps:
+ - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+
+ - task: DownloadBuildArtifacts@0
+ displayName: Download Blob Artifacts
+ inputs:
+ buildType: specific
+ buildVersionToDownload: specific
+ project: $(AzDOProjectName)
+ pipeline: $(AzDOPipelineId)
+ buildId: $(AzDOBuildId)
+ artifactName: BlobArtifacts
+ checkDownloadedFiles: true
+
+ - task: PowerShell@2
+ displayName: Validate
+ inputs:
+ filePath: $(Build.SourcesDirectory)/eng/common/post-build/sourcelink-validation.ps1
+ arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/
+ -ExtractPath $(Agent.BuildDirectory)/Extract/
+ -GHRepoName $(Build.Repository.Name)
+ -GHCommit $(Build.SourceVersion)
+ -SourcelinkCliVersion $(SourceLinkCLIVersion)
+ continueOnError: true
+
+- ${{ if ne(parameters.publishAssetsImmediately, 'true') }}:
+ - stage: publish_using_darc
+ ${{ if or(eq(parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true'), eq(parameters.SDLValidationParameters.enable, 'true')) }}:
+ dependsOn: ${{ parameters.publishDependsOn }}
+ ${{ else }}:
+ dependsOn: ${{ parameters.validateDependsOn }}
+ displayName: Publish using Darc
+ variables:
+ - template: /eng/common/core-templates/post-build/common-variables.yml
+ - template: /eng/common/core-templates/variables/pool-providers.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ jobs:
+ - job:
+ displayName: Publish Using Darc
+ timeoutInMinutes: 120
+ pool:
+ # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
+ ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
+ name: AzurePipelines-EO
+ image: 1ESPT-Windows2022
+ demands: Cmd
+ os: windows
+ # If it's not devdiv, it's dnceng
+ ${{ else }}:
+ ${{ if eq(parameters.is1ESPipeline, true) }}:
+ name: NetCore1ESPool-Publishing-Internal
+ image: windows.vs2019.amd64
+ os: windows
+ ${{ else }}:
+ name: NetCore1ESPool-Publishing-Internal
+ demands: ImageOverride -equals windows.vs2019.amd64
+ steps:
+ - template: /eng/common/core-templates/post-build/setup-maestro-vars.yml
+ parameters:
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+
+ - task: NuGetAuthenticate@1
+
+ - 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 true
+ -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}'
+ -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}'
diff --git a/eng/common/core-templates/post-build/setup-maestro-vars.yml b/eng/common/core-templates/post-build/setup-maestro-vars.yml
new file mode 100644
index 000000000000..8d56b5726793
--- /dev/null
+++ b/eng/common/core-templates/post-build/setup-maestro-vars.yml
@@ -0,0 +1,74 @@
+parameters:
+ BARBuildId: ''
+ PromoteToChannelIds: ''
+ is1ESPipeline: ''
+
+steps:
+ - ${{ if eq(parameters.is1ESPipeline, '') }}:
+ - 'Illegal entry point, is1ESPipeline is not defined. Repository yaml should not directly reference templates in core-templates folder.': error
+
+ - ${{ if eq(coalesce(parameters.PromoteToChannelIds, 0), 0) }}:
+ - task: DownloadBuildArtifacts@0
+ displayName: Download Release Configs
+ inputs:
+ buildType: current
+ artifactName: ReleaseConfigs
+ checkDownloadedFiles: true
+
+ - task: PowerShell@2
+ name: setReleaseVars
+ displayName: Set Release Configs Vars
+ inputs:
+ targetType: inline
+ pwsh: true
+ script: |
+ try {
+ if (!$Env:PromoteToMaestroChannels -or $Env:PromoteToMaestroChannels.Trim() -eq '') {
+ $Content = Get-Content $(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt
+
+ $BarId = $Content | Select -Index 0
+ $Channels = $Content | Select -Index 1
+ $IsStableBuild = $Content | Select -Index 2
+
+ $AzureDevOpsProject = $Env:System_TeamProject
+ $AzureDevOpsBuildDefinitionId = $Env:System_DefinitionId
+ $AzureDevOpsBuildId = $Env:Build_BuildId
+ }
+ else {
+ $buildApiEndpoint = "${Env:MaestroApiEndPoint}/api/builds/${Env:BARBuildId}?api-version=${Env:MaestroApiVersion}"
+
+ $apiHeaders = New-Object 'System.Collections.Generic.Dictionary[[String],[String]]'
+ $apiHeaders.Add('Accept', 'application/json')
+ $apiHeaders.Add('Authorization',"Bearer ${Env:MAESTRO_API_TOKEN}")
+
+ $buildInfo = try { Invoke-WebRequest -Method Get -Uri $buildApiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" }
+
+ $BarId = $Env:BARBuildId
+ $Channels = $Env:PromoteToMaestroChannels -split ","
+ $Channels = $Channels -join "]["
+ $Channels = "[$Channels]"
+
+ $IsStableBuild = $buildInfo.stable
+ $AzureDevOpsProject = $buildInfo.azureDevOpsProject
+ $AzureDevOpsBuildDefinitionId = $buildInfo.azureDevOpsBuildDefinitionId
+ $AzureDevOpsBuildId = $buildInfo.azureDevOpsBuildId
+ }
+
+ Write-Host "##vso[task.setvariable variable=BARBuildId]$BarId"
+ Write-Host "##vso[task.setvariable variable=TargetChannels]$Channels"
+ Write-Host "##vso[task.setvariable variable=IsStableBuild]$IsStableBuild"
+
+ Write-Host "##vso[task.setvariable variable=AzDOProjectName]$AzureDevOpsProject"
+ Write-Host "##vso[task.setvariable variable=AzDOPipelineId]$AzureDevOpsBuildDefinitionId"
+ Write-Host "##vso[task.setvariable variable=AzDOBuildId]$AzureDevOpsBuildId"
+ }
+ catch {
+ Write-Host $_
+ Write-Host $_.Exception
+ Write-Host $_.ScriptStackTrace
+ exit 1
+ }
+ env:
+ MAESTRO_API_TOKEN: $(MaestroApiAccessToken)
+ BARBuildId: ${{ parameters.BARBuildId }}
+ PromoteToMaestroChannels: ${{ parameters.PromoteToChannelIds }}
diff --git a/eng/common/core-templates/post-build/trigger-subscription.yml b/eng/common/core-templates/post-build/trigger-subscription.yml
new file mode 100644
index 000000000000..da669030daf6
--- /dev/null
+++ b/eng/common/core-templates/post-build/trigger-subscription.yml
@@ -0,0 +1,13 @@
+parameters:
+ ChannelId: 0
+
+steps:
+- task: PowerShell@2
+ displayName: Triggering subscriptions
+ inputs:
+ filePath: $(Build.SourcesDirectory)/eng/common/post-build/trigger-subscriptions.ps1
+ arguments: -SourceRepo $(Build.Repository.Uri)
+ -ChannelId ${{ parameters.ChannelId }}
+ -MaestroApiAccessToken $(MaestroAccessToken)
+ -MaestroApiEndPoint $(MaestroApiEndPoint)
+ -MaestroApiVersion $(MaestroApiVersion)
diff --git a/eng/common/core-templates/steps/add-build-to-channel.yml b/eng/common/core-templates/steps/add-build-to-channel.yml
new file mode 100644
index 000000000000..f67a210d62f3
--- /dev/null
+++ b/eng/common/core-templates/steps/add-build-to-channel.yml
@@ -0,0 +1,13 @@
+parameters:
+ ChannelId: 0
+
+steps:
+- task: PowerShell@2
+ displayName: Add Build to Channel
+ inputs:
+ filePath: $(Build.SourcesDirectory)/eng/common/post-build/add-build-to-channel.ps1
+ arguments: -BuildId $(BARBuildId)
+ -ChannelId ${{ parameters.ChannelId }}
+ -MaestroApiAccessToken $(MaestroApiAccessToken)
+ -MaestroApiEndPoint $(MaestroApiEndPoint)
+ -MaestroApiVersion $(MaestroApiVersion)
diff --git a/eng/common/core-templates/steps/component-governance.yml b/eng/common/core-templates/steps/component-governance.yml
new file mode 100644
index 000000000000..df449a34c112
--- /dev/null
+++ b/eng/common/core-templates/steps/component-governance.yml
@@ -0,0 +1,14 @@
+parameters:
+ disableComponentGovernance: false
+ componentGovernanceIgnoreDirectories: ''
+ is1ESPipeline: false
+
+steps:
+- ${{ if eq(parameters.disableComponentGovernance, 'true') }}:
+ - script: echo "##vso[task.setvariable variable=skipComponentGovernanceDetection]true"
+ displayName: Set skipComponentGovernanceDetection variable
+- ${{ if ne(parameters.disableComponentGovernance, 'true') }}:
+ - task: ComponentGovernanceComponentDetection@0
+ continueOnError: true
+ inputs:
+ ignoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
\ No newline at end of file
diff --git a/eng/common/core-templates/steps/generate-sbom.yml b/eng/common/core-templates/steps/generate-sbom.yml
new file mode 100644
index 000000000000..d938b60e1bb5
--- /dev/null
+++ b/eng/common/core-templates/steps/generate-sbom.yml
@@ -0,0 +1,54 @@
+# BuildDropPath - The root folder of the drop directory for which the manifest file will be generated.
+# PackageName - The name of the package this SBOM represents.
+# PackageVersion - The version of the package this SBOM represents.
+# ManifestDirPath - The path of the directory where the generated manifest files will be placed
+# IgnoreDirectories - Directories to ignore for SBOM generation. This will be passed through to the CG component detector.
+
+parameters:
+ PackageVersion: 9.0.0
+ BuildDropPath: '$(Build.SourcesDirectory)/artifacts'
+ PackageName: '.NET'
+ ManifestDirPath: $(Build.ArtifactStagingDirectory)/sbom
+ IgnoreDirectories: ''
+ sbomContinueOnError: true
+ is1ESPipeline: false
+ # disable publishArtifacts if some other step is publishing the artifacts (like job.yml).
+ publishArtifacts: true
+
+steps:
+- task: PowerShell@2
+ displayName: Prep for SBOM generation in (Non-linux)
+ condition: or(eq(variables['Agent.Os'], 'Windows_NT'), eq(variables['Agent.Os'], 'Darwin'))
+ inputs:
+ filePath: ./eng/common/generate-sbom-prep.ps1
+ arguments: ${{parameters.manifestDirPath}}
+
+# Chmodding is a workaround for https://github.com/dotnet/arcade/issues/8461
+- script: |
+ chmod +x ./eng/common/generate-sbom-prep.sh
+ ./eng/common/generate-sbom-prep.sh ${{parameters.manifestDirPath}}
+ displayName: Prep for SBOM generation in (Linux)
+ condition: eq(variables['Agent.Os'], 'Linux')
+ continueOnError: ${{ parameters.sbomContinueOnError }}
+
+- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
+ displayName: 'Generate SBOM manifest'
+ continueOnError: ${{ parameters.sbomContinueOnError }}
+ inputs:
+ PackageName: ${{ parameters.packageName }}
+ BuildDropPath: ${{ parameters.buildDropPath }}
+ PackageVersion: ${{ parameters.packageVersion }}
+ ManifestDirPath: ${{ parameters.manifestDirPath }}
+ ${{ if ne(parameters.IgnoreDirectories, '') }}:
+ AdditionalComponentDetectorArgs: '--IgnoreDirectories ${{ parameters.IgnoreDirectories }}'
+
+- ${{ if eq(parameters.publishArtifacts, 'true')}}:
+ - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ args:
+ displayName: Publish SBOM manifest
+ continueOnError: ${{parameters.sbomContinueOnError}}
+ targetPath: '${{ parameters.manifestDirPath }}'
+ artifactName: $(ARTIFACT_NAME)
+
diff --git a/eng/common/core-templates/steps/publish-build-artifacts.yml b/eng/common/core-templates/steps/publish-build-artifacts.yml
new file mode 100644
index 000000000000..f24ce346684e
--- /dev/null
+++ b/eng/common/core-templates/steps/publish-build-artifacts.yml
@@ -0,0 +1,20 @@
+parameters:
+- name: is1ESPipeline
+ type: boolean
+ default: false
+- name: args
+ type: object
+ default: {}
+steps:
+- ${{ if ne(parameters.is1ESPipeline, true) }}:
+ - template: /eng/common/templates/steps/publish-build-artifacts.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ ${{ each parameter in parameters.args }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
+- ${{ else }}:
+ - template: /eng/common/templates-official/steps/publish-build-artifacts.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ ${{ each parameter in parameters.args }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
\ No newline at end of file
diff --git a/eng/common/core-templates/steps/publish-logs.yml b/eng/common/core-templates/steps/publish-logs.yml
new file mode 100644
index 000000000000..8c5ea77b586d
--- /dev/null
+++ b/eng/common/core-templates/steps/publish-logs.yml
@@ -0,0 +1,59 @@
+parameters:
+ StageLabel: ''
+ JobLabel: ''
+ CustomSensitiveDataList: ''
+ # A default - in case value from eng/common/core-templates/post-build/common-variables.yml is not passed
+ BinlogToolVersion: '1.0.11'
+ is1ESPipeline: false
+
+steps:
+- task: Powershell@2
+ displayName: Prepare Binlogs to Upload
+ inputs:
+ targetType: inline
+ script: |
+ New-Item -ItemType Directory $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/
+ Move-Item -Path $(Build.SourcesDirectory)/artifacts/log/Debug/* $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/
+ continueOnError: true
+ condition: always()
+
+- task: PowerShell@2
+ displayName: Redact Logs
+ inputs:
+ filePath: $(Build.SourcesDirectory)/eng/common/post-build/redact-logs.ps1
+ # For now this needs to have explicit list of all sensitive data. Taken from eng/publishing/v3/publish.yml
+ # Sensitive data can as well be added to $(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt'
+ # If the file exists - sensitive data for redaction will be sourced from it
+ # (single entry per line, lines starting with '# ' are considered comments and skipped)
+ arguments: -InputPath '$(Build.SourcesDirectory)/PostBuildLogs'
+ -BinlogToolVersion ${{parameters.BinlogToolVersion}}
+ -TokensFilePath '$(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt'
+ '$(publishing-dnceng-devdiv-code-r-build-re)'
+ '$(MaestroAccessToken)'
+ '$(dn-bot-all-orgs-artifact-feeds-rw)'
+ '$(akams-client-id)'
+ '$(akams-client-secret)'
+ '$(microsoft-symbol-server-pat)'
+ '$(symweb-symbol-server-pat)'
+ '$(dn-bot-all-orgs-build-rw-code-rw)'
+ ${{parameters.CustomSensitiveDataList}}
+ continueOnError: true
+ condition: always()
+
+- task: CopyFiles@2
+ displayName: Gather post build logs
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/PostBuildLogs'
+ Contents: '**'
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/PostBuildLogs'
+
+- template: /eng/common/core-templates/steps/publish-build-artifacts.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ args:
+ displayName: Publish Logs
+ pathToPublish: '$(Build.ArtifactStagingDirectory)/PostBuildLogs'
+ publishLocation: Container
+ artifactName: PostBuildLogs
+ continueOnError: true
+ condition: always()
diff --git a/eng/common/core-templates/steps/publish-pipeline-artifacts.yml b/eng/common/core-templates/steps/publish-pipeline-artifacts.yml
new file mode 100644
index 000000000000..2efec04dc2c1
--- /dev/null
+++ b/eng/common/core-templates/steps/publish-pipeline-artifacts.yml
@@ -0,0 +1,20 @@
+parameters:
+- name: is1ESPipeline
+ type: boolean
+ default: false
+
+- name: args
+ type: object
+ default: {}
+
+steps:
+- ${{ if ne(parameters.is1ESPipeline, true) }}:
+ - template: /eng/common/templates/steps/publish-pipeline-artifacts.yml
+ parameters:
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
+- ${{ else }}:
+ - template: /eng/common/templates-official/steps/publish-pipeline-artifacts.yml
+ parameters:
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/core-templates/steps/retain-build.yml b/eng/common/core-templates/steps/retain-build.yml
new file mode 100644
index 000000000000..83d97a26a01f
--- /dev/null
+++ b/eng/common/core-templates/steps/retain-build.yml
@@ -0,0 +1,28 @@
+parameters:
+ # Optional azure devops PAT with build execute permissions for the build's organization,
+ # only needed if the build that should be retained ran on a different organization than
+ # the pipeline where this template is executing from
+ Token: ''
+ # Optional BuildId to retain, defaults to the current running build
+ BuildId: ''
+ # Azure devops Organization URI for the build in the https://dev.azure.com/ format.
+ # Defaults to the organization the current pipeline is running on
+ AzdoOrgUri: '$(System.CollectionUri)'
+ # Azure devops project for the build. Defaults to the project the current pipeline is running on
+ AzdoProject: '$(System.TeamProject)'
+
+steps:
+ - task: powershell@2
+ inputs:
+ targetType: 'filePath'
+ filePath: eng/common/retain-build.ps1
+ pwsh: true
+ arguments: >
+ -AzdoOrgUri: ${{parameters.AzdoOrgUri}}
+ -AzdoProject ${{parameters.AzdoProject}}
+ -Token ${{coalesce(parameters.Token, '$env:SYSTEM_ACCESSTOKEN') }}
+ -BuildId ${{coalesce(parameters.BuildId, '$env:BUILD_ID')}}
+ displayName: Enable permanent build retention
+ env:
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ BUILD_ID: $(Build.BuildId)
\ No newline at end of file
diff --git a/eng/common/core-templates/steps/send-to-helix.yml b/eng/common/core-templates/steps/send-to-helix.yml
new file mode 100644
index 000000000000..68fa739c4ab2
--- /dev/null
+++ b/eng/common/core-templates/steps/send-to-helix.yml
@@ -0,0 +1,93 @@
+# Please remember to update the documentation if you make changes to these parameters!
+parameters:
+ 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
+ HelixTargetQueues: '' # required -- semicolon-delimited list of Helix queues to test on; see https://helix.dot.net/ for a list of queues
+ HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group
+ HelixProjectPath: 'eng/common/helixpublish.proj' # optional -- path to the project file to build relative to BUILD_SOURCESDIRECTORY
+ HelixProjectArguments: '' # optional -- arguments passed to the build command
+ HelixConfiguration: '' # optional -- additional property attached to a job
+ HelixPreCommands: '' # optional -- commands to run before Helix work item execution
+ HelixPostCommands: '' # optional -- commands to run after Helix work item execution
+ WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects
+ WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects
+ WorkItemTimeout: '' # optional -- a timeout in TimeSpan.Parse-ready value (e.g. 00:02:00) for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects
+ CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload
+ XUnitProjects: '' # optional -- semicolon-delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true
+ XUnitWorkItemTimeout: '' # optional -- the workitem timeout in seconds for all workitems created from the xUnit projects specified by XUnitProjects
+ XUnitPublishTargetFramework: '' # optional -- framework to use to publish your xUnit projects
+ 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', 'runtime' or 'aspnetcore-runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json
+ DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json
+ 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."
+ IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set
+ HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting https://helix.int-dot.net )
+ Creator: '' # optional -- if the build is external, use this to specify who is sending the job
+ DisplayNamePrefix: 'Run Tests' # 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
+
+steps:
+ - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"'
+ displayName: ${{ parameters.DisplayNamePrefix }} (Windows)
+ env:
+ BuildConfig: $(_BuildConfig)
+ HelixSource: ${{ parameters.HelixSource }}
+ HelixType: ${{ parameters.HelixType }}
+ HelixBuild: ${{ parameters.HelixBuild }}
+ HelixConfiguration: ${{ parameters.HelixConfiguration }}
+ HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
+ HelixAccessToken: ${{ parameters.HelixAccessToken }}
+ HelixPreCommands: ${{ parameters.HelixPreCommands }}
+ HelixPostCommands: ${{ parameters.HelixPostCommands }}
+ WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
+ WorkItemCommand: ${{ parameters.WorkItemCommand }}
+ WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
+ CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
+ XUnitProjects: ${{ parameters.XUnitProjects }}
+ XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
+ XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
+ XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
+ XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
+ IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
+ DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
+ DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
+ WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
+ HelixBaseUri: ${{ parameters.HelixBaseUri }}
+ Creator: ${{ parameters.Creator }}
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT'))
+ continueOnError: ${{ parameters.continueOnError }}
+ - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog
+ displayName: ${{ parameters.DisplayNamePrefix }} (Unix)
+ env:
+ BuildConfig: $(_BuildConfig)
+ HelixSource: ${{ parameters.HelixSource }}
+ HelixType: ${{ parameters.HelixType }}
+ HelixBuild: ${{ parameters.HelixBuild }}
+ HelixConfiguration: ${{ parameters.HelixConfiguration }}
+ HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
+ HelixAccessToken: ${{ parameters.HelixAccessToken }}
+ HelixPreCommands: ${{ parameters.HelixPreCommands }}
+ HelixPostCommands: ${{ parameters.HelixPostCommands }}
+ WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
+ WorkItemCommand: ${{ parameters.WorkItemCommand }}
+ WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
+ CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
+ XUnitProjects: ${{ parameters.XUnitProjects }}
+ XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
+ XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
+ XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
+ XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
+ IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
+ DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
+ DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
+ WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
+ HelixBaseUri: ${{ parameters.HelixBaseUri }}
+ 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/core-templates/steps/source-build.yml b/eng/common/core-templates/steps/source-build.yml
new file mode 100644
index 000000000000..bdd725b496f9
--- /dev/null
+++ b/eng/common/core-templates/steps/source-build.yml
@@ -0,0 +1,134 @@
+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/core-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: {}
+ is1ESPipeline: false
+
+steps:
+# Build. Keep it self-contained for simple reusability. (No source-build-specific job variables.)
+- script: |
+ set -x
+ df -h
+
+ # If building on the internal project, the artifact feeds variable may be available (usually only if needed)
+ # In that case, call the feed setup script to add internal feeds corresponding to public ones.
+ # In addition, add an msbuild argument to copy the WIP from the repo to the target build location.
+ # This is because SetupNuGetSources.sh will alter the current NuGet.config file, and we need to preserve those
+ # changes.
+ internalRestoreArgs=
+ if [ '$(dn-bot-dnceng-artifact-feeds-rw)' != '$''(dn-bot-dnceng-artifact-feeds-rw)' ]; then
+ # Temporarily work around https://github.com/dotnet/arcade/issues/7709
+ chmod +x $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh
+ $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh $(Build.SourcesDirectory)/NuGet.config $(dn-bot-dnceng-artifact-feeds-rw)
+ internalRestoreArgs='/p:CopyWipIntoInnerSourceBuildRepo=true'
+
+ # The 'Copy WIP' feature of source build uses git stash to apply changes from the original repo.
+ # This only works if there is a username/email configured, which won't be the case in most CI runs.
+ git config --get user.email
+ if [ $? -ne 0 ]; then
+ git config user.email dn-bot@microsoft.com
+ git config user.name dn-bot
+ fi
+ fi
+
+ # If building on the internal project, the internal storage variable may be available (usually only if needed)
+ # In that case, add variables to allow the download of internal runtimes if the specified versions are not found
+ # in the default public locations.
+ internalRuntimeDownloadArgs=
+ if [ '$(dotnetbuilds-internal-container-read-token-base64)' != '$''(dotnetbuilds-internal-container-read-token-base64)' ]; then
+ internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://dotnetbuilds.blob.core.windows.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://dotnetbuilds.blob.core.windows.net/internal --runtimesourcefeedkey $(dotnetbuilds-internal-container-read-token-base64)'
+ fi
+
+ 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
+
+ runtimeOsArgs=
+ if [ '${{ parameters.platform.runtimeOS }}' != '' ]; then
+ runtimeOsArgs='/p:RuntimeOS=${{ parameters.platform.runtimeOS }}'
+ fi
+
+ baseOsArgs=
+ if [ '${{ parameters.platform.baseOS }}' != '' ]; then
+ baseOsArgs='/p:BaseOS=${{ parameters.platform.baseOS }}'
+ fi
+
+ publishArgs=
+ if [ '${{ parameters.platform.skipPublishValidation }}' != 'true' ]; then
+ publishArgs='--publish'
+ fi
+
+ assetManifestFileName=SourceBuild_RidSpecific.xml
+ if [ '${{ parameters.platform.name }}' != '' ]; then
+ assetManifestFileName=SourceBuild_${{ parameters.platform.name }}.xml
+ fi
+
+ ${{ coalesce(parameters.platform.buildScript, './build.sh') }} --ci \
+ --configuration $buildConfig \
+ --restore --build --pack $publishArgs -bl \
+ $officialBuildArgs \
+ $internalRuntimeDownloadArgs \
+ $internalRestoreArgs \
+ $targetRidArgs \
+ $runtimeOsArgs \
+ $baseOsArgs \
+ /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \
+ /p:ArcadeBuildFromSource=true \
+ /p:DotNetBuildSourceOnly=true \
+ /p:DotNetBuildRepo=true \
+ /p:AssetManifestFileName=$assetManifestFileName
+ displayName: Build
+
+# Upload build logs for diagnosis.
+- task: CopyFiles@2
+ displayName: Prepare BuildLogs staging directory
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)'
+ Contents: |
+ **/*.log
+ **/*.binlog
+ artifacts/sb/prebuilt-report/**
+ TargetFolder: '$(Build.StagingDirectory)/BuildLogs'
+ CleanTargetFolder: true
+ continueOnError: true
+ condition: succeededOrFailed()
+
+- template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml
+ parameters:
+ is1ESPipeline: ${{ parameters.is1ESPipeline }}
+ args:
+ displayName: Publish BuildLogs
+ targetPath: '$(Build.StagingDirectory)/BuildLogs'
+ artifactName: BuildLogs_SourceBuild_${{ parameters.platform.name }}_Attempt$(System.JobAttempt)
+ continueOnError: true
+ condition: succeededOrFailed()
+
+# Manually inject component detection so that we can ignore the source build upstream cache, which contains
+# a nupkg cache of input packages (a local feed).
+# This path must match the upstream cache path in property 'CurrentRepoSourceBuiltNupkgCacheDir'
+# in src\Microsoft.DotNet.Arcade.Sdk\tools\SourceBuild\SourceBuildArcade.targets
+- task: ComponentGovernanceComponentDetection@0
+ displayName: Component Detection (Exclude upstream cache)
+ inputs:
+ ignoreDirectories: '$(Build.SourcesDirectory)/artifacts/sb/src/artifacts/obj/source-built-upstream-cache'
diff --git a/eng/common/core-templates/variables/pool-providers.yml b/eng/common/core-templates/variables/pool-providers.yml
new file mode 100644
index 000000000000..41053d382a2e
--- /dev/null
+++ b/eng/common/core-templates/variables/pool-providers.yml
@@ -0,0 +1,8 @@
+parameters:
+ is1ESPipeline: false
+
+variables:
+ - ${{ if eq(parameters.is1ESPipeline, 'true') }}:
+ - template: /eng/common/templates-official/variables/pool-providers.yml
+ - ${{ else }}:
+ - template: /eng/common/templates/variables/pool-providers.yml
\ No newline at end of file
diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh
index 99a9dd6bb609..a8e35df7cee1 100755
--- a/eng/common/cross/build-rootfs.sh
+++ b/eng/common/cross/build-rootfs.sh
@@ -142,7 +142,6 @@ while :; do
case $lowerI in
-\?|-h|--help)
usage
- exit 1
;;
arm)
__BuildArch=arm
@@ -229,12 +228,19 @@ while :; do
__UbuntuRepo="http://archive.ubuntu.com/ubuntu/"
;;
lldb*)
- version="${lowerI/lldb/}"
- parts=(${version//./ })
+ version="$(echo "$lowerI" | tr -d '[:alpha:]-=')"
+ majorVersion="${version%%.*}"
+
+ [ -z "${version##*.*}" ] && minorVersion="${version#*.}"
+ if [ -z "$minorVersion" ]; then
+ minorVersion=0
+ fi
# for versions > 6.0, lldb has dropped the minor version
- if [[ "${parts[0]}" -gt 6 ]]; then
- version="${parts[0]}"
+ if [ "$majorVersion" -le 6 ]; then
+ version="$majorVersion.$minorVersion"
+ else
+ version="$majorVersion"
fi
__LLDB_Package="liblldb-${version}-dev"
@@ -243,15 +249,19 @@ while :; do
unset __LLDB_Package
;;
llvm*)
- version="${lowerI/llvm/}"
- parts=(${version//./ })
- __LLVM_MajorVersion="${parts[0]}"
- __LLVM_MinorVersion="${parts[1]}"
-
- # for versions > 6.0, llvm has dropped the minor version
- if [[ -z "$__LLVM_MinorVersion" && "$__LLVM_MajorVersion" -le 6 ]]; then
- __LLVM_MinorVersion=0;
+ version="$(echo "$lowerI" | tr -d '[:alpha:]-=')"
+ __LLVM_MajorVersion="${version%%.*}"
+
+ [ -z "${version##*.*}" ] && __LLVM_MinorVersion="${version#*.}"
+ if [ -z "$__LLVM_MinorVersion" ]; then
+ __LLVM_MinorVersion=0
+ fi
+
+ # for versions > 6.0, lldb has dropped the minor version
+ if [ "$__LLVM_MajorVersion" -gt 6 ]; then
+ __LLVM_MinorVersion=
fi
+
;;
xenial) # Ubuntu 16.04
if [[ "$__CodeName" != "jessie" ]]; then
@@ -323,15 +333,14 @@ while :; do
alpine*)
__CodeName=alpine
__UbuntuRepo=
- version="${lowerI/alpine/}"
- if [[ "$version" == "edge" ]]; then
+ if [[ "$lowerI" == "alpineedge" ]]; then
__AlpineVersion=edge
else
- parts=(${version//./ })
- __AlpineMajorVersion="${parts[0]}"
- __AlpineMinoVersion="${parts[1]}"
- __AlpineVersion="$__AlpineMajorVersion.$__AlpineMinoVersion"
+ version="$(echo "$lowerI" | tr -d '[:alpha:]-=')"
+ __AlpineMajorVersion="${version%%.*}"
+ __AlpineMinorVersion="${version#*.}"
+ __AlpineVersion="$__AlpineMajorVersion.$__AlpineMinorVersion"
fi
;;
freebsd13)
@@ -442,13 +451,39 @@ fi
mkdir -p "$__RootfsDir"
__RootfsDir="$( cd "$__RootfsDir" && pwd )"
+__hasWget=
+ensureDownloadTool()
+{
+ if command -v wget &> /dev/null; then
+ __hasWget=1
+ elif command -v curl &> /dev/null; then
+ __hasWget=0
+ else
+ >&2 echo "ERROR: either wget or curl is required by this script."
+ exit 1
+ fi
+}
+
if [[ "$__CodeName" == "alpine" ]]; then
__ApkToolsVersion=2.12.11
- __ApkToolsSHA512SUM=53e57b49230da07ef44ee0765b9592580308c407a8d4da7125550957bb72cb59638e04f8892a18b584451c8d841d1c7cb0f0ab680cc323a3015776affaa3be33
__ApkToolsDir="$(mktemp -d)"
__ApkKeysDir="$(mktemp -d)"
+ arch="$(uname -m)"
- wget "https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic//v$__ApkToolsVersion/x86_64/apk.static" -P "$__ApkToolsDir"
+ ensureDownloadTool
+
+ if [[ "$__hasWget" == 1 ]]; then
+ wget -P "$__ApkToolsDir" "https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic/v$__ApkToolsVersion/$arch/apk.static"
+ else
+ curl -SLO --create-dirs --output-dir "$__ApkToolsDir" "https://gitlab.alpinelinux.org/api/v4/projects/5/packages/generic/v$__ApkToolsVersion/$arch/apk.static"
+ fi
+ if [[ "$arch" == "x86_64" ]]; then
+ __ApkToolsSHA512SUM="53e57b49230da07ef44ee0765b9592580308c407a8d4da7125550957bb72cb59638e04f8892a18b584451c8d841d1c7cb0f0ab680cc323a3015776affaa3be33"
+ elif [[ "$arch" == "aarch64" ]]; then
+ __ApkToolsSHA512SUM="9e2b37ecb2b56c05dad23d379be84fd494c14bd730b620d0d576bda760588e1f2f59a7fcb2f2080577e0085f23a0ca8eadd993b4e61c2ab29549fdb71969afd0"
+ else
+ echo "WARNING: add missing hash for your host architecture. To find the value, use: 'find /tmp -name apk.static -exec sha512sum {} \;'"
+ fi
echo "$__ApkToolsSHA512SUM $__ApkToolsDir/apk.static" | sha512sum -c
chmod +x "$__ApkToolsDir/apk.static"
@@ -477,12 +512,14 @@ if [[ "$__CodeName" == "alpine" ]]; then
fi
# initialize DB
+ # shellcheck disable=SC2086
"$__ApkToolsDir/apk.static" \
-X "http://dl-cdn.alpinelinux.org/alpine/$version/main" \
-X "http://dl-cdn.alpinelinux.org/alpine/$version/community" \
-U $__ApkSignatureArg --root "$__RootfsDir" --arch "$__AlpineArch" --initdb add
if [[ "$__AlpineLlvmLibsLookup" == 1 ]]; then
+ # shellcheck disable=SC2086
__AlpinePackages+=" $("$__ApkToolsDir/apk.static" \
-X "http://dl-cdn.alpinelinux.org/alpine/$version/main" \
-X "http://dl-cdn.alpinelinux.org/alpine/$version/community" \
@@ -491,6 +528,7 @@ if [[ "$__CodeName" == "alpine" ]]; then
fi
# install all packages in one go
+ # shellcheck disable=SC2086
"$__ApkToolsDir/apk.static" \
-X "http://dl-cdn.alpinelinux.org/alpine/$version/main" \
-X "http://dl-cdn.alpinelinux.org/alpine/$version/community" \
@@ -501,12 +539,23 @@ if [[ "$__CodeName" == "alpine" ]]; then
elif [[ "$__CodeName" == "freebsd" ]]; then
mkdir -p "$__RootfsDir"/usr/local/etc
JOBS=${MAXJOBS:="$(getconf _NPROCESSORS_ONLN)"}
- wget -O - "https://download.freebsd.org/ftp/releases/${__FreeBSDArch}/${__FreeBSDMachineArch}/${__FreeBSDBase}/base.txz" | tar -C "$__RootfsDir" -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version
+
+ ensureDownloadTool
+
+ if [[ "$__hasWget" == 1 ]]; then
+ wget -O- "https://download.freebsd.org/ftp/releases/${__FreeBSDArch}/${__FreeBSDMachineArch}/${__FreeBSDBase}/base.txz" | tar -C "$__RootfsDir" -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version
+ else
+ curl -SL "https://download.freebsd.org/ftp/releases/${__FreeBSDArch}/${__FreeBSDMachineArch}/${__FreeBSDBase}/base.txz" | tar -C "$__RootfsDir" -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version
+ fi
echo "ABI = \"FreeBSD:${__FreeBSDABI}:${__FreeBSDMachineArch}\"; FINGERPRINTS = \"${__RootfsDir}/usr/share/keys\"; REPOS_DIR = [\"${__RootfsDir}/etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO;" > "${__RootfsDir}"/usr/local/etc/pkg.conf
echo "FreeBSD: { url: \"pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly\", mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \"${__RootfsDir}/usr/share/keys/pkg\", enabled: yes }" > "${__RootfsDir}"/etc/pkg/FreeBSD.conf
mkdir -p "$__RootfsDir"/tmp
# get and build package manager
- wget -O - "https://github.com/freebsd/pkg/archive/${__FreeBSDPkg}.tar.gz" | tar -C "$__RootfsDir"/tmp -zxf -
+ if [[ "$__hasWget" == 1 ]]; then
+ wget -O- "https://github.com/freebsd/pkg/archive/${__FreeBSDPkg}.tar.gz" | tar -C "$__RootfsDir"/tmp -zxf -
+ else
+ curl -SL "https://github.com/freebsd/pkg/archive/${__FreeBSDPkg}.tar.gz" | tar -C "$__RootfsDir"/tmp -zxf -
+ fi
cd "$__RootfsDir/tmp/pkg-${__FreeBSDPkg}"
# needed for install to succeed
mkdir -p "$__RootfsDir"/host/etc
@@ -514,20 +563,36 @@ elif [[ "$__CodeName" == "freebsd" ]]; then
rm -rf "$__RootfsDir/tmp/pkg-${__FreeBSDPkg}"
# install packages we need.
INSTALL_AS_USER=$(whoami) "$__RootfsDir"/host/sbin/pkg -r "$__RootfsDir" -C "$__RootfsDir"/usr/local/etc/pkg.conf update
+ # shellcheck disable=SC2086
INSTALL_AS_USER=$(whoami) "$__RootfsDir"/host/sbin/pkg -r "$__RootfsDir" -C "$__RootfsDir"/usr/local/etc/pkg.conf install --yes $__FreeBSDPackages
elif [[ "$__CodeName" == "illumos" ]]; then
mkdir "$__RootfsDir/tmp"
pushd "$__RootfsDir/tmp"
JOBS=${MAXJOBS:="$(getconf _NPROCESSORS_ONLN)"}
+
+ ensureDownloadTool
+
echo "Downloading sysroot."
- wget -O - https://github.com/illumos/sysroot/releases/download/20181213-de6af22ae73b-v1/illumos-sysroot-i386-20181213-de6af22ae73b-v1.tar.gz | tar -C "$__RootfsDir" -xzf -
+ if [[ "$__hasWget" == 1 ]]; then
+ wget -O- https://github.com/illumos/sysroot/releases/download/20181213-de6af22ae73b-v1/illumos-sysroot-i386-20181213-de6af22ae73b-v1.tar.gz | tar -C "$__RootfsDir" -xzf -
+ else
+ curl -SL https://github.com/illumos/sysroot/releases/download/20181213-de6af22ae73b-v1/illumos-sysroot-i386-20181213-de6af22ae73b-v1.tar.gz | tar -C "$__RootfsDir" -xzf -
+ fi
echo "Building binutils. Please wait.."
- wget -O - https://ftp.gnu.org/gnu/binutils/binutils-2.33.1.tar.bz2 | tar -xjf -
+ if [[ "$__hasWget" == 1 ]]; then
+ wget -O- https://ftp.gnu.org/gnu/binutils/binutils-2.33.1.tar.bz2 | tar -xjf -
+ else
+ curl -SL https://ftp.gnu.org/gnu/binutils/binutils-2.33.1.tar.bz2 | tar -xjf -
+ fi
mkdir build-binutils && cd build-binutils
../binutils-2.33.1/configure --prefix="$__RootfsDir" --target="${__illumosArch}-sun-solaris2.10" --program-prefix="${__illumosArch}-illumos-" --with-sysroot="$__RootfsDir"
make -j "$JOBS" && make install && cd ..
echo "Building gcc. Please wait.."
- wget -O - https://ftp.gnu.org/gnu/gcc/gcc-8.4.0/gcc-8.4.0.tar.xz | tar -xJf -
+ if [[ "$__hasWget" == 1 ]]; then
+ wget -O- https://ftp.gnu.org/gnu/gcc/gcc-8.4.0/gcc-8.4.0.tar.xz | tar -xJf -
+ else
+ curl -SL https://ftp.gnu.org/gnu/gcc/gcc-8.4.0/gcc-8.4.0.tar.xz | tar -xJf -
+ fi
CFLAGS="-fPIC"
CXXFLAGS="-fPIC"
CXXFLAGS_FOR_TARGET="-fPIC"
@@ -544,7 +609,11 @@ elif [[ "$__CodeName" == "illumos" ]]; then
fi
BaseUrl="$BaseUrl/packages/SmartOS/trunk/${__illumosArch}/All"
echo "Downloading manifest"
- wget "$BaseUrl"
+ if [[ "$__hasWget" == 1 ]]; then
+ wget "$BaseUrl"
+ else
+ curl -SLO "$BaseUrl"
+ fi
echo "Downloading dependencies."
read -ra array <<<"$__IllumosPackages"
for package in "${array[@]}"; do
@@ -552,7 +621,11 @@ elif [[ "$__CodeName" == "illumos" ]]; then
# find last occurrence of package in listing and extract its name
package="$(sed -En '/.*href="('"$package"'-[0-9].*).tgz".*/h;$!d;g;s//\1/p' All)"
echo "Resolved name '$package'"
- wget "$BaseUrl"/"$package".tgz
+ if [[ "$__hasWget" == 1 ]]; then
+ wget "$BaseUrl"/"$package".tgz
+ else
+ curl -SLO "$BaseUrl"/"$package".tgz
+ fi
ar -x "$package".tgz
tar --skip-old-files -xzf "$package".tmp.tg* -C "$__RootfsDir" 2>/dev/null
done
@@ -561,10 +634,17 @@ elif [[ "$__CodeName" == "illumos" ]]; then
rm -rf "$__RootfsDir"/{tmp,+*}
mkdir -p "$__RootfsDir"/usr/include/net
mkdir -p "$__RootfsDir"/usr/include/netpacket
- wget -P "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/bpf.h
- wget -P "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/dlt.h
- wget -P "$__RootfsDir"/usr/include/netpacket https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/inet/sockmods/netpacket/packet.h
- wget -P "$__RootfsDir"/usr/include/sys https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/sys/sdt.h
+ if [[ "$__hasWget" == 1 ]]; then
+ wget -P "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/bpf.h
+ wget -P "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/dlt.h
+ wget -P "$__RootfsDir"/usr/include/netpacket https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/inet/sockmods/netpacket/packet.h
+ wget -P "$__RootfsDir"/usr/include/sys https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/sys/sdt.h
+ else
+ curl -SLO --create-dirs --output-dir "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/bpf.h
+ curl -SLO --create-dirs --output-dir "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/dlt.h
+ curl -SLO --create-dirs --output-dir "$__RootfsDir"/usr/include/netpacket https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/inet/sockmods/netpacket/packet.h
+ curl -SLO --create-dirs --output-dir "$__RootfsDir"/usr/include/sys https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/sys/sdt.h
+ fi
elif [[ "$__CodeName" == "haiku" ]]; then
JOBS=${MAXJOBS:="$(getconf _NPROCESSORS_ONLN)"}
@@ -574,9 +654,16 @@ elif [[ "$__CodeName" == "haiku" ]]; then
mkdir "$__RootfsDir/tmp/download"
+ ensureDownloadTool
+
echo "Downloading Haiku package tool"
- git clone https://github.com/haiku/haiku-toolchains-ubuntu --depth 1 $__RootfsDir/tmp/script
- wget -O "$__RootfsDir/tmp/download/hosttools.zip" $($__RootfsDir/tmp/script/fetch.sh --hosttools)
+ git clone https://github.com/haiku/haiku-toolchains-ubuntu --depth 1 "$__RootfsDir/tmp/script"
+ if [[ "$__hasWget" == 1 ]]; then
+ wget -O "$__RootfsDir/tmp/download/hosttools.zip" "$("$__RootfsDir/tmp/script/fetch.sh" --hosttools)"
+ else
+ curl -SLo "$__RootfsDir/tmp/download/hosttools.zip" "$("$__RootfsDir/tmp/script/fetch.sh" --hosttools)"
+ fi
+
unzip -o "$__RootfsDir/tmp/download/hosttools.zip" -d "$__RootfsDir/tmp/bin"
DepotBaseUrl="https://depot.haiku-os.org/__api/v2/pkg/get-pkg"
@@ -589,14 +676,25 @@ elif [[ "$__CodeName" == "haiku" ]]; then
echo "Downloading $package..."
# API documented here: https://github.com/haiku/haikudepotserver/blob/master/haikudepotserver-api2/src/main/resources/api2/pkg.yaml#L60
# The schema here: https://github.com/haiku/haikudepotserver/blob/master/haikudepotserver-api2/src/main/resources/api2/pkg.yaml#L598
- hpkgDownloadUrl="$(wget -qO- --post-data='{"name":"'"$package"'","repositorySourceCode":"haikuports_'$__HaikuArch'","versionType":"LATEST","naturalLanguageCode":"en"}' \
- --header='Content-Type:application/json' "$DepotBaseUrl" | jq -r '.result.versions[].hpkgDownloadURL')"
- wget -P "$__RootfsDir/tmp/download" "$hpkgDownloadUrl"
+ if [[ "$__hasWget" == 1 ]]; then
+ hpkgDownloadUrl="$(wget -qO- --post-data '{"name":"'"$package"'","repositorySourceCode":"haikuports_'$__HaikuArch'","versionType":"LATEST","naturalLanguageCode":"en"}' \
+ --header 'Content-Type:application/json' "$DepotBaseUrl" | jq -r '.result.versions[].hpkgDownloadURL')"
+ wget -P "$__RootfsDir/tmp/download" "$hpkgDownloadUrl"
+ else
+ hpkgDownloadUrl="$(curl -sSL -XPOST --data '{"name":"'"$package"'","repositorySourceCode":"haikuports_'$__HaikuArch'","versionType":"LATEST","naturalLanguageCode":"en"}' \
+ --header 'Content-Type:application/json' "$DepotBaseUrl" | jq -r '.result.versions[].hpkgDownloadURL')"
+ curl -SLO --create-dirs --output-dir "$__RootfsDir/tmp/download" "$hpkgDownloadUrl"
+ fi
done
for package in haiku haiku_devel; do
echo "Downloading $package..."
- hpkgVersion="$(wget -qO- $HpkgBaseUrl | sed -n 's/^.*version: "\([^"]*\)".*$/\1/p')"
- wget -P "$__RootfsDir/tmp/download" "$HpkgBaseUrl/packages/$package-$hpkgVersion-1-$__HaikuArch.hpkg"
+ if [[ "$__hasWget" == 1 ]]; then
+ hpkgVersion="$(wget -qO- "$HpkgBaseUrl" | sed -n 's/^.*version: "\([^"]*\)".*$/\1/p')"
+ wget -P "$__RootfsDir/tmp/download" "$HpkgBaseUrl/packages/$package-$hpkgVersion-1-$__HaikuArch.hpkg"
+ else
+ hpkgVersion="$(curl -sSL "$HpkgBaseUrl" | sed -n 's/^.*version: "\([^"]*\)".*$/\1/p')"
+ curl -SLO --create-dirs --output-dir "$__RootfsDir/tmp/download" "$HpkgBaseUrl/packages/$package-$hpkgVersion-1-$__HaikuArch.hpkg"
+ fi
done
# Set up the sysroot
@@ -609,7 +707,11 @@ elif [[ "$__CodeName" == "haiku" ]]; then
# Download buildtools
echo "Downloading Haiku buildtools"
- wget -O "$__RootfsDir/tmp/download/buildtools.zip" $($__RootfsDir/tmp/script/fetch.sh --buildtools --arch=$__HaikuArch)
+ if [[ "$__hasWget" == 1 ]]; then
+ wget -O "$__RootfsDir/tmp/download/buildtools.zip" "$("$__RootfsDir/tmp/script/fetch.sh" --buildtools --arch=$__HaikuArch)"
+ else
+ curl -SLo "$__RootfsDir/tmp/download/buildtools.zip" "$("$__RootfsDir/tmp/script/fetch.sh" --buildtools --arch=$__HaikuArch)"
+ fi
unzip -o "$__RootfsDir/tmp/download/buildtools.zip" -d "$__RootfsDir"
# Cleaning up temporary files
@@ -622,10 +724,12 @@ elif [[ -n "$__CodeName" ]]; then
__Keyring="$__Keyring --force-check-gpg"
fi
+ # shellcheck disable=SC2086
debootstrap "--variant=minbase" $__Keyring --arch "$__UbuntuArch" "$__CodeName" "$__RootfsDir" "$__UbuntuRepo"
cp "$__CrossDir/$__BuildArch/sources.list.$__CodeName" "$__RootfsDir/etc/apt/sources.list"
chroot "$__RootfsDir" apt-get update
chroot "$__RootfsDir" apt-get -f -y install
+ # shellcheck disable=SC2086
chroot "$__RootfsDir" apt-get -y install $__UbuntuPackages
chroot "$__RootfsDir" symlinks -cr /usr
chroot "$__RootfsDir" apt-get clean
@@ -643,6 +747,5 @@ elif [[ "$__Tizen" == "tizen" ]]; then
ROOTFS_DIR="$__RootfsDir" "$__CrossDir/tizen-build-rootfs.sh" "$__BuildArch"
else
echo "Unsupported target platform."
- usage;
- exit 1
+ usage
fi
diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake
index 3762640fdcf7..9a4e285a5ae3 100644
--- a/eng/common/cross/toolchain.cmake
+++ b/eng/common/cross/toolchain.cmake
@@ -382,6 +382,26 @@ if(TARGET_ARCH_NAME MATCHES "^(arm|armel|x86)$")
endif()
endif()
+# Set C++ standard library options if specified
+set(CLR_CMAKE_CXX_STANDARD_LIBRARY "" CACHE STRING "Standard library flavor to link against. Only supported with the Clang compiler.")
+if (CLR_CMAKE_CXX_STANDARD_LIBRARY)
+ add_compile_options($<$:--stdlib=${CLR_CMAKE_CXX_STANDARD_LIBRARY}>)
+ add_link_options($<$:--stdlib=${CLR_CMAKE_CXX_STANDARD_LIBRARY}>)
+endif()
+
+option(CLR_CMAKE_CXX_STANDARD_LIBRARY_STATIC "Statically link against the C++ standard library" OFF)
+if(CLR_CMAKE_CXX_STANDARD_LIBRARY_STATIC)
+ add_link_options($<$:-static-libstdc++>)
+endif()
+
+set(CLR_CMAKE_CXX_ABI_LIBRARY "" CACHE STRING "C++ ABI implementation library to link against. Only supported with the Clang compiler.")
+if (CLR_CMAKE_CXX_ABI_LIBRARY)
+ # The user may specify the ABI library with the 'lib' prefix, like 'libstdc++'. Strip the prefix here so the linker finds the right library.
+ string(REGEX REPLACE "^lib(.+)" "\\1" CLR_CMAKE_CXX_ABI_LIBRARY ${CLR_CMAKE_CXX_ABI_LIBRARY})
+ # We need to specify this as a linker-backend option as Clang will filter this option out when linking to libc++.
+ add_link_options("LINKER:-l${CLR_CMAKE_CXX_ABI_LIBRARY}")
+endif()
+
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/eng/common/native/init-compiler.sh b/eng/common/native/init-compiler.sh
index afdeb7a4d54a..ccd3a17268e2 100644
--- a/eng/common/native/init-compiler.sh
+++ b/eng/common/native/init-compiler.sh
@@ -64,7 +64,7 @@ if [ -z "$CLR_CC" ]; then
if [ -z "$majorVersion" ]; then
# note: gcc (all versions) and clang versions higher than 6 do not have minor version in file name, if it is zero.
if [ "$compiler" = "clang" ]; then versions="18 17 16 15 14 13 12 11 10 9 8 7 6.0 5.0 4.0 3.9 3.8 3.7 3.6 3.5"
- elif [ "$compiler" = "gcc" ]; then versions="13 12 11 10 9 8 7 6 5 4.9"; fi
+ elif [ "$compiler" = "gcc" ]; then versions="14 13 12 11 10 9 8 7 6 5 4.9"; fi
for version in $versions; do
_major="${version%%.*}"
diff --git a/eng/common/native/init-distro-rid.sh b/eng/common/native/init-distro-rid.sh
index 228be0b15986..83ea7aab0e08 100644
--- a/eng/common/native/init-distro-rid.sh
+++ b/eng/common/native/init-distro-rid.sh
@@ -20,10 +20,6 @@ getNonPortableDistroRid()
# shellcheck disable=SC1091
if [ -e "${rootfsDir}/etc/os-release" ]; then
. "${rootfsDir}/etc/os-release"
- if [ "${ID}" = "rhel" ] || [ "${ID}" = "rocky" ] || [ "${ID}" = "alpine" ] || [ "${ID}" = "ol" ]; then
- VERSION_ID="${VERSION_ID%.*}" # Remove the last version digit for these distros
- fi
-
if echo "${VERSION_ID:-}" | grep -qE '^([[:digit:]]|\.)+$'; then
nonPortableRid="${ID}.${VERSION_ID}-${targetArch}"
else
@@ -48,19 +44,7 @@ getNonPortableDistroRid()
nonPortableRid="android.$__android_sdk_version-${targetArch}"
elif [ "$targetOs" = "illumos" ]; then
__uname_version=$(uname -v)
- case "$__uname_version" in
- omnios-*)
- __omnios_major_version=$(echo "$__uname_version" | cut -c9-10)
- nonPortableRid="omnios.$__omnios_major_version-${targetArch}"
- ;;
- joyent_*)
- __smartos_major_version=$(echo "$__uname_version" | cut -c9-10)
- nonPortableRid="smartos.$__smartos_major_version-${targetArch}"
- ;;
- *)
- nonPortableRid="illumos-${targetArch}"
- ;;
- esac
+ nonPortableRid="illumos-${targetArch}"
elif [ "$targetOs" = "solaris" ]; then
__uname_version=$(uname -v)
__solaris_major_version=$(echo "$__uname_version" | cut -d'.' -f1)
diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1
index 091023970f1c..aab40de3fd9a 100644
--- a/eng/common/sdk-task.ps1
+++ b/eng/common/sdk-task.ps1
@@ -64,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 "17.8.5" -MemberType NoteProperty
+ $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.10.0-pre.4.0" -MemberType NoteProperty
}
if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") {
$xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true
diff --git a/eng/common/template-guidance.md b/eng/common/template-guidance.md
new file mode 100644
index 000000000000..c114bc28dcb9
--- /dev/null
+++ b/eng/common/template-guidance.md
@@ -0,0 +1,137 @@
+# Overview
+
+Arcade provides templates for public (`/templates`) and 1ES pipeline templates (`/templates-official`) scenarios. Pipelines which are required to be managed by 1ES pipeline templates should reference `/templates-offical`, all other pipelines may reference `/templates`.
+
+## How to use
+
+Basic guidance is:
+
+- 1ES Pipeline Template or 1ES Microbuild template runs should reference `eng/common/templates-official`. Any internal production-graded pipeline should use these templates.
+
+- All other runs should reference `eng/common/templates`.
+
+See [azure-pipelines.yml](../../azure-pipelines.yml) (templates-official example) or [azure-pipelines-pr.yml](../../azure-pipelines-pr.yml) (templates example) for examples.
+
+#### The `templateIs1ESManaged` parameter
+
+The `templateIs1ESManaged` is available on most templates and affects which of the variants is used for nested templates. See [Development Notes](#development-notes) below for more information on the `templateIs1ESManaged1 parameter.
+
+- For templates under `job/`, `jobs/`, `steps`, or `post-build/`, this parameter must be explicitly set.
+
+## Multiple outputs
+
+1ES pipeline templates impose a policy where every publish artifact execution results in additional security scans being injected into your pipeline. When using `templates-official/jobs/jobs.yml`, Arcade reduces the number of additional security injections by gathering all publishing outputs into the [Build.ArtifactStagingDirectory](https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#build-variables-devops-services), and utilizing the [outputParentDirectory](https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/1es-pipeline-templates/features/outputs#multiple-outputs) feature of 1ES pipeline templates. When implementing your pipeline, if you ensure publish artifacts are located in the `$(Build.ArtifactStagingDirectory)`, and utilize the 1ES provided template context, then you can reduce the number of security scans for your pipeline.
+
+Example:
+``` yaml
+# azure-pipelines.yml
+extends:
+ template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate
+ parameters:
+ stages:
+ - stage: build
+ jobs:
+ - template: /eng/common/templates-official/jobs/jobs.yml@self
+ parameters:
+ # 1ES makes use of outputs to reduce security task injection overhead
+ templateContext:
+ outputs:
+ - output: pipelineArtifact
+ displayName: 'Publish logs from source'
+ continueOnError: true
+ condition: always()
+ targetPath: $(Build.ArtifactStagingDirectory)/artifacts/log
+ artifactName: Logs
+ jobs:
+ - job: Windows
+ steps:
+ - script: echo "friendly neighborhood" > artifacts/marvel/spiderman.txt
+ # copy build outputs to artifact staging directory for publishing
+ - task: CopyFiles@2
+ displayName: Gather build output
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)/artifacts/marvel'
+ Contents: '**'
+ TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/marvel'
+```
+
+Note: Multiple outputs are ONLY applicable to 1ES PT publishing (only usable when referencing `templates-official`).
+
+# Development notes
+
+**Folder / file structure**
+
+``` text
+eng\common\
+ [templates || templates-official]\
+ job\
+ job.yml (shim + artifact publishing logic)
+ onelocbuild.yml (shim)
+ publish-build-assets.yml (shim)
+ source-build.yml (shim)
+ source-index-stage1.yml (shim)
+ jobs\
+ codeql-build.yml (shim)
+ jobs.yml (shim)
+ source-build.yml (shim)
+ post-build\
+ post-build.yml (shim)
+ trigger-subscription.yml (shim)
+ common-variabls.yml (shim)
+ setup-maestro-vars.yml (shim)
+ steps\
+ publish-build-artifacts.yml (logic)
+ publish-pipeline-artifacts.yml (logic)
+ add-build-channel.yml (shim)
+ component-governance.yml (shim)
+ generate-sbom.yml (shim)
+ publish-logs.yml (shim)
+ retain-build.yml (shim)
+ send-to-helix.yml (shim)
+ source-build.yml (shim)
+ variables\
+ pool-providers.yml (logic + redirect) # templates/variables/pool-providers.yml will redirect to templates-official/variables/pool-providers.yml if you are running in the internal project
+ sdl-variables.yml (logic)
+ core-templates\
+ job\
+ job.yml (logic)
+ onelocbuild.yml (logic)
+ publish-build-assets.yml (logic)
+ source-build.yml (logic)
+ source-index-stage1.yml (logic)
+ jobs\
+ codeql-build.yml (logic)
+ jobs.yml (logic)
+ source-build.yml (logic)
+ post-build\
+ common-variabls.yml (logic)
+ post-build.yml (logic)
+ setup-maestro-vars.yml (logic)
+ trigger-subscription.yml (logic)
+ steps\
+ add-build-to-channel.yml (logic)
+ component-governance.yml (logic)
+ generate-sbom.yml (logic)
+ publish-build-artifacts.yml (redirect)
+ publish-logs.yml (logic)
+ publish-pipeline-artifacts.yml (redirect)
+ retain-build.yml (logic)
+ send-to-helix.yml (logic)
+ source-build.yml (logic)
+ variables\
+ pool-providers.yml (redirect)
+```
+
+In the table above, a file is designated as "shim", "logic", or "redirect".
+
+- shim - represents a yaml file which is an intermediate step between pipeline logic and .Net Core Engineering's templates (`core-templates`) and defines the `is1ESPipeline` parameter value.
+
+- logic - represents actual base template logic.
+
+- redirect- represents a file in `core-templates` which redirects to the "logic" file in either `templates` or `templates-official`.
+
+Logic for Arcade's templates live **primarily** in the `core-templates` folder. The exceptions to the location of the logic files are around artifact publishing, which is handled differently between 1es pipeline templates and standard templates. `templates` and `templates-official` provide shim entry points which redirect to `core-templates` while also defining the `is1ESPipeline` parameter. If a shim is referenced in `templates`, then `is1ESPipeline` is set to `false`. If a shim is referenced in `templates-official`, then `is1ESPipeline` is set to `true`.
+
+Within `templates` and `templates-official`, the templates at the "stages", and "jobs" / "job" level have been replaced with shims. Templates at the "steps" and "variables" level are typically too granular to be replaced with shims and instead persist logic which is directly applicable to either scenario.
+
+Within `core-templates`, there are a handful of places where logic is dependent on which shim entry point was used. In those places, we redirect back to the respective logic file in `templates` or `templates-official`.
diff --git a/eng/common/templates-official/job/job.yml b/eng/common/templates-official/job/job.yml
index c63e17e863ed..4724e9aaa809 100644
--- a/eng/common/templates-official/job/job.yml
+++ b/eng/common/templates-official/job/job.yml
@@ -1,264 +1,62 @@
-# 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.
-
-parameters:
-# Job schema parameters - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
- cancelTimeoutInMinutes: ''
- condition: ''
- container: ''
- continueOnError: false
- dependsOn: ''
- displayName: ''
- pool: ''
- steps: []
- strategy: ''
- timeoutInMinutes: ''
- variables: []
- workspace: ''
- templateContext: ''
-
-# Job base template specific parameters
- # See schema documentation - https://github.com/dotnet/arcade/blob/master/Documentation/AzureDevOps/TemplateSchema.md
- artifacts: ''
- enableMicrobuild: false
- enablePublishBuildArtifacts: false
- enablePublishBuildAssets: false
- enablePublishTestResults: false
- enablePublishUsingPipelines: false
- enableBuildRetry: false
- disableComponentGovernance: ''
- componentGovernanceIgnoreDirectories: ''
- mergeTestResults: false
- testRunTitle: ''
- testResultsFormat: ''
- name: ''
- preSteps: []
- runAsPublic: false
-# Sbom related params
- enableSbom: true
- PackageVersion: 7.0.0
- BuildDropPath: '$(Build.SourcesDirectory)/artifacts'
-
jobs:
-- job: ${{ parameters.name }}
-
- ${{ if ne(parameters.cancelTimeoutInMinutes, '') }}:
- cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }}
-
- ${{ if ne(parameters.condition, '') }}:
- condition: ${{ parameters.condition }}
-
- ${{ if ne(parameters.container, '') }}:
- container: ${{ parameters.container }}
-
- ${{ if ne(parameters.continueOnError, '') }}:
- continueOnError: ${{ parameters.continueOnError }}
-
- ${{ if ne(parameters.dependsOn, '') }}:
- dependsOn: ${{ parameters.dependsOn }}
-
- ${{ if ne(parameters.displayName, '') }}:
- displayName: ${{ parameters.displayName }}
-
- ${{ if ne(parameters.pool, '') }}:
- pool: ${{ parameters.pool }}
-
- ${{ if ne(parameters.strategy, '') }}:
- strategy: ${{ parameters.strategy }}
-
- ${{ if ne(parameters.timeoutInMinutes, '') }}:
- timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
-
- ${{ if ne(parameters.templateContext, '') }}:
- templateContext: ${{ parameters.templateContext }}
-
- variables:
- - ${{ if ne(parameters.enableTelemetry, 'false') }}:
- - name: DOTNET_CLI_TELEMETRY_PROFILE
- value: '$(Build.Repository.Uri)'
- - ${{ if eq(parameters.enableRichCodeNavigation, 'true') }}:
- - name: EnableRichCodeNavigation
- value: 'true'
- # Retry signature validation up to three times, waiting 2 seconds between attempts.
- # See https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3028#retry-untrusted-root-failures
- - name: NUGET_EXPERIMENTAL_CHAIN_BUILD_RETRY_POLICY
- value: 3,2000
- - ${{ each variable in parameters.variables }}:
- # handle name-value variable syntax
- # example:
- # - name: [key]
- # value: [value]
- - ${{ if ne(variable.name, '') }}:
- - name: ${{ variable.name }}
- value: ${{ variable.value }}
-
- # handle variable groups
- - ${{ if ne(variable.group, '') }}:
- - group: ${{ variable.group }}
-
- # handle template variable syntax
- # example:
- # - template: path/to/template.yml
- # parameters:
- # [key]: [value]
- - ${{ if ne(variable.template, '') }}:
- - template: ${{ variable.template }}
- ${{ if ne(variable.parameters, '') }}:
- parameters: ${{ variable.parameters }}
-
- # handle key-value variable syntax.
- # example:
- # - [key]: [value]
- - ${{ if and(eq(variable.name, ''), eq(variable.group, ''), eq(variable.template, '')) }}:
- - ${{ each pair in variable }}:
- - name: ${{ pair.key }}
- value: ${{ pair.value }}
-
- # DotNet-HelixApi-Access provides 'HelixApiAccessToken' for internal builds
- - ${{ if and(eq(parameters.enableTelemetry, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - group: DotNet-HelixApi-Access
-
- ${{ if ne(parameters.workspace, '') }}:
- workspace: ${{ parameters.workspace }}
-
- steps:
- - ${{ if ne(parameters.preSteps, '') }}:
- - ${{ each preStep in parameters.preSteps }}:
- - ${{ preStep }}
-
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - ${{ if eq(parameters.enableMicrobuild, 'true') }}:
- - task: MicroBuildSigningPlugin@4
- displayName: Install MicroBuild plugin
- inputs:
- signType: $(_SignType)
- zipSources: false
- feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json
- env:
- TeamName: $(_TeamName)
- MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)'
- continueOnError: ${{ parameters.continueOnError }}
- condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT'))
-
- - ${{ if and(eq(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'internal')) }}:
- - task: NuGetAuthenticate@1
-
- - ${{ if and(ne(parameters.artifacts.download, 'false'), ne(parameters.artifacts.download, '')) }}:
- - task: DownloadPipelineArtifact@2
- inputs:
- buildType: current
- artifactName: ${{ coalesce(parameters.artifacts.download.name, 'Artifacts_$(Agent.OS)_$(_BuildConfig)') }}
- targetPath: ${{ coalesce(parameters.artifacts.download.path, 'artifacts') }}
- itemPattern: ${{ coalesce(parameters.artifacts.download.pattern, '**') }}
-
- - ${{ each step in parameters.steps }}:
- - ${{ step }}
-
- - ${{ if eq(parameters.enableRichCodeNavigation, true) }}:
- - task: RichCodeNavIndexer@0
- displayName: RichCodeNav Upload
- inputs:
- languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }}
- environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'internal') }}
- richNavLogOutputDirectory: $(Build.SourcesDirectory)/artifacts/bin
- uploadRichNavArtifacts: ${{ coalesce(parameters.richCodeNavigationUploadArtifacts, false) }}
- continueOnError: true
-
- - template: /eng/common/templates-official/steps/component-governance.yml
- parameters:
- ${{ if eq(parameters.disableComponentGovernance, '') }}:
- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.runAsPublic, 'false'), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/dotnet/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/microsoft/'), eq(variables['Build.SourceBranch'], 'refs/heads/main'))) }}:
- disableComponentGovernance: false
- ${{ else }}:
- disableComponentGovernance: true
- ${{ else }}:
- disableComponentGovernance: ${{ parameters.disableComponentGovernance }}
- componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
-
- - ${{ if eq(parameters.enableMicrobuild, 'true') }}:
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - task: MicroBuildCleanup@1
- displayName: Execute Microbuild cleanup tasks
- condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT'))
- continueOnError: ${{ parameters.continueOnError }}
- env:
- TeamName: $(_TeamName)
-
- - ${{ if ne(parameters.artifacts.publish, '') }}:
- - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}:
- - task: CopyFiles@2
- displayName: Gather binaries for publish to artifacts
- inputs:
- SourceFolder: 'artifacts/bin'
- Contents: '**'
- TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/bin'
- - task: CopyFiles@2
- displayName: Gather packages for publish to artifacts
- inputs:
- SourceFolder: 'artifacts/packages'
- Contents: '**'
- TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/packages'
- - task: 1ES.PublishBuildArtifacts@1
- displayName: Publish pipeline artifacts
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts'
- PublishLocation: Container
- ArtifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }}
- continueOnError: true
- condition: always()
- - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}:
- - task: 1ES.PublishPipelineArtifact@1
- inputs:
- targetPath: 'artifacts/log'
- artifactName: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)') }}
- displayName: 'Publish logs'
- continueOnError: true
- condition: always()
-
- - ${{ if ne(parameters.enablePublishBuildArtifacts, 'false') }}:
- - task: 1ES.PublishBuildArtifacts@1
- displayName: Publish Logs
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)'
- PublishLocation: Container
- ArtifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }}
- continueOnError: true
- condition: always()
-
- - ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'xunit')) }}:
- - task: PublishTestResults@2
- displayName: Publish XUnit Test Results
- inputs:
- testResultsFormat: 'xUnit'
- testResultsFiles: '*.xml'
- searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-xunit
- 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.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.enableSbom, 'true')) }}:
- - template: /eng/common/templates-official/steps/generate-sbom.yml
- parameters:
- PackageVersion: ${{ parameters.packageVersion}}
- BuildDropPath: ${{ parameters.buildDropPath }}
- IgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
-
- - ${{ if eq(parameters.enableBuildRetry, 'true') }}:
- - task: 1ES.PublishPipelineArtifact@1
- inputs:
- targetPath: '$(Build.SourcesDirectory)\eng\common\BuildConfiguration'
- artifactName: 'BuildConfiguration'
- displayName: 'Publish build retry configuration'
- continueOnError: true
\ No newline at end of file
+- template: /eng/common/core-templates/job/job.yml
+ parameters:
+ is1ESPipeline: true
+
+ # publish artifacts
+ # for 1ES managed templates, use the templateContext.output to handle multiple outputs.
+ templateContext:
+ outputParentDirectory: $(Build.ArtifactStagingDirectory)
+ outputs:
+ - ${{ if ne(parameters.artifacts.publish, '') }}:
+ - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}:
+ - output: buildArtifacts
+ displayName: Publish pipeline artifacts
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts'
+ ArtifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }}
+ condition: always()
+ continueOnError: true
+ - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}:
+ - output: pipelineArtifact
+ targetPath: '$(Build.ArtifactStagingDirectory)/artifacts/log'
+ artifactName: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)_Attempt$(System.JobAttempt)') }}
+ displayName: 'Publish logs'
+ continueOnError: true
+ condition: always()
+
+ - ${{ if eq(parameters.enablePublishBuildArtifacts, true) }}:
+ - output: buildArtifacts
+ displayName: Publish Logs
+ PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts/log/$(_BuildConfig)'
+ publishLocation: Container
+ ArtifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }}
+ continueOnError: true
+ condition: always()
+
+ - ${{ if eq(parameters.enableBuildRetry, 'true') }}:
+ - output: pipelineArtifact
+ targetPath: '$(Build.ArtifactStagingDirectory)/artifacts/eng/common/BuildConfiguration'
+ artifactName: 'BuildConfiguration'
+ displayName: 'Publish build retry configuration'
+ continueOnError: true
+
+ - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.enableSbom, 'true')) }}:
+ - output: pipelineArtifact
+ displayName: Publish SBOM manifest
+ continueOnError: true
+ targetPath: $(Build.ArtifactStagingDirectory)/sbom
+ artifactName: $(ARTIFACT_NAME)
+
+ # add any outputs provided via root yaml
+ - ${{ if ne(parameters.templateContext.outputs, '') }}:
+ - ${{ each output in parameters.templateContext.outputs }}:
+ - ${{ output }}
+
+ # add any remaining templateContext properties
+ ${{ each context in parameters.templateContext }}:
+ ${{ if and(ne(context.key, 'outputParentDirectory'), ne(context.key, 'outputs')) }}:
+ ${{ context.key }}: ${{ context.value }}
+
+ ${{ each parameter in parameters }}:
+ ${{ if and(ne(parameter.key, 'templateContext'), ne(parameter.key, 'is1ESPipeline')) }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/job/onelocbuild.yml b/eng/common/templates-official/job/onelocbuild.yml
index ba9ba4930329..0f0c514b912d 100644
--- a/eng/common/templates-official/job/onelocbuild.yml
+++ b/eng/common/templates-official/job/onelocbuild.yml
@@ -1,112 +1,7 @@
-parameters:
- # Optional: dependencies of the job
- dependsOn: ''
-
- # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool
- pool: ''
-
- CeapexPat: $(dn-bot-ceapex-package-r) # PAT for the loc AzDO instance https://dev.azure.com/ceapex
- GithubPat: $(BotAccount-dotnet-bot-repo-PAT)
-
- SourcesDirectory: $(Build.SourcesDirectory)
- CreatePr: true
- AutoCompletePr: false
- ReusePr: true
- UseLfLineEndings: true
- UseCheckedInLocProjectJson: false
- SkipLocProjectJsonGeneration: false
- LanguageSet: VS_Main_Languages
- LclSource: lclFilesInRepo
- LclPackageId: ''
- RepoType: gitHub
- GitHubOrg: dotnet
- MirrorRepo: ''
- MirrorBranch: main
- condition: ''
- JobNameSuffix: ''
-
jobs:
-- job: OneLocBuild${{ parameters.JobNameSuffix }}
-
- dependsOn: ${{ parameters.dependsOn }}
-
- displayName: OneLocBuild${{ parameters.JobNameSuffix }}
-
- variables:
- - group: OneLocBuildVariables # Contains the CeapexPat and GithubPat
- - name: _GenerateLocProjectArguments
- value: -SourcesDirectory ${{ parameters.SourcesDirectory }}
- -LanguageSet "${{ parameters.LanguageSet }}"
- -CreateNeutralXlfs
- - ${{ if eq(parameters.UseCheckedInLocProjectJson, 'true') }}:
- - name: _GenerateLocProjectArguments
- value: ${{ variables._GenerateLocProjectArguments }} -UseCheckedInLocProjectJson
- - template: /eng/common/templates-official/variables/pool-providers.yml
-
- ${{ if ne(parameters.pool, '') }}:
- pool: ${{ parameters.pool }}
- ${{ if eq(parameters.pool, '') }}:
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: AzurePipelines-EO
- image: 1ESPT-Windows2022
- demands: Cmd
- os: windows
- # If it's not devdiv, it's dnceng
- ${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: $(DncEngInternalBuildPool)
- image: 1es-windows-2022-pt
- os: windows
-
- steps:
- - ${{ if ne(parameters.SkipLocProjectJsonGeneration, 'true') }}:
- - task: Powershell@2
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/generate-locproject.ps1
- arguments: $(_GenerateLocProjectArguments)
- displayName: Generate LocProject.json
- condition: ${{ parameters.condition }}
-
- - task: OneLocBuild@2
- displayName: OneLocBuild
- env:
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- inputs:
- locProj: eng/Localize/LocProject.json
- outDir: $(Build.ArtifactStagingDirectory)
- lclSource: ${{ parameters.LclSource }}
- lclPackageId: ${{ parameters.LclPackageId }}
- isCreatePrSelected: ${{ parameters.CreatePr }}
- isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }}
- ${{ if eq(parameters.CreatePr, true) }}:
- isUseLfLineEndingsSelected: ${{ parameters.UseLfLineEndings }}
- ${{ if eq(parameters.RepoType, 'gitHub') }}:
- isShouldReusePrSelected: ${{ parameters.ReusePr }}
- packageSourceAuth: patAuth
- patVariable: ${{ parameters.CeapexPat }}
- ${{ if eq(parameters.RepoType, 'gitHub') }}:
- repoType: ${{ parameters.RepoType }}
- gitHubPatVariable: "${{ parameters.GithubPat }}"
- ${{ if ne(parameters.MirrorRepo, '') }}:
- isMirrorRepoSelected: true
- gitHubOrganization: ${{ parameters.GitHubOrg }}
- mirrorRepo: ${{ parameters.MirrorRepo }}
- mirrorBranch: ${{ parameters.MirrorBranch }}
- condition: ${{ parameters.condition }}
-
- - task: 1ES.PublishBuildArtifacts@1
- displayName: Publish Localization Files
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/loc'
- PublishLocation: Container
- ArtifactName: Loc
- condition: ${{ parameters.condition }}
+- template: /eng/common/core-templates/job/onelocbuild.yml
+ parameters:
+ is1ESPipeline: true
- - task: 1ES.PublishBuildArtifacts@1
- displayName: Publish LocProject.json
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/eng/Localize/'
- PublishLocation: Container
- ArtifactName: Loc
- condition: ${{ parameters.condition }}
\ No newline at end of file
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/job/publish-build-assets.yml b/eng/common/templates-official/job/publish-build-assets.yml
index 38340d3e3861..d667a70e8de7 100644
--- a/eng/common/templates-official/job/publish-build-assets.yml
+++ b/eng/common/templates-official/job/publish-build-assets.yml
@@ -1,159 +1,7 @@
-parameters:
- configuration: 'Debug'
-
- # Optional: condition for the job to run
- condition: ''
-
- # Optional: 'true' if future jobs should run even if this job fails
- continueOnError: false
-
- # Optional: dependencies of the job
- dependsOn: ''
-
- # Optional: Include PublishBuildArtifacts task
- enablePublishBuildArtifacts: false
-
- # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool
- pool: {}
-
- # Optional: should run as a public build even in the internal project
- # 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: whether the build's artifacts will be published using release pipelines or direct feed publishing
- publishUsingPipelines: false
-
- # Optional: whether the build's artifacts will be published using release pipelines or direct feed publishing
- publishAssetsImmediately: false
-
- artifactsPublishingAdditionalParameters: ''
-
- signingValidationAdditionalParameters: ''
-
jobs:
-- job: Asset_Registry_Publish
-
- dependsOn: ${{ parameters.dependsOn }}
- timeoutInMinutes: 150
-
- ${{ if eq(parameters.publishAssetsImmediately, 'true') }}:
- displayName: Publish Assets
- ${{ else }}:
- displayName: Publish to Build Asset Registry
-
- variables:
- - template: /eng/common/templates-official/variables/pool-providers.yml
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - group: Publish-Build-Assets
- - group: AzureDevOps-Artifact-Feeds-Pats
- - name: runCodesignValidationInjection
- value: false
- # unconditional - needed for logs publishing (redactor tool version)
- - template: /eng/common/templates-official/post-build/common-variables.yml
-
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: AzurePipelines-EO
- image: 1ESPT-Windows2022
- demands: Cmd
- os: windows
- # If it's not devdiv, it's dnceng
- ${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: NetCore1ESPool-Publishing-Internal
- image: windows.vs2019.amd64
- os: windows
- steps:
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - checkout: self
- fetchDepth: 3
- clean: true
-
- - task: DownloadBuildArtifacts@0
- displayName: Download artifact
- inputs:
- artifactName: AssetManifests
- downloadPath: '$(Build.StagingDirectory)/Download'
- checkDownloadedFiles: true
- condition: ${{ parameters.condition }}
- continueOnError: ${{ parameters.continueOnError }}
-
- - task: NuGetAuthenticate@1
-
- - task: PowerShell@2
- displayName: Publish Build Assets
- inputs:
- filePath: eng\common\sdk-task.ps1
- arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet
- /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests'
- /p:BuildAssetRegistryToken=$(MaestroAccessToken)
- /p:MaestroApiEndpoint=https://maestro.dot.net
- /p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }}
- /p:OfficialBuildId=$(Build.BuildNumber)
- condition: ${{ parameters.condition }}
- continueOnError: ${{ parameters.continueOnError }}
-
- - task: powershell@2
- displayName: Create ReleaseConfigs Artifact
- inputs:
- targetType: inline
- script: |
- New-Item -Path "$(Build.StagingDirectory)/ReleaseConfigs" -ItemType Directory -Force
- $filePath = "$(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt"
- Add-Content -Path $filePath -Value $(BARBuildId)
- Add-Content -Path $filePath -Value "$(DefaultChannels)"
- Add-Content -Path $filePath -Value $(IsStableBuild)
-
- - task: 1ES.PublishBuildArtifacts@1
- displayName: Publish ReleaseConfigs Artifact
- inputs:
- PathtoPublish: '$(Build.StagingDirectory)/ReleaseConfigs'
- PublishLocation: Container
- ArtifactName: ReleaseConfigs
-
- - task: powershell@2
- displayName: Check if SymbolPublishingExclusionsFile.txt exists
- inputs:
- targetType: inline
- script: |
- $symbolExclusionfile = "$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt"
- if(Test-Path -Path $symbolExclusionfile)
- {
- Write-Host "SymbolExclusionFile exists"
- Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]true"
- }
- else{
- Write-Host "Symbols Exclusion file does not exists"
- Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]false"
- }
-
- - task: 1ES.PublishBuildArtifacts@1
- displayName: Publish SymbolPublishingExclusionsFile Artifact
- condition: eq(variables['SymbolExclusionFile'], 'true')
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt'
- PublishLocation: Container
- ArtifactName: ReleaseConfigs
-
- - ${{ if eq(parameters.publishAssetsImmediately, 'true') }}:
- - template: /eng/common/templates-official/post-build/setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: PowerShell@2
- displayName: Publish Using Darc
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/publish-using-darc.ps1
- arguments: -BuildId $(BARBuildId)
- -PublishingInfraVersion 3
- -AzdoToken '$(publishing-dnceng-devdiv-code-r-build-re)'
- -MaestroToken '$(MaestroApiAccessToken)'
- -WaitPublishingFinish true
- -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}'
- -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}'
+- template: /eng/common/core-templates/job/publish-build-assets.yml
+ parameters:
+ is1ESPipeline: true
- - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}:
- - template: /eng/common/templates-official/steps/publish-logs.yml
- parameters:
- JobLabel: 'Publish_Artifacts_Logs'
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/job/source-build.yml b/eng/common/templates-official/job/source-build.yml
index 50f04e642a35..1a480034b678 100644
--- a/eng/common/templates-official/job/source-build.yml
+++ b/eng/common/templates-official/job/source-build.yml
@@ -1,67 +1,7 @@
-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.
- # skipPublishValidation: false
- # Disables publishing validation. By default, a check is performed to ensure no packages are
- # published by source-build.
- # 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 eq(parameters.platform.pool, '') }}:
- # The default VM host AzDO pool. This should be capable of running Docker containers: almost all
- # source-build builds run in Docker, including the default managed platform.
- # /eng/common/templates-official/variables/pool-providers.yml can't be used here (some customers declare variables already), so duplicate its logic
- pool:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore-Svc-Public' ), False, 'NetCore-Public')]
- demands: ImageOverride -equals build.ubuntu.1804.amd64
-
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')]
- image: 1es-mariner-2-pt
- os: linux
-
- ${{ if ne(parameters.platform.pool, '') }}:
- pool: ${{ parameters.platform.pool }}
-
- workspace:
- clean: all
+- template: /eng/common/core-templates/job/source-build.yml
+ parameters:
+ is1ESPipeline: true
- steps:
- - template: /eng/common/templates-official/steps/source-build.yml
- parameters:
- platform: ${{ parameters.platform }}
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/job/source-index-stage1.yml b/eng/common/templates-official/job/source-index-stage1.yml
index 53a9ef51fd82..6d5ead316f92 100644
--- a/eng/common/templates-official/job/source-index-stage1.yml
+++ b/eng/common/templates-official/job/source-index-stage1.yml
@@ -1,67 +1,7 @@
-parameters:
- runAsPublic: false
- sourceIndexPackageVersion: 1.0.1-20240129.2
- sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json
- sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci"
- preSteps: []
- binlogPath: artifacts/log/Debug/Build.binlog
- condition: ''
- dependsOn: ''
- pool: ''
-
jobs:
-- job: SourceIndexStage1
- dependsOn: ${{ parameters.dependsOn }}
- condition: ${{ parameters.condition }}
- variables:
- - name: SourceIndexPackageVersion
- value: ${{ parameters.sourceIndexPackageVersion }}
- - name: SourceIndexPackageSource
- value: ${{ parameters.sourceIndexPackageSource }}
- - name: BinlogPath
- value: ${{ parameters.binlogPath }}
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - group: source-dot-net stage1 variables
- - template: /eng/common/templates-official/variables/pool-providers.yml
-
- ${{ if ne(parameters.pool, '') }}:
- pool: ${{ parameters.pool }}
- ${{ if eq(parameters.pool, '') }}:
- pool:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- name: $(DncEngPublicBuildPool)
- image: windows.vs2022.amd64.open
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- name: $(DncEngInternalBuildPool)
- image: windows.vs2022.amd64
-
- steps:
- - ${{ each preStep in parameters.preSteps }}:
- - ${{ preStep }}
-
- - task: UseDotNet@2
- displayName: Use .NET 8 SDK
- inputs:
- packageType: sdk
- version: 8.0.x
- installationPath: $(Agent.TempDirectory)/dotnet
- workingDirectory: $(Agent.TempDirectory)
-
- - script: |
- $(Agent.TempDirectory)/dotnet/dotnet tool install BinLogToSln --version $(SourceIndexPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools
- $(Agent.TempDirectory)/dotnet/dotnet tool install UploadIndexStage1 --version $(SourceIndexPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools
- displayName: Download Tools
- # Set working directory to temp directory so 'dotnet' doesn't try to use global.json and use the repo's sdk.
- workingDirectory: $(Agent.TempDirectory)
-
- - script: ${{ parameters.sourceIndexBuildCommand }}
- displayName: Build Repository
-
- - script: $(Agent.TempDirectory)/.source-index/tools/BinLogToSln -i $(BinlogPath) -r $(Build.SourcesDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output
- displayName: Process Binlog into indexable sln
+- template: /eng/common/core-templates/job/source-index-stage1.yml
+ parameters:
+ is1ESPipeline: true
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - script: $(Agent.TempDirectory)/.source-index/tools/UploadIndexStage1 -i .source-index/stage1output -n $(Build.Repository.Name)
- displayName: Upload stage1 artifacts to source index
- env:
- BLOB_CONTAINER_URL: $(source-dot-net-stage1-blob-container-url)
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/jobs/codeql-build.yml b/eng/common/templates-official/jobs/codeql-build.yml
index b68d3c2f3199..a726322ecfe0 100644
--- a/eng/common/templates-official/jobs/codeql-build.yml
+++ b/eng/common/templates-official/jobs/codeql-build.yml
@@ -1,31 +1,7 @@
-parameters:
- # See schema documentation in /Documentation/AzureDevOps/TemplateSchema.md
- continueOnError: false
- # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
- jobs: []
- # Optional: if specified, restore and use this version of Guardian instead of the default.
- overrideGuardianVersion: ''
-
jobs:
-- template: /eng/common/templates-official/jobs/jobs.yml
+- template: /eng/common/core-templates/jobs/codeql-build.yml
parameters:
- enableMicrobuild: false
- enablePublishBuildArtifacts: false
- enablePublishTestResults: false
- enablePublishBuildAssets: false
- enablePublishUsingPipelines: false
- enableTelemetry: true
+ is1ESPipeline: true
- variables:
- - group: Publish-Build-Assets
- # The Guardian version specified in 'eng/common/sdl/packages.config'. This value must be kept in
- # sync with the packages.config file.
- - name: DefaultGuardianVersion
- value: 0.109.0
- - name: GuardianPackagesConfigFile
- value: $(Build.SourcesDirectory)\eng\common\sdl\packages.config
- - name: GuardianVersion
- value: ${{ coalesce(parameters.overrideGuardianVersion, '$(DefaultGuardianVersion)') }}
-
- jobs: ${{ parameters.jobs }}
-
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/jobs/jobs.yml b/eng/common/templates-official/jobs/jobs.yml
index 857a0f8ba43e..007deddaea0f 100644
--- a/eng/common/templates-official/jobs/jobs.yml
+++ b/eng/common/templates-official/jobs/jobs.yml
@@ -1,97 +1,7 @@
-parameters:
- # See schema documentation in /Documentation/AzureDevOps/TemplateSchema.md
- continueOnError: false
-
- # Optional: Include PublishBuildArtifacts task
- enablePublishBuildArtifacts: false
-
- # Optional: Enable publishing using release pipelines
- enablePublishUsingPipelines: false
-
- # Optional: Enable running the source-build jobs to build repo from source
- enableSourceBuild: false
-
- # Optional: Parameters for source-build template.
- # See /eng/common/templates-official/jobs/source-build.yml for options
- sourceBuildParameters: []
-
- graphFileGeneration:
- # Optional: Enable generating the graph files at the end of the build
- enabled: false
- # Optional: Include toolset dependencies in the generated graph files
- includeToolset: false
-
- # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
- jobs: []
-
- # Optional: Override automatically derived dependsOn value for "publish build assets" job
- publishBuildAssetsDependsOn: ''
-
- # Optional: Publish the assets as soon as the publish to BAR stage is complete, rather doing so in a separate stage.
- publishAssetsImmediately: false
-
- # Optional: If using publishAssetsImmediately and additional parameters are needed, can be used to send along additional parameters (normally sent to post-build.yml)
- artifactsPublishingAdditionalParameters: ''
- signingValidationAdditionalParameters: ''
-
- # Optional: should run as a public build even in the internal project
- # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects.
- runAsPublic: false
-
- enableSourceIndex: false
- sourceIndexParams: {}
-
-# 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.
-
jobs:
-- ${{ each job in parameters.jobs }}:
- - template: ../job/job.yml
- parameters:
- # pass along parameters
- ${{ each parameter in parameters }}:
- ${{ if ne(parameter.key, 'jobs') }}:
- ${{ parameter.key }}: ${{ parameter.value }}
-
- # pass along job properties
- ${{ each property in job }}:
- ${{ if ne(property.key, 'job') }}:
- ${{ property.key }}: ${{ property.value }}
-
- name: ${{ job.job }}
-
-- ${{ if eq(parameters.enableSourceBuild, true) }}:
- - template: /eng/common/templates-official/jobs/source-build.yml
- parameters:
- allCompletedJobId: Source_Build_Complete
- ${{ each parameter in parameters.sourceBuildParameters }}:
- ${{ parameter.key }}: ${{ parameter.value }}
-
-- ${{ if eq(parameters.enableSourceIndex, 'true') }}:
- - template: ../job/source-index-stage1.yml
- parameters:
- runAsPublic: ${{ parameters.runAsPublic }}
- ${{ each parameter in parameters.sourceIndexParams }}:
- ${{ 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
- parameters:
- continueOnError: ${{ parameters.continueOnError }}
- dependsOn:
- - ${{ if ne(parameters.publishBuildAssetsDependsOn, '') }}:
- - ${{ each job in parameters.publishBuildAssetsDependsOn }}:
- - ${{ job.job }}
- - ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}:
- - ${{ each job in parameters.jobs }}:
- - ${{ job.job }}
- - ${{ if eq(parameters.enableSourceBuild, true) }}:
- - Source_Build_Complete
+- template: /eng/common/core-templates/jobs/jobs.yml
+ parameters:
+ is1ESPipeline: true
- runAsPublic: ${{ parameters.runAsPublic }}
- publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }}
- publishAssetsImmediately: ${{ parameters.publishAssetsImmediately }}
- enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }}
- artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
- signingValidationAdditionalParameters: ${{ parameters.signingValidationAdditionalParameters }}
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/jobs/source-build.yml b/eng/common/templates-official/jobs/source-build.yml
index 08e5db9bb116..483e7b611f34 100644
--- a/eng/common/templates-official/jobs/source-build.yml
+++ b/eng/common/templates-official/jobs/source-build.yml
@@ -1,46 +1,7 @@
-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-official/job/source-build.yml
- jobNamePrefix: 'Source_Build'
-
- # This is the default platform provided by Arcade, intended for use by a managed-only repo.
- defaultManagedPlatform:
- name: 'Managed'
- container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8'
-
- # 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'. If no platforms are specified,
- # one job runs on 'defaultManagedPlatform'.
- platforms: []
-
jobs:
+- template: /eng/common/core-templates/jobs/source-build.yml
+ parameters:
+ is1ESPipeline: true
-- ${{ 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(length(parameters.platforms), 0) }}:
- - ${{ parameters.jobNamePrefix }}_${{ parameters.defaultManagedPlatform.name }}
-
-- ${{ each platform in parameters.platforms }}:
- - template: /eng/common/templates-official/job/source-build.yml
- parameters:
- jobNamePrefix: ${{ parameters.jobNamePrefix }}
- platform: ${{ platform }}
-
-- ${{ if eq(length(parameters.platforms), 0) }}:
- - template: /eng/common/templates-official/job/source-build.yml
- parameters:
- jobNamePrefix: ${{ parameters.jobNamePrefix }}
- platform: ${{ parameters.defaultManagedPlatform }}
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
\ No newline at end of file
diff --git a/eng/common/templates-official/post-build/common-variables.yml b/eng/common/templates-official/post-build/common-variables.yml
index b9ede10bf099..c32fc49233f8 100644
--- a/eng/common/templates-official/post-build/common-variables.yml
+++ b/eng/common/templates-official/post-build/common-variables.yml
@@ -1,24 +1,8 @@
variables:
- - group: Publish-Build-Assets
+- template: /eng/common/core-templates/post-build/common-variables.yml
+ parameters:
+ # Specifies whether to use 1ES
+ is1ESPipeline: true
- # Whether the build is internal or not
- - name: IsInternalBuild
- value: ${{ and(ne(variables['System.TeamProject'], 'public'), contains(variables['Build.SourceBranch'], 'internal')) }}
-
- # Default Maestro++ API Endpoint and API Version
- - name: MaestroApiEndPoint
- value: "https://maestro.dot.net"
- - name: MaestroApiAccessToken
- value: $(MaestroAccessToken)
- - name: MaestroApiVersion
- value: "2020-02-20"
-
- - name: SourceLinkCLIVersion
- value: 3.0.0
- - name: SymbolToolVersion
- value: 1.0.1
- - name: BinlogToolVersion
- value: 1.0.11
-
- - name: runCodesignValidationInjection
- value: false
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
\ No newline at end of file
diff --git a/eng/common/templates-official/post-build/post-build.yml b/eng/common/templates-official/post-build/post-build.yml
index d286e956bdfa..2364c0fd4a52 100644
--- a/eng/common/templates-official/post-build/post-build.yml
+++ b/eng/common/templates-official/post-build/post-build.yml
@@ -1,285 +1,8 @@
-parameters:
- # Which publishing infra should be used. THIS SHOULD MATCH THE VERSION ON THE BUILD MANIFEST.
- # Publishing V1 is no longer supported
- # Publishing V2 is no longer supported
- # Publishing V3 is the default
- - name: publishingInfraVersion
- displayName: Which version of publishing should be used to promote the build definition?
- type: number
- default: 3
- values:
- - 3
-
- - name: BARBuildId
- displayName: BAR Build Id
- type: number
- default: 0
-
- - name: PromoteToChannelIds
- displayName: Channel to promote BARBuildId to
- type: string
- default: ''
-
- - name: enableSourceLinkValidation
- displayName: Enable SourceLink validation
- type: boolean
- default: false
-
- - name: enableSigningValidation
- displayName: Enable signing validation
- type: boolean
- default: true
-
- - name: enableSymbolValidation
- displayName: Enable symbol validation
- type: boolean
- default: false
-
- - name: enableNugetValidation
- displayName: Enable NuGet validation
- type: boolean
- default: true
-
- - name: publishInstallersAndChecksums
- displayName: Publish installers and checksums
- type: boolean
- default: true
-
- - name: SDLValidationParameters
- type: object
- default:
- enable: false
- publishGdn: false
- continueOnError: false
- params: ''
- artifactNames: ''
- downloadArtifacts: true
-
- # These parameters let the user customize the call to sdk-task.ps1 for publishing
- # symbols & general artifacts as well as for signing validation
- - name: symbolPublishingAdditionalParameters
- displayName: Symbol publishing additional parameters
- type: string
- default: ''
-
- - name: artifactsPublishingAdditionalParameters
- displayName: Artifact publishing additional parameters
- type: string
- default: ''
-
- - name: signingValidationAdditionalParameters
- displayName: Signing validation additional parameters
- type: string
- default: ''
-
- # Which stages should finish execution before post-build stages start
- - name: validateDependsOn
- type: object
- default:
- - build
-
- - name: publishDependsOn
- type: object
- default:
- - Validate
-
- # Optional: Call asset publishing rather than running in a separate stage
- - name: publishAssetsImmediately
- type: boolean
- default: false
-
stages:
-- ${{ if or(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
- variables:
- - template: common-variables.yml
- - template: /eng/common/templates-official/variables/pool-providers.yml
- jobs:
- - job:
- displayName: NuGet Validation
- condition: and(succeededOrFailed(), eq( ${{ parameters.enableNugetValidation }}, 'true'))
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: AzurePipelines-EO
- image: 1ESPT-Windows2022
- demands: Cmd
- os: windows
- # If it's not devdiv, it's dnceng
- ${{ else }}:
- name: $(DncEngInternalBuildPool)
- image: 1es-windows-2022-pt
- os: windows
-
- steps:
- - template: setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: DownloadBuildArtifacts@0
- displayName: Download Package Artifacts
- inputs:
- buildType: specific
- buildVersionToDownload: specific
- project: $(AzDOProjectName)
- pipeline: $(AzDOPipelineId)
- buildId: $(AzDOBuildId)
- artifactName: PackageArtifacts
- checkDownloadedFiles: true
-
- - task: PowerShell@2
- displayName: Validate
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/nuget-validation.ps1
- arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/
- -ToolDestinationPath $(Agent.BuildDirectory)/Extract/
-
- - job:
- displayName: Signing Validation
- condition: and( eq( ${{ parameters.enableSigningValidation }}, 'true'), ne( variables['PostBuildSign'], 'true'))
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: AzurePipelines-EO
- image: 1ESPT-Windows2022
- demands: Cmd
- os: windows
- # If it's not devdiv, it's dnceng
- ${{ else }}:
- name: $(DncEngInternalBuildPool)
- image: 1es-windows-2022-pt
- os: windows
- steps:
- - template: setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: DownloadBuildArtifacts@0
- displayName: Download Package Artifacts
- inputs:
- buildType: specific
- buildVersionToDownload: specific
- project: $(AzDOProjectName)
- pipeline: $(AzDOPipelineId)
- buildId: $(AzDOBuildId)
- artifactName: PackageArtifacts
- checkDownloadedFiles: true
- itemPattern: |
- **
- !**/Microsoft.SourceBuild.Intermediate.*.nupkg
-
- # This is necessary whenever we want to publish/restore to an AzDO private feed
- # Since sdk-task.ps1 tries to restore packages we need to do this authentication here
- # otherwise it'll complain about accessing a private feed.
- - task: NuGetAuthenticate@1
- displayName: 'Authenticate to AzDO Feeds'
-
- # Signing validation will optionally work with the buildmanifest file which is downloaded from
- # Azure DevOps above.
- - task: PowerShell@2
- displayName: Validate
- inputs:
- filePath: eng\common\sdk-task.ps1
- arguments: -task SigningValidation -restore -msbuildEngine vs
- /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts'
- /p:SignCheckExclusionsFile='$(Build.SourcesDirectory)/eng/SignCheckExclusionsFile.txt'
- ${{ parameters.signingValidationAdditionalParameters }}
-
- - template: ../steps/publish-logs.yml
- parameters:
- StageLabel: 'Validation'
- JobLabel: 'Signing'
- BinlogToolVersion: $(BinlogToolVersion)
-
- - job:
- displayName: SourceLink Validation
- condition: eq( ${{ parameters.enableSourceLinkValidation }}, 'true')
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: AzurePipelines-EO
- image: 1ESPT-Windows2022
- demands: Cmd
- os: windows
- # If it's not devdiv, it's dnceng
- ${{ else }}:
- name: $(DncEngInternalBuildPool)
- image: 1es-windows-2022-pt
- os: windows
- steps:
- - template: setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: DownloadBuildArtifacts@0
- displayName: Download Blob Artifacts
- inputs:
- buildType: specific
- buildVersionToDownload: specific
- project: $(AzDOProjectName)
- pipeline: $(AzDOPipelineId)
- buildId: $(AzDOBuildId)
- artifactName: BlobArtifacts
- checkDownloadedFiles: true
-
- - task: PowerShell@2
- displayName: Validate
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/sourcelink-validation.ps1
- arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/
- -ExtractPath $(Agent.BuildDirectory)/Extract/
- -GHRepoName $(Build.Repository.Name)
- -GHCommit $(Build.SourceVersion)
- -SourcelinkCliVersion $(SourceLinkCLIVersion)
- continueOnError: true
-
-- ${{ if ne(parameters.publishAssetsImmediately, 'true') }}:
- - stage: publish_using_darc
- ${{ if or(eq(parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true'), eq(parameters.SDLValidationParameters.enable, 'true')) }}:
- dependsOn: ${{ parameters.publishDependsOn }}
- ${{ else }}:
- dependsOn: ${{ parameters.validateDependsOn }}
- displayName: Publish using Darc
- variables:
- - template: common-variables.yml
- - template: /eng/common/templates-official/variables/pool-providers.yml
- jobs:
- - job:
- displayName: Publish Using Darc
- timeoutInMinutes: 120
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: AzurePipelines-EO
- image: 1ESPT-Windows2022
- demands: Cmd
- os: windows
- # If it's not devdiv, it's dnceng
- ${{ else }}:
- name: NetCore1ESPool-Publishing-Internal
- image: windows.vs2019.amd64
- os: windows
- steps:
- - template: setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: NuGetAuthenticate@1
+- template: /eng/common/core-templates/post-build/post-build.yml
+ parameters:
+ # Specifies whether to use 1ES
+ is1ESPipeline: true
- - 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 true
- -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}'
- -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}'
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/post-build/setup-maestro-vars.yml b/eng/common/templates-official/post-build/setup-maestro-vars.yml
index 0c87f149a4ad..024397d87864 100644
--- a/eng/common/templates-official/post-build/setup-maestro-vars.yml
+++ b/eng/common/templates-official/post-build/setup-maestro-vars.yml
@@ -1,70 +1,8 @@
-parameters:
- BARBuildId: ''
- PromoteToChannelIds: ''
-
steps:
- - ${{ if eq(coalesce(parameters.PromoteToChannelIds, 0), 0) }}:
- - task: DownloadBuildArtifacts@0
- displayName: Download Release Configs
- inputs:
- buildType: current
- artifactName: ReleaseConfigs
- checkDownloadedFiles: true
-
- - task: PowerShell@2
- name: setReleaseVars
- displayName: Set Release Configs Vars
- inputs:
- targetType: inline
- pwsh: true
- script: |
- try {
- if (!$Env:PromoteToMaestroChannels -or $Env:PromoteToMaestroChannels.Trim() -eq '') {
- $Content = Get-Content $(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt
-
- $BarId = $Content | Select -Index 0
- $Channels = $Content | Select -Index 1
- $IsStableBuild = $Content | Select -Index 2
-
- $AzureDevOpsProject = $Env:System_TeamProject
- $AzureDevOpsBuildDefinitionId = $Env:System_DefinitionId
- $AzureDevOpsBuildId = $Env:Build_BuildId
- }
- else {
- $buildApiEndpoint = "${Env:MaestroApiEndPoint}/api/builds/${Env:BARBuildId}?api-version=${Env:MaestroApiVersion}"
-
- $apiHeaders = New-Object 'System.Collections.Generic.Dictionary[[String],[String]]'
- $apiHeaders.Add('Accept', 'application/json')
- $apiHeaders.Add('Authorization',"Bearer ${Env:MAESTRO_API_TOKEN}")
-
- $buildInfo = try { Invoke-WebRequest -Method Get -Uri $buildApiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" }
-
- $BarId = $Env:BARBuildId
- $Channels = $Env:PromoteToMaestroChannels -split ","
- $Channels = $Channels -join "]["
- $Channels = "[$Channels]"
-
- $IsStableBuild = $buildInfo.stable
- $AzureDevOpsProject = $buildInfo.azureDevOpsProject
- $AzureDevOpsBuildDefinitionId = $buildInfo.azureDevOpsBuildDefinitionId
- $AzureDevOpsBuildId = $buildInfo.azureDevOpsBuildId
- }
-
- Write-Host "##vso[task.setvariable variable=BARBuildId]$BarId"
- Write-Host "##vso[task.setvariable variable=TargetChannels]$Channels"
- Write-Host "##vso[task.setvariable variable=IsStableBuild]$IsStableBuild"
+- template: /eng/common/core-templates/post-build/setup-maestro-vars.yml
+ parameters:
+ # Specifies whether to use 1ES
+ is1ESPipeline: true
- Write-Host "##vso[task.setvariable variable=AzDOProjectName]$AzureDevOpsProject"
- Write-Host "##vso[task.setvariable variable=AzDOPipelineId]$AzureDevOpsBuildDefinitionId"
- Write-Host "##vso[task.setvariable variable=AzDOBuildId]$AzureDevOpsBuildId"
- }
- catch {
- Write-Host $_
- Write-Host $_.Exception
- Write-Host $_.ScriptStackTrace
- exit 1
- }
- env:
- MAESTRO_API_TOKEN: $(MaestroApiAccessToken)
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToMaestroChannels: ${{ parameters.PromoteToChannelIds }}
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
\ No newline at end of file
diff --git a/eng/common/templates-official/steps/add-build-to-channel.yml b/eng/common/templates-official/steps/add-build-to-channel.yml
index f67a210d62f3..543dea8c6969 100644
--- a/eng/common/templates-official/steps/add-build-to-channel.yml
+++ b/eng/common/templates-official/steps/add-build-to-channel.yml
@@ -1,13 +1,7 @@
-parameters:
- ChannelId: 0
-
steps:
-- task: PowerShell@2
- displayName: Add Build to Channel
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/add-build-to-channel.ps1
- arguments: -BuildId $(BARBuildId)
- -ChannelId ${{ parameters.ChannelId }}
- -MaestroApiAccessToken $(MaestroApiAccessToken)
- -MaestroApiEndPoint $(MaestroApiEndPoint)
- -MaestroApiVersion $(MaestroApiVersion)
+- template: /eng/common/core-templates/steps/add-build-to-channel.yml
+ parameters:
+ is1ESPipeline: true
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/steps/component-governance.yml b/eng/common/templates-official/steps/component-governance.yml
index 0ecec47b0c91..30bb3985ca2b 100644
--- a/eng/common/templates-official/steps/component-governance.yml
+++ b/eng/common/templates-official/steps/component-governance.yml
@@ -1,13 +1,7 @@
-parameters:
- disableComponentGovernance: false
- componentGovernanceIgnoreDirectories: ''
-
steps:
-- ${{ if eq(parameters.disableComponentGovernance, 'true') }}:
- - script: "echo ##vso[task.setvariable variable=skipComponentGovernanceDetection]true"
- displayName: Set skipComponentGovernanceDetection variable
-- ${{ if ne(parameters.disableComponentGovernance, 'true') }}:
- - task: ComponentGovernanceComponentDetection@0
- continueOnError: true
- inputs:
- ignoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
\ No newline at end of file
+- template: /eng/common/core-templates/steps/component-governance.yml
+ parameters:
+ is1ESPipeline: true
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/steps/generate-sbom.yml b/eng/common/templates-official/steps/generate-sbom.yml
index 488b560e8ba4..9a89a4706d94 100644
--- a/eng/common/templates-official/steps/generate-sbom.yml
+++ b/eng/common/templates-official/steps/generate-sbom.yml
@@ -1,48 +1,7 @@
-# BuildDropPath - The root folder of the drop directory for which the manifest file will be generated.
-# PackageName - The name of the package this SBOM represents.
-# PackageVersion - The version of the package this SBOM represents.
-# ManifestDirPath - The path of the directory where the generated manifest files will be placed
-# IgnoreDirectories - Directories to ignore for SBOM generation. This will be passed through to the CG component detector.
-
-parameters:
- PackageVersion: 7.0.0
- BuildDropPath: '$(Build.SourcesDirectory)/artifacts'
- PackageName: '.NET'
- ManifestDirPath: $(Build.ArtifactStagingDirectory)/sbom
- IgnoreDirectories: ''
- sbomContinueOnError: true
-
steps:
-- task: PowerShell@2
- displayName: Prep for SBOM generation in (Non-linux)
- condition: or(eq(variables['Agent.Os'], 'Windows_NT'), eq(variables['Agent.Os'], 'Darwin'))
- inputs:
- filePath: ./eng/common/generate-sbom-prep.ps1
- arguments: ${{parameters.manifestDirPath}}
-
-# Chmodding is a workaround for https://github.com/dotnet/arcade/issues/8461
-- script: |
- chmod +x ./eng/common/generate-sbom-prep.sh
- ./eng/common/generate-sbom-prep.sh ${{parameters.manifestDirPath}}
- displayName: Prep for SBOM generation in (Linux)
- condition: eq(variables['Agent.Os'], 'Linux')
- continueOnError: ${{ parameters.sbomContinueOnError }}
-
-- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
- displayName: 'Generate SBOM manifest'
- continueOnError: ${{ parameters.sbomContinueOnError }}
- inputs:
- PackageName: ${{ parameters.packageName }}
- BuildDropPath: ${{ parameters.buildDropPath }}
- PackageVersion: ${{ parameters.packageVersion }}
- ManifestDirPath: ${{ parameters.manifestDirPath }}
- ${{ if ne(parameters.IgnoreDirectories, '') }}:
- AdditionalComponentDetectorArgs: '--IgnoreDirectories ${{ parameters.IgnoreDirectories }}'
-
-- task: 1ES.PublishPipelineArtifact@1
- displayName: Publish SBOM manifest
- continueOnError: ${{parameters.sbomContinueOnError}}
- inputs:
- targetPath: '${{parameters.manifestDirPath}}'
- artifactName: $(ARTIFACT_NAME)
+- template: /eng/common/core-templates/steps/generate-sbom.yml
+ parameters:
+ is1ESPipeline: true
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/steps/publish-build-artifacts.yml b/eng/common/templates-official/steps/publish-build-artifacts.yml
new file mode 100644
index 000000000000..100a3fc98493
--- /dev/null
+++ b/eng/common/templates-official/steps/publish-build-artifacts.yml
@@ -0,0 +1,41 @@
+parameters:
+- name: displayName
+ type: string
+ default: 'Publish to Build Artifact'
+
+- name: condition
+ type: string
+ default: succeeded()
+
+- name: artifactName
+ type: string
+
+- name: pathToPublish
+ type: string
+
+- name: continueOnError
+ type: boolean
+ default: false
+
+- name: publishLocation
+ type: string
+ default: 'Container'
+
+- name: is1ESPipeline
+ type: boolean
+ default: true
+
+steps:
+- ${{ if ne(parameters.is1ESPipeline, true) }}:
+ - 'eng/common/templates-official cannot be referenced from a non-1ES managed template': error
+- task: 1ES.PublishBuildArtifacts@1
+ displayName: ${{ parameters.displayName }}
+ condition: ${{ parameters.condition }}
+ ${{ if parameters.continueOnError }}:
+ continueOnError: ${{ parameters.continueOnError }}
+ inputs:
+ PublishLocation: ${{ parameters.publishLocation }}
+ PathtoPublish: ${{ parameters.pathToPublish }}
+ ${{ if parameters.artifactName }}:
+ ArtifactName: ${{ parameters.artifactName }}
+
diff --git a/eng/common/templates-official/steps/publish-logs.yml b/eng/common/templates-official/steps/publish-logs.yml
index 84b2f559c56e..579fd531e94c 100644
--- a/eng/common/templates-official/steps/publish-logs.yml
+++ b/eng/common/templates-official/steps/publish-logs.yml
@@ -1,49 +1,7 @@
-parameters:
- StageLabel: ''
- JobLabel: ''
- CustomSensitiveDataList: ''
- # A default - in case value from eng/common/templates-official/post-build/common-variables.yml is not passed
- BinlogToolVersion: '1.0.11'
-
steps:
-- task: Powershell@2
- displayName: Prepare Binlogs to Upload
- inputs:
- targetType: inline
- script: |
- New-Item -ItemType Directory $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/
- Move-Item -Path $(Build.SourcesDirectory)/artifacts/log/Debug/* $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/
- continueOnError: true
- condition: always()
-
-- task: PowerShell@2
- displayName: Redact Logs
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/redact-logs.ps1
- # For now this needs to have explicit list of all sensitive data. Taken from eng/publishing/v3/publish.yml
- # Sensitive data can as well be added to $(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt'
- # If the file exists - sensitive data for redaction will be sourced from it
- # (single entry per line, lines starting with '# ' are considered comments and skipped)
- arguments: -InputPath '$(Build.SourcesDirectory)/PostBuildLogs'
- -BinlogToolVersion ${{parameters.BinlogToolVersion}}
- -TokensFilePath '$(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt'
- '$(publishing-dnceng-devdiv-code-r-build-re)'
- '$(MaestroAccessToken)'
- '$(dn-bot-all-orgs-artifact-feeds-rw)'
- '$(akams-client-id)'
- '$(akams-client-secret)'
- '$(microsoft-symbol-server-pat)'
- '$(symweb-symbol-server-pat)'
- '$(dn-bot-all-orgs-build-rw-code-rw)'
- ${{parameters.CustomSensitiveDataList}}
- continueOnError: true
- condition: always()
-
-- task: 1ES.PublishBuildArtifacts@1
- displayName: Publish Logs
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/PostBuildLogs'
- PublishLocation: Container
- ArtifactName: PostBuildLogs
- continueOnError: true
- condition: always()
+- template: /eng/common/core-templates/steps/publish-logs.yml
+ parameters:
+ is1ESPipeline: true
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/steps/publish-pipeline-artifacts.yml b/eng/common/templates-official/steps/publish-pipeline-artifacts.yml
new file mode 100644
index 000000000000..d71eb0c74398
--- /dev/null
+++ b/eng/common/templates-official/steps/publish-pipeline-artifacts.yml
@@ -0,0 +1,26 @@
+parameters:
+- name: is1ESPipeline
+ type: boolean
+ default: true
+
+- name: args
+ type: object
+ default: {}
+
+steps:
+- ${{ if ne(parameters.is1ESPipeline, true) }}:
+ - 'eng/common/templates-official cannot be referenced from a non-1ES managed template': error
+- task: 1ES.PublishPipelineArtifact@1
+ displayName: ${{ coalesce(parameters.args.displayName, 'Publish to Build Artifact') }}
+ ${{ if parameters.args.condition }}:
+ condition: ${{ parameters.args.condition }}
+ ${{ else }}:
+ condition: succeeded()
+ ${{ if parameters.args.continueOnError }}:
+ continueOnError: ${{ parameters.args.continueOnError }}
+ inputs:
+ targetPath: ${{ parameters.args.targetPath }}
+ ${{ if parameters.args.artifactName }}:
+ artifactName: ${{ parameters.args.artifactName }}
+ ${{ if parameters.args.properties }}:
+ properties: ${{ parameters.args.properties }}
\ No newline at end of file
diff --git a/eng/common/templates-official/steps/retain-build.yml b/eng/common/templates-official/steps/retain-build.yml
index 83d97a26a01f..5594551508a3 100644
--- a/eng/common/templates-official/steps/retain-build.yml
+++ b/eng/common/templates-official/steps/retain-build.yml
@@ -1,28 +1,7 @@
-parameters:
- # Optional azure devops PAT with build execute permissions for the build's organization,
- # only needed if the build that should be retained ran on a different organization than
- # the pipeline where this template is executing from
- Token: ''
- # Optional BuildId to retain, defaults to the current running build
- BuildId: ''
- # Azure devops Organization URI for the build in the https://dev.azure.com/ format.
- # Defaults to the organization the current pipeline is running on
- AzdoOrgUri: '$(System.CollectionUri)'
- # Azure devops project for the build. Defaults to the project the current pipeline is running on
- AzdoProject: '$(System.TeamProject)'
-
steps:
- - task: powershell@2
- inputs:
- targetType: 'filePath'
- filePath: eng/common/retain-build.ps1
- pwsh: true
- arguments: >
- -AzdoOrgUri: ${{parameters.AzdoOrgUri}}
- -AzdoProject ${{parameters.AzdoProject}}
- -Token ${{coalesce(parameters.Token, '$env:SYSTEM_ACCESSTOKEN') }}
- -BuildId ${{coalesce(parameters.BuildId, '$env:BUILD_ID')}}
- displayName: Enable permanent build retention
- env:
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- BUILD_ID: $(Build.BuildId)
\ No newline at end of file
+- template: /eng/common/core-templates/steps/retain-build.yml
+ parameters:
+ is1ESPipeline: true
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/steps/send-to-helix.yml b/eng/common/templates-official/steps/send-to-helix.yml
index 68fa739c4ab2..6500f21bf845 100644
--- a/eng/common/templates-official/steps/send-to-helix.yml
+++ b/eng/common/templates-official/steps/send-to-helix.yml
@@ -1,93 +1,7 @@
-# Please remember to update the documentation if you make changes to these parameters!
-parameters:
- 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
- HelixTargetQueues: '' # required -- semicolon-delimited list of Helix queues to test on; see https://helix.dot.net/ for a list of queues
- HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group
- HelixProjectPath: 'eng/common/helixpublish.proj' # optional -- path to the project file to build relative to BUILD_SOURCESDIRECTORY
- HelixProjectArguments: '' # optional -- arguments passed to the build command
- HelixConfiguration: '' # optional -- additional property attached to a job
- HelixPreCommands: '' # optional -- commands to run before Helix work item execution
- HelixPostCommands: '' # optional -- commands to run after Helix work item execution
- WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects
- WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects
- WorkItemTimeout: '' # optional -- a timeout in TimeSpan.Parse-ready value (e.g. 00:02:00) for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects
- CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload
- XUnitProjects: '' # optional -- semicolon-delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true
- XUnitWorkItemTimeout: '' # optional -- the workitem timeout in seconds for all workitems created from the xUnit projects specified by XUnitProjects
- XUnitPublishTargetFramework: '' # optional -- framework to use to publish your xUnit projects
- 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', 'runtime' or 'aspnetcore-runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json
- DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json
- 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."
- IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set
- HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting https://helix.int-dot.net )
- Creator: '' # optional -- if the build is external, use this to specify who is sending the job
- DisplayNamePrefix: 'Run Tests' # 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
-
steps:
- - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"'
- displayName: ${{ parameters.DisplayNamePrefix }} (Windows)
- env:
- BuildConfig: $(_BuildConfig)
- HelixSource: ${{ parameters.HelixSource }}
- HelixType: ${{ parameters.HelixType }}
- HelixBuild: ${{ parameters.HelixBuild }}
- HelixConfiguration: ${{ parameters.HelixConfiguration }}
- HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
- HelixAccessToken: ${{ parameters.HelixAccessToken }}
- HelixPreCommands: ${{ parameters.HelixPreCommands }}
- HelixPostCommands: ${{ parameters.HelixPostCommands }}
- WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
- WorkItemCommand: ${{ parameters.WorkItemCommand }}
- WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
- CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
- XUnitProjects: ${{ parameters.XUnitProjects }}
- XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
- XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
- XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
- XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
- IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
- DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
- DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
- WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
- HelixBaseUri: ${{ parameters.HelixBaseUri }}
- Creator: ${{ parameters.Creator }}
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT'))
- continueOnError: ${{ parameters.continueOnError }}
- - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog
- displayName: ${{ parameters.DisplayNamePrefix }} (Unix)
- env:
- BuildConfig: $(_BuildConfig)
- HelixSource: ${{ parameters.HelixSource }}
- HelixType: ${{ parameters.HelixType }}
- HelixBuild: ${{ parameters.HelixBuild }}
- HelixConfiguration: ${{ parameters.HelixConfiguration }}
- HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
- HelixAccessToken: ${{ parameters.HelixAccessToken }}
- HelixPreCommands: ${{ parameters.HelixPreCommands }}
- HelixPostCommands: ${{ parameters.HelixPostCommands }}
- WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
- WorkItemCommand: ${{ parameters.WorkItemCommand }}
- WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
- CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
- XUnitProjects: ${{ parameters.XUnitProjects }}
- XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
- XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
- XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
- XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
- IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
- DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
- DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
- WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
- HelixBaseUri: ${{ parameters.HelixBaseUri }}
- Creator: ${{ parameters.Creator }}
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT'))
- continueOnError: ${{ parameters.continueOnError }}
+- template: /eng/common/core-templates/steps/send-to-helix.yml
+ parameters:
+ is1ESPipeline: true
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/steps/source-build.yml b/eng/common/templates-official/steps/source-build.yml
index 53ed57b6d48a..8f92c49e7b06 100644
--- a/eng/common/templates-official/steps/source-build.yml
+++ b/eng/common/templates-official/steps/source-build.yml
@@ -1,131 +1,7 @@
-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-official/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
-
- # If building on the internal project, the artifact feeds variable may be available (usually only if needed)
- # In that case, call the feed setup script to add internal feeds corresponding to public ones.
- # In addition, add an msbuild argument to copy the WIP from the repo to the target build location.
- # This is because SetupNuGetSources.sh will alter the current NuGet.config file, and we need to preserve those
- # changes.
- internalRestoreArgs=
- if [ '$(dn-bot-dnceng-artifact-feeds-rw)' != '$''(dn-bot-dnceng-artifact-feeds-rw)' ]; then
- # Temporarily work around https://github.com/dotnet/arcade/issues/7709
- chmod +x $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh
- $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh $(Build.SourcesDirectory)/NuGet.config $(dn-bot-dnceng-artifact-feeds-rw)
- internalRestoreArgs='/p:CopyWipIntoInnerSourceBuildRepo=true'
-
- # The 'Copy WIP' feature of source build uses git stash to apply changes from the original repo.
- # This only works if there is a username/email configured, which won't be the case in most CI runs.
- git config --get user.email
- if [ $? -ne 0 ]; then
- git config user.email dn-bot@microsoft.com
- git config user.name dn-bot
- fi
- fi
-
- # If building on the internal project, the internal storage variable may be available (usually only if needed)
- # In that case, add variables to allow the download of internal runtimes if the specified versions are not found
- # in the default public locations.
- internalRuntimeDownloadArgs=
- if [ '$(dotnetbuilds-internal-container-read-token-base64)' != '$''(dotnetbuilds-internal-container-read-token-base64)' ]; then
- internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://dotnetbuilds.blob.core.windows.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://dotnetbuilds.blob.core.windows.net/internal --runtimesourcefeedkey $(dotnetbuilds-internal-container-read-token-base64)'
- fi
-
- 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
-
- runtimeOsArgs=
- if [ '${{ parameters.platform.runtimeOS }}' != '' ]; then
- runtimeOsArgs='/p:RuntimeOS=${{ parameters.platform.runtimeOS }}'
- fi
-
- baseOsArgs=
- if [ '${{ parameters.platform.baseOS }}' != '' ]; then
- baseOsArgs='/p:BaseOS=${{ parameters.platform.baseOS }}'
- fi
-
- publishArgs=
- if [ '${{ parameters.platform.skipPublishValidation }}' != 'true' ]; then
- publishArgs='--publish'
- fi
-
- assetManifestFileName=SourceBuild_RidSpecific.xml
- if [ '${{ parameters.platform.name }}' != '' ]; then
- assetManifestFileName=SourceBuild_${{ parameters.platform.name }}.xml
- fi
-
- ${{ coalesce(parameters.platform.buildScript, './build.sh') }} --ci \
- --configuration $buildConfig \
- --restore --build --pack $publishArgs -bl \
- $officialBuildArgs \
- $internalRuntimeDownloadArgs \
- $internalRestoreArgs \
- $targetRidArgs \
- $runtimeOsArgs \
- $baseOsArgs \
- /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \
- /p:ArcadeBuildFromSource=true \
- /p:DotNetBuildSourceOnly=true \
- /p:DotNetBuildRepo=true \
- /p:AssetManifestFileName=$assetManifestFileName
- displayName: Build
-
-# Upload build logs for diagnosis.
-- task: CopyFiles@2
- displayName: Prepare BuildLogs staging directory
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)'
- Contents: |
- **/*.log
- **/*.binlog
- artifacts/sb/prebuilt-report/**
- TargetFolder: '$(Build.StagingDirectory)/BuildLogs'
- CleanTargetFolder: true
- continueOnError: true
- condition: succeededOrFailed()
-
-- task: 1ES.PublishPipelineArtifact@1
- displayName: Publish BuildLogs
- inputs:
- targetPath: '$(Build.StagingDirectory)/BuildLogs'
- artifactName: BuildLogs_SourceBuild_${{ parameters.platform.name }}_Attempt$(System.JobAttempt)
- continueOnError: true
- condition: succeededOrFailed()
+- template: /eng/common/core-templates/steps/source-build.yml
+ parameters:
+ is1ESPipeline: true
-# Manually inject component detection so that we can ignore the source build upstream cache, which contains
-# a nupkg cache of input packages (a local feed).
-# This path must match the upstream cache path in property 'CurrentRepoSourceBuiltNupkgCacheDir'
-# in src\Microsoft.DotNet.Arcade.Sdk\tools\SourceBuild\SourceBuildArcade.targets
-- task: ComponentGovernanceComponentDetection@0
- displayName: Component Detection (Exclude upstream cache)
- inputs:
- ignoreDirectories: '$(Build.SourcesDirectory)/artifacts/sb/src/artifacts/obj/source-built-upstream-cache'
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates-official/variables/pool-providers.yml b/eng/common/templates-official/variables/pool-providers.yml
index beab7d1bfba0..1f308b24efc4 100644
--- a/eng/common/templates-official/variables/pool-providers.yml
+++ b/eng/common/templates-official/variables/pool-providers.yml
@@ -23,7 +23,7 @@
#
# pool:
# name: $(DncEngInternalBuildPool)
-# image: 1es-windows-2022-pt
+# image: 1es-windows-2022
variables:
# Coalesce the target and source branches so we know when a PR targets a release branch
diff --git a/eng/common/templates/job/execute-sdl.yml b/eng/common/templates/job/execute-sdl.yml
deleted file mode 100644
index 7870f93bc176..000000000000
--- a/eng/common/templates/job/execute-sdl.yml
+++ /dev/null
@@ -1,139 +0,0 @@
-parameters:
- enable: 'false' # Whether the SDL validation job should execute or not
- overrideParameters: '' # Optional: to override values for parameters.
- additionalParameters: '' # Optional: parameters that need user specific values eg: '-SourceToolsList @("abc","def") -ArtifactToolsList @("ghi","jkl")'
- # Optional: if specified, restore and use this version of Guardian instead of the default.
- overrideGuardianVersion: ''
- # Optional: if true, publish the '.gdn' folder as a pipeline artifact. This can help with in-depth
- # diagnosis of problems with specific tool configurations.
- publishGuardianDirectoryToPipeline: false
- # The script to run to execute all SDL tools. Use this if you want to use a script to define SDL
- # parameters rather than relying on YAML. It may be better to use a local script, because you can
- # reproduce results locally without piecing together a command based on the YAML.
- executeAllSdlToolsScript: 'eng/common/sdl/execute-all-sdl-tools.ps1'
- # There is some sort of bug (has been reported) in Azure DevOps where if this parameter is named
- # 'continueOnError', the parameter value is not correctly picked up.
- # This can also be remedied by the caller (post-build.yml) if it does not use a nested parameter
- sdlContinueOnError: false # optional: determines whether to continue the build if the step errors;
- # optional: determines if build artifacts should be downloaded.
- downloadArtifacts: true
- # optional: determines if this job should search the directory of downloaded artifacts for
- # 'tar.gz' and 'zip' archive files and extract them before running SDL validation tasks.
- extractArchiveArtifacts: false
- dependsOn: '' # Optional: dependencies of the job
- artifactNames: '' # Optional: patterns supplied to DownloadBuildArtifacts
- # Usage:
- # artifactNames:
- # - 'BlobArtifacts'
- # - 'Artifacts_Windows_NT_Release'
- # Optional: download a list of pipeline artifacts. 'downloadArtifacts' controls build artifacts,
- # not pipeline artifacts, so doesn't affect the use of this parameter.
- pipelineArtifactNames: []
-
-jobs:
-- job: Run_SDL
- dependsOn: ${{ parameters.dependsOn }}
- displayName: Run SDL tool
- condition: and(succeededOrFailed(), eq( ${{ parameters.enable }}, 'true'))
- variables:
- - group: DotNet-VSTS-Bot
- - name: AzDOProjectName
- value: ${{ parameters.AzDOProjectName }}
- - name: AzDOPipelineId
- value: ${{ parameters.AzDOPipelineId }}
- - name: AzDOBuildId
- value: ${{ parameters.AzDOBuildId }}
- - template: /eng/common/templates/variables/sdl-variables.yml
- - name: GuardianVersion
- value: ${{ coalesce(parameters.overrideGuardianVersion, '$(DefaultGuardianVersion)') }}
- - template: /eng/common/templates/variables/pool-providers.yml
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: VSEngSS-MicroBuild2022-1ES
- demands: Cmd
- # If it's not devdiv, it's dnceng
- ${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: $(DncEngInternalBuildPool)
- demands: ImageOverride -equals windows.vs2019.amd64
- steps:
- - checkout: self
- clean: true
-
- # If the template caller didn't provide an AzDO parameter, set them all up as Maestro vars.
- - ${{ if not(and(parameters.AzDOProjectName, parameters.AzDOPipelineId, parameters.AzDOBuildId)) }}:
- - template: /eng/common/templates/post-build/setup-maestro-vars.yml
-
- - ${{ if ne(parameters.downloadArtifacts, 'false')}}:
- - ${{ if ne(parameters.artifactNames, '') }}:
- - ${{ each artifactName in parameters.artifactNames }}:
- - task: DownloadBuildArtifacts@0
- displayName: Download Build Artifacts
- inputs:
- buildType: specific
- buildVersionToDownload: specific
- project: $(AzDOProjectName)
- pipeline: $(AzDOPipelineId)
- buildId: $(AzDOBuildId)
- artifactName: ${{ artifactName }}
- downloadPath: $(Build.ArtifactStagingDirectory)\artifacts
- checkDownloadedFiles: true
- - ${{ if eq(parameters.artifactNames, '') }}:
- - task: DownloadBuildArtifacts@0
- displayName: Download Build Artifacts
- inputs:
- buildType: specific
- buildVersionToDownload: specific
- project: $(AzDOProjectName)
- pipeline: $(AzDOPipelineId)
- buildId: $(AzDOBuildId)
- downloadType: specific files
- itemPattern: "**"
- downloadPath: $(Build.ArtifactStagingDirectory)\artifacts
- checkDownloadedFiles: true
-
- - ${{ each artifactName in parameters.pipelineArtifactNames }}:
- - task: DownloadPipelineArtifact@2
- displayName: Download Pipeline Artifacts
- inputs:
- buildType: specific
- buildVersionToDownload: specific
- project: $(AzDOProjectName)
- pipeline: $(AzDOPipelineId)
- buildId: $(AzDOBuildId)
- artifactName: ${{ artifactName }}
- downloadPath: $(Build.ArtifactStagingDirectory)\artifacts
- checkDownloadedFiles: true
-
- - powershell: eng/common/sdl/trim-assets-version.ps1
- -InputPath $(Build.ArtifactStagingDirectory)\artifacts
- displayName: Trim the version from the NuGet packages
- continueOnError: ${{ parameters.sdlContinueOnError }}
-
- - powershell: eng/common/sdl/extract-artifact-packages.ps1
- -InputPath $(Build.ArtifactStagingDirectory)\artifacts\BlobArtifacts
- -ExtractPath $(Build.ArtifactStagingDirectory)\artifacts\BlobArtifacts
- displayName: Extract Blob Artifacts
- continueOnError: ${{ parameters.sdlContinueOnError }}
-
- - powershell: eng/common/sdl/extract-artifact-packages.ps1
- -InputPath $(Build.ArtifactStagingDirectory)\artifacts\PackageArtifacts
- -ExtractPath $(Build.ArtifactStagingDirectory)\artifacts\PackageArtifacts
- displayName: Extract Package Artifacts
- continueOnError: ${{ parameters.sdlContinueOnError }}
-
- - ${{ if ne(parameters.extractArchiveArtifacts, 'false') }}:
- - powershell: eng/common/sdl/extract-artifact-archives.ps1
- -InputPath $(Build.ArtifactStagingDirectory)\artifacts
- -ExtractPath $(Build.ArtifactStagingDirectory)\artifacts
- displayName: Extract Archive Artifacts
- continueOnError: ${{ parameters.sdlContinueOnError }}
-
- - template: /eng/common/templates/steps/execute-sdl.yml
- parameters:
- overrideGuardianVersion: ${{ parameters.overrideGuardianVersion }}
- executeAllSdlToolsScript: ${{ parameters.executeAllSdlToolsScript }}
- overrideParameters: ${{ parameters.overrideParameters }}
- additionalParameters: ${{ parameters.additionalParameters }}
- publishGuardianDirectoryToPipeline: ${{ parameters.publishGuardianDirectoryToPipeline }}
- sdlContinueOnError: ${{ parameters.sdlContinueOnError }}
diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml
index a3277bf15c51..1cf9a6d48127 100644
--- a/eng/common/templates/job/job.yml
+++ b/eng/common/templates/job/job.yml
@@ -1,259 +1,61 @@
-# 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.
-
-parameters:
-# Job schema parameters - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
- cancelTimeoutInMinutes: ''
- condition: ''
- container: ''
- continueOnError: false
- dependsOn: ''
- displayName: ''
- pool: ''
- steps: []
- strategy: ''
- timeoutInMinutes: ''
- variables: []
- workspace: ''
- templateContext: ''
-
-# Job base template specific parameters
- # See schema documentation - https://github.com/dotnet/arcade/blob/master/Documentation/AzureDevOps/TemplateSchema.md
- artifacts: ''
- enableMicrobuild: false
+parameters:
enablePublishBuildArtifacts: false
- enablePublishBuildAssets: false
- enablePublishTestResults: false
- enablePublishUsingPipelines: false
- enableBuildRetry: false
- disableComponentGovernance: ''
- componentGovernanceIgnoreDirectories: ''
- mergeTestResults: false
- testRunTitle: ''
- testResultsFormat: ''
- name: ''
- preSteps: []
- runAsPublic: false
-# Sbom related params
- enableSbom: true
- PackageVersion: 7.0.0
- BuildDropPath: '$(Build.SourcesDirectory)/artifacts'
jobs:
-- job: ${{ parameters.name }}
-
- ${{ if ne(parameters.cancelTimeoutInMinutes, '') }}:
- cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }}
-
- ${{ if ne(parameters.condition, '') }}:
- condition: ${{ parameters.condition }}
-
- ${{ if ne(parameters.container, '') }}:
- container: ${{ parameters.container }}
-
- ${{ if ne(parameters.continueOnError, '') }}:
- continueOnError: ${{ parameters.continueOnError }}
-
- ${{ if ne(parameters.dependsOn, '') }}:
- dependsOn: ${{ parameters.dependsOn }}
-
- ${{ if ne(parameters.displayName, '') }}:
- displayName: ${{ parameters.displayName }}
-
- ${{ if ne(parameters.pool, '') }}:
- pool: ${{ parameters.pool }}
-
- ${{ if ne(parameters.strategy, '') }}:
- strategy: ${{ parameters.strategy }}
-
- ${{ if ne(parameters.timeoutInMinutes, '') }}:
- timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
-
- ${{ if ne(parameters.templateContext, '') }}:
- templateContext: ${{ parameters.templateContext }}
-
- variables:
- - ${{ if ne(parameters.enableTelemetry, 'false') }}:
- - name: DOTNET_CLI_TELEMETRY_PROFILE
- value: '$(Build.Repository.Uri)'
- - ${{ if eq(parameters.enableRichCodeNavigation, 'true') }}:
- - name: EnableRichCodeNavigation
- value: 'true'
- # Retry signature validation up to three times, waiting 2 seconds between attempts.
- # See https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3028#retry-untrusted-root-failures
- - name: NUGET_EXPERIMENTAL_CHAIN_BUILD_RETRY_POLICY
- value: 3,2000
- - ${{ each variable in parameters.variables }}:
- # handle name-value variable syntax
- # example:
- # - name: [key]
- # value: [value]
- - ${{ if ne(variable.name, '') }}:
- - name: ${{ variable.name }}
- value: ${{ variable.value }}
-
- # handle variable groups
- - ${{ if ne(variable.group, '') }}:
- - group: ${{ variable.group }}
-
- # handle template variable syntax
- # example:
- # - template: path/to/template.yml
- # parameters:
- # [key]: [value]
- - ${{ if ne(variable.template, '') }}:
- - template: ${{ variable.template }}
- ${{ if ne(variable.parameters, '') }}:
- parameters: ${{ variable.parameters }}
-
- # handle key-value variable syntax.
- # example:
- # - [key]: [value]
- - ${{ if and(eq(variable.name, ''), eq(variable.group, ''), eq(variable.template, '')) }}:
- - ${{ each pair in variable }}:
- - name: ${{ pair.key }}
- value: ${{ pair.value }}
-
- # DotNet-HelixApi-Access provides 'HelixApiAccessToken' for internal builds
- - ${{ if and(eq(parameters.enableTelemetry, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - group: DotNet-HelixApi-Access
-
- ${{ if ne(parameters.workspace, '') }}:
- workspace: ${{ parameters.workspace }}
-
- steps:
- - ${{ if ne(parameters.preSteps, '') }}:
- - ${{ each preStep in parameters.preSteps }}:
- - ${{ preStep }}
-
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - ${{ if eq(parameters.enableMicrobuild, 'true') }}:
- - task: MicroBuildSigningPlugin@3
- displayName: Install MicroBuild plugin
- inputs:
- signType: $(_SignType)
- zipSources: false
- feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json
- env:
- TeamName: $(_TeamName)
- continueOnError: ${{ parameters.continueOnError }}
- condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT'))
-
- - ${{ if and(eq(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'internal')) }}:
- - task: NuGetAuthenticate@1
-
- - ${{ if and(ne(parameters.artifacts.download, 'false'), ne(parameters.artifacts.download, '')) }}:
- - task: DownloadPipelineArtifact@2
- inputs:
- buildType: current
- artifactName: ${{ coalesce(parameters.artifacts.download.name, 'Artifacts_$(Agent.OS)_$(_BuildConfig)') }}
- targetPath: ${{ coalesce(parameters.artifacts.download.path, 'artifacts') }}
- itemPattern: ${{ coalesce(parameters.artifacts.download.pattern, '**') }}
-
- - ${{ each step in parameters.steps }}:
- - ${{ step }}
-
- - ${{ if eq(parameters.enableRichCodeNavigation, true) }}:
- - task: RichCodeNavIndexer@0
- displayName: RichCodeNav Upload
- inputs:
- languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }}
- environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'internal') }}
- richNavLogOutputDirectory: $(Build.SourcesDirectory)/artifacts/bin
- uploadRichNavArtifacts: ${{ coalesce(parameters.richCodeNavigationUploadArtifacts, false) }}
- continueOnError: true
-
- - template: /eng/common/templates/steps/component-governance.yml
- parameters:
- ${{ if eq(parameters.disableComponentGovernance, '') }}:
- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.runAsPublic, 'false'), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/dotnet/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/microsoft/'), eq(variables['Build.SourceBranch'], 'refs/heads/main'))) }}:
- disableComponentGovernance: false
- ${{ else }}:
- disableComponentGovernance: true
- ${{ else }}:
- disableComponentGovernance: ${{ parameters.disableComponentGovernance }}
- componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
-
- - ${{ if eq(parameters.enableMicrobuild, 'true') }}:
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - task: MicroBuildCleanup@1
- displayName: Execute Microbuild cleanup tasks
- condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT'))
- continueOnError: ${{ parameters.continueOnError }}
- env:
- TeamName: $(_TeamName)
-
- - ${{ if ne(parameters.artifacts.publish, '') }}:
- - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}:
- - task: CopyFiles@2
- displayName: Gather binaries for publish to artifacts
- inputs:
- SourceFolder: 'artifacts/bin'
- Contents: '**'
- TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/bin'
- - task: CopyFiles@2
- displayName: Gather packages for publish to artifacts
- inputs:
- SourceFolder: 'artifacts/packages'
- Contents: '**'
- TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/packages'
- - task: PublishBuildArtifacts@1
- displayName: Publish pipeline artifacts
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts'
- PublishLocation: Container
- ArtifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }}
- continueOnError: true
- condition: always()
- - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}:
- - publish: artifacts/log
- artifact: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)') }}
- displayName: Publish logs
- continueOnError: true
- condition: always()
-
- - ${{ if ne(parameters.enablePublishBuildArtifacts, 'false') }}:
- - task: PublishBuildArtifacts@1
- displayName: Publish Logs
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)'
- PublishLocation: Container
- ArtifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }}
- continueOnError: true
- condition: always()
-
- - ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'xunit')) }}:
- - task: PublishTestResults@2
- displayName: Publish XUnit Test Results
- inputs:
- testResultsFormat: 'xUnit'
- testResultsFiles: '*.xml'
- searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
- testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-xunit
- 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.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.enableSbom, 'true')) }}:
- - template: /eng/common/templates/steps/generate-sbom.yml
- parameters:
- PackageVersion: ${{ parameters.packageVersion}}
- BuildDropPath: ${{ parameters.buildDropPath }}
- IgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
-
- - ${{ if eq(parameters.enableBuildRetry, 'true') }}:
- - publish: $(Build.SourcesDirectory)\eng\common\BuildConfiguration
- artifact: BuildConfiguration
- displayName: Publish build retry configuration
- continueOnError: true
+- template: /eng/common/core-templates/job/job.yml
+ parameters:
+ is1ESPipeline: false
+
+ ${{ each parameter in parameters }}:
+ ${{ if and(ne(parameter.key, 'steps'), ne(parameter.key, 'is1ESPipeline')) }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
+
+ steps:
+ - ${{ each step in parameters.steps }}:
+ - ${{ step }}
+
+ artifactPublishSteps:
+ - ${{ if ne(parameters.artifacts.publish, '') }}:
+ - ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}:
+ - template: /eng/common/core-templates/steps/publish-build-artifacts.yml
+ parameters:
+ is1ESPipeline: false
+ args:
+ displayName: Publish pipeline artifacts
+ pathToPublish: '$(Build.ArtifactStagingDirectory)/artifacts'
+ publishLocation: Container
+ artifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }}
+ continueOnError: true
+ condition: always()
+ - ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}:
+ - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml
+ parameters:
+ is1ESPipeline: false
+ args:
+ targetPath: '$(Build.ArtifactStagingDirectory)/artifacts/log'
+ artifactName: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)') }}
+ displayName: 'Publish logs'
+ continueOnError: true
+ condition: always()
+
+ - ${{ if ne(parameters.enablePublishBuildArtifacts, 'false') }}:
+ - template: /eng/common/core-templates/steps/publish-build-artifacts.yml
+ parameters:
+ is1ESPipeline: false
+ args:
+ displayName: Publish Logs
+ pathToPublish: '$(Build.ArtifactStagingDirectory)/artifacts/log/$(_BuildConfig)'
+ publishLocation: Container
+ artifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }}
+ continueOnError: true
+ condition: always()
+
+ - ${{ if eq(parameters.enableBuildRetry, 'true') }}:
+ - template: /eng/common/core-templates/steps/publish-pipeline-artifacts.yml
+ parameters:
+ is1ESPipeline: false
+ args:
+ targetPath: '$(Build.SourcesDirectory)\eng\common\BuildConfiguration'
+ artifactName: 'BuildConfiguration'
+ displayName: 'Publish build retry configuration'
+ continueOnError: true
diff --git a/eng/common/templates/job/onelocbuild.yml b/eng/common/templates/job/onelocbuild.yml
index 60ab00c4de3a..ff829dc4c700 100644
--- a/eng/common/templates/job/onelocbuild.yml
+++ b/eng/common/templates/job/onelocbuild.yml
@@ -1,109 +1,7 @@
-parameters:
- # Optional: dependencies of the job
- dependsOn: ''
-
- # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool
- pool: ''
-
- CeapexPat: $(dn-bot-ceapex-package-r) # PAT for the loc AzDO instance https://dev.azure.com/ceapex
- GithubPat: $(BotAccount-dotnet-bot-repo-PAT)
-
- SourcesDirectory: $(Build.SourcesDirectory)
- CreatePr: true
- AutoCompletePr: false
- ReusePr: true
- UseLfLineEndings: true
- UseCheckedInLocProjectJson: false
- SkipLocProjectJsonGeneration: false
- LanguageSet: VS_Main_Languages
- LclSource: lclFilesInRepo
- LclPackageId: ''
- RepoType: gitHub
- GitHubOrg: dotnet
- MirrorRepo: ''
- MirrorBranch: main
- condition: ''
- JobNameSuffix: ''
-
jobs:
-- job: OneLocBuild${{ parameters.JobNameSuffix }}
-
- dependsOn: ${{ parameters.dependsOn }}
-
- displayName: OneLocBuild${{ parameters.JobNameSuffix }}
-
- variables:
- - group: OneLocBuildVariables # Contains the CeapexPat and GithubPat
- - name: _GenerateLocProjectArguments
- value: -SourcesDirectory ${{ parameters.SourcesDirectory }}
- -LanguageSet "${{ parameters.LanguageSet }}"
- -CreateNeutralXlfs
- - ${{ if eq(parameters.UseCheckedInLocProjectJson, 'true') }}:
- - name: _GenerateLocProjectArguments
- value: ${{ variables._GenerateLocProjectArguments }} -UseCheckedInLocProjectJson
- - template: /eng/common/templates/variables/pool-providers.yml
-
- ${{ if ne(parameters.pool, '') }}:
- pool: ${{ parameters.pool }}
- ${{ if eq(parameters.pool, '') }}:
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: VSEngSS-MicroBuild2022-1ES
- demands: Cmd
- # If it's not devdiv, it's dnceng
- ${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: $(DncEngInternalBuildPool)
- demands: ImageOverride -equals windows.vs2019.amd64
-
- steps:
- - ${{ if ne(parameters.SkipLocProjectJsonGeneration, 'true') }}:
- - task: Powershell@2
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/generate-locproject.ps1
- arguments: $(_GenerateLocProjectArguments)
- displayName: Generate LocProject.json
- condition: ${{ parameters.condition }}
-
- - task: OneLocBuild@2
- displayName: OneLocBuild
- env:
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- inputs:
- locProj: eng/Localize/LocProject.json
- outDir: $(Build.ArtifactStagingDirectory)
- lclSource: ${{ parameters.LclSource }}
- lclPackageId: ${{ parameters.LclPackageId }}
- isCreatePrSelected: ${{ parameters.CreatePr }}
- isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }}
- ${{ if eq(parameters.CreatePr, true) }}:
- isUseLfLineEndingsSelected: ${{ parameters.UseLfLineEndings }}
- ${{ if eq(parameters.RepoType, 'gitHub') }}:
- isShouldReusePrSelected: ${{ parameters.ReusePr }}
- packageSourceAuth: patAuth
- patVariable: ${{ parameters.CeapexPat }}
- ${{ if eq(parameters.RepoType, 'gitHub') }}:
- repoType: ${{ parameters.RepoType }}
- gitHubPatVariable: "${{ parameters.GithubPat }}"
- ${{ if ne(parameters.MirrorRepo, '') }}:
- isMirrorRepoSelected: true
- gitHubOrganization: ${{ parameters.GitHubOrg }}
- mirrorRepo: ${{ parameters.MirrorRepo }}
- mirrorBranch: ${{ parameters.MirrorBranch }}
- condition: ${{ parameters.condition }}
-
- - task: PublishBuildArtifacts@1
- displayName: Publish Localization Files
- inputs:
- PathtoPublish: '$(Build.ArtifactStagingDirectory)/loc'
- PublishLocation: Container
- ArtifactName: Loc
- condition: ${{ parameters.condition }}
+- template: /eng/common/core-templates/job/onelocbuild.yml
+ parameters:
+ is1ESPipeline: false
- - task: PublishBuildArtifacts@1
- displayName: Publish LocProject.json
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/eng/Localize/'
- PublishLocation: Container
- ArtifactName: Loc
- condition: ${{ parameters.condition }}
\ No newline at end of file
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml
index bb42240f865b..ab2edec2adb5 100644
--- a/eng/common/templates/job/publish-build-assets.yml
+++ b/eng/common/templates/job/publish-build-assets.yml
@@ -1,155 +1,7 @@
-parameters:
- configuration: 'Debug'
-
- # Optional: condition for the job to run
- condition: ''
-
- # Optional: 'true' if future jobs should run even if this job fails
- continueOnError: false
-
- # Optional: dependencies of the job
- dependsOn: ''
-
- # Optional: Include PublishBuildArtifacts task
- enablePublishBuildArtifacts: false
-
- # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool
- pool: {}
-
- # Optional: should run as a public build even in the internal project
- # 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: whether the build's artifacts will be published using release pipelines or direct feed publishing
- publishUsingPipelines: false
-
- # Optional: whether the build's artifacts will be published using release pipelines or direct feed publishing
- publishAssetsImmediately: false
-
- artifactsPublishingAdditionalParameters: ''
-
- signingValidationAdditionalParameters: ''
-
jobs:
-- job: Asset_Registry_Publish
-
- dependsOn: ${{ parameters.dependsOn }}
- timeoutInMinutes: 150
-
- ${{ if eq(parameters.publishAssetsImmediately, 'true') }}:
- displayName: Publish Assets
- ${{ else }}:
- displayName: Publish to Build Asset Registry
-
- variables:
- - template: /eng/common/templates/variables/pool-providers.yml
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - group: Publish-Build-Assets
- - group: AzureDevOps-Artifact-Feeds-Pats
- - name: runCodesignValidationInjection
- value: false
- # unconditional - needed for logs publishing (redactor tool version)
- - template: /eng/common/templates/post-build/common-variables.yml
-
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: VSEngSS-MicroBuild2022-1ES
- demands: Cmd
- # If it's not devdiv, it's dnceng
- ${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
- name: NetCore1ESPool-Publishing-Internal
- demands: ImageOverride -equals windows.vs2019.amd64
-
- steps:
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - checkout: self
- fetchDepth: 3
- clean: true
-
- - task: DownloadBuildArtifacts@0
- displayName: Download artifact
- inputs:
- artifactName: AssetManifests
- downloadPath: '$(Build.StagingDirectory)/Download'
- checkDownloadedFiles: true
- condition: ${{ parameters.condition }}
- continueOnError: ${{ parameters.continueOnError }}
-
- - task: NuGetAuthenticate@1
-
- - task: PowerShell@2
- displayName: Publish Build Assets
- inputs:
- filePath: eng\common\sdk-task.ps1
- arguments: -task PublishBuildAssets -restore -msbuildEngine dotnet
- /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests'
- /p:BuildAssetRegistryToken=$(MaestroAccessToken)
- /p:MaestroApiEndpoint=https://maestro.dot.net
- /p:PublishUsingPipelines=${{ parameters.publishUsingPipelines }}
- /p:OfficialBuildId=$(Build.BuildNumber)
- condition: ${{ parameters.condition }}
- continueOnError: ${{ parameters.continueOnError }}
-
- - task: powershell@2
- displayName: Create ReleaseConfigs Artifact
- inputs:
- targetType: inline
- script: |
- Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value $(BARBuildId)
- Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value "$(DefaultChannels)"
- Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value $(IsStableBuild)
-
- - task: PublishBuildArtifacts@1
- displayName: Publish ReleaseConfigs Artifact
- inputs:
- PathtoPublish: '$(Build.StagingDirectory)/ReleaseConfigs.txt'
- PublishLocation: Container
- ArtifactName: ReleaseConfigs
-
- - task: powershell@2
- displayName: Check if SymbolPublishingExclusionsFile.txt exists
- inputs:
- targetType: inline
- script: |
- $symbolExclusionfile = "$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt"
- if(Test-Path -Path $symbolExclusionfile)
- {
- Write-Host "SymbolExclusionFile exists"
- Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]true"
- }
- else{
- Write-Host "Symbols Exclusion file does not exists"
- Write-Host "##vso[task.setvariable variable=SymbolExclusionFile]false"
- }
-
- - task: PublishBuildArtifacts@1
- displayName: Publish SymbolPublishingExclusionsFile Artifact
- condition: eq(variables['SymbolExclusionFile'], 'true')
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/eng/SymbolPublishingExclusionsFile.txt'
- PublishLocation: Container
- ArtifactName: ReleaseConfigs
-
- - ${{ if eq(parameters.publishAssetsImmediately, 'true') }}:
- - template: /eng/common/templates/post-build/setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: PowerShell@2
- displayName: Publish Using Darc
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/publish-using-darc.ps1
- arguments: -BuildId $(BARBuildId)
- -PublishingInfraVersion 3
- -AzdoToken '$(publishing-dnceng-devdiv-code-r-build-re)'
- -MaestroToken '$(MaestroApiAccessToken)'
- -WaitPublishingFinish true
- -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}'
- -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}'
+- template: /eng/common/core-templates/job/publish-build-assets.yml
+ parameters:
+ is1ESPipeline: false
- - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}:
- - template: /eng/common/templates/steps/publish-logs.yml
- parameters:
- JobLabel: 'Publish_Artifacts_Logs'
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/job/source-build.yml b/eng/common/templates/job/source-build.yml
index 8a3deef2b727..e44d47b1d760 100644
--- a/eng/common/templates/job/source-build.yml
+++ b/eng/common/templates/job/source-build.yml
@@ -1,66 +1,7 @@
-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.
- # skipPublishValidation: false
- # Disables publishing validation. By default, a check is performed to ensure no packages are
- # published by source-build.
- # 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 eq(parameters.platform.pool, '') }}:
- # The default VM host AzDO pool. This should be capable of running Docker containers: almost all
- # source-build builds run in Docker, including the default managed platform.
- # /eng/common/templates/variables/pool-providers.yml can't be used here (some customers declare variables already), so duplicate its logic
- pool:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore-Svc-Public' ), False, 'NetCore-Public')]
- demands: ImageOverride -equals Build.Ubuntu.1804.Amd64.Open
-
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- name: $[replace(replace(eq(contains(coalesce(variables['System.PullRequest.TargetBranch'], variables['Build.SourceBranch'], 'refs/heads/main'), 'release'), 'true'), True, 'NetCore1ESPool-Svc-Internal'), False, 'NetCore1ESPool-Internal')]
- demands: ImageOverride -equals Build.Ubuntu.1804.Amd64
-
- ${{ if ne(parameters.platform.pool, '') }}:
- pool: ${{ parameters.platform.pool }}
-
- workspace:
- clean: all
+- template: /eng/common/core-templates/job/source-build.yml
+ parameters:
+ is1ESPipeline: false
- steps:
- - template: /eng/common/templates/steps/source-build.yml
- parameters:
- platform: ${{ parameters.platform }}
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/job/source-index-stage1.yml b/eng/common/templates/job/source-index-stage1.yml
index b5a3e5c4a6c8..89f3291593cb 100644
--- a/eng/common/templates/job/source-index-stage1.yml
+++ b/eng/common/templates/job/source-index-stage1.yml
@@ -1,67 +1,7 @@
-parameters:
- runAsPublic: false
- sourceIndexPackageVersion: 1.0.1-20240129.2
- sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json
- sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci"
- preSteps: []
- binlogPath: artifacts/log/Debug/Build.binlog
- condition: ''
- dependsOn: ''
- pool: ''
-
jobs:
-- job: SourceIndexStage1
- dependsOn: ${{ parameters.dependsOn }}
- condition: ${{ parameters.condition }}
- variables:
- - name: SourceIndexPackageVersion
- value: ${{ parameters.sourceIndexPackageVersion }}
- - name: SourceIndexPackageSource
- value: ${{ parameters.sourceIndexPackageSource }}
- - name: BinlogPath
- value: ${{ parameters.binlogPath }}
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - group: source-dot-net stage1 variables
- - template: /eng/common/templates/variables/pool-providers.yml
-
- ${{ if ne(parameters.pool, '') }}:
- pool: ${{ parameters.pool }}
- ${{ if eq(parameters.pool, '') }}:
- pool:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- name: $(DncEngPublicBuildPool)
- demands: ImageOverride -equals windows.vs2022.amd64.open
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- name: $(DncEngInternalBuildPool)
- demands: ImageOverride -equals windows.vs2022.amd64
-
- steps:
- - ${{ each preStep in parameters.preSteps }}:
- - ${{ preStep }}
-
- - task: UseDotNet@2
- displayName: Use .NET 8 SDK
- inputs:
- packageType: sdk
- version: 8.0.x
- installationPath: $(Agent.TempDirectory)/dotnet
- workingDirectory: $(Agent.TempDirectory)
-
- - script: |
- $(Agent.TempDirectory)/dotnet/dotnet tool install BinLogToSln --version $(SourceIndexPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools
- $(Agent.TempDirectory)/dotnet/dotnet tool install UploadIndexStage1 --version $(SourceIndexPackageVersion) --add-source $(SourceIndexPackageSource) --tool-path $(Agent.TempDirectory)/.source-index/tools
- displayName: Download Tools
- # Set working directory to temp directory so 'dotnet' doesn't try to use global.json and use the repo's sdk.
- workingDirectory: $(Agent.TempDirectory)
-
- - script: ${{ parameters.sourceIndexBuildCommand }}
- displayName: Build Repository
-
- - script: $(Agent.TempDirectory)/.source-index/tools/BinLogToSln -i $(BinlogPath) -r $(Build.SourcesDirectory) -n $(Build.Repository.Name) -o .source-index/stage1output
- displayName: Process Binlog into indexable sln
+- template: /eng/common/core-templates/job/source-index-stage1.yml
+ parameters:
+ is1ESPipeline: false
- - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- - script: $(Agent.TempDirectory)/.source-index/tools/UploadIndexStage1 -i .source-index/stage1output -n $(Build.Repository.Name)
- displayName: Upload stage1 artifacts to source index
- env:
- BLOB_CONTAINER_URL: $(source-dot-net-stage1-blob-container-url)
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/jobs/codeql-build.yml b/eng/common/templates/jobs/codeql-build.yml
index f7dc5ea4aaa6..517f24d6a52c 100644
--- a/eng/common/templates/jobs/codeql-build.yml
+++ b/eng/common/templates/jobs/codeql-build.yml
@@ -1,31 +1,7 @@
-parameters:
- # See schema documentation in /Documentation/AzureDevOps/TemplateSchema.md
- continueOnError: false
- # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
- jobs: []
- # Optional: if specified, restore and use this version of Guardian instead of the default.
- overrideGuardianVersion: ''
-
jobs:
-- template: /eng/common/templates/jobs/jobs.yml
+- template: /eng/common/core-templates/jobs/codeql-build.yml
parameters:
- enableMicrobuild: false
- enablePublishBuildArtifacts: false
- enablePublishTestResults: false
- enablePublishBuildAssets: false
- enablePublishUsingPipelines: false
- enableTelemetry: true
+ is1ESPipeline: false
- variables:
- - group: Publish-Build-Assets
- # The Guardian version specified in 'eng/common/sdl/packages.config'. This value must be kept in
- # sync with the packages.config file.
- - name: DefaultGuardianVersion
- value: 0.109.0
- - name: GuardianPackagesConfigFile
- value: $(Build.SourcesDirectory)\eng\common\sdl\packages.config
- - name: GuardianVersion
- value: ${{ coalesce(parameters.overrideGuardianVersion, '$(DefaultGuardianVersion)') }}
-
- jobs: ${{ parameters.jobs }}
-
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/jobs/jobs.yml b/eng/common/templates/jobs/jobs.yml
index 289bb2396ce8..388e9037b3e6 100644
--- a/eng/common/templates/jobs/jobs.yml
+++ b/eng/common/templates/jobs/jobs.yml
@@ -1,97 +1,7 @@
-parameters:
- # See schema documentation in /Documentation/AzureDevOps/TemplateSchema.md
- continueOnError: false
-
- # Optional: Include PublishBuildArtifacts task
- enablePublishBuildArtifacts: false
-
- # Optional: Enable publishing using release pipelines
- enablePublishUsingPipelines: false
-
- # Optional: Enable running the source-build jobs to build repo from source
- enableSourceBuild: false
-
- # Optional: Parameters for source-build template.
- # See /eng/common/templates/jobs/source-build.yml for options
- sourceBuildParameters: []
-
- graphFileGeneration:
- # Optional: Enable generating the graph files at the end of the build
- enabled: false
- # Optional: Include toolset dependencies in the generated graph files
- includeToolset: false
-
- # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
- jobs: []
-
- # Optional: Override automatically derived dependsOn value for "publish build assets" job
- publishBuildAssetsDependsOn: ''
-
- # Optional: Publish the assets as soon as the publish to BAR stage is complete, rather doing so in a separate stage.
- publishAssetsImmediately: false
-
- # Optional: If using publishAssetsImmediately and additional parameters are needed, can be used to send along additional parameters (normally sent to post-build.yml)
- artifactsPublishingAdditionalParameters: ''
- signingValidationAdditionalParameters: ''
-
- # Optional: should run as a public build even in the internal project
- # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects.
- runAsPublic: false
-
- enableSourceIndex: false
- sourceIndexParams: {}
-
-# 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.
-
jobs:
-- ${{ each job in parameters.jobs }}:
- - template: ../job/job.yml
- parameters:
- # pass along parameters
- ${{ each parameter in parameters }}:
- ${{ if ne(parameter.key, 'jobs') }}:
- ${{ parameter.key }}: ${{ parameter.value }}
-
- # pass along job properties
- ${{ each property in job }}:
- ${{ if ne(property.key, 'job') }}:
- ${{ property.key }}: ${{ property.value }}
-
- name: ${{ job.job }}
-
-- ${{ if eq(parameters.enableSourceBuild, true) }}:
- - template: /eng/common/templates/jobs/source-build.yml
- parameters:
- allCompletedJobId: Source_Build_Complete
- ${{ each parameter in parameters.sourceBuildParameters }}:
- ${{ parameter.key }}: ${{ parameter.value }}
-
-- ${{ if eq(parameters.enableSourceIndex, 'true') }}:
- - template: ../job/source-index-stage1.yml
- parameters:
- runAsPublic: ${{ parameters.runAsPublic }}
- ${{ each parameter in parameters.sourceIndexParams }}:
- ${{ 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
- parameters:
- continueOnError: ${{ parameters.continueOnError }}
- dependsOn:
- - ${{ if ne(parameters.publishBuildAssetsDependsOn, '') }}:
- - ${{ each job in parameters.publishBuildAssetsDependsOn }}:
- - ${{ job.job }}
- - ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}:
- - ${{ each job in parameters.jobs }}:
- - ${{ job.job }}
- - ${{ if eq(parameters.enableSourceBuild, true) }}:
- - Source_Build_Complete
+- template: /eng/common/core-templates/jobs/jobs.yml
+ parameters:
+ is1ESPipeline: false
- runAsPublic: ${{ parameters.runAsPublic }}
- publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }}
- publishAssetsImmediately: ${{ parameters.publishAssetsImmediately }}
- enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }}
- artifactsPublishingAdditionalParameters: ${{ parameters.artifactsPublishingAdditionalParameters }}
- signingValidationAdditionalParameters: ${{ parameters.signingValidationAdditionalParameters }}
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/jobs/source-build.yml b/eng/common/templates/jobs/source-build.yml
index a15b07eb51d9..818d4c326dbb 100644
--- a/eng/common/templates/jobs/source-build.yml
+++ b/eng/common/templates/jobs/source-build.yml
@@ -1,46 +1,7 @@
-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'
-
- # This is the default platform provided by Arcade, intended for use by a managed-only repo.
- defaultManagedPlatform:
- name: 'Managed'
- container: 'mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8'
-
- # 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'. If no platforms are specified,
- # one job runs on 'defaultManagedPlatform'.
- platforms: []
-
jobs:
+- template: /eng/common/core-templates/jobs/source-build.yml
+ parameters:
+ is1ESPipeline: false
-- ${{ 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(length(parameters.platforms), 0) }}:
- - ${{ 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(length(parameters.platforms), 0) }}:
- - template: /eng/common/templates/job/source-build.yml
- parameters:
- jobNamePrefix: ${{ parameters.jobNamePrefix }}
- platform: ${{ parameters.defaultManagedPlatform }}
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
\ No newline at end of file
diff --git a/eng/common/templates/post-build/common-variables.yml b/eng/common/templates/post-build/common-variables.yml
index b9ede10bf099..7fa105875592 100644
--- a/eng/common/templates/post-build/common-variables.yml
+++ b/eng/common/templates/post-build/common-variables.yml
@@ -1,24 +1,8 @@
variables:
- - group: Publish-Build-Assets
+- template: /eng/common/core-templates/post-build/common-variables.yml
+ parameters:
+ # Specifies whether to use 1ES
+ is1ESPipeline: false
- # Whether the build is internal or not
- - name: IsInternalBuild
- value: ${{ and(ne(variables['System.TeamProject'], 'public'), contains(variables['Build.SourceBranch'], 'internal')) }}
-
- # Default Maestro++ API Endpoint and API Version
- - name: MaestroApiEndPoint
- value: "https://maestro.dot.net"
- - name: MaestroApiAccessToken
- value: $(MaestroAccessToken)
- - name: MaestroApiVersion
- value: "2020-02-20"
-
- - name: SourceLinkCLIVersion
- value: 3.0.0
- - name: SymbolToolVersion
- value: 1.0.1
- - name: BinlogToolVersion
- value: 1.0.11
-
- - name: runCodesignValidationInjection
- value: false
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
\ No newline at end of file
diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml
index ee70e2b399c5..53ede714bdd2 100644
--- a/eng/common/templates/post-build/post-build.yml
+++ b/eng/common/templates/post-build/post-build.yml
@@ -1,282 +1,8 @@
-parameters:
- # Which publishing infra should be used. THIS SHOULD MATCH THE VERSION ON THE BUILD MANIFEST.
- # Publishing V1 is no longer supported
- # Publishing V2 is no longer supported
- # Publishing V3 is the default
- - name: publishingInfraVersion
- displayName: Which version of publishing should be used to promote the build definition?
- type: number
- default: 3
- values:
- - 3
-
- - name: BARBuildId
- displayName: BAR Build Id
- type: number
- default: 0
-
- - name: PromoteToChannelIds
- displayName: Channel to promote BARBuildId to
- type: string
- default: ''
-
- - name: enableSourceLinkValidation
- displayName: Enable SourceLink validation
- type: boolean
- default: false
-
- - name: enableSigningValidation
- displayName: Enable signing validation
- type: boolean
- default: true
-
- - name: enableSymbolValidation
- displayName: Enable symbol validation
- type: boolean
- default: false
-
- - name: enableNugetValidation
- displayName: Enable NuGet validation
- type: boolean
- default: true
-
- - name: publishInstallersAndChecksums
- displayName: Publish installers and checksums
- type: boolean
- default: true
-
- - name: SDLValidationParameters
- type: object
- default:
- enable: false
- publishGdn: false
- continueOnError: false
- params: ''
- artifactNames: ''
- downloadArtifacts: true
-
- # These parameters let the user customize the call to sdk-task.ps1 for publishing
- # symbols & general artifacts as well as for signing validation
- - name: symbolPublishingAdditionalParameters
- displayName: Symbol publishing additional parameters
- type: string
- default: ''
-
- - name: artifactsPublishingAdditionalParameters
- displayName: Artifact publishing additional parameters
- type: string
- default: ''
-
- - name: signingValidationAdditionalParameters
- displayName: Signing validation additional parameters
- type: string
- default: ''
-
- # Which stages should finish execution before post-build stages start
- - name: validateDependsOn
- type: object
- default:
- - build
-
- - name: publishDependsOn
- type: object
- default:
- - Validate
-
- # Optional: Call asset publishing rather than running in a separate stage
- - name: publishAssetsImmediately
- type: boolean
- default: false
-
stages:
-- ${{ if or(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
- variables:
- - template: common-variables.yml
- - template: /eng/common/templates/variables/pool-providers.yml
- jobs:
- - job:
- displayName: NuGet Validation
- condition: and(succeededOrFailed(), eq( ${{ parameters.enableNugetValidation }}, 'true'))
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: VSEngSS-MicroBuild2022-1ES
- demands: Cmd
- # If it's not devdiv, it's dnceng
- ${{ else }}:
- name: $(DncEngInternalBuildPool)
- demands: ImageOverride -equals windows.vs2019.amd64
-
- steps:
- - template: setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: DownloadBuildArtifacts@0
- displayName: Download Package Artifacts
- inputs:
- buildType: specific
- buildVersionToDownload: specific
- project: $(AzDOProjectName)
- pipeline: $(AzDOPipelineId)
- buildId: $(AzDOBuildId)
- artifactName: PackageArtifacts
- checkDownloadedFiles: true
-
- - task: PowerShell@2
- displayName: Validate
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/nuget-validation.ps1
- arguments: -PackagesPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/
- -ToolDestinationPath $(Agent.BuildDirectory)/Extract/
-
- - job:
- displayName: Signing Validation
- condition: and( eq( ${{ parameters.enableSigningValidation }}, 'true'), ne( variables['PostBuildSign'], 'true'))
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: VSEngSS-MicroBuild2022-1ES
- demands: Cmd
- # If it's not devdiv, it's dnceng
- ${{ else }}:
- name: $(DncEngInternalBuildPool)
- demands: ImageOverride -equals windows.vs2019.amd64
- steps:
- - template: setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: DownloadBuildArtifacts@0
- displayName: Download Package Artifacts
- inputs:
- buildType: specific
- buildVersionToDownload: specific
- project: $(AzDOProjectName)
- pipeline: $(AzDOPipelineId)
- buildId: $(AzDOBuildId)
- artifactName: PackageArtifacts
- checkDownloadedFiles: true
- itemPattern: |
- **
- !**/Microsoft.SourceBuild.Intermediate.*.nupkg
-
- # This is necessary whenever we want to publish/restore to an AzDO private feed
- # Since sdk-task.ps1 tries to restore packages we need to do this authentication here
- # otherwise it'll complain about accessing a private feed.
- - task: NuGetAuthenticate@1
- displayName: 'Authenticate to AzDO Feeds'
-
- # Signing validation will optionally work with the buildmanifest file which is downloaded from
- # Azure DevOps above.
- - task: PowerShell@2
- displayName: Validate
- inputs:
- filePath: eng\common\sdk-task.ps1
- arguments: -task SigningValidation -restore -msbuildEngine vs
- /p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts'
- /p:SignCheckExclusionsFile='$(Build.SourcesDirectory)/eng/SignCheckExclusionsFile.txt'
- ${{ parameters.signingValidationAdditionalParameters }}
-
- - template: ../steps/publish-logs.yml
- parameters:
- StageLabel: 'Validation'
- JobLabel: 'Signing'
- BinlogToolVersion: $(BinlogToolVersion)
-
- - job:
- displayName: SourceLink Validation
- condition: eq( ${{ parameters.enableSourceLinkValidation }}, 'true')
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: VSEngSS-MicroBuild2022-1ES
- demands: Cmd
- # If it's not devdiv, it's dnceng
- ${{ else }}:
- name: $(DncEngInternalBuildPool)
- demands: ImageOverride -equals windows.vs2019.amd64
- steps:
- - template: setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: DownloadBuildArtifacts@0
- displayName: Download Blob Artifacts
- inputs:
- buildType: specific
- buildVersionToDownload: specific
- project: $(AzDOProjectName)
- pipeline: $(AzDOPipelineId)
- buildId: $(AzDOBuildId)
- artifactName: BlobArtifacts
- checkDownloadedFiles: true
-
- - task: PowerShell@2
- displayName: Validate
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/sourcelink-validation.ps1
- arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/
- -ExtractPath $(Agent.BuildDirectory)/Extract/
- -GHRepoName $(Build.Repository.Name)
- -GHCommit $(Build.SourceVersion)
- -SourcelinkCliVersion $(SourceLinkCLIVersion)
- continueOnError: true
-
- - template: /eng/common/templates/job/execute-sdl.yml
- parameters:
- enable: ${{ parameters.SDLValidationParameters.enable }}
- publishGuardianDirectoryToPipeline: ${{ parameters.SDLValidationParameters.publishGdn }}
- additionalParameters: ${{ parameters.SDLValidationParameters.params }}
- continueOnError: ${{ parameters.SDLValidationParameters.continueOnError }}
- artifactNames: ${{ parameters.SDLValidationParameters.artifactNames }}
- downloadArtifacts: ${{ parameters.SDLValidationParameters.downloadArtifacts }}
-
-- ${{ if ne(parameters.publishAssetsImmediately, 'true') }}:
- - stage: publish_using_darc
- ${{ if or(eq(parameters.enableNugetValidation, 'true'), eq(parameters.enableSigningValidation, 'true'), eq(parameters.enableSourceLinkValidation, 'true'), eq(parameters.SDLValidationParameters.enable, 'true')) }}:
- dependsOn: ${{ parameters.publishDependsOn }}
- ${{ else }}:
- dependsOn: ${{ parameters.validateDependsOn }}
- displayName: Publish using Darc
- variables:
- - template: common-variables.yml
- - template: /eng/common/templates/variables/pool-providers.yml
- jobs:
- - job:
- displayName: Publish Using Darc
- timeoutInMinutes: 120
- pool:
- # We don't use the collection uri here because it might vary (.visualstudio.com vs. dev.azure.com)
- ${{ if eq(variables['System.TeamProject'], 'DevDiv') }}:
- name: VSEngSS-MicroBuild2022-1ES
- demands: Cmd
- # If it's not devdiv, it's dnceng
- ${{ else }}:
- name: NetCore1ESPool-Publishing-Internal
- demands: ImageOverride -equals windows.vs2019.amd64
- steps:
- - template: setup-maestro-vars.yml
- parameters:
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToChannelIds: ${{ parameters.PromoteToChannelIds }}
-
- - task: NuGetAuthenticate@1
+- template: /eng/common/core-templates/post-build/post-build.yml
+ parameters:
+ # Specifies whether to use 1ES
+ is1ESPipeline: false
- - 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 true
- -ArtifactsPublishingAdditionalParameters '${{ parameters.artifactsPublishingAdditionalParameters }}'
- -SymbolPublishingAdditionalParameters '${{ parameters.symbolPublishingAdditionalParameters }}'
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
\ No newline at end of file
diff --git a/eng/common/templates/post-build/setup-maestro-vars.yml b/eng/common/templates/post-build/setup-maestro-vars.yml
index 0c87f149a4ad..a79fab5b441e 100644
--- a/eng/common/templates/post-build/setup-maestro-vars.yml
+++ b/eng/common/templates/post-build/setup-maestro-vars.yml
@@ -1,70 +1,8 @@
-parameters:
- BARBuildId: ''
- PromoteToChannelIds: ''
-
steps:
- - ${{ if eq(coalesce(parameters.PromoteToChannelIds, 0), 0) }}:
- - task: DownloadBuildArtifacts@0
- displayName: Download Release Configs
- inputs:
- buildType: current
- artifactName: ReleaseConfigs
- checkDownloadedFiles: true
-
- - task: PowerShell@2
- name: setReleaseVars
- displayName: Set Release Configs Vars
- inputs:
- targetType: inline
- pwsh: true
- script: |
- try {
- if (!$Env:PromoteToMaestroChannels -or $Env:PromoteToMaestroChannels.Trim() -eq '') {
- $Content = Get-Content $(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt
-
- $BarId = $Content | Select -Index 0
- $Channels = $Content | Select -Index 1
- $IsStableBuild = $Content | Select -Index 2
-
- $AzureDevOpsProject = $Env:System_TeamProject
- $AzureDevOpsBuildDefinitionId = $Env:System_DefinitionId
- $AzureDevOpsBuildId = $Env:Build_BuildId
- }
- else {
- $buildApiEndpoint = "${Env:MaestroApiEndPoint}/api/builds/${Env:BARBuildId}?api-version=${Env:MaestroApiVersion}"
-
- $apiHeaders = New-Object 'System.Collections.Generic.Dictionary[[String],[String]]'
- $apiHeaders.Add('Accept', 'application/json')
- $apiHeaders.Add('Authorization',"Bearer ${Env:MAESTRO_API_TOKEN}")
-
- $buildInfo = try { Invoke-WebRequest -Method Get -Uri $buildApiEndpoint -Headers $apiHeaders | ConvertFrom-Json } catch { Write-Host "Error: $_" }
-
- $BarId = $Env:BARBuildId
- $Channels = $Env:PromoteToMaestroChannels -split ","
- $Channels = $Channels -join "]["
- $Channels = "[$Channels]"
-
- $IsStableBuild = $buildInfo.stable
- $AzureDevOpsProject = $buildInfo.azureDevOpsProject
- $AzureDevOpsBuildDefinitionId = $buildInfo.azureDevOpsBuildDefinitionId
- $AzureDevOpsBuildId = $buildInfo.azureDevOpsBuildId
- }
-
- Write-Host "##vso[task.setvariable variable=BARBuildId]$BarId"
- Write-Host "##vso[task.setvariable variable=TargetChannels]$Channels"
- Write-Host "##vso[task.setvariable variable=IsStableBuild]$IsStableBuild"
+- template: /eng/common/core-templates/post-build/setup-maestro-vars.yml
+ parameters:
+ # Specifies whether to use 1ES
+ is1ESPipeline: false
- Write-Host "##vso[task.setvariable variable=AzDOProjectName]$AzureDevOpsProject"
- Write-Host "##vso[task.setvariable variable=AzDOPipelineId]$AzureDevOpsBuildDefinitionId"
- Write-Host "##vso[task.setvariable variable=AzDOBuildId]$AzureDevOpsBuildId"
- }
- catch {
- Write-Host $_
- Write-Host $_.Exception
- Write-Host $_.ScriptStackTrace
- exit 1
- }
- env:
- MAESTRO_API_TOKEN: $(MaestroApiAccessToken)
- BARBuildId: ${{ parameters.BARBuildId }}
- PromoteToMaestroChannels: ${{ parameters.PromoteToChannelIds }}
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
\ No newline at end of file
diff --git a/eng/common/templates/steps/add-build-to-channel.yml b/eng/common/templates/steps/add-build-to-channel.yml
index f67a210d62f3..42bbba161b9b 100644
--- a/eng/common/templates/steps/add-build-to-channel.yml
+++ b/eng/common/templates/steps/add-build-to-channel.yml
@@ -1,13 +1,7 @@
-parameters:
- ChannelId: 0
-
steps:
-- task: PowerShell@2
- displayName: Add Build to Channel
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/add-build-to-channel.ps1
- arguments: -BuildId $(BARBuildId)
- -ChannelId ${{ parameters.ChannelId }}
- -MaestroApiAccessToken $(MaestroApiAccessToken)
- -MaestroApiEndPoint $(MaestroApiEndPoint)
- -MaestroApiVersion $(MaestroApiVersion)
+- template: /eng/common/core-templates/steps/add-build-to-channel.yml
+ parameters:
+ is1ESPipeline: false
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/steps/build-reason.yml b/eng/common/templates/steps/build-reason.yml
deleted file mode 100644
index eba58109b52c..000000000000
--- a/eng/common/templates/steps/build-reason.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-# build-reason.yml
-# Description: runs steps if build.reason condition is valid. conditions is a string of valid build reasons
-# to include steps (',' separated).
-parameters:
- conditions: ''
- steps: []
-
-steps:
- - ${{ if and( not(startsWith(parameters.conditions, 'not')), contains(parameters.conditions, variables['build.reason'])) }}:
- - ${{ parameters.steps }}
- - ${{ if and( startsWith(parameters.conditions, 'not'), not(contains(parameters.conditions, variables['build.reason']))) }}:
- - ${{ parameters.steps }}
diff --git a/eng/common/templates/steps/component-governance.yml b/eng/common/templates/steps/component-governance.yml
index 0ecec47b0c91..c12a5f8d21d7 100644
--- a/eng/common/templates/steps/component-governance.yml
+++ b/eng/common/templates/steps/component-governance.yml
@@ -1,13 +1,7 @@
-parameters:
- disableComponentGovernance: false
- componentGovernanceIgnoreDirectories: ''
-
steps:
-- ${{ if eq(parameters.disableComponentGovernance, 'true') }}:
- - script: "echo ##vso[task.setvariable variable=skipComponentGovernanceDetection]true"
- displayName: Set skipComponentGovernanceDetection variable
-- ${{ if ne(parameters.disableComponentGovernance, 'true') }}:
- - task: ComponentGovernanceComponentDetection@0
- continueOnError: true
- inputs:
- ignoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
\ No newline at end of file
+- template: /eng/common/core-templates/steps/component-governance.yml
+ parameters:
+ is1ESPipeline: false
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/steps/execute-codeql.yml b/eng/common/templates/steps/execute-codeql.yml
deleted file mode 100644
index 3930b1630214..000000000000
--- a/eng/common/templates/steps/execute-codeql.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-parameters:
- # Language that should be analyzed. Defaults to csharp
- language: csharp
- # Build Commands
- buildCommands: ''
- overrideParameters: '' # Optional: to override values for parameters.
- additionalParameters: '' # Optional: parameters that need user specific values eg: '-SourceToolsList @("abc","def") -ArtifactToolsList @("ghi","jkl")'
- # Optional: if specified, restore and use this version of Guardian instead of the default.
- overrideGuardianVersion: ''
- # Optional: if true, publish the '.gdn' folder as a pipeline artifact. This can help with in-depth
- # diagnosis of problems with specific tool configurations.
- publishGuardianDirectoryToPipeline: false
- # The script to run to execute all SDL tools. Use this if you want to use a script to define SDL
- # parameters rather than relying on YAML. It may be better to use a local script, because you can
- # reproduce results locally without piecing together a command based on the YAML.
- executeAllSdlToolsScript: 'eng/common/sdl/execute-all-sdl-tools.ps1'
- # There is some sort of bug (has been reported) in Azure DevOps where if this parameter is named
- # 'continueOnError', the parameter value is not correctly picked up.
- # This can also be remedied by the caller (post-build.yml) if it does not use a nested parameter
- # optional: determines whether to continue the build if the step errors;
- sdlContinueOnError: false
-
-steps:
-- template: /eng/common/templates/steps/execute-sdl.yml
- parameters:
- overrideGuardianVersion: ${{ parameters.overrideGuardianVersion }}
- executeAllSdlToolsScript: ${{ parameters.executeAllSdlToolsScript }}
- overrideParameters: ${{ parameters.overrideParameters }}
- additionalParameters: '${{ parameters.additionalParameters }}
- -CodeQLAdditionalRunConfigParams @("BuildCommands < ${{ parameters.buildCommands }}", "Language < ${{ parameters.language }}")'
- publishGuardianDirectoryToPipeline: ${{ parameters.publishGuardianDirectoryToPipeline }}
- sdlContinueOnError: ${{ parameters.sdlContinueOnError }}
\ No newline at end of file
diff --git a/eng/common/templates/steps/execute-sdl.yml b/eng/common/templates/steps/execute-sdl.yml
deleted file mode 100644
index 07426fde05d8..000000000000
--- a/eng/common/templates/steps/execute-sdl.yml
+++ /dev/null
@@ -1,88 +0,0 @@
-parameters:
- overrideGuardianVersion: ''
- executeAllSdlToolsScript: ''
- overrideParameters: ''
- additionalParameters: ''
- publishGuardianDirectoryToPipeline: false
- sdlContinueOnError: false
- condition: ''
-
-steps:
-- task: NuGetAuthenticate@1
- inputs:
- nuGetServiceConnections: GuardianConnect
-
-- task: NuGetToolInstaller@1
- displayName: 'Install NuGet.exe'
-
-- ${{ if ne(parameters.overrideGuardianVersion, '') }}:
- - pwsh: |
- Set-Location -Path $(Build.SourcesDirectory)\eng\common\sdl
- . .\sdl.ps1
- $guardianCliLocation = Install-Gdn -Path $(Build.SourcesDirectory)\.artifacts -Version ${{ parameters.overrideGuardianVersion }}
- Write-Host "##vso[task.setvariable variable=GuardianCliLocation]$guardianCliLocation"
- displayName: Install Guardian (Overridden)
-
-- ${{ if eq(parameters.overrideGuardianVersion, '') }}:
- - pwsh: |
- Set-Location -Path $(Build.SourcesDirectory)\eng\common\sdl
- . .\sdl.ps1
- $guardianCliLocation = Install-Gdn -Path $(Build.SourcesDirectory)\.artifacts
- Write-Host "##vso[task.setvariable variable=GuardianCliLocation]$guardianCliLocation"
- displayName: Install Guardian
-
-- ${{ if ne(parameters.overrideParameters, '') }}:
- - powershell: ${{ parameters.executeAllSdlToolsScript }} ${{ parameters.overrideParameters }}
- displayName: Execute SDL (Overridden)
- continueOnError: ${{ parameters.sdlContinueOnError }}
- condition: ${{ parameters.condition }}
-
-- ${{ if eq(parameters.overrideParameters, '') }}:
- - powershell: ${{ parameters.executeAllSdlToolsScript }}
- -GuardianCliLocation $(GuardianCliLocation)
- -NugetPackageDirectory $(Build.SourcesDirectory)\.packages
- -AzureDevOpsAccessToken $(dn-bot-dotnet-build-rw-code-rw)
- ${{ parameters.additionalParameters }}
- displayName: Execute SDL
- continueOnError: ${{ parameters.sdlContinueOnError }}
- condition: ${{ parameters.condition }}
-
-- ${{ if ne(parameters.publishGuardianDirectoryToPipeline, 'false') }}:
- # We want to publish the Guardian results and configuration for easy diagnosis. However, the
- # '.gdn' dir is a mix of configuration, results, extracted dependencies, and Guardian default
- # tooling files. Some of these files are large and aren't useful during an investigation, so
- # exclude them by simply deleting them before publishing. (As of writing, there is no documented
- # way to selectively exclude a dir from the pipeline artifact publish task.)
- - task: DeleteFiles@1
- displayName: Delete Guardian dependencies to avoid uploading
- inputs:
- SourceFolder: $(Agent.BuildDirectory)/.gdn
- Contents: |
- c
- i
- condition: succeededOrFailed()
-
- - publish: $(Agent.BuildDirectory)/.gdn
- artifact: GuardianConfiguration
- displayName: Publish GuardianConfiguration
- condition: succeededOrFailed()
-
- # Publish the SARIF files in a container named CodeAnalysisLogs to enable integration
- # with the "SARIF SAST Scans Tab" Azure DevOps extension
- - task: CopyFiles@2
- displayName: Copy SARIF files
- inputs:
- flattenFolders: true
- sourceFolder: $(Agent.BuildDirectory)/.gdn/rc/
- contents: '**/*.sarif'
- targetFolder: $(Build.SourcesDirectory)/CodeAnalysisLogs
- condition: succeededOrFailed()
-
- # Use PublishBuildArtifacts because the SARIF extension only checks this case
- # see microsoft/sarif-azuredevops-extension#4
- - task: PublishBuildArtifacts@1
- displayName: Publish SARIF files to CodeAnalysisLogs container
- inputs:
- pathToPublish: $(Build.SourcesDirectory)/CodeAnalysisLogs
- artifactName: CodeAnalysisLogs
- condition: succeededOrFailed()
\ No newline at end of file
diff --git a/eng/common/templates/steps/generate-sbom.yml b/eng/common/templates/steps/generate-sbom.yml
index a06373f38fa5..26dc00a2e0f3 100644
--- a/eng/common/templates/steps/generate-sbom.yml
+++ b/eng/common/templates/steps/generate-sbom.yml
@@ -1,48 +1,7 @@
-# BuildDropPath - The root folder of the drop directory for which the manifest file will be generated.
-# PackageName - The name of the package this SBOM represents.
-# PackageVersion - The version of the package this SBOM represents.
-# ManifestDirPath - The path of the directory where the generated manifest files will be placed
-# IgnoreDirectories - Directories to ignore for SBOM generation. This will be passed through to the CG component detector.
-
-parameters:
- PackageVersion: 7.0.0
- BuildDropPath: '$(Build.SourcesDirectory)/artifacts'
- PackageName: '.NET'
- ManifestDirPath: $(Build.ArtifactStagingDirectory)/sbom
- IgnoreDirectories: ''
- sbomContinueOnError: true
-
steps:
-- task: PowerShell@2
- displayName: Prep for SBOM generation in (Non-linux)
- condition: or(eq(variables['Agent.Os'], 'Windows_NT'), eq(variables['Agent.Os'], 'Darwin'))
- inputs:
- filePath: ./eng/common/generate-sbom-prep.ps1
- arguments: ${{parameters.manifestDirPath}}
-
-# Chmodding is a workaround for https://github.com/dotnet/arcade/issues/8461
-- script: |
- chmod +x ./eng/common/generate-sbom-prep.sh
- ./eng/common/generate-sbom-prep.sh ${{parameters.manifestDirPath}}
- displayName: Prep for SBOM generation in (Linux)
- condition: eq(variables['Agent.Os'], 'Linux')
- continueOnError: ${{ parameters.sbomContinueOnError }}
-
-- task: AzureArtifacts.manifest-generator-task.manifest-generator-task.ManifestGeneratorTask@0
- displayName: 'Generate SBOM manifest'
- continueOnError: ${{ parameters.sbomContinueOnError }}
- inputs:
- PackageName: ${{ parameters.packageName }}
- BuildDropPath: ${{ parameters.buildDropPath }}
- PackageVersion: ${{ parameters.packageVersion }}
- ManifestDirPath: ${{ parameters.manifestDirPath }}
- ${{ if ne(parameters.IgnoreDirectories, '') }}:
- AdditionalComponentDetectorArgs: '--IgnoreDirectories ${{ parameters.IgnoreDirectories }}'
-
-- task: PublishPipelineArtifact@1
- displayName: Publish SBOM manifest
- continueOnError: ${{parameters.sbomContinueOnError}}
- inputs:
- targetPath: '${{parameters.manifestDirPath}}'
- artifactName: $(ARTIFACT_NAME)
+- template: /eng/common/core-templates/steps/generate-sbom.yml
+ parameters:
+ is1ESPipeline: false
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/steps/publish-build-artifacts.yml b/eng/common/templates/steps/publish-build-artifacts.yml
new file mode 100644
index 000000000000..6428a98dfef6
--- /dev/null
+++ b/eng/common/templates/steps/publish-build-artifacts.yml
@@ -0,0 +1,40 @@
+parameters:
+- name: is1ESPipeline
+ type: boolean
+ default: false
+
+- name: displayName
+ type: string
+ default: 'Publish to Build Artifact'
+
+- name: condition
+ type: string
+ default: succeeded()
+
+- name: artifactName
+ type: string
+
+- name: pathToPublish
+ type: string
+
+- name: continueOnError
+ type: boolean
+ default: false
+
+- name: publishLocation
+ type: string
+ default: 'Container'
+
+steps:
+- ${{ if eq(parameters.is1ESPipeline, true) }}:
+ - 'eng/common/templates cannot be referenced from a 1ES managed template': error
+- task: PublishBuildArtifacts@1
+ displayName: ${{ parameters.displayName }}
+ condition: ${{ parameters.condition }}
+ ${{ if parameters.continueOnError }}:
+ continueOnError: ${{ parameters.continueOnError }}
+ inputs:
+ PublishLocation: ${{ parameters.publishLocation }}
+ PathtoPublish: ${{ parameters.pathToPublish }}
+ ${{ if parameters.artifactName }}:
+ ArtifactName: ${{ parameters.artifactName }}
\ No newline at end of file
diff --git a/eng/common/templates/steps/publish-logs.yml b/eng/common/templates/steps/publish-logs.yml
index 80861297ddc0..4ea86bd88235 100644
--- a/eng/common/templates/steps/publish-logs.yml
+++ b/eng/common/templates/steps/publish-logs.yml
@@ -1,49 +1,7 @@
-parameters:
- StageLabel: ''
- JobLabel: ''
- CustomSensitiveDataList: ''
- # A default - in case value from eng/common/templates/post-build/common-variables.yml is not passed
- BinlogToolVersion: '1.0.11'
-
steps:
-- task: Powershell@2
- displayName: Prepare Binlogs to Upload
- inputs:
- targetType: inline
- script: |
- New-Item -ItemType Directory $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/
- Move-Item -Path $(Build.SourcesDirectory)/artifacts/log/Debug/* $(Build.SourcesDirectory)/PostBuildLogs/${{parameters.StageLabel}}/${{parameters.JobLabel}}/
- continueOnError: true
- condition: always()
-
-- task: PowerShell@2
- displayName: Redact Logs
- inputs:
- filePath: $(Build.SourcesDirectory)/eng/common/post-build/redact-logs.ps1
- # For now this needs to have explicit list of all sensitive data. Taken from eng/publishing/v3/publish.yml
- # Sensitive data can as well be added to $(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt'
- # If the file exists - sensitive data for redaction will be sourced from it
- # (single entry per line, lines starting with '# ' are considered comments and skipped)
- arguments: -InputPath '$(Build.SourcesDirectory)/PostBuildLogs'
- -BinlogToolVersion ${{parameters.BinlogToolVersion}}
- -TokensFilePath '$(Build.SourcesDirectory)/eng/BinlogSecretsRedactionFile.txt'
- '$(publishing-dnceng-devdiv-code-r-build-re)'
- '$(MaestroAccessToken)'
- '$(dn-bot-all-orgs-artifact-feeds-rw)'
- '$(akams-client-id)'
- '$(akams-client-secret)'
- '$(microsoft-symbol-server-pat)'
- '$(symweb-symbol-server-pat)'
- '$(dn-bot-all-orgs-build-rw-code-rw)'
- ${{parameters.CustomSensitiveDataList}}
- continueOnError: true
- condition: always()
-
-- task: PublishBuildArtifacts@1
- displayName: Publish Logs
- inputs:
- PathtoPublish: '$(Build.SourcesDirectory)/PostBuildLogs'
- PublishLocation: Container
- ArtifactName: PostBuildLogs
- continueOnError: true
- condition: always()
+- template: /eng/common/core-templates/steps/publish-logs.yml
+ parameters:
+ is1ESPipeline: false
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/steps/publish-pipeline-artifacts.yml b/eng/common/templates/steps/publish-pipeline-artifacts.yml
new file mode 100644
index 000000000000..5dd698b212fc
--- /dev/null
+++ b/eng/common/templates/steps/publish-pipeline-artifacts.yml
@@ -0,0 +1,34 @@
+parameters:
+- name: is1ESPipeline
+ type: boolean
+ default: false
+
+- name: args
+ type: object
+ default: {}
+
+steps:
+- ${{ if eq(parameters.is1ESPipeline, true) }}:
+ - 'eng/common/templates cannot be referenced from a 1ES managed template': error
+- task: PublishPipelineArtifact@1
+ displayName: ${{ coalesce(parameters.args.displayName, 'Publish to Build Artifact') }}
+ ${{ if parameters.args.condition }}:
+ condition: ${{ parameters.args.condition }}
+ ${{ else }}:
+ condition: succeeded()
+ ${{ if parameters.args.continueOnError }}:
+ continueOnError: ${{ parameters.args.continueOnError }}
+ inputs:
+ targetPath: ${{ parameters.args.targetPath }}
+ ${{ if parameters.args.artifactName }}:
+ artifactName: ${{ parameters.args.artifactName }}
+ ${{ if parameters.args.publishLocation }}:
+ publishLocation: ${{ parameters.args.publishLocation }}
+ ${{ if parameters.args.fileSharePath }}:
+ fileSharePath: ${{ parameters.args.fileSharePath }}
+ ${{ if parameters.args.Parallel }}:
+ parallel: ${{ parameters.args.Parallel }}
+ ${{ if parameters.args.parallelCount }}:
+ parallelCount: ${{ parameters.args.parallelCount }}
+ ${{ if parameters.args.properties }}:
+ properties: ${{ parameters.args.properties }}
\ No newline at end of file
diff --git a/eng/common/templates/steps/retain-build.yml b/eng/common/templates/steps/retain-build.yml
index 83d97a26a01f..8e841ace3d29 100644
--- a/eng/common/templates/steps/retain-build.yml
+++ b/eng/common/templates/steps/retain-build.yml
@@ -1,28 +1,7 @@
-parameters:
- # Optional azure devops PAT with build execute permissions for the build's organization,
- # only needed if the build that should be retained ran on a different organization than
- # the pipeline where this template is executing from
- Token: ''
- # Optional BuildId to retain, defaults to the current running build
- BuildId: ''
- # Azure devops Organization URI for the build in the https://dev.azure.com/ format.
- # Defaults to the organization the current pipeline is running on
- AzdoOrgUri: '$(System.CollectionUri)'
- # Azure devops project for the build. Defaults to the project the current pipeline is running on
- AzdoProject: '$(System.TeamProject)'
-
steps:
- - task: powershell@2
- inputs:
- targetType: 'filePath'
- filePath: eng/common/retain-build.ps1
- pwsh: true
- arguments: >
- -AzdoOrgUri: ${{parameters.AzdoOrgUri}}
- -AzdoProject ${{parameters.AzdoProject}}
- -Token ${{coalesce(parameters.Token, '$env:SYSTEM_ACCESSTOKEN') }}
- -BuildId ${{coalesce(parameters.BuildId, '$env:BUILD_ID')}}
- displayName: Enable permanent build retention
- env:
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- BUILD_ID: $(Build.BuildId)
\ No newline at end of file
+- template: /eng/common/core-templates/steps/retain-build.yml
+ parameters:
+ is1ESPipeline: false
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/steps/run-on-unix.yml b/eng/common/templates/steps/run-on-unix.yml
deleted file mode 100644
index e1733814f65d..000000000000
--- a/eng/common/templates/steps/run-on-unix.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-parameters:
- agentOs: ''
- steps: []
-
-steps:
-- ${{ if ne(parameters.agentOs, 'Windows_NT') }}:
- - ${{ parameters.steps }}
diff --git a/eng/common/templates/steps/run-on-windows.yml b/eng/common/templates/steps/run-on-windows.yml
deleted file mode 100644
index 73e7e9c275a1..000000000000
--- a/eng/common/templates/steps/run-on-windows.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-parameters:
- agentOs: ''
- steps: []
-
-steps:
-- ${{ if eq(parameters.agentOs, 'Windows_NT') }}:
- - ${{ parameters.steps }}
diff --git a/eng/common/templates/steps/run-script-ifequalelse.yml b/eng/common/templates/steps/run-script-ifequalelse.yml
deleted file mode 100644
index 3d1242f5587c..000000000000
--- a/eng/common/templates/steps/run-script-ifequalelse.yml
+++ /dev/null
@@ -1,33 +0,0 @@
-parameters:
- # if parameter1 equals parameter 2, run 'ifScript' command, else run 'elsescript' command
- parameter1: ''
- parameter2: ''
- ifScript: ''
- elseScript: ''
-
- # name of script step
- name: Script
-
- # display name of script step
- displayName: If-Equal-Else Script
-
- # environment
- env: {}
-
- # conditional expression for step execution
- condition: ''
-
-steps:
-- ${{ if and(ne(parameters.ifScript, ''), eq(parameters.parameter1, parameters.parameter2)) }}:
- - script: ${{ parameters.ifScript }}
- name: ${{ parameters.name }}
- displayName: ${{ parameters.displayName }}
- env: ${{ parameters.env }}
- condition: ${{ parameters.condition }}
-
-- ${{ if and(ne(parameters.elseScript, ''), ne(parameters.parameter1, parameters.parameter2)) }}:
- - script: ${{ parameters.elseScript }}
- name: ${{ parameters.name }}
- displayName: ${{ parameters.displayName }}
- env: ${{ parameters.env }}
- condition: ${{ parameters.condition }}
\ No newline at end of file
diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml
index 68fa739c4ab2..39f99fc2762d 100644
--- a/eng/common/templates/steps/send-to-helix.yml
+++ b/eng/common/templates/steps/send-to-helix.yml
@@ -1,93 +1,7 @@
-# Please remember to update the documentation if you make changes to these parameters!
-parameters:
- 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
- HelixTargetQueues: '' # required -- semicolon-delimited list of Helix queues to test on; see https://helix.dot.net/ for a list of queues
- HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group
- HelixProjectPath: 'eng/common/helixpublish.proj' # optional -- path to the project file to build relative to BUILD_SOURCESDIRECTORY
- HelixProjectArguments: '' # optional -- arguments passed to the build command
- HelixConfiguration: '' # optional -- additional property attached to a job
- HelixPreCommands: '' # optional -- commands to run before Helix work item execution
- HelixPostCommands: '' # optional -- commands to run after Helix work item execution
- WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects
- WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects
- WorkItemTimeout: '' # optional -- a timeout in TimeSpan.Parse-ready value (e.g. 00:02:00) for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects
- CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload
- XUnitProjects: '' # optional -- semicolon-delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true
- XUnitWorkItemTimeout: '' # optional -- the workitem timeout in seconds for all workitems created from the xUnit projects specified by XUnitProjects
- XUnitPublishTargetFramework: '' # optional -- framework to use to publish your xUnit projects
- 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', 'runtime' or 'aspnetcore-runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json
- DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json
- 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."
- IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set
- HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting https://helix.int-dot.net )
- Creator: '' # optional -- if the build is external, use this to specify who is sending the job
- DisplayNamePrefix: 'Run Tests' # 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
-
steps:
- - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"'
- displayName: ${{ parameters.DisplayNamePrefix }} (Windows)
- env:
- BuildConfig: $(_BuildConfig)
- HelixSource: ${{ parameters.HelixSource }}
- HelixType: ${{ parameters.HelixType }}
- HelixBuild: ${{ parameters.HelixBuild }}
- HelixConfiguration: ${{ parameters.HelixConfiguration }}
- HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
- HelixAccessToken: ${{ parameters.HelixAccessToken }}
- HelixPreCommands: ${{ parameters.HelixPreCommands }}
- HelixPostCommands: ${{ parameters.HelixPostCommands }}
- WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
- WorkItemCommand: ${{ parameters.WorkItemCommand }}
- WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
- CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
- XUnitProjects: ${{ parameters.XUnitProjects }}
- XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
- XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
- XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
- XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
- IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
- DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
- DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
- WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
- HelixBaseUri: ${{ parameters.HelixBaseUri }}
- Creator: ${{ parameters.Creator }}
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT'))
- continueOnError: ${{ parameters.continueOnError }}
- - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/${{ parameters.HelixProjectPath }} /restore /p:TreatWarningsAsErrors=false ${{ parameters.HelixProjectArguments }} /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog
- displayName: ${{ parameters.DisplayNamePrefix }} (Unix)
- env:
- BuildConfig: $(_BuildConfig)
- HelixSource: ${{ parameters.HelixSource }}
- HelixType: ${{ parameters.HelixType }}
- HelixBuild: ${{ parameters.HelixBuild }}
- HelixConfiguration: ${{ parameters.HelixConfiguration }}
- HelixTargetQueues: ${{ parameters.HelixTargetQueues }}
- HelixAccessToken: ${{ parameters.HelixAccessToken }}
- HelixPreCommands: ${{ parameters.HelixPreCommands }}
- HelixPostCommands: ${{ parameters.HelixPostCommands }}
- WorkItemDirectory: ${{ parameters.WorkItemDirectory }}
- WorkItemCommand: ${{ parameters.WorkItemCommand }}
- WorkItemTimeout: ${{ parameters.WorkItemTimeout }}
- CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }}
- XUnitProjects: ${{ parameters.XUnitProjects }}
- XUnitWorkItemTimeout: ${{ parameters.XUnitWorkItemTimeout }}
- XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }}
- XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }}
- XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }}
- IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }}
- DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }}
- DotNetCliVersion: ${{ parameters.DotNetCliVersion }}
- WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }}
- HelixBaseUri: ${{ parameters.HelixBaseUri }}
- Creator: ${{ parameters.Creator }}
- SYSTEM_ACCESSTOKEN: $(System.AccessToken)
- condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT'))
- continueOnError: ${{ parameters.continueOnError }}
+- template: /eng/common/core-templates/steps/send-to-helix.yml
+ parameters:
+ is1ESPipeline: false
+
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/steps/source-build.yml b/eng/common/templates/steps/source-build.yml
index 32738aa93801..23c1d6f4e9f8 100644
--- a/eng/common/templates/steps/source-build.yml
+++ b/eng/common/templates/steps/source-build.yml
@@ -1,131 +1,7 @@
-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
-
- # If building on the internal project, the artifact feeds variable may be available (usually only if needed)
- # In that case, call the feed setup script to add internal feeds corresponding to public ones.
- # In addition, add an msbuild argument to copy the WIP from the repo to the target build location.
- # This is because SetupNuGetSources.sh will alter the current NuGet.config file, and we need to preserve those
- # changes.
- internalRestoreArgs=
- if [ '$(dn-bot-dnceng-artifact-feeds-rw)' != '$''(dn-bot-dnceng-artifact-feeds-rw)' ]; then
- # Temporarily work around https://github.com/dotnet/arcade/issues/7709
- chmod +x $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh
- $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh $(Build.SourcesDirectory)/NuGet.config $(dn-bot-dnceng-artifact-feeds-rw)
- internalRestoreArgs='/p:CopyWipIntoInnerSourceBuildRepo=true'
-
- # The 'Copy WIP' feature of source build uses git stash to apply changes from the original repo.
- # This only works if there is a username/email configured, which won't be the case in most CI runs.
- git config --get user.email
- if [ $? -ne 0 ]; then
- git config user.email dn-bot@microsoft.com
- git config user.name dn-bot
- fi
- fi
-
- # If building on the internal project, the internal storage variable may be available (usually only if needed)
- # In that case, add variables to allow the download of internal runtimes if the specified versions are not found
- # in the default public locations.
- internalRuntimeDownloadArgs=
- if [ '$(dotnetbuilds-internal-container-read-token-base64)' != '$''(dotnetbuilds-internal-container-read-token-base64)' ]; then
- internalRuntimeDownloadArgs='/p:DotNetRuntimeSourceFeed=https://dotnetbuilds.blob.core.windows.net/internal /p:DotNetRuntimeSourceFeedKey=$(dotnetbuilds-internal-container-read-token-base64) --runtimesourcefeed https://dotnetbuilds.blob.core.windows.net/internal --runtimesourcefeedkey $(dotnetbuilds-internal-container-read-token-base64)'
- fi
-
- 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
-
- runtimeOsArgs=
- if [ '${{ parameters.platform.runtimeOS }}' != '' ]; then
- runtimeOsArgs='/p:RuntimeOS=${{ parameters.platform.runtimeOS }}'
- fi
-
- baseOsArgs=
- if [ '${{ parameters.platform.baseOS }}' != '' ]; then
- baseOsArgs='/p:BaseOS=${{ parameters.platform.baseOS }}'
- fi
-
- publishArgs=
- if [ '${{ parameters.platform.skipPublishValidation }}' != 'true' ]; then
- publishArgs='--publish'
- fi
-
- assetManifestFileName=SourceBuild_RidSpecific.xml
- if [ '${{ parameters.platform.name }}' != '' ]; then
- assetManifestFileName=SourceBuild_${{ parameters.platform.name }}.xml
- fi
-
- ${{ coalesce(parameters.platform.buildScript, './build.sh') }} --ci \
- --configuration $buildConfig \
- --restore --build --pack $publishArgs -bl \
- $officialBuildArgs \
- $internalRuntimeDownloadArgs \
- $internalRestoreArgs \
- $targetRidArgs \
- $runtimeOsArgs \
- $baseOsArgs \
- /p:SourceBuildNonPortable=${{ parameters.platform.nonPortable }} \
- /p:ArcadeBuildFromSource=true \
- /p:DotNetBuildSourceOnly=true \
- /p:DotNetBuildRepo=true \
- /p:AssetManifestFileName=$assetManifestFileName
- displayName: Build
-
-# Upload build logs for diagnosis.
-- task: CopyFiles@2
- displayName: Prepare BuildLogs staging directory
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)'
- Contents: |
- **/*.log
- **/*.binlog
- artifacts/sb/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()
+- template: /eng/common/core-templates/steps/source-build.yml
+ parameters:
+ is1ESPipeline: false
-# Manually inject component detection so that we can ignore the source build upstream cache, which contains
-# a nupkg cache of input packages (a local feed).
-# This path must match the upstream cache path in property 'CurrentRepoSourceBuiltNupkgCacheDir'
-# in src\Microsoft.DotNet.Arcade.Sdk\tools\SourceBuild\SourceBuildArcade.targets
-- task: ComponentGovernanceComponentDetection@0
- displayName: Component Detection (Exclude upstream cache)
- inputs:
- ignoreDirectories: '$(Build.SourcesDirectory)/artifacts/sb/src/artifacts/obj/source-built-upstream-cache'
+ ${{ each parameter in parameters }}:
+ ${{ parameter.key }}: ${{ parameter.value }}
diff --git a/eng/common/templates/steps/telemetry-end.yml b/eng/common/templates/steps/telemetry-end.yml
deleted file mode 100644
index fadc04ca1b9a..000000000000
--- a/eng/common/templates/steps/telemetry-end.yml
+++ /dev/null
@@ -1,102 +0,0 @@
-parameters:
- maxRetries: 5
- retryDelay: 10 # in seconds
-
-steps:
-- bash: |
- if [ "$AGENT_JOBSTATUS" = "Succeeded" ] || [ "$AGENT_JOBSTATUS" = "PartiallySucceeded" ]; then
- errorCount=0
- else
- errorCount=1
- fi
- warningCount=0
-
- curlStatus=1
- retryCount=0
- # retry loop to harden against spotty telemetry connections
- # we don't retry successes and 4xx client errors
- until [[ $curlStatus -eq 0 || ( $curlStatus -ge 400 && $curlStatus -le 499 ) || $retryCount -ge $MaxRetries ]]
- do
- if [ $retryCount -gt 0 ]; then
- echo "Failed to send telemetry to Helix; waiting $RetryDelay seconds before retrying..."
- sleep $RetryDelay
- fi
-
- # create a temporary file for curl output
- res=`mktemp`
-
- curlResult=`
- curl --verbose --output $res --write-out "%{http_code}"\
- -H 'Content-Type: application/json' \
- -H "X-Helix-Job-Token: $Helix_JobToken" \
- -H 'Content-Length: 0' \
- -X POST -G "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$Helix_WorkItemId/finish" \
- --data-urlencode "errorCount=$errorCount" \
- --data-urlencode "warningCount=$warningCount"`
- curlStatus=$?
-
- if [ $curlStatus -eq 0 ]; then
- if [ $curlResult -gt 299 ] || [ $curlResult -lt 200 ]; then
- curlStatus=$curlResult
- fi
- fi
-
- let retryCount++
- done
-
- if [ $curlStatus -ne 0 ]; then
- echo "Failed to Send Build Finish information after $retryCount retries"
- vstsLogOutput="vso[task.logissue type=error;sourcepath=templates/steps/telemetry-end.yml;code=1;]Failed to Send Build Finish information: $curlStatus"
- echo "##$vstsLogOutput"
- exit 1
- fi
- displayName: Send Unix Build End Telemetry
- env:
- # defined via VSTS variables in start-job.sh
- Helix_JobToken: $(Helix_JobToken)
- Helix_WorkItemId: $(Helix_WorkItemId)
- MaxRetries: ${{ parameters.maxRetries }}
- RetryDelay: ${{ parameters.retryDelay }}
- condition: and(always(), ne(variables['Agent.Os'], 'Windows_NT'))
-- powershell: |
- if (($env:Agent_JobStatus -eq 'Succeeded') -or ($env:Agent_JobStatus -eq 'PartiallySucceeded')) {
- $ErrorCount = 0
- } else {
- $ErrorCount = 1
- }
- $WarningCount = 0
-
- # Basic retry loop to harden against server flakiness
- $retryCount = 0
- while ($retryCount -lt $env:MaxRetries) {
- try {
- Invoke-RestMethod -Uri "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$env:Helix_WorkItemId/finish?errorCount=$ErrorCount&warningCount=$WarningCount" -Method Post -ContentType "application/json" -Body "" `
- -Headers @{ 'X-Helix-Job-Token'=$env:Helix_JobToken }
- break
- }
- catch {
- $statusCode = $_.Exception.Response.StatusCode.value__
- if ($statusCode -ge 400 -and $statusCode -le 499) {
- Write-Host "##vso[task.logissue]error Failed to send telemetry to Helix (status code $statusCode); not retrying (4xx client error)"
- Write-Host "##vso[task.logissue]error ", $_.Exception.GetType().FullName, $_.Exception.Message
- exit 1
- }
- Write-Host "Failed to send telemetry to Helix (status code $statusCode); waiting $env:RetryDelay seconds before retrying..."
- $retryCount++
- sleep $env:RetryDelay
- continue
- }
- }
-
- if ($retryCount -ge $env:MaxRetries) {
- Write-Host "##vso[task.logissue]error Failed to send telemetry to Helix after $retryCount retries."
- exit 1
- }
- displayName: Send Windows Build End Telemetry
- env:
- # defined via VSTS variables in start-job.ps1
- Helix_JobToken: $(Helix_JobToken)
- Helix_WorkItemId: $(Helix_WorkItemId)
- MaxRetries: ${{ parameters.maxRetries }}
- RetryDelay: ${{ parameters.retryDelay }}
- condition: and(always(),eq(variables['Agent.Os'], 'Windows_NT'))
diff --git a/eng/common/templates/steps/telemetry-start.yml b/eng/common/templates/steps/telemetry-start.yml
deleted file mode 100644
index 32c01ef0b553..000000000000
--- a/eng/common/templates/steps/telemetry-start.yml
+++ /dev/null
@@ -1,241 +0,0 @@
-parameters:
- helixSource: 'undefined_defaulted_in_telemetry.yml'
- helixType: 'undefined_defaulted_in_telemetry.yml'
- buildConfig: ''
- runAsPublic: false
- maxRetries: 5
- retryDelay: 10 # in seconds
-
-steps:
-- ${{ if and(eq(parameters.runAsPublic, 'false'), not(eq(variables['System.TeamProject'], 'public'))) }}:
- - task: AzureKeyVault@1
- inputs:
- azureSubscription: 'HelixProd_KeyVault'
- KeyVaultName: HelixProdKV
- SecretsFilter: 'HelixApiAccessToken'
- condition: always()
-- bash: |
- # create a temporary file
- jobInfo=`mktemp`
-
- # write job info content to temporary file
- cat > $jobInfo <
false
-
- true
+
+ true
$(IntermediateOutputPath)ILLink.Resources.Substitutions.xml
true
diff --git a/eng/liveBuilds.targets b/eng/liveBuilds.targets
index c4c03648e2e3..d739736338e4 100644
--- a/eng/liveBuilds.targets
+++ b/eng/liveBuilds.targets
@@ -216,6 +216,7 @@
$(LibrariesNativeArtifactsPath)dotnet.js;
$(LibrariesNativeArtifactsPath)dotnet.js.map;
$(LibrariesNativeArtifactsPath)dotnet.native.js;
+ $(LibrariesNativeArtifactsPath)dotnet.globalization.js;
$(LibrariesNativeArtifactsPath)dotnet.runtime.js;
$(LibrariesNativeArtifactsPath)dotnet.runtime.js.map;
$(LibrariesNativeArtifactsPath)dotnet.d.ts;
diff --git a/eng/liveILLink.targets b/eng/liveILLink.targets
index f18b89622982..6b45e00a49d5 100644
--- a/eng/liveILLink.targets
+++ b/eng/liveILLink.targets
@@ -30,11 +30,13 @@
+
+ SetConfiguration="Configuration=$(ToolsConfiguration)"
+ GlobalPropertiesToRemove="TargetArchitecture;TargetOS" >
TargetFramework=$(NetCoreAppToolCurrent)
TargetFramework=$(NetFrameworkToolCurrent)
diff --git a/eng/native/build-commons.sh b/eng/native/build-commons.sh
index 0916abb396fa..2cf33442a932 100755
--- a/eng/native/build-commons.sh
+++ b/eng/native/build-commons.sh
@@ -109,7 +109,7 @@ build_native()
# set default iOS simulator deployment target
# keep in sync with SetOSTargetMinVersions in the root Directory.Build.props
- cmakeArgs="-DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 $cmakeArgs"
+ cmakeArgs="-DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=12.2 $cmakeArgs"
if [[ "$__TargetArch" == x64 ]]; then
cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"x86_64\" $cmakeArgs"
elif [[ "$__TargetArch" == arm64 ]]; then
@@ -123,7 +123,7 @@ build_native()
# set default iOS device deployment target
# keep in sync with SetOSTargetMinVersions in the root Directory.Build.props
- cmakeArgs="-DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 $cmakeArgs"
+ cmakeArgs="-DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_DEPLOYMENT_TARGET=12.2 $cmakeArgs"
if [[ "$__TargetArch" == arm64 ]]; then
cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"arm64\" $cmakeArgs"
else
@@ -135,7 +135,7 @@ build_native()
# set default tvOS simulator deployment target
# keep in sync with SetOSTargetMinVersions in the root Directory.Build.props
- cmakeArgs="-DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvsimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 $cmakeArgs"
+ cmakeArgs="-DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvsimulator -DCMAKE_OSX_DEPLOYMENT_TARGET=12.2 $cmakeArgs"
if [[ "$__TargetArch" == x64 ]]; then
cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"x86_64\" $cmakeArgs"
elif [[ "$__TargetArch" == arm64 ]]; then
@@ -149,7 +149,7 @@ build_native()
# set default tvOS device deployment target
# keep in sync with SetOSTargetMinVersions in the root Directory.Build.props
- cmakeArgs="-DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 $cmakeArgs"
+ cmakeArgs="-DCMAKE_SYSTEM_NAME=tvOS -DCMAKE_OSX_SYSROOT=appletvos -DCMAKE_OSX_DEPLOYMENT_TARGET=12.2 $cmakeArgs"
if [[ "$__TargetArch" == arm64 ]]; then
cmakeArgs="-DCMAKE_OSX_ARCHITECTURES=\"arm64\" $cmakeArgs"
else
diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake
index 18dc063e51e0..04436c0dd4b6 100644
--- a/eng/native/configurecompiler.cmake
+++ b/eng/native/configurecompiler.cmake
@@ -14,6 +14,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
+include(CheckLinkerFlag)
# "configureoptimization.cmake" must be included after CLR_CMAKE_HOST_UNIX has been set.
include(${CMAKE_CURRENT_LIST_DIR}/configureoptimization.cmake)
@@ -210,8 +211,8 @@ if (CLR_CMAKE_ENABLE_SANITIZERS)
# Disable the use-after-return check for ASAN on Clang. This is because we have a lot of code that
# depends on the fact that our locals are not saved in a parallel stack, so we can't enable this today.
# If we ever have a way to detect a parallel stack and track its bounds, we can re-enable this check.
- add_compile_options($<$:-fsanitize-address-use-after-return=never>)
- add_compile_options($<$:-fsanitize-address-use-after-return=never>)
+ add_compile_options($<$:-fsanitize-address-use-after-return=never>)
+ add_compile_options($<$:-fsanitize-address-use-after-return=never>)
endif()
endif()
@@ -300,7 +301,13 @@ elseif(CLR_CMAKE_HOST_SUNOS)
add_definitions(-D__EXTENSIONS__ -D_XPG4_2 -D_POSIX_PTHREAD_SEMANTICS)
elseif(CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_MACCATALYST AND NOT CLR_CMAKE_HOST_IOS AND NOT CLR_CMAKE_HOST_TVOS)
add_definitions(-D_XOPEN_SOURCE)
- add_linker_flag("-Wl,-bind_at_load")
+
+ # the new linker in Xcode 15 (ld_new/ld_prime) deprecated the -bind_at_load flag for macOS which causes a warning
+ # that fails the build since we build with -Werror. Only pass the flag if we need it, i.e. older linkers.
+ check_linker_flag(C "-Wl,-bind_at_load,-fatal_warnings" LINKER_SUPPORTS_BIND_AT_LOAD_FLAG)
+ if(LINKER_SUPPORTS_BIND_AT_LOAD_FLAG)
+ add_linker_flag("-Wl,-bind_at_load")
+ endif()
elseif(CLR_CMAKE_HOST_HAIKU)
add_compile_options($<$:-Wa,--noexecstack>)
add_linker_flag("-Wl,--no-undefined")
@@ -667,11 +674,11 @@ if (CLR_CMAKE_HOST_UNIX)
set(DISABLE_OVERRIDING_MIN_VERSION_ERROR -Wno-overriding-t-option)
add_link_options(-Wno-overriding-t-option)
if(CLR_CMAKE_HOST_ARCH_ARM64)
- set(MACOS_VERSION_MIN_FLAGS "-target arm64-apple-ios14.2-macabi")
- add_link_options(-target arm64-apple-ios14.2-macabi)
+ set(MACOS_VERSION_MIN_FLAGS "-target arm64-apple-ios15.0-macabi")
+ add_link_options(-target arm64-apple-ios15.0-macabi)
elseif(CLR_CMAKE_HOST_ARCH_AMD64)
- set(MACOS_VERSION_MIN_FLAGS "-target x86_64-apple-ios13.5-macabi")
- add_link_options(-target x86_64-apple-ios13.5-macabi)
+ set(MACOS_VERSION_MIN_FLAGS "-target x86_64-apple-ios15.0-macabi")
+ add_link_options(-target x86_64-apple-ios15.0-macabi)
else()
clr_unknown_arch()
endif()
@@ -684,11 +691,10 @@ if (CLR_CMAKE_HOST_UNIX)
set(CMAKE_OBJC_FLAGS "${CMAKE_OBJC_FLAGS} ${MACOS_VERSION_MIN_FLAGS} ${DISABLE_OVERRIDING_MIN_VERSION_ERROR}")
set(CMAKE_OBJCXX_FLAGS "${CMAKE_OBJCXX_FLAGS} ${MACOS_VERSION_MIN_FLAGS} ${DISABLE_OVERRIDING_MIN_VERSION_ERROR}")
elseif(CLR_CMAKE_HOST_OSX)
+ set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0")
if(CLR_CMAKE_HOST_ARCH_ARM64)
- set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0")
add_compile_options(-arch arm64)
elseif(CLR_CMAKE_HOST_ARCH_AMD64)
- set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15")
add_compile_options(-arch x86_64)
else()
clr_unknown_arch()
diff --git a/eng/native/gen-buildsys.cmd b/eng/native/gen-buildsys.cmd
index 7de701b7be36..4e69470c73e8 100644
--- a/eng/native/gen-buildsys.cmd
+++ b/eng/native/gen-buildsys.cmd
@@ -53,7 +53,7 @@ if /i "%__Arch%" == "wasm" (
if /i "%__Os%" == "wasi" (
if "%WASI_SDK_PATH%" == "" (
if not exist "%__repoRoot%\src\mono\wasi\wasi-sdk" (
- echo Error: Should set WASI_SDK_PATH environment variable pointing to wasi-sdk root.
+ echo Error: Should set WASI_SDK_PATH environment variable pointing to WASI SDK root.
exit /B 1
)
diff --git a/eng/native/sanitizer-ignorelist.txt b/eng/native/sanitizer-ignorelist.txt
index ecc8bef9bf68..8e89d3ca960d 100644
--- a/eng/native/sanitizer-ignorelist.txt
+++ b/eng/native/sanitizer-ignorelist.txt
@@ -10,5 +10,5 @@ fun:_ZN11CMiniMdBase19UsesAllocatedMemoryEP11CMiniColDef
# 2 0x4e8051 in __ubsan_handle_dynamic_type_cache_miss
# 3 0x7f02ce676cd8 in JIT_InitPInvokeFrame(InlinedCallFrame*, void*) /home/steveharter/git/dotnet_coreclr/vm/jithelpers.cpp:6491:9
# 4 0x7f0252bbceb2 ()
-fun:_Z20JIT_InitPInvokeFrameP16InlinedCallFramePv
+fun:_Z20JIT_InitPInvokeFrameP16InlinedCallFrame
diff --git a/eng/nativeSanitizers.targets b/eng/nativeSanitizers.targets
index 69ec76b93487..bcaec8691450 100644
--- a/eng/nativeSanitizers.targets
+++ b/eng/nativeSanitizers.targets
@@ -12,7 +12,7 @@
arm64
-
+
diff --git a/eng/pipelines/common/evaluate-default-paths.yml b/eng/pipelines/common/evaluate-default-paths.yml
index edbc1c618f60..5d9373ea3cb0 100644
--- a/eng/pipelines/common/evaluate-default-paths.yml
+++ b/eng/pipelines/common/evaluate-default-paths.yml
@@ -7,7 +7,7 @@ parameters:
_const_paths:
_wasm_specific_only: [
eng/testing/bump-chrome-version.proj
- eng/testing/ChromeVersions.props
+ eng/testing/BrowserVersions.props
eng/testing/WasmRunner*
eng/testing/WasiRunner*
eng/testing/scenarios/BuildWasiAppsJobsList.txt
@@ -22,6 +22,7 @@ parameters:
src/libraries/sendtohelix-browser.targets
src/libraries/sendtohelix-wasi.targets
src/libraries/sendtohelix-wasm.targets
+ src/libraries/System.Runtime.InteropServices.JavaScript/*
src/mono/mono/**/*wasm*
src/mono/nuget/Microsoft.NET.Runtime.WebAssembly.Sdk/*
src/mono/nuget/Microsoft.NET.Runtime.WebAssembly.Wasi.Sdk/*
@@ -57,7 +58,7 @@ parameters:
]
_wasm_chrome: [
eng/testing/bump-chrome-version.proj
- eng/testing/ChromeVersions.props
+ eng/testing/BrowserVersions.props
]
_perf_pipeline_specific_only: [
eng/pipelines/runtime-wasm-perf.yml
@@ -161,8 +162,14 @@ jobs:
- subset: tools_illink
include:
- src/tools/illink/*
+ - src/coreclr/tools/aot/ILCompiler.DependencyAnalysisFramework/*
+ - src/coreclr/tools/ILVerification/*
- global.json
+ - subset: tools_cdacreader
+ include:
+ - src/native/managed/cdacreader/*
+
- subset: installer
include:
exclude:
diff --git a/eng/pipelines/common/global-build-job.yml b/eng/pipelines/common/global-build-job.yml
index 1f0f14ac0b32..e19a92e62077 100644
--- a/eng/pipelines/common/global-build-job.yml
+++ b/eng/pipelines/common/global-build-job.yml
@@ -25,8 +25,6 @@ parameters:
useContinueOnErrorDuringBuild: false
shouldContinueOnError: false
isOfficialBuild: false
- isSourceBuild: false
- isNonPortableSourceBuild: false
runtimeFlavor: 'coreclr'
runtimeVariant: ''
helixQueues: ''
@@ -34,12 +32,9 @@ parameters:
testResultsFormat: ''
postBuildSteps: []
extraVariablesTemplates: []
- isManualCodeQLBuild: false
preBuildSteps: []
- enableRichCodeNavigation: false
- richCodeNavigationLanguage: 'csharp'
- disableComponentGovernance: ''
templatePath: 'templates'
+ templateContext: ''
jobs:
- template: /eng/common/${{ parameters.templatePath }}/job/job.yml
@@ -57,8 +52,8 @@ jobs:
enablePublishTestResults: ${{ parameters.enablePublishTestResults }}
testResultsFormat: ${{ parameters.testResultsFormat }}
- enableRichCodeNavigation: ${{ parameters.enableRichCodeNavigation }}
- richCodeNavigationLanguage: ${{ parameters.richCodeNavigationLanguage }}
+ ${{ if ne(parameters.templateContext, '') }}:
+ templateContext: ${{ parameters.templateContext }}
artifacts:
publish:
@@ -104,10 +99,26 @@ jobs:
- name: crossArg
value: '-cross'
- - ${{ if ne(parameters.jobParameters.crossrootfsDir, '') }}:
- # This is only required for cross builds.
- - name: ROOTFS_DIR
- value: ${{ parameters.jobParameters.crossrootfsDir }}
+ - name: CxxStandardLibraryArg
+ value: ''
+ - ${{ if ne(parameters.cxxStandardLibrary, '') }}:
+ - name: CxxStandardLibraryArg
+ value: /p:TargetCxxStandardLibrary=${{ parameters.cxxStandardLibrary }}
+
+ - name: CxxStandardLibraryStaticArg
+ value: ''
+ - ${{ if ne(parameters.cxxStandardLibraryStatic, '') }}:
+ - name: CxxStandardLibraryStaticArg
+ value: /p:TargetCxxStandardLibraryStatic=${{ parameters.cxxStandardLibraryStatic }}
+
+ - name: CxxAbiLibraryArg
+ value: ''
+ - ${{ if ne(parameters.cxxAbiLibrary, '') }}:
+ - name: CxxAbiLibraryArg
+ value: /p:TargetCxxAbiLibrary=${{ parameters.cxxAbiLibrary }}
+
+ - name: TargetCxxLibraryConfigurationArgs
+ value: $(CxxStandardLibraryArg) $(CxxStandardLibraryStaticArg) $(CxxAbiLibraryArg)
- name: _officialBuildParameter
${{ if eq(parameters.isOfficialBuild, true) }}:
@@ -154,10 +165,7 @@ jobs:
- checkout: self
clean: true
- # If running in source build mode, a git stash will be used for the inner clone. Avoid setting a fetch depth,
- # as a stash of a shallow cloned repo is not currently supported.
- ${{ if ne(parameters.isSourceBuild, true) }}:
- fetchDepth: $(checkoutFetchDepth)
+ fetchDepth: $(checkoutFetchDepth)
- ${{ if and(eq(parameters.isOfficialBuild, true), notin(parameters.osGroup, 'osx', 'maccatalyst', 'ios', 'iossimulator', 'tvos', 'tvossimulator')) }}:
- template: /eng/pipelines/common/restore-internal-tools.yml
@@ -187,16 +195,6 @@ jobs:
artifact: Mono_Offsets_${{monoCrossAOTTargetOS}}
path: '$(Build.SourcesDirectory)/artifacts/obj/mono/offsetfiles'
- - ${{ if eq(parameters.isSourceBuild, true) }}:
- - template: /eng/common/${{ parameters.templatePath }}/steps/source-build.yml
- parameters:
- platform:
- baseOS: ${{ parameters.baseOS }}
- buildScript: $(Build.SourcesDirectory)$(dir)build$(scriptExt)
- nonPortable: ${{ parameters.isNonPortableSourceBuild }}
- targetRID: ${{ parameters.targetRid }}
- name: ${{ parameters.platform }}
-
- ${{ if in(parameters.osGroup, 'osx', 'maccatalyst', 'ios', 'iossimulator', 'tvos', 'tvossimulator') }}:
- script: $(Build.SourcesDirectory)/eng/install-native-dependencies.sh ${{ parameters.osGroup }}
displayName: Install Build Dependencies
@@ -250,7 +248,6 @@ jobs:
targetRid: ${{ parameters.targetRid }}
nameSuffix: ${{ parameters.nameSuffix }}
platform: ${{ parameters.platform }}
- pgoType: ${{ parameters.pgoType }}
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
${{ if ne(preBuildStep.forwardedParameters, '') }}:
${{ each parameter in preBuildStep.forwardedParameters }}:
@@ -261,21 +258,11 @@ jobs:
- ${{ preBuildStep }}
# Build
- - ${{ if eq(parameters.isSourceBuild, false) }}:
- - ${{ if eq(parameters.isManualCodeQLBuild, true) }}:
- - task: CodeQL3000Init@0
- displayName: Initialize CodeQL (manually-injected)
-
- - template: /eng/pipelines/common/templates/global-build-step.yml
- parameters:
- buildArgs: ${{ parameters.buildArgs }}
- useContinueOnErrorDuringBuild: ${{ parameters.useContinueOnErrorDuringBuild }}
- shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
-
- - ${{ if eq(parameters.isManualCodeQLBuild, true) }}:
- - task: CodeQL3000Finalize@0
- displayName: Finalize CodeQL (manually-injected)
- #endif isSourceBuild
+ - template: /eng/pipelines/common/templates/global-build-step.yml
+ parameters:
+ buildArgs: ${{ parameters.buildArgs }}
+ useContinueOnErrorDuringBuild: ${{ parameters.useContinueOnErrorDuringBuild }}
+ shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
- ${{ if in(parameters.osGroup, 'osx', 'ios', 'tvos', 'android') }}:
- script: |
diff --git a/eng/pipelines/common/platform-matrix.yml b/eng/pipelines/common/platform-matrix.yml
index 7245e5216804..49f9ba6e3f24 100644
--- a/eng/pipelines/common/platform-matrix.yml
+++ b/eng/pipelines/common/platform-matrix.yml
@@ -253,30 +253,7 @@ jobs:
crossBuild: true
${{ insert }}: ${{ parameters.jobParameters }}
-# Linux x86
-
-- ${{ if containsValue(parameters.platforms, 'linux_x86') }}:
- - template: xplat-setup.yml
- parameters:
- jobTemplate: ${{ parameters.jobTemplate }}
- helixQueuesTemplate: ${{ parameters.helixQueuesTemplate }}
- variables: ${{ parameters.variables }}
- osGroup: linux
- archType: x86
- targetRid: linux-x86
- platform: linux_x86
- shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
- container: linux_x86
- jobParameters:
- runtimeFlavor: ${{ parameters.runtimeFlavor }}
- buildConfig: ${{ parameters.buildConfig }}
- helixQueueGroup: ${{ parameters.helixQueueGroup }}
- crossBuild: true
- ${{ insert }}: ${{ parameters.jobParameters }}
-
-# Runtime-dev-innerloop build
-
-- ${{ if containsValue(parameters.platforms, 'linux_x64_dev_innerloop') }}:
+- ${{ if containsValue(parameters.platforms, 'linux_x64_sanitizer') }}:
- template: xplat-setup.yml
parameters:
jobTemplate: ${{ parameters.jobTemplate }}
@@ -287,38 +264,41 @@ jobs:
targetRid: linux-x64
platform: linux_x64
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
- container: linux_x64_dev_innerloop
+ container: linux_x64_sanitizer
jobParameters:
runtimeFlavor: ${{ parameters.runtimeFlavor }}
buildConfig: ${{ parameters.buildConfig }}
helixQueueGroup: ${{ parameters.helixQueueGroup }}
+ crossBuild: true
+ cxxStandardLibrary: libc++
+ cxxStandardLibraryStatic: true
+ cxxAbiLibrary: libstdc++
${{ insert }}: ${{ parameters.jobParameters }}
-# Centos 8 Stream x64 Source Build
+# Linux x86
-- ${{ if containsValue(parameters.platforms, 'SourceBuild_centos8_x64') }}:
+- ${{ if containsValue(parameters.platforms, 'linux_x86') }}:
- template: xplat-setup.yml
parameters:
jobTemplate: ${{ parameters.jobTemplate }}
helixQueuesTemplate: ${{ parameters.helixQueuesTemplate }}
variables: ${{ parameters.variables }}
osGroup: linux
- archType: x64
- targetRid: centos.8-x64
- platform: centos8_linux_x64
+ archType: x86
+ targetRid: linux-x86
+ platform: linux_x86
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
- container: SourceBuild_centos_x64
+ container: linux_x86
jobParameters:
runtimeFlavor: ${{ parameters.runtimeFlavor }}
buildConfig: ${{ parameters.buildConfig }}
helixQueueGroup: ${{ parameters.helixQueueGroup }}
- isSourceBuild: true
- isNonPortableSourceBuild: true
+ crossBuild: true
${{ insert }}: ${{ parameters.jobParameters }}
-# Non-existent RID Source Build
+# Runtime-dev-innerloop build
-- ${{ if containsValue(parameters.platforms, 'SourceBuild_banana24_x64') }}:
+- ${{ if containsValue(parameters.platforms, 'linux_x64_dev_innerloop') }}:
- template: xplat-setup.yml
parameters:
jobTemplate: ${{ parameters.jobTemplate }}
@@ -326,39 +306,33 @@ jobs:
variables: ${{ parameters.variables }}
osGroup: linux
archType: x64
- targetRid: banana.24-x64
- platform: banana24_linux_x64
+ targetRid: linux-x64
+ platform: linux_x64
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
- container: SourceBuild_centos_x64 # Run the unknown-rid build on a platform with a known RID so our RID graph tooling can automatically add it to the RID graph.
+ container: linux_x64_dev_innerloop
jobParameters:
runtimeFlavor: ${{ parameters.runtimeFlavor }}
- baseOS: linux
buildConfig: ${{ parameters.buildConfig }}
helixQueueGroup: ${{ parameters.helixQueueGroup }}
- isSourceBuild: true
- isNonPortableSourceBuild: true
${{ insert }}: ${{ parameters.jobParameters }}
-# Portable Linux x64 Source Build
-
-- ${{ if containsValue(parameters.platforms, 'SourceBuild_linux_x64') }}:
+- ${{ if containsValue(parameters.platforms, 'linux_musl_x64_dev_innerloop') }}:
- template: xplat-setup.yml
parameters:
jobTemplate: ${{ parameters.jobTemplate }}
helixQueuesTemplate: ${{ parameters.helixQueuesTemplate }}
variables: ${{ parameters.variables }}
osGroup: linux
+ osSubgroup: _musl
archType: x64
- targetRid: linux-x64
- platform: linux_x64
+ targetRid: linux-musl-x64
+ platform: linux_musl_x64
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
- container: SourceBuild_linux_x64
+ container: linux_musl_x64_dev_innerloop
jobParameters:
runtimeFlavor: ${{ parameters.runtimeFlavor }}
buildConfig: ${{ parameters.buildConfig }}
helixQueueGroup: ${{ parameters.helixQueueGroup }}
- isSourceBuild: true
- isNonPortableSourceBuild: false
${{ insert }}: ${{ parameters.jobParameters }}
# GCC Linux x64 Build
@@ -374,7 +348,7 @@ jobs:
targetRid: linux-x64
platform: linux_x64
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
- container: debian-12-gcc13-amd64
+ container: debian-12-gcc14-amd64
jobParameters:
runtimeFlavor: ${{ parameters.runtimeFlavor }}
buildConfig: ${{ parameters.buildConfig }}
diff --git a/eng/pipelines/common/templates/global-build-step.yml b/eng/pipelines/common/templates/global-build-step.yml
index b88207c516c1..2a2262d9a4ea 100644
--- a/eng/pipelines/common/templates/global-build-step.yml
+++ b/eng/pipelines/common/templates/global-build-step.yml
@@ -4,12 +4,13 @@ parameters:
shouldContinueOnError: false
archParameter: $(_archParameter)
crossArg: $(crossArg)
+ targetCxxLibraryConfigurationArgs: $(TargetCxxLibraryConfigurationArgs)
displayName: Build product
container: ''
condition: succeeded()
steps:
- - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -ci ${{ parameters.archParameter }} $(_osParameter) ${{ parameters.crossArg }} ${{ parameters.buildArgs }} $(_officialBuildParameter) $(_buildDarwinFrameworksParameter) $(_overrideTestScriptWindowsCmdParameter)
+ - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -ci ${{ parameters.archParameter }} $(_osParameter) ${{ parameters.crossArg }} ${{ parameters.buildArgs }} ${{ parameters.targetCxxLibraryConfigurationArgs }} $(_officialBuildParameter) $(_buildDarwinFrameworksParameter) $(_overrideTestScriptWindowsCmdParameter)
displayName: ${{ parameters.displayName }}
${{ if eq(parameters.useContinueOnErrorDuringBuild, true) }}:
continueOnError: ${{ parameters.shouldContinueOnError }}
diff --git a/eng/pipelines/common/templates/pipeline-with-resources.yml b/eng/pipelines/common/templates/pipeline-with-resources.yml
index 5ae3a3f7a38f..dd10e2a4bbe0 100644
--- a/eng/pipelines/common/templates/pipeline-with-resources.yml
+++ b/eng/pipelines/common/templates/pipeline-with-resources.yml
@@ -17,7 +17,7 @@ extends:
containers:
linux_arm:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-arm
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-cross-arm-net9.0-20240507035943-1390eea
env:
ROOTFS_DIR: /crossrootfs/arm
@@ -27,23 +27,22 @@ extends:
ROOTFS_DIR: /crossrootfs/armv6
linux_arm64:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-biarch-amd64-arm64
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-cross-arm64-net9.0
env:
- ROOTFS_HOST_DIR: /crossrootfs/x64
ROOTFS_DIR: /crossrootfs/arm64
linux_musl_x64:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-amd64-alpine
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-cross-amd64-alpine-net9.0
env:
ROOTFS_DIR: /crossrootfs/x64
linux_musl_arm:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-arm-alpine
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-cross-arm-alpine-net9.0
env:
ROOTFS_DIR: /crossrootfs/arm
linux_musl_arm64:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-arm64-alpine
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-cross-arm64-alpine-net9.0
env:
ROOTFS_DIR: /crossrootfs/arm64
@@ -56,18 +55,26 @@ extends:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-android-docker
linux_x64:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-amd64
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-cross-amd64-net9.0
env:
ROOTFS_DIR: /crossrootfs/x64
linux_x86:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-x86
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-cross-x86-net9.0
env:
ROOTFS_DIR: /crossrootfs/x86
linux_x64_dev_innerloop:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04
+ linux_musl_x64_dev_innerloop:
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.19-WithNode
+
+ linux_x64_sanitizer:
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-cross-amd64-net9.0-sanitizer
+ env:
+ ROOTFS_DIR: /crossrootfs/x64
+
# We use a CentOS Stream 8 image here to test building from source on CentOS Stream 8.
SourceBuild_centos_x64:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8
@@ -77,12 +84,12 @@ extends:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:almalinux-8-source-build
linux_s390x:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-s390x
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-s390x
env:
ROOTFS_DIR: /crossrootfs/s390x
linux_ppc64le:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-18.04-cross-ppc64le
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-cross-ppc64le
env:
ROOTFS_DIR: /crossrootfs/ppc64le
@@ -91,14 +98,14 @@ extends:
env:
ROOTFS_DIR: /crossrootfs/riscv64
- debian-12-gcc13-amd64:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-gcc13-amd64
+ debian-12-gcc14-amd64:
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-12-gcc14-amd64
linux_x64_llvmaot:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8
browser_wasm:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-webassembly-20230913040940-1edc1c6
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-webassembly
env:
ROOTFS_DIR: /crossrootfs/x64
@@ -121,4 +128,4 @@ extends:
image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-debpkg
rpmpkg:
- image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-fpm
\ No newline at end of file
+ image: mcr.microsoft.com/dotnet-buildtools/prereqs:cbl-mariner-2.0-fpm
diff --git a/eng/pipelines/common/templates/publish-pipeline-artifacts.yml b/eng/pipelines/common/templates/publish-pipeline-artifacts.yml
deleted file mode 100644
index 81f292ec5528..000000000000
--- a/eng/pipelines/common/templates/publish-pipeline-artifacts.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-parameters:
-- name: displayName
- type: string
-- name: inputs
- type: object
-- name: isOfficialBuild
- type: boolean
-
-steps:
- - ${{ if parameters.isOfficialBuild }}:
- - task: 1ES.PublishPipelineArtifact@1
- displayName: ${{ parameters.displayName }}
- inputs: ${{ parameters.inputs }}
- - ${{ else }}:
- - task: PublishPipelineArtifact@1
- displayName: ${{ parameters.displayName }}
- inputs: ${{ parameters.inputs }}
\ No newline at end of file
diff --git a/eng/pipelines/common/templates/runtimes/run-test-job.yml b/eng/pipelines/common/templates/runtimes/run-test-job.yml
index d6404617a3e1..0899b32fe524 100644
--- a/eng/pipelines/common/templates/runtimes/run-test-job.yml
+++ b/eng/pipelines/common/templates/runtimes/run-test-job.yml
@@ -537,6 +537,7 @@ jobs:
- jitosr_stress
- jitpartialcompilation_pgo
- jitoptrepeat
+ - jitrpolayout
${{ else }}:
scenarios:
- jitosr_stress
@@ -549,6 +550,7 @@ jobs:
- jitphysicalpromotion_full
- jitrlcse
- jitoptrepeat
+ - jitrpolayout
${{ if in(parameters.testGroup, 'jit-cfg') }}:
scenarios:
- jitcfg
diff --git a/eng/pipelines/common/templates/simple-wasm-build-tests.yml b/eng/pipelines/common/templates/simple-wasm-build-tests.yml
index 7a593f4f9be2..273a80fc65ee 100644
--- a/eng/pipelines/common/templates/simple-wasm-build-tests.yml
+++ b/eng/pipelines/common/templates/simple-wasm-build-tests.yml
@@ -34,7 +34,7 @@ jobs:
isExtraPlatforms: ${{ parameters.isExtraPlatformsBuild }}
testGroup: innerloop
nameSuffix: WasmBuildTests
- buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:TestWasmBuildTests=true /p:TestAssemblies=false /p:BrowserHost=$(_hostedOs) /p:WorkloadsTestPreviousVersions=$(workloadsTestPreviousVersionsVar) ${{ parameters.extraBuildArgs }}
+ buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:MonoEnableAssertMessages=true /p:ArchiveTests=true /p:TestWasmBuildTests=true /p:TestAssemblies=false /p:BrowserHost=$(_hostedOs) /p:WorkloadsTestPreviousVersions=$(workloadsTestPreviousVersionsVar) ${{ parameters.extraBuildArgs }}
timeoutInMinutes: 180
condition: >-
or(
diff --git a/eng/pipelines/common/templates/template1es.yml b/eng/pipelines/common/templates/template1es.yml
index 0770e37d6bd0..0964295750d2 100644
--- a/eng/pipelines/common/templates/template1es.yml
+++ b/eng/pipelines/common/templates/template1es.yml
@@ -15,11 +15,14 @@ resources:
- repository: 1ESPipelineTemplates
type: git
name: 1ESPipelineTemplates/1ESPipelineTemplates
- ref: refs/tags/release
+ ref: refs/tags/release-2024-05-13-1
extends:
template: v1/1ES.Official.PipelineTemplate.yml@1ESPipelineTemplates
parameters:
+ sdl:
+ credscan:
+ suppressionsFile: $(Build.SourcesDirectory)/.config/CredScanSuppressions.json
pool:
name: $(DncEngInternalBuildPool)
image: 1es-windows-2022
@@ -28,4 +31,4 @@ extends:
containers:
${{ parameters.containers }}
- stages: ${{ parameters.stages }}
\ No newline at end of file
+ stages: ${{ parameters.stages }}
diff --git a/eng/pipelines/common/templates/wasm-library-aot-tests.yml b/eng/pipelines/common/templates/wasm-library-aot-tests.yml
index 9937d44ef21f..2336f9840151 100644
--- a/eng/pipelines/common/templates/wasm-library-aot-tests.yml
+++ b/eng/pipelines/common/templates/wasm-library-aot-tests.yml
@@ -1,7 +1,7 @@
parameters:
alwaysRun: false
extraBuildArgs: ''
- extraHelixArgs: ''
+ extraHelixArguments: ''
isExtraPlatformsBuild: false
isWasmOnlyBuild: false
buildAOTOnHelix: true
@@ -26,12 +26,14 @@ jobs:
isExtraPlatformsBuild: ${{ parameters.isExtraPlatformsBuild }}
isWasmOnlyBuild: ${{ parameters.isWasmOnlyBuild }}
extraBuildArgs: /p:EnableAggressiveTrimming=true /p:BuildAOTTestsOnHelix=${{ parameters.buildAOTOnHelix }} /p:RunAOTCompilation=${{ parameters.runAOT }} ${{ parameters.extraBuildArgs }}
- extraHelixArgs: /p:NeedsToBuildWasmAppsOnHelix=true ${{ parameters.extraHelixArgs }}
+ extraHelixArguments: /p:NeedsToBuildWasmAppsOnHelix=true ${{ parameters.extraHelixArguments }}
alwaysRun: ${{ parameters.alwaysRun }}
shouldRunSmokeOnly: ${{ parameters.shouldRunSmokeOnly }}
shouldContinueOnError: ${{ parameters.shouldContinueOnError }}
scenarios:
+ - ${{ if eq(platform, 'browser_wasm') }}:
+ - WasmTestOnV8
- ${{ if eq(platform, 'browser_wasm_win') }}:
- - WasmTestOnBrowser
- - ${{ if ne(platform, 'browser_wasm_win') }}:
- - normal
+ - WasmTestOnChrome
+ - ${{ if or(eq(platform, 'wasi_wasm_win'), eq(platform, 'wasi_wasm')) }}:
+ - WasmTestOnWasmtime
diff --git a/eng/pipelines/common/templates/wasm-library-tests.yml b/eng/pipelines/common/templates/wasm-library-tests.yml
index b1b041604439..f015563fef00 100644
--- a/eng/pipelines/common/templates/wasm-library-tests.yml
+++ b/eng/pipelines/common/templates/wasm-library-tests.yml
@@ -1,12 +1,12 @@
parameters:
alwaysRun: false
extraBuildArgs: ''
- extraHelixArgs: ''
+ extraHelixArguments: ''
isExtraPlatformsBuild: false
isWasmOnlyBuild: false
nameSuffix: ''
platforms: []
- scenarios: ['normal']
+ scenarios: ['WasmTestOnV8']
shouldContinueOnError: false
shouldRunSmokeOnly: false
@@ -61,12 +61,17 @@ jobs:
- name: _wasmRunSmokeTestsOnlyArg
value: /p:RunSmokeTestsOnly=$(shouldRunSmokeOnlyVar)
- name: chromeInstallArg
- ${{ if containsValue(parameters.scenarios, 'wasmtestonbrowser') }}:
+ ${{ if containsValue(parameters.scenarios, 'WasmTestOnChrome') }}:
value: /p:InstallChromeForTests=true
${{ else }}:
value: ''
+ - name: firefoxInstallArg
+ ${{ if containsValue(parameters.scenarios, 'WasmTestOnFirefox') }}:
+ value: /p:InstallFirefoxForTests=true
+ ${{ else }}:
+ value: ''
- name: v8InstallArg
- ${{ if containsValue(parameters.scenarios, 'normal') }}:
+ ${{ if containsValue(parameters.scenarios, 'WasmTestOnV8') }}:
value: /p:InstallV8ForTests=true
${{ else }}:
value: ''
@@ -75,7 +80,7 @@ jobs:
isExtraPlatforms: ${{ parameters.isExtraPlatformsBuild }}
testGroup: innerloop
nameSuffix: LibraryTests${{ parameters.nameSuffix }}
- buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:BrowserHost=$(_hostedOs) $(_wasmRunSmokeTestsOnlyArg) $(chromeInstallArg) $(v8InstallArg) ${{ parameters.extraBuildArgs }}
+ buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:MonoEnableAssertMessages=true /p:BrowserHost=$(_hostedOs) $(_wasmRunSmokeTestsOnlyArg) $(chromeInstallArg) $(firefoxInstallArg) $(v8InstallArg) ${{ parameters.extraBuildArgs }}
timeoutInMinutes: 240
# if !alwaysRun, then:
# if this is runtime-wasm (isWasmOnlyBuild):
@@ -92,5 +97,5 @@ jobs:
parameters:
creator: dotnet-bot
testRunNamePrefixSuffix: Mono_$(_BuildConfig)
- extraHelixArguments: /p:BrowserHost=$(_hostedOs) $(_wasmRunSmokeTestsOnlyArg) ${{ parameters.extraHelixArgs }}
+ extraHelixArguments: /p:BrowserHost=$(_hostedOs) $(_wasmRunSmokeTestsOnlyArg) ${{ parameters.extraHelixArguments }}
scenarios: ${{ parameters.scenarios }}
diff --git a/eng/pipelines/common/templates/wasm-runtime-tests.yml b/eng/pipelines/common/templates/wasm-runtime-tests.yml
index 3a8affe48a21..510607830f08 100644
--- a/eng/pipelines/common/templates/wasm-runtime-tests.yml
+++ b/eng/pipelines/common/templates/wasm-runtime-tests.yml
@@ -36,7 +36,7 @@ jobs:
isExtraPlatforms: ${{ parameters.isExtraPlatformsBuild }}
nameSuffix: AllSubsets_Mono_RuntimeTests
runtimeVariant: monointerpreter
- buildArgs: -s mono+libs -c $(_BuildConfig) /p:InstallV8ForTests=false ${{ parameters.extraBuildArgs }}
+ buildArgs: -s mono+libs -c $(_BuildConfig) /p:MonoEnableAssertMessages=true /p:InstallV8ForTests=false ${{ parameters.extraBuildArgs }}
timeoutInMinutes: 180
condition: >-
or(
diff --git a/eng/pipelines/coreclr/libraries-pgo.yml b/eng/pipelines/coreclr/libraries-pgo.yml
index a8f0e16b01f3..e6dd78aba4a7 100644
--- a/eng/pipelines/coreclr/libraries-pgo.yml
+++ b/eng/pipelines/coreclr/libraries-pgo.yml
@@ -71,3 +71,4 @@ extends:
- syntheticpgo
- syntheticpgo_blend
- jitrlcse
+ - jitrpolayout
diff --git a/eng/pipelines/coreclr/nativeaot-post-build-steps.yml b/eng/pipelines/coreclr/nativeaot-post-build-steps.yml
index 94761028f48a..bc29a657c456 100644
--- a/eng/pipelines/coreclr/nativeaot-post-build-steps.yml
+++ b/eng/pipelines/coreclr/nativeaot-post-build-steps.yml
@@ -21,11 +21,3 @@ steps:
nativeAotTest: true
helixQueues: ${{ parameters.helixQueues }}
liveLibrariesBuildConfig: ${{ parameters.liveLibrariesBuildConfig }}
-
- # Can't run arm/arm64 tests on x64 build machines
- - ${{ if and(ne(parameters.archType, 'arm'), ne(parameters.archType, 'arm64')) }}:
-
- # Publishing tooling doesn't support different configs between runtime and libs, so only run tests in Release config
- - ${{ if eq(parameters.buildConfig, 'release') }}:
- - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -ci -arch ${{ parameters.archType }} $(_osParameter) -s libs.tests -c $(_BuildConfig) $(crossArg) $(_nativeSanitizersArg) /p:TestAssemblies=false /p:RunNativeAotTestApps=true $(_officialBuildParameter) /bl:$(Build.SourcesDirectory)/artifacts/log/$(buildConfigUpper)/NativeAotTests.binlog ${{ parameters.extraTestArgs }}
- displayName: Run NativeAot Library Tests
diff --git a/eng/pipelines/coreclr/perf-non-wasm-jobs.yml b/eng/pipelines/coreclr/perf-non-wasm-jobs.yml
index c48103af929c..574728cfed7e 100644
--- a/eng/pipelines/coreclr/perf-non-wasm-jobs.yml
+++ b/eng/pipelines/coreclr/perf-non-wasm-jobs.yml
@@ -306,7 +306,7 @@ jobs:
runJobTemplate: /eng/pipelines/coreclr/templates/run-performance-job.yml
logicalmachine: 'perfviper'
- # run coreclr perfowl microbenchmarks perf gdv3 jobs
+ # run coreclr perfowl microbenchmarks perf rlcse jobs
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/coreclr/templates/perf-job.yml
@@ -322,9 +322,9 @@ jobs:
runKind: micro
runJobTemplate: /eng/pipelines/coreclr/templates/run-performance-job.yml
logicalmachine: 'perfowl'
- experimentName: 'gdv3'
+ experimentName: 'rlcse'
- # run coreclr perfowl microbenchmarks perf rlcse jobs
+ # run coreclr perfowl microbenchmarks perf jitoptrepeat jobs
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/coreclr/templates/perf-job.yml
@@ -340,9 +340,9 @@ jobs:
runKind: micro
runJobTemplate: /eng/pipelines/coreclr/templates/run-performance-job.yml
logicalmachine: 'perfowl'
- experimentName: 'rlcse'
+ experimentName: 'jitoptrepeat'
- # run coreclr perfowl microbenchmarks perf jitoptrepeat jobs
+ # run coreclr perfowl microbenchmarks perf rpolayout jobs
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/coreclr/templates/perf-job.yml
@@ -358,7 +358,7 @@ jobs:
runKind: micro
runJobTemplate: /eng/pipelines/coreclr/templates/run-performance-job.yml
logicalmachine: 'perfowl'
- experimentName: 'jitoptrepeat'
+ experimentName: 'rpolayout'
# run coreclr crossgen perf job
- template: /eng/pipelines/common/platform-matrix.yml
diff --git a/eng/pipelines/coreclr/perf_slow.yml b/eng/pipelines/coreclr/perf_slow.yml
index 4a6fa32a81f1..f5d10f2a01fa 100644
--- a/eng/pipelines/coreclr/perf_slow.yml
+++ b/eng/pipelines/coreclr/perf_slow.yml
@@ -121,7 +121,7 @@ extends:
platforms:
- linux_arm64
jobParameters:
- buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:MonoAOTEnableLLVM=true /p:MonoEnableLLVM=true /p:BuildMonoAOTCrossCompiler=true /p:MonoLibClang="/usr/local/lib/libclang.so.16" /p:AotHostArchitecture=arm64 /p:AotHostOS=linux
+ buildArgs: -s mono+libs+host+packs -c $(_BuildConfig) /p:MonoAOTEnableLLVM=true /p:MonoEnableLLVM=true /p:BuildMonoAOTCrossCompiler=true /p:MonoLibClang="/usr/local/lib/libclang.so" /p:AotHostArchitecture=arm64 /p:AotHostOS=linux
nameSuffix: AOT
isOfficialBuild: false
postBuildSteps:
diff --git a/eng/pipelines/coreclr/runtime-nativeaot-outerloop.yml b/eng/pipelines/coreclr/runtime-nativeaot-outerloop.yml
index e8bfd86cd81d..494601a890df 100644
--- a/eng/pipelines/coreclr/runtime-nativeaot-outerloop.yml
+++ b/eng/pipelines/coreclr/runtime-nativeaot-outerloop.yml
@@ -69,7 +69,7 @@ extends:
testGroup: innerloop
isSingleFile: true
nameSuffix: NativeAOT_Libs
- buildArgs: -s clr.aot+host.native+libs+libs.tests -c $(_BuildConfig) /p:TestNativeAot=true /p:ArchiveTests=true /p:IlcUseServerGc=false /p:RunAnalyzers=false
+ buildArgs: -s clr.aot+libs+libs.tests -c $(_BuildConfig) /p:TestNativeAot=true /p:ArchiveTests=true /p:IlcUseServerGc=false /p:RunAnalyzers=false
timeoutInMinutes: 300 # doesn't normally take this long, but I've seen Helix queues backed up for 160 minutes
includeAllPlatforms: true
# extra steps, run tests
@@ -95,7 +95,7 @@ extends:
testGroup: innerloop
isSingleFile: true
nameSuffix: NativeAOT_Checked_Libs
- buildArgs: -s clr.aot+host.native+libs+libs.tests -c $(_BuildConfig) -rc Checked /p:TestNativeAot=true /p:ArchiveTests=true /p:IlcUseServerGc=false /p:RunAnalyzers=false
+ buildArgs: -s clr.aot+libs+libs.tests -c $(_BuildConfig) -rc Checked /p:TestNativeAot=true /p:ArchiveTests=true /p:IlcUseServerGc=false /p:RunAnalyzers=false
timeoutInMinutes: 360
# extra steps, run tests
postBuildSteps:
@@ -120,7 +120,7 @@ extends:
testGroup: innerloop
isSingleFile: true
nameSuffix: NativeAOT_Checked_Libs_SizeOpt
- buildArgs: -s clr.aot+host.native+libs+libs.tests -c $(_BuildConfig) -rc Checked /p:TestNativeAot=true /p:ArchiveTests=true /p:OptimizationPreference=Size /p:IlcUseServerGc=false /p:RunAnalyzers=false
+ buildArgs: -s clr.aot+libs+libs.tests -c $(_BuildConfig) -rc Checked /p:TestNativeAot=true /p:ArchiveTests=true /p:OptimizationPreference=Size /p:IlcUseServerGc=false /p:RunAnalyzers=false
timeoutInMinutes: 240
# extra steps, run tests
postBuildSteps:
@@ -145,7 +145,7 @@ extends:
testGroup: innerloop
isSingleFile: true
nameSuffix: NativeAOT_Checked_Libs_SpeedOpt
- buildArgs: -s clr.aot+host.native+libs+libs.tests -c $(_BuildConfig) -rc Checked /p:TestNativeAot=true /p:ArchiveTests=true /p:OptimizationPreference=Speed /p:IlcUseServerGc=false /p:RunAnalyzers=false
+ buildArgs: -s clr.aot+libs+libs.tests -c $(_BuildConfig) -rc Checked /p:TestNativeAot=true /p:ArchiveTests=true /p:OptimizationPreference=Speed /p:IlcUseServerGc=false /p:RunAnalyzers=false
timeoutInMinutes: 240
# extra steps, run tests
postBuildSteps:
@@ -176,7 +176,7 @@ extends:
jobParameters:
timeoutInMinutes: 300 # doesn't normally take this long, but we have had Helix queues backed up for over an hour
nameSuffix: NativeAOT_Pri0
- buildArgs: -s clr.aot+host.native+libs -rc $(_BuildConfig) -lc Release -hc Release /p:RunAnalyzers=false
+ buildArgs: -s clr.aot+libs -rc $(_BuildConfig) -lc Release /p:RunAnalyzers=false
postBuildSteps:
- template: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
parameters:
diff --git a/eng/pipelines/coreclr/templates/run-performance-job.yml b/eng/pipelines/coreclr/templates/run-performance-job.yml
index 12d630a5b3f3..2b61558e2fc9 100644
--- a/eng/pipelines/coreclr/templates/run-performance-job.yml
+++ b/eng/pipelines/coreclr/templates/run-performance-job.yml
@@ -91,6 +91,9 @@ jobs:
export ORIGPYPATH=$PYTHONPATH
export CRYPTOGRAPHY_ALLOW_OPENSSL_102=true;
echo "** Installing prerequistes **";
+ echo "** Waiting for dpkg to unlock (up to 2 minutes) **" &&
+ timeout 2m bash -c 'while sudo fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do if [ -z "$printed" ]; then echo "Waiting for dpkg lock to be released... Lock is held by: $(ps -o cmd= -p $(sudo fuser /var/lib/dpkg/lock-frontend))"; printed=1; fi; echo "Waiting 5 seconds to check again"; sleep 5; done;' &&
+ sudo apt-get remove -y lttng-modules-dkms &&
sudo apt-get -y install python3-pip &&
python3 -m pip install --user -U pip &&
sudo apt-get -y install python3-venv &&
@@ -192,4 +195,4 @@ jobs:
WorkItemDirectory: '$(WorkItemDirectory)' # WorkItemDirectory can not be empty, so we send it some docs to keep it happy
CorrelationPayloadDirectory: '$(PayloadDirectory)' # it gets checked out to a folder with shorter path than WorkItemDirectory so we can avoid file name too long exceptions
ProjectFile: ${{ parameters.projectFile }}
- osGroup: ${{ parameters.osGroup }}
\ No newline at end of file
+ osGroup: ${{ parameters.osGroup }}
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslike.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslike.yml
index 051cb8b286bd..be6ef9c63c00 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslike.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-ioslike.yml
@@ -35,7 +35,11 @@ jobs:
testGroup: innerloop
nameSuffix: AllSubsets_Mono
isExtraPlatforms: ${{ parameters.isExtraPlatformsBuild }}
- buildArgs: -s mono+libs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true $(_runSmokeTestsOnlyArg) /p:BuildTestsOnHelix=true /p:EnableAdditionalTimezoneChecks=true /p:UsePortableRuntimePack=true /p:BuildDarwinFrameworks=true /p:IsManualOrRollingBuild=true
+ # Don't trim tests on rolling builds
+ ${{ if eq(variables['isRollingBuild'], true) }}:
+ buildArgs: -s mono+libs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true $(_runSmokeTestsOnlyArg) /p:BuildTestsOnHelix=true /p:EnableAdditionalTimezoneChecks=true /p:UsePortableRuntimePack=true /p:BuildDarwinFrameworks=true /p:IsManualOrRollingBuild=true /p:EnableAggressiveTrimming=false
+ ${{ else }}:
+ buildArgs: -s mono+libs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true $(_runSmokeTestsOnlyArg) /p:BuildTestsOnHelix=true /p:EnableAdditionalTimezoneChecks=true /p:UsePortableRuntimePack=true /p:BuildDarwinFrameworks=true /p:IsManualOrRollingBuild=true /p:EnableAggressiveTrimming=true
timeoutInMinutes: 480
# extra steps, run tests
postBuildSteps:
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-linuxbionic.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-linuxbionic.yml
index 7eb5fa47f808..862f7e54848e 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-linuxbionic.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-linuxbionic.yml
@@ -12,6 +12,7 @@ jobs:
#
# Build the whole product using Mono for Android Linux with Bionic libc
+# FIXME: disabled test runs https://github.com/dotnet/runtime/issues/100281
#
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
@@ -41,9 +42,9 @@ jobs:
nameSuffix: AllSubsets_Mono
buildArgs: -s mono+libs+host+packs+libs.tests -c $(_BuildConfig) /p:ArchiveTests=true
timeoutInMinutes: 480
- # extra steps, run tests
- postBuildSteps:
- - template: /eng/pipelines/libraries/helix.yml
- parameters:
- creator: dotnet-bot
- testRunNamePrefixSuffix: Mono_$(_BuildConfig)_LinuxBionic
+ # extra steps, run tests # FIXME: see https://github.com/dotnet/runtime/issues/100281
+ # postBuildSteps:
+ # - template: /eng/pipelines/libraries/helix.yml
+ # parameters:
+ # creator: dotnet-bot
+ # testRunNamePrefixSuffix: Mono_$(_BuildConfig)_LinuxBionic
diff --git a/eng/pipelines/extra-platforms/runtime-extra-platforms-wasm.yml b/eng/pipelines/extra-platforms/runtime-extra-platforms-wasm.yml
index fc8d757233cd..a5c6cb414227 100644
--- a/eng/pipelines/extra-platforms/runtime-extra-platforms-wasm.yml
+++ b/eng/pipelines/extra-platforms/runtime-extra-platforms-wasm.yml
@@ -89,8 +89,8 @@ jobs:
isExtraPlatformsBuild: ${{ parameters.isExtraPlatformsBuild }}
isWasmOnlyBuild: ${{ parameters.isWasmOnlyBuild }}
scenarios:
- - normal
- - WasmTestOnBrowser
+ - WasmTestOnV8
+ - WasmTestOnChrome
# this only runs on the extra pipeline
- template: /eng/pipelines/common/templates/wasm-library-tests.yml
@@ -114,7 +114,7 @@ jobs:
isExtraPlatformsBuild: ${{ parameters.isExtraPlatformsBuild }}
isWasmOnlyBuild: ${{ parameters.isWasmOnlyBuild }}
scenarios:
- - WasmTestOnBrowser
+ - WasmTestOnChrome
- WasmTestOnNodeJS
# EAT Library tests - only run on linux
@@ -183,7 +183,7 @@ jobs:
shouldContinueOnError: ${{ not(parameters.isWasmOnlyBuild) }}
alwaysRun: ${{ variables.isRollingBuild }}
scenarios:
- - normal
+ - WasmTestOnV8
# Hybrid Globalization tests
- template: /eng/pipelines/common/templates/wasm-library-tests.yml
@@ -197,8 +197,8 @@ jobs:
isWasmOnlyBuild: ${{ parameters.isWasmOnlyBuild }}
alwaysRun: true
scenarios:
- - normal
- - WasmTestOnBrowser
+ - WasmTestOnChrome
+ - WasmTestOnFirefox
- WasmTestOnNodeJS
# Hybrid Globalization AOT tests
@@ -214,8 +214,7 @@ jobs:
isWasmOnlyBuild: ${{ parameters.isWasmOnlyBuild }}
alwaysRun: true
scenarios:
- - normal
- - WasmTestOnBrowser
+ - WasmTestOnChrome
- WasmTestOnNodeJS
- ${{ if and(ne(parameters.isRollingBuild, true), ne(parameters.excludeNonLibTests, true), ne(parameters.debuggerTestsOnly, true)) }}:
@@ -321,4 +320,4 @@ jobs:
isExtraPlatformsBuild: ${{ parameters.isExtraPlatformsBuild }}
isWasmOnlyBuild: ${{ parameters.isWasmOnlyBuild }}
scenarios:
- - normal
+ - WasmTestOnWasmtime
diff --git a/eng/pipelines/global-build.yml b/eng/pipelines/global-build.yml
index 32e4ec79c831..d7302fe253b6 100644
--- a/eng/pipelines/global-build.yml
+++ b/eng/pipelines/global-build.yml
@@ -1,6 +1,6 @@
-# The purpose of this pipeline is to exercise local developer workflow in the consolidated
-# runtime repo. In particular, it is supposed to run the root "build" script just like any
-# normal developer normally would and monitor regressions w.r.t. this fundamental scenario.
+# The purpose of this pipeline is to exercise various developer workflows in the repo.
+# Primarily, it is meant to cover local (non-cross) build scenarios and
+# source-build scenarios that commonly cause build breaks.
trigger: none
@@ -41,28 +41,6 @@ extends:
- stage: Build
jobs:
- #
- # Build with Release config and Debug runtimeConfiguration
- #
- - template: /eng/pipelines/common/platform-matrix.yml
- parameters:
- jobTemplate: /eng/pipelines/common/global-build-job.yml
- buildConfig: release
- platforms:
- - windows_x86
- - osx_x64
- - osx_arm64
- jobParameters:
- testGroup: innerloop
- nameSuffix: Runtime_Debug
- buildArgs: -c release -runtimeConfiguration debug
- timeoutInMinutes: 120
- condition:
- or(
- eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_coreclr.containsChange'], true),
- eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_non_mono_and_wasm.containsChange'], true),
- eq(variables['isRollingBuild'], true))
-
#
# Build with Release config and runtimeConfiguration with MSBuild generator
#
@@ -83,26 +61,6 @@ extends:
eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_non_mono_and_wasm.containsChange'], true),
eq(variables['isRollingBuild'], true))
- #
- # Build with Debug config and Release runtimeConfiguration
- #
- - template: /eng/pipelines/common/platform-matrix.yml
- parameters:
- jobTemplate: /eng/pipelines/common/global-build-job.yml
- buildConfig: debug
- platforms:
- - linux_x64_dev_innerloop
- jobParameters:
- testGroup: innerloop
- nameSuffix: Runtime_Release
- buildArgs: -c debug -runtimeConfiguration release
- timeoutInMinutes: 120
- condition:
- or(
- eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_coreclr.containsChange'], true),
- eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_non_mono_and_wasm.containsChange'], true),
- eq(variables['isRollingBuild'], true))
-
#
# Build with RuntimeFlavor only. This exercise code paths where only RuntimeFlavor is
# specified. Catches cases where we depend on Configuration also being specified
@@ -124,38 +82,37 @@ extends:
eq(variables['isRollingBuild'], true))
#
- # Build Mono + Libraries. This exercises the code path where we build libraries without
- # first building CoreCLR
+ # Build Libraries AllConfigurations. This exercises the code path where we build libraries for all
+ # configurations on a non Windows operating system.
#
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: debug
platforms:
- - windows_x64
+ - linux_x64_dev_innerloop
jobParameters:
- testGroup: innerloop
- nameSuffix: Mono_Libraries
- buildArgs: -subset mono+libs /p:RuntimeFlavor=Mono
+ nameSuffix: Libraries_AllConfigurations
+ buildArgs: -subset libs -allconfigurations
timeoutInMinutes: 120
condition:
or(
- eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_non_wasm.containsChange'], true),
+ eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_non_mono_and_wasm.containsChange'], true),
eq(variables['isRollingBuild'], true))
#
- # Build Libraries AllConfigurations. This exercises the code path where we build libraries for all
- # configurations on a non Windows operating system.
+ # Build native assets on Alpine. This exercises more modern musl libc changes that have a tendendy to break source-build.
+ # We don't add this as a source-build job as the repo source-build infrastructure isn't set up to run on alpine effectively.
#
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/common/global-build-job.yml
- buildConfig: debug
+ buildConfig: release
platforms:
- - linux_x64_dev_innerloop
+ - linux_musl_x64_dev_innerloop
jobParameters:
- nameSuffix: Libraries_AllConfigurations
- buildArgs: -subset libs -allconfigurations
+ nameSuffix: Musl_Validation
+ buildArgs: -subset clr.native+libs.native+host.native -c $(_BuildConfig)
timeoutInMinutes: 120
condition:
or(
@@ -163,16 +120,11 @@ extends:
eq(variables['isRollingBuild'], true))
#
- # SourceBuild Build
+ # Build Portable SourceBuild
#
- - template: /eng/pipelines/common/platform-matrix.yml
+ - template: /eng/common/templates/jobs/source-build.yml
parameters:
- jobTemplate: /eng/pipelines/common/global-build-job.yml
- buildConfig: Release
platforms:
- - SourceBuild_linux_x64
- jobParameters:
- nameSuffix: PortableSourceBuild
- timeoutInMinutes: 95
- condition:
- eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_non_mono_and_wasm.containsChange'], true)
+ - name: Linux_x64
+ targetRid: linux-x64
+ container: SourceBuild_linux_x64
diff --git a/eng/pipelines/libraries/execute-trimming-tests-steps.yml b/eng/pipelines/libraries/execute-trimming-tests-steps.yml
index 567abab0bb98..13778ee0ab63 100644
--- a/eng/pipelines/libraries/execute-trimming-tests-steps.yml
+++ b/eng/pipelines/libraries/execute-trimming-tests-steps.yml
@@ -1,8 +1,14 @@
parameters:
archType: ''
extraTestArgs: ''
+ runAotTests: true
steps:
# Execute tests
- script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -ci -arch ${{ parameters.archType }} $(_osParameter) -s libs.tests -c $(_BuildConfig) $(crossArg) /p:TestAssemblies=false /p:TestTrimming=true $(_officialBuildParameter) /bl:$(Build.SourcesDirectory)/artifacts/log/$(buildConfigUpper)/TrimmingTests.binlog ${{ parameters.extraTestArgs }}
displayName: Run Trimming Tests
+
+ # Execute AOT test app tests
+ - ${{ if eq(parameters.runAotTests, true) }}:
+ - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -ci -arch ${{ parameters.archType }} $(_osParameter) -s libs.tests -c $(_BuildConfig) $(crossArg) /p:TestAssemblies=false /p:RunNativeAotTestApps=true $(_officialBuildParameter) /bl:$(Build.SourcesDirectory)/artifacts/log/$(buildConfigUpper)/NativeAotTestAppTests.binlog ${{ parameters.extraTestArgs }}
+ displayName: Run Native AOT Test App Tests
diff --git a/eng/pipelines/libraries/fuzzing/deploy-to-onefuzz.yml b/eng/pipelines/libraries/fuzzing/deploy-to-onefuzz.yml
new file mode 100644
index 000000000000..a26558ee148f
--- /dev/null
+++ b/eng/pipelines/libraries/fuzzing/deploy-to-onefuzz.yml
@@ -0,0 +1,107 @@
+trigger: none
+
+schedules:
+- cron: "0 10 * * *" # 10 AM UTC
+ displayName: OneFuzz deployment nightly run
+ branches:
+ include:
+ - main
+
+variables:
+ - template: ../variables.yml
+ - name: fuzzerProject
+ value: $(Build.SourcesDirectory)/src/libraries/Fuzzing/DotnetFuzzing
+ - name: dotnetPath
+ value: $(Build.SourcesDirectory)/.dotnet/dotnet
+
+extends:
+ template: /eng/pipelines/common/templates/pipeline-with-resources.yml
+ parameters:
+ stages:
+ - stage: Build
+ jobs:
+ - job: windows
+ displayName: Build & Deploy to OneFuzz
+ timeoutInMinutes: 120
+ pool:
+ name: $(DncEngInternalBuildPool)
+ demands: ImageOverride -equals windows.vs2022.amd64
+
+ steps:
+ - checkout: self
+ clean: true
+ fetchDepth: 1
+ lfs: false
+
+ - powershell: |
+ cd $(Build.SourcesDirectory)
+ ./build.cmd clr+libs+packs+host -rc Checked -c Debug
+ displayName: Build runtime (checked + debug)
+
+ - powershell: |
+ cd $(fuzzerProject)
+ $(dotnetPath) publish -o publish
+ displayName: Build Fuzzing targets
+
+ - powershell: |
+ cd $(fuzzerProject)
+ $(dotnetPath) tool install --tool-path . SharpFuzz.CommandLine
+ displayName: Install SharpFuzz.CommandLine
+
+ - powershell: |
+ cd $(fuzzerProject)
+ publish/DotnetFuzzing.exe prepare-onefuzz deployment
+ displayName: Prepare OneFuzz deployment
+
+# OneFuzz can't currently handle a single deployment where multiple jobs share similar assemblies/pdbs.
+# As a workaround, we emit a task for every fuzzing target individually.
+# https://fuzzfest.visualstudio.com/Onefuzz/_workitems/edit/191504/ is tracking this issue.
+# - task: onefuzz-task@0
+# inputs:
+# onefuzzOSes: 'Windows'
+# env:
+# onefuzzDropDirectory: $(fuzzerProject)/deployment
+# SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+# displayName: Send to OneFuzz
+
+# ONEFUZZ_TASK_WORKAROUND_START
+ - task: onefuzz-task@0
+ inputs:
+ onefuzzOSes: 'Windows'
+ env:
+ onefuzzDropDirectory: $(fuzzerProject)/deployment/HttpHeadersFuzzer
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ displayName: Send HttpHeadersFuzzer to OneFuzz
+
+ - task: onefuzz-task@0
+ inputs:
+ onefuzzOSes: 'Windows'
+ env:
+ onefuzzDropDirectory: $(fuzzerProject)/deployment/JsonDocumentFuzzer
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ displayName: Send JsonDocumentFuzzer to OneFuzz
+
+ - task: onefuzz-task@0
+ inputs:
+ onefuzzOSes: 'Windows'
+ env:
+ onefuzzDropDirectory: $(fuzzerProject)/deployment/SearchValuesByteCharFuzzer
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ displayName: Send SearchValuesByteCharFuzzer to OneFuzz
+
+ - task: onefuzz-task@0
+ inputs:
+ onefuzzOSes: 'Windows'
+ env:
+ onefuzzDropDirectory: $(fuzzerProject)/deployment/SearchValuesStringFuzzer
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ displayName: Send SearchValuesStringFuzzer to OneFuzz
+
+ - task: onefuzz-task@0
+ inputs:
+ onefuzzOSes: 'Windows'
+ env:
+ onefuzzDropDirectory: $(fuzzerProject)/deployment/UTF8Fuzzer
+ SYSTEM_ACCESSTOKEN: $(System.AccessToken)
+ displayName: Send UTF8Fuzzer to OneFuzz
+# ONEFUZZ_TASK_WORKAROUND_END
diff --git a/eng/pipelines/libraries/helix-queues-setup.yml b/eng/pipelines/libraries/helix-queues-setup.yml
index cb52e5acf042..91fe25701b07 100644
--- a/eng/pipelines/libraries/helix-queues-setup.yml
+++ b/eng/pipelines/libraries/helix-queues-setup.yml
@@ -146,7 +146,6 @@ jobs:
- ${{ if notIn(parameters.jobParameters.framework, 'net48') }}:
# mono outerloop
- ${{ if and(eq(parameters.jobParameters.testScope, 'outerloop'), eq(parameters.jobParameters.runtimeFlavor, 'mono')) }}:
- - Windows.7.Amd64.Open
- Windows.11.Amd64.Client.Open
# libraries on coreclr (outerloop and innerloop), or libraries on mono innerloop
- ${{ if or(ne(parameters.jobParameters.testScope, 'outerloop'), ne(parameters.jobParameters.runtimeFlavor, 'mono')) }}:
@@ -155,7 +154,6 @@ jobs:
- Windows.Amd64.Server2022.Open
- ${{ if or(ne(parameters.jobParameters.isExtraPlatformsBuild, true), eq(parameters.jobParameters.includeAllPlatforms, true)) }}:
- Windows.Amd64.Server2022.Open
- - Windows.7.Amd64.Open
# .NETFramework
- ${{ if eq(parameters.jobParameters.framework, 'net48') }}:
diff --git a/eng/pipelines/libraries/outerloop-mono.yml b/eng/pipelines/libraries/outerloop-mono.yml
index 34b1af3c71b5..b9d4bcfecd7b 100644
--- a/eng/pipelines/libraries/outerloop-mono.yml
+++ b/eng/pipelines/libraries/outerloop-mono.yml
@@ -65,7 +65,7 @@ extends:
- template: /eng/pipelines/libraries/helix.yml
parameters:
scenarios:
- - normal
+ - WasmTestOnV8
testScope: outerloop
creator: dotnet-bot
testRunNamePrefixSuffix: Mono_$(_BuildConfig)
diff --git a/eng/pipelines/mono/templates/generate-offsets.yml b/eng/pipelines/mono/templates/generate-offsets.yml
deleted file mode 100644
index 8d8d781dd326..000000000000
--- a/eng/pipelines/mono/templates/generate-offsets.yml
+++ /dev/null
@@ -1,88 +0,0 @@
-parameters:
- buildConfig: 'Debug'
- osGroup: ''
- osSubGroup: ''
- platform: ''
- container: ''
- timeoutInMinutes: ''
- variables: {}
- pool: ''
- condition: true
- isOfficialBuild: false
- templatePath: 'templates'
-
-### Product build
-jobs:
-- template: /eng/pipelines/common/templates/runtimes/xplat-job.yml
- parameters:
- templatePath: ${{ parameters.templatePath }}
- buildConfig: ${{ parameters.buildConfig }}
- osGroup: ${{ parameters.osGroup }}
- osSubGroup: ${{ parameters.osSubGroup }}
- helixType: 'build/product/'
- enableMicrobuild: true
- pool: ${{ parameters.pool }}
- condition: ${{ parameters.condition }}
- dependOnEvaluatePaths: ${{ parameters.dependOnEvaluatePaths }}
- logsName: 'BuildLogs_Attempt$(System.JobAttempt)_Mono_Offsets_$(osGroup)$(osSubGroup)'
-
- # Compute job name from template parameters
- name: ${{ format('mono_{0}{1}_offsets', parameters.osGroup, parameters.osSubGroup) }}
- displayName: ${{ format('Mono {0}{1} AOT offsets', parameters.osGroup, parameters.osSubGroup) }}
-
- # Run all steps in the container.
- # Note that the containers are defined in platform-matrix.yml
- container: ${{ parameters.container }}
-
- timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
-
- gatherAssetManifests: true
- variables:
- - name: osGroup
- value: ${{ parameters.osGroup }}
- - name: osSubGroup
- value: ${{ parameters.osSubGroup }}
- - name: officialBuildIdArg
- value: ''
- - ${{ if eq(parameters.isOfficialBuild, true) }}:
- - name: officialBuildIdArg
- value: '/p:OfficialBuildId=$(Build.BuildNumber)'
- - name: osOverride
- value: -os linux
- - name: archType
- value: x64
- - ${{ parameters.variables }}
-
- steps:
-
- # Install native dependencies
- # Linux builds use docker images with dependencies preinstalled,
- # and FreeBSD builds use a build agent with dependencies
- # preinstalled, so we only need this step for OSX and Windows.
- - ${{ if in(parameters.osGroup, 'osx', 'maccatalyst', 'ios', 'iossimulator', 'tvos', 'tvossimulator') }}:
- - script: $(Build.SourcesDirectory)/eng/install-native-dependencies.sh $(osGroup)
- displayName: Install native dependencies
-
- # Build
- - ${{ if ne(parameters.osGroup, 'windows') }}:
- - script: ./build$(scriptExt) -subset mono.aotcross -c $(buildConfig) -arch $(archType) $(osOverride) -ci $(officialBuildIdArg) /p:MonoGenerateOffsetsOSGroups=$(osGroup)
- displayName: Generate AOT offsets
- - ${{ if eq(parameters.osGroup, 'windows') }}:
- - script: build$(scriptExt) -subset mono.aotcross -c $(buildConfig) -arch $(archType) $(osOverride) -ci $(officialBuildIdArg) /p:MonoGenerateOffsetsOSGroups=$(osGroup)
- displayName: Generate AOT offsets
-
- # Upload offset files
- - task: CopyFiles@2
- displayName: Collect offset files
- inputs:
- sourceFolder: '$(Build.SourcesDirectory)/artifacts/obj/mono/'
- contents: '**/offsets-*.h'
- targetFolder: '$(Build.SourcesDirectory)/artifacts/obj/mono/offsetfiles/'
-
- - template: /eng/pipelines/common/templates/publish-pipeline-artifacts.yml
- parameters:
- displayName: Upload offset files
- isOfficialBuild: ${{ parameters.isOfficialBuild }}
- inputs:
- targetPath: '$(Build.SourcesDirectory)/artifacts/obj/mono/offsetfiles'
- artifactName: 'Mono_Offsets_$(osGroup)$(osSubGroup)'
diff --git a/eng/pipelines/mono/templates/workloads-build.yml b/eng/pipelines/mono/templates/workloads-build.yml
deleted file mode 100644
index 72e4c3adc8fb..000000000000
--- a/eng/pipelines/mono/templates/workloads-build.yml
+++ /dev/null
@@ -1,116 +0,0 @@
-parameters:
- archType: ''
- buildConfig: ''
- container: ''
- dependsOn: []
- isOfficialBuild: false
- osGroup: ''
- osSubgroup: ''
- platform: ''
- pool: ''
- runtimeVariant: ''
- testGroup: ''
- timeoutInMinutes: ''
- templatePath: 'templates'
- variables: {}
-
-jobs:
-- template: /eng/pipelines/common/templates/runtimes/xplat-job.yml
- parameters:
- templatePath: ${{ parameters.templatePath }}
- archType: ${{ parameters.archType }}
- buildConfig: ${{ parameters.buildConfig }}
- container: ${{ parameters.container }}
- condition: and(succeeded(), ${{ parameters.isOfficialBuild }})
- helixType: 'build/product/'
- osGroup: ${{ parameters.osGroup }}
- osSubgroup: ${{ parameters.osSubgroup }}
- pool: ${{ parameters.pool }}
- runtimeVariant: ${{ parameters.runtimeVariant }}
- timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
- logsName: WorkloadLogs_Attempt$(System.JobAttempt)
-
- dependsOn: ${{ parameters.dependsOn }}
-
- name: workloadsbuild
- displayName: Build Workloads
-
- variables:
- - name: officialBuildIdArg
- value: ''
- - ${{ if eq(parameters.isOfficialBuild, true) }}:
- - name: officialBuildIdArg
- value: '/p:OfficialBuildId=$(Build.BuildNumber)'
- - name: SignType
- value: $[ coalesce(variables.OfficialSignType, 'real') ]
- - name: workloadPackagesPath
- value: $(Build.SourcesDirectory)/artifacts/workloadPackages
- - name: workloadArtifactsPath
- value: $(Build.SourcesDirectory)/artifacts/workloads
- - ${{ parameters.variables }}
-
- steps:
- - task: DownloadPipelineArtifact@2
- inputs:
- artifact: 'IntermediateArtifacts'
- path: $(workloadPackagesPath)
- patterns: |
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-arm64.Cross.android-*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-arm64.Cross.browser-wasm*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.wasi-wasm*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-arm64.Cross.wasi-wasm*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.android-*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.browser-wasm*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.multithread.browser-wasm*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.ios-*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.iossimulator-*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.maccatalyst-*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.multithread.browser-wasm*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.tvos-*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.tvossimulator-*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.wasi-wasm*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Workload.Mono.ToolChain.Current.Manifest*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Workload.Mono.ToolChain.net6.Manifest*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Workload.Mono.ToolChain.net7.Manifest*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Workload.Mono.ToolChain.net8.Manifest*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.MonoTargets.Sdk*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.MonoAOTCompiler.Task*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.WebAssembly.Sdk*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.WebAssembly.Wasi*.nupkg
- IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.WebAssembly.Templates*.nupkg
- IntermediateArtifacts/windows_arm64/Shipping/Microsoft.NETCore.App.Runtime.win-arm64*.nupkg
- IntermediateArtifacts/windows_x64/Shipping/Microsoft.NETCore.App.Runtime.win-x64*.nupkg
- IntermediateArtifacts/windows_x86/Shipping/Microsoft.NETCore.App.Runtime.win-x86*.nupkg
-
- - task: CopyFiles@2
- displayName: Flatten packages
- inputs:
- sourceFolder: $(workloadPackagesPath)
- contents: '*/Shipping/*.nupkg'
- cleanTargetFolder: false
- targetFolder: $(workloadPackagesPath)
- flattenFolders: true
-
- - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -subset mono.workloads -arch $(archType) -c $(buildConfig) $(officialBuildIdArg) -ci
- displayName: Build workload artifacts
-
- # Upload packages wrapping msis
- - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- parameters:
- name: workloads
-
- # Delete wixpdb files before they are uploaded to artifacts
- - task: DeleteFiles@1
- displayName: Delete wixpdb's
- inputs:
- SourceFolder: $(workloadArtifactsPath)
- Contents: '*.wixpdb'
-
- # Upload artifacts to be used for generating VS components
- - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- parameters:
- name: workloads-vs
- publishPackagesCondition: false
- publishVSSetupCondition: true
diff --git a/eng/pipelines/official/jobs/prepare-signed-artifacts.yml b/eng/pipelines/official/jobs/prepare-signed-artifacts.yml
index 24fd2df48d74..eb25d311890a 100644
--- a/eng/pipelines/official/jobs/prepare-signed-artifacts.yml
+++ b/eng/pipelines/official/jobs/prepare-signed-artifacts.yml
@@ -1,76 +1,65 @@
parameters:
- dependsOn: []
PublishRidAgnosticPackagesFromPlatform: ''
isOfficialBuild: false
logArtifactName: 'Logs-PrepareSignedArtifacts_Attempt$(System.JobAttempt)'
jobs:
-- job: PrepareSignedArtifacts
- displayName: Prepare Signed Artifacts
- dependsOn: ${{ parameters.dependsOn }}
- pool:
- name: $(DncEngInternalBuildPool)
- demands: ImageOverride -equals 1es-windows-2022
- # Double the default timeout.
- timeoutInMinutes: 240
- workspace:
- clean: all
+- template: /eng/common/templates-official/job/job.yml
+ parameters:
+ name: 'PrepareSignedArtifacts'
+ displayName: 'Prepare Signed Artifacts'
- variables:
- - name: SignType
- value: $[ coalesce(variables.OfficialSignType, 'real') ]
+ pool:
+ name: $(DncEngInternalBuildPool)
+ demands: ImageOverride -equals 1es-windows-2022
- templateContext:
- outputs:
- - output: pipelineArtifact
- displayName: 'Publish BuildLogs'
- condition: succeededOrFailed()
- targetPath: '$(Build.StagingDirectory)\BuildLogs'
- artifactName: ${{ parameters.logArtifactName }}
+ # Double the default timeout.
+ timeoutInMinutes: 240
- steps:
- - checkout: self
- clean: true
- fetchDepth: 20
+ workspace:
+ clean: all
- - ${{ if eq(parameters.isOfficialBuild, true) }}:
- - task: NuGetAuthenticate@1
+ enableMicrobuild: true
- - task: MicroBuildSigningPlugin@2
- displayName: Install MicroBuild plugin for Signing
- inputs:
- signType: $(SignType)
- zipSources: false
- feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json
- continueOnError: false
- condition: and(succeeded(),
- in(variables['SignType'], 'real', 'test'))
-
- - task: DownloadBuildArtifacts@0
- displayName: Download IntermediateArtifacts
- inputs:
- artifactName: IntermediateArtifacts
- downloadPath: $(Build.SourcesDirectory)\artifacts\PackageDownload
- checkDownloadedFiles: true
-
- - script: >-
- build.cmd -ci
- -subset publish
- -configuration Release
- /p:PublishRidAgnosticPackagesFromPlatform=${{ parameters.PublishRidAgnosticPackagesFromPlatform }}
- /p:OfficialBuildId=$(Build.BuildNumber)
- /p:SignType=$(SignType)
- /p:DotNetSignType=$(SignType)
- /bl:$(Build.SourcesDirectory)\prepare-artifacts.binlog
- displayName: Prepare artifacts and upload to build
-
- - task: CopyFiles@2
- displayName: Copy Files to $(Build.StagingDirectory)\BuildLogs
- inputs:
- SourceFolder: '$(Build.SourcesDirectory)'
- Contents: |
- **/*.log
- **/*.binlog
- TargetFolder: '$(Build.StagingDirectory)\BuildLogs'
- continueOnError: true
- condition: succeededOrFailed()
\ No newline at end of file
+ variables:
+ - name: '_SignType'
+ value: $[ coalesce(variables.OfficialSignType, 'real') ]
+
+ templateContext:
+ inputs:
+ - input: checkout
+ repository: self
+ clean: true
+ fetchDepth: 20
+ - input: pipelineArtifact
+ artifactName: IntermediateArtifacts
+ targetPath: $(Build.SourcesDirectory)\artifacts\PackageDownload\IntermediateArtifacts
+ outputs:
+ - output: pipelineArtifact
+ displayName: 'Publish BuildLogs'
+ condition: succeededOrFailed()
+ targetPath: '$(Build.StagingDirectory)\BuildLogs'
+ artifactName: ${{ parameters.logArtifactName }}
+
+ steps:
+ - script: >-
+ build.cmd -ci
+ -subset publish
+ -configuration Release
+ /p:PublishRidAgnosticPackagesFromPlatform=${{ parameters.PublishRidAgnosticPackagesFromPlatform }}
+ /p:OfficialBuildId=$(Build.BuildNumber)
+ /p:SignType=$(_SignType)
+ /p:DotNetSignType=$(_SignType)
+ /bl:$(Build.SourcesDirectory)\prepare-artifacts.binlog
+ displayName: Prepare artifacts and upload to build
+
+ - task: CopyFiles@2
+ displayName: Copy Files to $(Build.StagingDirectory)\BuildLogs
+ inputs:
+ SourceFolder: '$(Build.SourcesDirectory)'
+ Contents: |
+ **/*.log
+ **/*.binlog
+ TargetFolder: '$(Build.StagingDirectory)\BuildLogs'
+ continueOnError: true
+ condition: succeededOrFailed()
\ No newline at end of file
diff --git a/eng/pipelines/runtime-codeql.yml b/eng/pipelines/runtime-codeql.yml
index 9eff98fef5ab..599622f88f62 100644
--- a/eng/pipelines/runtime-codeql.yml
+++ b/eng/pipelines/runtime-codeql.yml
@@ -47,7 +47,12 @@ extends:
nameSuffix: AllSubsets_CoreCLR
isOfficialBuild: ${{ variables.isOfficialBuild }}
timeoutInMinutes: 360
- isManualCodeQLBuild: true
+ preBuildSteps:
+ - task: CodeQL3000Init@0
+ displayName: Initialize CodeQL (manually-injected)
+ postBuildSteps:
+ - task: CodeQL3000Finalize@0
+ displayName: Finalize CodeQL (manually-injected)
#
# Build Mono runtime packs
@@ -65,4 +70,9 @@ extends:
nameSuffix: AllSubsets_Mono
isOfficialBuild: ${{ variables.isOfficialBuild }}
timeoutInMinutes: 360
- isManualCodeQLBuild: true
+ preBuildSteps:
+ - task: CodeQL3000Init@0
+ displayName: Initialize CodeQL (manually-injected)
+ postBuildSteps:
+ - task: CodeQL3000Finalize@0
+ displayName: Finalize CodeQL (manually-injected)
diff --git a/eng/pipelines/runtime-linker-tests.yml b/eng/pipelines/runtime-linker-tests.yml
index aec5e1057ac5..2b001b769f50 100644
--- a/eng/pipelines/runtime-linker-tests.yml
+++ b/eng/pipelines/runtime-linker-tests.yml
@@ -135,3 +135,4 @@ extends:
- template: /eng/pipelines/libraries/execute-trimming-tests-steps.yml
parameters:
extraTestArgs: '/p:WasmBuildNative=false'
+ runAotTests: false
diff --git a/eng/pipelines/runtime-official.yml b/eng/pipelines/runtime-official.yml
index ba09a957605e..cf856d94df61 100644
--- a/eng/pipelines/runtime-official.yml
+++ b/eng/pipelines/runtime-official.yml
@@ -23,6 +23,8 @@ pr: none
variables:
- template: /eng/pipelines/common/variables.yml
+ parameters:
+ templatePath: 'templates-official'
- template: /eng/pipelines/common/internal-variables.yml
parameters:
teamName: dotnet-core-acquisition
@@ -379,11 +381,12 @@ extends:
parameters:
name: MonoRuntimePacks
+
# Build Mono AOT offset headers once, for consumption elsewhere
#
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
- jobTemplate: /eng/pipelines/mono/templates/generate-offsets.yml
+ jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms:
- android_x64
@@ -392,9 +395,31 @@ extends:
- tvos_arm64
- ios_arm64
- maccatalyst_x64
+ variables:
+ - name: _osParameter
+ value: -os linux
+ - name: _archParameter
+ value: -arch x64
jobParameters:
templatePath: 'templates-official'
- isOfficialBuild: ${{ variables.isOfficialBuild }}
+ nameSuffix: MonoAOTOffsets
+ buildArgs: -s mono.aotcross -c $(_BuildConfig) /p:MonoGenerateOffsetsOSGroups=$(osGroup)
+ postBuildSteps:
+ # Upload offset files
+ - task: CopyFiles@2
+ displayName: Collect offset files
+ inputs:
+ sourceFolder: '$(Build.SourcesDirectory)/artifacts/obj/mono/'
+ contents: '**/offsets-*.h'
+ targetFolder: '$(Build.SourcesDirectory)/artifacts/obj/mono/offsetfiles/'
+
+ templateContext:
+ outputs:
+ - output: pipelineArtifact
+ displayName: 'Publish Mono AOT offsets'
+ condition: succeeded()
+ targetPath: '$(Build.SourcesDirectory)/artifacts/obj/mono/offsetfiles'
+ artifactName: 'Mono_Offsets_$(osGroup)$(osSubGroup)'
#
# Build Mono release AOT cross-compilers
@@ -416,9 +441,9 @@ extends:
nameSuffix: CrossAOT_Mono
runtimeVariant: crossaot
dependsOn:
- - mono_android_offsets
- - mono_browser_offsets
- - mono_wasi_offsets
+ - build_android_x64_release_MonoAOTOffsets
+ - build_browser_wasm_linux_release_MonoAOTOffsets
+ - build_wasi_wasm_linux_release_MonoAOTOffsets
monoCrossAOTTargetOS:
- android
- browser
@@ -444,9 +469,9 @@ extends:
nameSuffix: CrossAOT_Mono
runtimeVariant: crossaot
dependsOn:
- - mono_android_offsets
- - mono_browser_offsets
- - mono_wasi_offsets
+ - build_android_x64_release_MonoAOTOffsets
+ - build_browser_wasm_linux_release_MonoAOTOffsets
+ - build_wasi_wasm_linux_release_MonoAOTOffsets
monoCrossAOTTargetOS:
- android
- browser
@@ -472,12 +497,12 @@ extends:
nameSuffix: CrossAOT_Mono
runtimeVariant: crossaot
dependsOn:
- - mono_android_offsets
- - mono_browser_offsets
- - mono_wasi_offsets
- - mono_tvos_offsets
- - mono_ios_offsets
- - mono_maccatalyst_offsets
+ - build_android_x64_release_MonoAOTOffsets
+ - build_browser_wasm_linux_release_MonoAOTOffsets
+ - build_wasi_wasm_linux_release_MonoAOTOffsets
+ - build_tvos_arm64_release_MonoAOTOffsets
+ - build_ios_arm64_release_MonoAOTOffsets
+ - build_maccatalyst_x64_release_MonoAOTOffsets
monoCrossAOTTargetOS:
- android
- browser
@@ -560,22 +585,12 @@ extends:
#
# Build SourceBuild packages
#
- - template: /eng/pipelines/common/platform-matrix.yml
+ - template: /eng/common/templates-official/jobs/source-build.yml
parameters:
- jobTemplate: /eng/pipelines/common/global-build-job.yml
- buildConfig: Release
- helixQueueGroup: ci
platforms:
- - SourceBuild_linux_x64
- jobParameters:
- templatePath: 'templates-official'
- nameSuffix: PortableSourceBuild
- isOfficialBuild: ${{ variables.isOfficialBuild }}
- postBuildSteps:
- - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
- parameters:
- name: SourceBuildPackages
- timeoutInMinutes: 95
+ - name: Linux_x64
+ targetRid: linux-x64
+ container: SourceBuild_linux_x64
#
# Build PGO Instrumented CoreCLR Release
@@ -607,12 +622,80 @@ extends:
#
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
- jobTemplate: /eng/pipelines/mono/templates/workloads-build.yml
+ jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms:
- windows_x64
jobParameters:
templatePath: 'templates-official'
+ nameSuffix: Workloads
+ preBuildSteps:
+ - task: DownloadPipelineArtifact@2
+ inputs:
+ artifact: 'IntermediateArtifacts'
+ path: $(Build.SourcesDirectory)/artifacts/workloadPackages
+ patterns: |
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.android-*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-arm64.Cross.android-*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-arm64.Cross.browser-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.wasi-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.AOT.win-arm64.Cross.wasi-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.android-*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.browser-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.multithread.browser-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.ios-*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.iossimulator-*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.maccatalyst-*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.multithread.browser-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.tvos-*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.tvossimulator-*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NETCore.App.Runtime.Mono.wasi-wasm*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Workload.Mono.ToolChain.Current.Manifest*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Workload.Mono.ToolChain.net6.Manifest*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Workload.Mono.ToolChain.net7.Manifest*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Workload.Mono.ToolChain.net8.Manifest*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.MonoTargets.Sdk*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.MonoAOTCompiler.Task*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.WebAssembly.Sdk*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.WebAssembly.Wasi*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Runtime.WebAssembly.Templates*.nupkg
+ IntermediateArtifacts/windows_arm64/Shipping/Microsoft.NETCore.App.Runtime.win-arm64*.nupkg
+ IntermediateArtifacts/windows_x64/Shipping/Microsoft.NETCore.App.Runtime.win-x64*.nupkg
+ IntermediateArtifacts/windows_x86/Shipping/Microsoft.NETCore.App.Runtime.win-x86*.nupkg
+ IntermediateArtifacts/MonoRuntimePacks/Shipping/Microsoft.NET.Sdk.WebAssembly.Pack*.nupkg
+
+ - task: CopyFiles@2
+ displayName: Flatten packages
+ inputs:
+ sourceFolder: $(Build.SourcesDirectory)/artifacts/workloadPackages
+ contents: '*/Shipping/*.nupkg'
+ cleanTargetFolder: false
+ targetFolder: $(Build.SourcesDirectory)/artifacts/workloadPackages
+ flattenFolders: true
+
+ buildArgs: -s mono.workloads -c $(_BuildConfig) /p:PackageSource=$(Build.SourcesDirectory)/artifacts/workloadPackages /p:WorkloadOutputPath=$(Build.SourcesDirectory)/artifacts/workloads
+
+ postBuildSteps:
+ # Upload packages wrapping msis
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: workloads
+
+ # Delete wixpdb files before they are uploaded to artifacts
+ - task: DeleteFiles@1
+ displayName: Delete wixpdb's
+ inputs:
+ SourceFolder: $(Build.SourcesDirectory)/artifacts/workloads
+ Contents: '*.wixpdb'
+
+ # Upload artifacts to be used for generating VS components
+ - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
+ parameters:
+ name: workloads-vs
+ publishPackagesCondition: false
+ publishVSSetupCondition: always()
+
isOfficialBuild: ${{ variables.isOfficialBuild }}
timeoutInMinutes: 120
dependsOn:
diff --git a/eng/pipelines/runtime-sanitized.yml b/eng/pipelines/runtime-sanitized.yml
index ed0334b61b3e..329f9b9af9cd 100644
--- a/eng/pipelines/runtime-sanitized.yml
+++ b/eng/pipelines/runtime-sanitized.yml
@@ -28,7 +28,7 @@ extends:
buildConfig: Checked
runtimeFlavor: coreclr
platforms:
- - linux_x64
+ - linux_x64_sanitizer
- osx_x64
- windows_x64
variables:
@@ -63,7 +63,7 @@ extends:
buildConfig: Debug
runtimeFlavor: coreclr
platforms:
- - linux_x64
+ - linux_x64_sanitizer
- osx_x64
variables:
- name: _nativeSanitizersArg
@@ -123,7 +123,7 @@ extends:
helixQueuesTemplate: /eng/pipelines/coreclr/templates/helix-queues-setup.yml
buildConfig: release
platforms:
- - linux_x64
+ - linux_x64_sanitizer
- osx_x64
- windows_x64
variables:
@@ -133,7 +133,7 @@ extends:
testGroup: innerloop
timeoutInMinutes: 120
nameSuffix: NativeAOT
- buildArgs: -s clr.aot+host.native+libs -rc $(_BuildConfig) -lc Release -hc Release $(_nativeSanitizersArg)
+ buildArgs: -s clr.aot+libs -rc $(_BuildConfig) -lc Release $(_nativeSanitizersArg)
postBuildSteps:
- template: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
parameters:
diff --git a/eng/pipelines/runtime-wasm-perf.yml b/eng/pipelines/runtime-wasm-perf.yml
index 91e508e2c966..39645a501ecf 100644
--- a/eng/pipelines/runtime-wasm-perf.yml
+++ b/eng/pipelines/runtime-wasm-perf.yml
@@ -16,7 +16,7 @@ pr:
- eng/pipelines/coreclr/templates/run-perf*
- eng/pipelines/coreclr/templates/run-scenarios-job.yml
- eng/testing/performance/*
- - eng/testing/ChromeVersions.props
+ - eng/testing/BrowserVersions.props
variables:
- template: /eng/pipelines/common/variables.yml
diff --git a/eng/pipelines/runtime.yml b/eng/pipelines/runtime.yml
index 98dc5285250f..cb7aadde9fab 100644
--- a/eng/pipelines/runtime.yml
+++ b/eng/pipelines/runtime.yml
@@ -498,7 +498,7 @@ extends:
jobParameters:
testScope: innerloop
nameSuffix: CoreCLR_NonPortable
- buildArgs: -s clr.native+clr.tools+clr.corelib+clr.nativecorelib+clr.aot+clr.packages -c $(_BuildConfig) /p:PortableBuild=false
+ buildArgs: -s clr.native+clr.tools+clr.corelib+clr.nativecorelib+clr.aot+clr.packages --outputrid tizen.9.0.0-armel -c $(_BuildConfig) /p:PortableBuild=false
timeoutInMinutes: 120
condition: >-
or(
@@ -567,7 +567,7 @@ extends:
jobParameters:
timeoutInMinutes: 120
nameSuffix: NativeAOT
- buildArgs: -s clr.aot+host.native+libs -rc $(_BuildConfig) -lc Release -hc Release /p:RunAnalyzers=false
+ buildArgs: -s clr.aot+libs -rc $(_BuildConfig) -lc Release /p:RunAnalyzers=false
postBuildSteps:
- template: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
parameters:
@@ -606,7 +606,7 @@ extends:
jobParameters:
timeoutInMinutes: 180
nameSuffix: NativeAOT
- buildArgs: -s clr.aot+host.native+libs.native+libs.sfx -rc $(_BuildConfig) -lc Release -hc Release /p:RunAnalyzers=false
+ buildArgs: -s clr.aot+libs.native+libs.sfx -rc $(_BuildConfig) -lc Release /p:RunAnalyzers=false
postBuildSteps:
- template: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
parameters:
@@ -651,7 +651,7 @@ extends:
testGroup: innerloop
timeoutInMinutes: 120
nameSuffix: NativeAOT
- buildArgs: -s clr.aot+host.native+libs+tools.illink -c $(_BuildConfig) -rc $(_BuildConfig) -lc Release -hc Release /p:RunAnalyzers=false
+ buildArgs: -s clr.aot+libs+tools.illink -c $(_BuildConfig) -rc $(_BuildConfig) -lc Release /p:RunAnalyzers=false
postBuildSteps:
- template: /eng/pipelines/coreclr/nativeaot-post-build-steps.yml
parameters:
@@ -688,7 +688,7 @@ extends:
testGroup: innerloop
isSingleFile: true
nameSuffix: NativeAOT_Libraries
- buildArgs: -s clr.aot+host.native+libs+libs.tests -c $(_BuildConfig) /p:TestNativeAot=true /p:RunSmokeTestsOnly=true /p:ArchiveTests=true /p:RunAnalyzers=false
+ buildArgs: -s clr.aot+libs+libs.tests -c $(_BuildConfig) /p:TestNativeAot=true /p:RunSmokeTestsOnly=true /p:ArchiveTests=true /p:RunAnalyzers=false
timeoutInMinutes: 240 # Doesn't actually take long, but we've seen the ARM64 Helix queue often get backlogged for 2+ hours
# extra steps, run tests
postBuildSteps:
@@ -713,7 +713,7 @@ extends:
jobParameters:
timeoutInMinutes: 120
nameSuffix: CLR_Tools_Tests
- buildArgs: -s clr.aot+clr.iltools+libs.sfx+clr.toolstests -c $(_BuildConfig) -test
+ buildArgs: -s clr.aot+clr.iltools+libs.sfx+clr.toolstests+tools.cdacreadertests -c $(_BuildConfig) -test
enablePublishTestResults: true
testResultsFormat: 'xunit'
# We want to run AOT tests when illink changes because there's share code and tests from illink which are used by AOT
@@ -721,6 +721,7 @@ extends:
or(
eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_coreclr.containsChange'], true),
eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_tools_illink.containsChange'], true),
+ eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_tools_cdacreader.containsChange'], true),
eq(variables['isRollingBuild'], true))
#
# Build CrossDacs
@@ -753,8 +754,7 @@ extends:
#
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
- jobTemplate: /eng/pipelines/mono/templates/generate-offsets.yml
- templatePath: 'templates'
+ jobTemplate: /eng/pipelines/common/global-build-job.yml
buildConfig: release
platforms:
- android_x64
@@ -763,8 +763,26 @@ extends:
- tvos_arm64
- ios_arm64
- maccatalyst_x64
+ variables:
+ - name: _osParameter
+ value: -os linux
+ - name: _archParameter
+ value: -arch x64
jobParameters:
- isOfficialBuild: false
+ nameSuffix: MonoAOTOffsets
+ buildArgs: -s mono.aotcross -c $(_BuildConfig) /p:MonoGenerateOffsetsOSGroups=$(osGroup)
+ postBuildSteps:
+ # Upload offset files
+ - task: CopyFiles@2
+ displayName: Collect offset files
+ inputs:
+ sourceFolder: '$(Build.SourcesDirectory)/artifacts/obj/mono/'
+ contents: '**/offsets-*.h'
+ targetFolder: '$(Build.SourcesDirectory)/artifacts/obj/mono/offsetfiles/'
+
+ - publish: '$(Build.SourcesDirectory)/artifacts/obj/mono/offsetfiles'
+ artifact: Mono_Offsets_$(osGroup)$(osSubGroup)
+ displayName: Upload offset files
# needed by crossaot
condition: >-
or(
@@ -823,8 +841,9 @@ extends:
alwaysRun: ${{ variables.isRollingBuild }}
extraBuildArgs: /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS)
scenarios:
- - normal
- - WasmTestOnBrowser
+ - WasmTestOnV8
+ - WasmTestOnChrome
+ - WasmTestOnFirefox
- template: /eng/pipelines/common/templates/wasm-library-tests.yml
parameters:
@@ -833,7 +852,7 @@ extends:
alwaysRun: ${{ variables.isRollingBuild }}
extraBuildArgs: /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS)
scenarios:
- - WasmTestOnBrowser
+ - WasmTestOnChrome
# Library tests with full threading
- template: /eng/pipelines/common/templates/wasm-library-tests.yml
@@ -843,10 +862,12 @@ extends:
#- browser_wasm_win
nameSuffix: _Threading
extraBuildArgs: /p:WasmEnableThreads=true /p:AotHostArchitecture=x64 /p:AotHostOS=$(_hostedOS)
+ extraHelixArguments: /p:WasmEnableThreads=true
alwaysRun: ${{ variables.isRollingBuild }}
shouldRunSmokeOnly: onLibrariesAndIllinkChanges
scenarios:
- - WasmTestOnBrowser
+ - WasmTestOnChrome
+ - WasmTestOnFirefox
#- WasmTestOnNodeJS - this is not supported yet, https://github.com/dotnet/runtime/issues/85592
# EAT Library tests - only run on linux
@@ -867,7 +888,6 @@ extends:
- browser_wasm
- browser_wasm_win
- wasi_wasm
- - wasi_wasm_win
nameSuffix: _Smoke_AOT
runAOT: true
shouldRunSmokeOnly: true
@@ -935,7 +955,7 @@ extends:
shouldRunSmokeOnly: true
alwaysRun: ${{ variables.isRollingBuild }}
scenarios:
- - normal
+ - WasmTestOnWasmtime
- template: /eng/pipelines/common/templates/simple-wasm-build-tests.yml
parameters:
@@ -1009,7 +1029,7 @@ extends:
jobParameters:
testGroup: innerloop
nameSuffix: AllSubsets_Mono
- buildArgs: -s mono+libs+libs.tests+host+packs -c $(_BuildConfig) /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true /p:RunSmokeTestsOnly=true /p:BuildTestsOnHelix=true /p:EnableAdditionalTimezoneChecks=true /p:UsePortableRuntimePack=true /p:BuildDarwinFrameworks=true
+ buildArgs: -s mono+libs+libs.tests+host+packs -c $(_BuildConfig) /p:ArchiveTests=true /p:DevTeamProvisioning=- /p:RunAOTCompilation=true /p:RunSmokeTestsOnly=true /p:BuildTestsOnHelix=true /p:EnableAdditionalTimezoneChecks=true /p:UsePortableRuntimePack=true /p:BuildDarwinFrameworks=true /p:EnableAggressiveTrimming=true
timeoutInMinutes: 480
condition: >-
or(
@@ -1245,9 +1265,9 @@ extends:
nameSuffix: CrossAOT_Mono
runtimeVariant: crossaot
dependsOn:
- - mono_android_offsets
- - mono_browser_offsets
- - mono_wasi_offsets
+ - build_android_x64_release_MonoAOTOffsets
+ - build_browser_wasm_linux_release_MonoAOTOffsets
+ - build_wasi_wasm_linux_release_MonoAOTOffsets
monoCrossAOTTargetOS:
- android
- browser
@@ -1272,9 +1292,9 @@ extends:
nameSuffix: CrossAOT_Mono
runtimeVariant: crossaot
dependsOn:
- - mono_android_offsets
- - mono_browser_offsets
- - mono_wasi_offsets
+ - build_android_x64_release_MonoAOTOffsets
+ - build_browser_wasm_linux_release_MonoAOTOffsets
+ - build_wasi_wasm_linux_release_MonoAOTOffsets
monoCrossAOTTargetOS:
- android
- browser
@@ -1303,12 +1323,12 @@ extends:
nameSuffix: CrossAOT_Mono
runtimeVariant: crossaot
dependsOn:
- - mono_android_offsets
- - mono_browser_offsets
- - mono_wasi_offsets
- - mono_tvos_offsets
- - mono_ios_offsets
- - mono_maccatalyst_offsets
+ - build_android_x64_release_MonoAOTOffsets
+ - build_browser_wasm_linux_release_MonoAOTOffsets
+ - build_wasi_wasm_linux_release_MonoAOTOffsets
+ - build_tvos_arm64_release_MonoAOTOffsets
+ - build_ios_arm64_release_MonoAOTOffsets
+ - build_maccatalyst_x64_release_MonoAOTOffsets
monoCrossAOTTargetOS:
- android
- browser
@@ -1878,36 +1898,29 @@ extends:
eq(stageDependencies.EvaluatePaths.evaluate_paths.outputs['SetPathVars_mono_excluding_wasm.containsChange'], true),
eq(variables['isRollingBuild'], true))
- #
- # Sourcebuild legs
- # We have 3 important legs for source-build:
- # - Centos.8 (ensures that known non-portable RID is working)
- # - Linux-x64 portable (used for dependency flow and downstream PR verification)
- # - Banana.24 - Non-existent RID to ensure we don't break RIDs we don't know about.
- #
- # Running all of these everywhere is wasteful. Run Banana.24 and CentOS.8 in rolling CI,
- # Run Linux-x64 in PR.
-
- - template: /eng/pipelines/common/platform-matrix.yml
- parameters:
- jobTemplate: /eng/pipelines/common/global-build-job.yml
- buildConfig: Release
- helixQueueGroup: pr
- platforms:
- - SourceBuild_centos8_x64
- jobParameters:
- nameSuffix: centos8SourceBuild
- timeoutInMinutes: 95
- condition: eq(variables['isRollingBuild'], true)
-
- - template: /eng/pipelines/common/platform-matrix.yml
- parameters:
- jobTemplate: /eng/pipelines/common/global-build-job.yml
- buildConfig: Release
- helixQueueGroup: pr
- platforms:
- - SourceBuild_banana24_x64
- jobParameters:
- nameSuffix: banana24SourceBuild
- timeoutInMinutes: 95
- condition: eq(variables['isRollingBuild'], true)
+ - stage: SourceBuild
+ displayName: Source Build Validation
+ dependsOn: []
+ condition: eq(variables['isRollingBuild'], true)
+ jobs:
+ #
+ # Sourcebuild legs
+ # We have 3 important legs for source-build:
+ # - Centos.8 (ensures that known non-portable RID is working)
+ # - Linux-x64 portable (used for dependency flow and downstream PR verification)
+ # - Banana.24 - Non-existent RID to ensure we don't break RIDs we don't know about.
+ #
+ # Running all of these everywhere is wasteful. Run Banana.24 and CentOS.8 in rolling CI,
+ # Run Linux-x64 in PR.
+ - template: /eng/common/templates/jobs/source-build.yml
+ parameters:
+ platforms:
+ - name: CentOS8
+ targetRid: centos.8-x64
+ nonPortable: true
+ container: SourceBuild_centos_x64
+ - name: NonexistentRID
+ baseOS: linux
+ targetRid: banana.24-x64
+ nonPortable: true
+ container: SourceBuild_centos_x64
diff --git a/eng/pipelines/runtimelab.yml b/eng/pipelines/runtimelab.yml
index 3b71ae9475cd..e8bea9140f53 100644
--- a/eng/pipelines/runtimelab.yml
+++ b/eng/pipelines/runtimelab.yml
@@ -59,7 +59,7 @@ extends:
helixQueuesTemplate: /eng/pipelines/coreclr/templates/helix-queues-setup.yml
buildConfig: debug
platforms:
- - osx_x64
+ # - osx_x64 # Upstream break.
- windows_x64
- Browser_wasm_win
- wasi_wasm_win
diff --git a/eng/testing/BrowserVersions.props b/eng/testing/BrowserVersions.props
new file mode 100644
index 000000000000..08d0faffe037
--- /dev/null
+++ b/eng/testing/BrowserVersions.props
@@ -0,0 +1,16 @@
+
+
+ 125.0.6422.60
+ 1287751
+ https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/1287757
+ 12.5.227
+ 125.0.6422.60
+ 1287751
+ https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/1287751
+ 12.5.227
+ 125.0.1
+ 0.34.0
+ 125.0.1
+ 0.34.0
+
+
\ No newline at end of file
diff --git a/eng/testing/ChromeVersions.props b/eng/testing/ChromeVersions.props
deleted file mode 100644
index c919397b3a06..000000000000
--- a/eng/testing/ChromeVersions.props
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
- 123.0.6312.58
- 1262506
- https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/1262506
- 12.3.219
- 123.0.6312.58
- 1262506
- https://storage.googleapis.com/chromium-browser-snapshots/Win_x64/1262514
- 12.3.219
-
-
diff --git a/eng/testing/WasiRunnerAOTTemplate.sh b/eng/testing/WasiRunnerAOTTemplate.sh
deleted file mode 100644
index b45c553b67c5..000000000000
--- a/eng/testing/WasiRunnerAOTTemplate.sh
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/usr/bin/env bash
-
-# SetCommands defined in eng\testing\tests.wasm.targets
-[[SetCommands]]
-[[SetCommandsEcho]]
-
-EXECUTION_DIR=$(dirname $0)
-if [[ -n "$3" ]]; then
- SCENARIO=$3
-fi
-
-export PATH=$PREPEND_PATH:$PATH
-
-if [[ -z "$HELIX_WORKITEM_UPLOAD_ROOT" ]]; then
- XHARNESS_OUT="$EXECUTION_DIR/xharness-output"
-else
- XHARNESS_OUT="$HELIX_WORKITEM_UPLOAD_ROOT/xharness-output"
-fi
-
-if [[ -n "$XHARNESS_CLI_PATH" ]]; then
- # When running in CI, we only have the .NET runtime available
- # We need to call the XHarness CLI DLL directly via dotnet exec
- HARNESS_RUNNER="dotnet exec $XHARNESS_CLI_PATH"
-else
- HARNESS_RUNNER="dotnet xharness"
-fi
-
-if [[ -z "$XHARNESS_COMMAND" ]]; then
- XHARNESS_COMMAND="test"
-fi
-
-echo PATH=$PATH
-echo EXECUTION_DIR=$EXECUTION_DIR
-echo SCENARIO=$SCENARIO
-echo XHARNESS_OUT=$XHARNESS_OUT
-echo XHARNESS_CLI_PATH=$XHARNESS_CLI_PATH
-echo HARNESS_RUNNER=$HARNESS_RUNNER
-echo XHARNESS_COMMAND=$XHARNESS_COMMAND
-echo XHARNESS_ARGS=$XHARNESS_ARGS
-
-function _buildAOTFunc()
-{
- local projectFile=$1
- local binLog=$2
- shift 2
-
- time dotnet msbuild $projectFile /bl:$binLog $*
- local buildExitCode=$?
-
- echo "\n** Performance summary for the build **\n"
- dotnet msbuild $binLog -clp:PerformanceSummary -v:q -nologo
- if [[ "$(uname -s)" == "Linux" && $buildExitCode -ne 0 ]]; then
- echo "\nLast few messages from dmesg:\n"
- local lastLines=`dmesg | tail -n 20`
- echo $lastLines
-
- if [[ "$lastLines" =~ "oom-kill" ]]; then
- return 9200 # OOM
- fi
- fi
-
- echo
- echo
-
- if [[ $buildExitCode -ne 0 ]]; then
- return 9100 # aot build failure
- fi
-
- return 0
-}
-
-pushd $EXECUTION_DIR
-
-# ========================= BEGIN Test Execution =============================
-echo ----- start $(date) =============== To repro directly: =====================================================
-echo pushd $EXECUTION_DIR
-# RunCommands defined in eng\testing\tests.wasm.targets
-[[RunCommandsEcho]]
-echo popd
-echo ===========================================================================================================
-pushd $EXECUTION_DIR
-# RunCommands defined in eng\testing\tests.wasm.targets
-[[RunCommands]]
-_exitCode=$?
-popd
-echo ----- end $(date) ----- exit code $_exitCode ----------------------------------------------------------
-
-echo "XHarness artifacts: $XHARNESS_OUT"
-
-exit $_exitCode
diff --git a/eng/testing/WasiRunnerTemplate.sh b/eng/testing/WasiRunnerTemplate.sh
index 7a3752d32117..66e6731e03f2 100644
--- a/eng/testing/WasiRunnerTemplate.sh
+++ b/eng/testing/WasiRunnerTemplate.sh
@@ -47,6 +47,37 @@ echo HARNESS_RUNNER=$HARNESS_RUNNER
echo XHARNESS_COMMAND=$XHARNESS_COMMAND
echo XHARNESS_ARGS=$XHARNESS_ARGS
+function _buildAOTFunc()
+{
+ local projectFile=$1
+ local binLog=$2
+ shift 2
+
+ time dotnet msbuild $projectFile /bl:$binLog $*
+ local buildExitCode=$?
+
+ echo "\n** Performance summary for the build **\n"
+ dotnet msbuild $binLog -clp:PerformanceSummary -v:q -nologo
+ if [[ "$(uname -s)" == "Linux" && $buildExitCode -ne 0 ]]; then
+ echo "\nLast few messages from dmesg:\n"
+ local lastLines=`dmesg | tail -n 20`
+ echo $lastLines
+
+ if [[ "$lastLines" =~ "oom-kill" ]]; then
+ return 9200 # OOM
+ fi
+ fi
+
+ echo
+ echo
+
+ if [[ $buildExitCode -ne 0 ]]; then
+ return 9100 # aot build failure
+ fi
+
+ return 0
+}
+
pushd $EXECUTION_DIR
# ========================= BEGIN Test Execution =============================
diff --git a/eng/testing/WasmRunnerAOTTemplate.sh b/eng/testing/WasmRunnerAOTTemplate.sh
deleted file mode 100644
index 1e17a2a4770e..000000000000
--- a/eng/testing/WasmRunnerAOTTemplate.sh
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/usr/bin/env bash
-
-# SetCommands defined in eng\testing\tests.wasm.targets
-[[SetCommands]]
-[[SetCommandsEcho]]
-
-export PATH="$HOME/.jsvu/bin:$PATH"
-export PATH=$PREPEND_PATH:$PATH
-
-EXECUTION_DIR=$(dirname $0)
-if [[ -n "$3" ]]; then
- SCENARIO=$3
-fi
-
-if [[ -z "$HELIX_WORKITEM_UPLOAD_ROOT" ]]; then
- XHARNESS_OUT="$EXECUTION_DIR/xharness-output"
-else
- XHARNESS_OUT="$HELIX_WORKITEM_UPLOAD_ROOT/xharness-output"
-fi
-
-if [[ -n "$XHARNESS_CLI_PATH" ]]; then
- # When running in CI, we only have the .NET runtime available
- # We need to call the XHarness CLI DLL directly via dotnet exec
- HARNESS_RUNNER="dotnet exec $XHARNESS_CLI_PATH"
-else
- HARNESS_RUNNER="dotnet xharness"
-fi
-
-if [[ -z "$XHARNESS_COMMAND" ]]; then
- if [[ "$SCENARIO" == "WasmTestOnBrowser" || "$SCENARIO" == "wasmtestonbrowser" ]]; then
- XHARNESS_COMMAND="test-browser"
- else
- XHARNESS_COMMAND="test"
- fi
-fi
-
-if [[ "$XHARNESS_COMMAND" == "test" ]]; then
- if [[ -z "$JS_ENGINE_ARGS" ]]; then
- JS_ENGINE_ARGS="--engine-arg=--stack-trace-limit=1000"
- if [[ "$SCENARIO" != "WasmTestOnNodeJS" && "$SCENARIO" != "wasmtestonnodejs" ]]; then
- JS_ENGINE_ARGS="$JS_ENGINE_ARGS --engine-arg=--module"
- fi
- if [[ "$SCENARIO" == "WasmTestOnNodeJS" || "$SCENARIO" == "wasmtestonnodejs" ]]; then
- JS_ENGINE_ARGS="$JS_ENGINE_ARGS --engine-arg=--experimental-wasm-eh"
- fi
- fi
-
- if [[ -z "$MAIN_JS" ]]; then
- MAIN_JS="--js-file=test-main.js"
- fi
-
- if [[ -z "$JS_ENGINE" ]]; then
- if [[ "$SCENARIO" == "WasmTestOnNodeJS" || "$SCENARIO" == "wasmtestonnodejs" ]]; then
- JS_ENGINE="--engine=NodeJS"
- else
- JS_ENGINE="--engine=V8"
- if [[ -n "$V8_PATH_FOR_TESTS" ]]; then
- JS_ENGINE_ARGS="$JS_ENGINE_ARGS --js-engine-path=$V8_PATH_FOR_TESTS"
- fi
- fi
- fi
-fi
-
-if [[ -z "$XHARNESS_ARGS" ]]; then
- XHARNESS_ARGS="$JS_ENGINE $JS_ENGINE_ARGS $MAIN_JS"
-fi
-
-echo PATH=$PATH
-echo EXECUTION_DIR=$EXECUTION_DIR
-echo SCENARIO=$SCENARIO
-echo XHARNESS_OUT=$XHARNESS_OUT
-echo XHARNESS_CLI_PATH=$XHARNESS_CLI_PATH
-echo HARNESS_RUNNER=$HARNESS_RUNNER
-echo XHARNESS_COMMAND=$XHARNESS_COMMAND
-echo MAIN_JS=$MAIN_JS
-echo JS_ENGINE=$JS_ENGINE
-echo JS_ENGINE_ARGS=$JS_ENGINE_ARGS
-echo XHARNESS_ARGS=$XHARNESS_ARGS
-
-function _buildAOTFunc()
-{
- local projectFile=$1
- local binLog=$2
- shift 2
-
- time dotnet msbuild $projectFile /bl:$binLog $*
- local buildExitCode=$?
-
- echo "\n** Performance summary for the build **\n"
- dotnet msbuild $binLog -clp:PerformanceSummary -v:q -nologo
- if [[ "$(uname -s)" == "Linux" && $buildExitCode -ne 0 ]]; then
- echo "\nLast few messages from dmesg:\n"
- local lastLines=`dmesg | tail -n 20`
- echo $lastLines
-
- if [[ "$lastLines" =~ "oom-kill" ]]; then
- return 9200 # OOM
- fi
- fi
-
- echo
- echo
-
- if [[ $buildExitCode -ne 0 ]]; then
- return 9100 # aot build failure
- fi
-
- return 0
-}
-
-
-pushd $EXECUTION_DIR
-
-# ========================= BEGIN Test Execution =============================
-echo ----- start $(date) =============== To repro directly: =====================================================
-echo pushd $EXECUTION_DIR
-# RunCommands defined in eng\testing\tests.wasm.targets
-[[RunCommandsEcho]]
-echo popd
-echo ===========================================================================================================
-pushd $EXECUTION_DIR
-# RunCommands defined in eng\testing\tests.wasm.targets
-[[RunCommands]]
-_exitCode=$?
-popd
-echo ----- end $(date) ----- exit code $_exitCode ----------------------------------------------------------
-
-echo "XHarness artifacts: $XHARNESS_OUT"
-
-exit $_exitCode
diff --git a/eng/testing/WasmRunnerTemplate.cmd b/eng/testing/WasmRunnerTemplate.cmd
index f92cee17cc9d..e043ce7a34e9 100644
--- a/eng/testing/WasmRunnerTemplate.cmd
+++ b/eng/testing/WasmRunnerTemplate.cmd
@@ -27,10 +27,14 @@ if [%XHARNESS_CLI_PATH%] NEQ [] (
)
if [%XHARNESS_COMMAND%] == [] (
- if /I [%SCENARIO%]==[WasmTestOnBrowser] (
+ if /I [%SCENARIO%]==[WasmTestOnChrome] (
set XHARNESS_COMMAND=test-browser
) else (
- set XHARNESS_COMMAND=test
+ if /I [%SCENARIO%]==[WasmTestOnFirefox] (
+ set XHARNESS_COMMAND=test-browser
+ ) else (
+ set XHARNESS_COMMAND=test
+ )
)
)
@@ -56,11 +60,25 @@ if /I [%XHARNESS_COMMAND%] == [test] (
)
)
) else (
- if [%BROWSER_PATH%] == [] if not [%HELIX_CORRELATION_PAYLOAD%] == [] (
- set "BROWSER_PATH=--browser-path^=%HELIX_CORRELATION_PAYLOAD%\chrome-win\chrome.exe"
- )
- if [%JS_ENGINE_ARGS%] == [] (
- set "JS_ENGINE_ARGS=--browser-arg^=--js-flags^=--stack-trace-limit^=1000"
+ if /I [%SCENARIO%] == [WasmTestOnChrome] (
+ if [%BROWSER_PATH%] == [] if not [%HELIX_CORRELATION_PAYLOAD%] == [] (
+ set "BROWSER_PATH=--browser-path^=%HELIX_CORRELATION_PAYLOAD%\chrome-win\chrome.exe"
+ )
+ if [%JS_ENGINE_ARGS%] == [] (
+ set "JS_ENGINE_ARGS=--browser-arg^=--js-flags^=--stack-trace-limit^=1000"
+ )
+ ) else (
+ if /I [%SCENARIO%] == [WasmTestOnFirefox] (
+ if [%BROWSER_PATH%] == [] if not [%HELIX_CORRELATION_PAYLOAD%] == [] (
+ set "BROWSER_PATH=--browser-path^=%HELIX_CORRELATION_PAYLOAD%\firefox\firefox.exe"
+ )
+ if [%JS_ENGINE%] == [] (
+ set "JS_ENGINE=--browser^=Firefox"
+ )
+ if [%JS_ENGINE_ARGS%] == [] (
+ set "JS_ENGINE_ARGS=--browser-arg^=-private-window"
+ )
+ )
)
)
diff --git a/eng/testing/WasmRunnerTemplate.sh b/eng/testing/WasmRunnerTemplate.sh
index 4f5856546fc5..6cf4dc11d4be 100644
--- a/eng/testing/WasmRunnerTemplate.sh
+++ b/eng/testing/WasmRunnerTemplate.sh
@@ -26,7 +26,9 @@ else
fi
if [[ -z "$XHARNESS_COMMAND" ]]; then
- if [[ "$SCENARIO" == "WasmTestOnBrowser" || "$SCENARIO" == "wasmtestonbrowser" ]]; then
+ if [[ "$SCENARIO" == "WasmTestOnFirefox" || "$SCENARIO" == "wasmtestonfirefox" ]]; then
+ XHARNESS_COMMAND="test-browser"
+ elif [[ "$SCENARIO" == "WasmTestOnChrome" || "$SCENARIO" == "wasmtestonchrome" ]]; then
XHARNESS_COMMAND="test-browser"
else
XHARNESS_COMMAND="test"
@@ -59,8 +61,17 @@ if [[ "$XHARNESS_COMMAND" == "test" ]]; then
fi
fi
else
- if [[ -z "$JS_ENGINE_ARGS" ]]; then
- JS_ENGINE_ARGS="--browser-arg=--js-flags=--stack-trace-limit=1000"
+ if [[ "$SCENARIO" == "WasmTestOnChrome" || "$SCENARIO" == "wasmtestonchrome" ]]; then
+ if [[ -z "$JS_ENGINE_ARGS" ]]; then
+ JS_ENGINE_ARGS="--browser-arg=--js-flags=--stack-trace-limit=1000"
+ fi
+ elif [[ "$SCENARIO" == "WasmTestOnFirefox" || "$SCENARIO" == "wasmtestonfirefox" ]]; then
+ if [[ -z "$JS_ENGINE" ]]; then
+ JS_ENGINE="--browser=Firefox"
+ fi
+ if [[ -z "$JS_ENGINE_ARGS" ]]; then
+ JS_ENGINE_ARGS="--browser-arg=-private-window"
+ fi
fi
fi
@@ -88,6 +99,38 @@ echo JS_ENGINE=$JS_ENGINE
echo JS_ENGINE_ARGS=$JS_ENGINE_ARGS
echo XHARNESS_ARGS=$XHARNESS_ARGS
+function _buildAOTFunc()
+{
+ local projectFile=$1
+ local binLog=$2
+ shift 2
+
+ time dotnet msbuild $projectFile /bl:$binLog $*
+ local buildExitCode=$?
+
+ echo "\n** Performance summary for the build **\n"
+ dotnet msbuild $binLog -clp:PerformanceSummary -v:q -nologo
+ if [[ "$(uname -s)" == "Linux" && $buildExitCode -ne 0 ]]; then
+ echo "\nLast few messages from dmesg:\n"
+ local lastLines=`dmesg | tail -n 20`
+ echo $lastLines
+
+ if [[ "$lastLines" =~ "oom-kill" ]]; then
+ return 9200 # OOM
+ fi
+ fi
+
+ echo
+ echo
+
+ if [[ $buildExitCode -ne 0 ]]; then
+ return 9100 # aot build failure
+ fi
+
+ return 0
+}
+
+
pushd $EXECUTION_DIR
# ========================= BEGIN Test Execution =============================
diff --git a/eng/testing/bump-chrome-version.proj b/eng/testing/bump-chrome-version.proj
index 334e37bfd32b..77fc525f8c80 100644
--- a/eng/testing/bump-chrome-version.proj
+++ b/eng/testing/bump-chrome-version.proj
@@ -3,7 +3,7 @@
- $(RepositoryEngineeringDir)testing\ChromeVersions.props
+ $(RepositoryEngineeringDir)testing\BrowserVersions.props
$(RepositoryEngineeringDir)testing\bump-chrome-pr.env
diff --git a/eng/testing/helix-extension-example.targets b/eng/testing/helix-extension-example.targets
index e14095c07567..77b3490d5001 100644
--- a/eng/testing/helix-extension-example.targets
+++ b/eng/testing/helix-extension-example.targets
@@ -1,5 +1,5 @@
-
+
$(HelixExtensionTargets);_AddHelixCrypoItems
<_CryptoProjectName>System.Security.Cryptography.Tests
diff --git a/eng/testing/linker/SupportFiles/Directory.Build.props b/eng/testing/linker/SupportFiles/Directory.Build.props
index 5a54c83e5692..4e33801ab128 100644
--- a/eng/testing/linker/SupportFiles/Directory.Build.props
+++ b/eng/testing/linker/SupportFiles/Directory.Build.props
@@ -11,6 +11,7 @@
false
true
+ true
$(NoWarn);IL2121
diff --git a/eng/testing/linker/trimmingTests.props b/eng/testing/linker/trimmingTests.props
index b917cd5fe382..b822294a93d0 100644
--- a/eng/testing/linker/trimmingTests.props
+++ b/eng/testing/linker/trimmingTests.props
@@ -1,6 +1,8 @@
- $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'trimmingTests'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'trimmingTests'))
+ $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'aotTests'))
+
$([MSBuild]::NormalizeDirectory('$(TrimmingTestDir)', 'projects'))
$(MSBuildThisFileDirectory)project.csproj.template
true
diff --git a/eng/testing/linker/trimmingTests.targets b/eng/testing/linker/trimmingTests.targets
index 926bafa52cfe..7ff8fccc2c01 100644
--- a/eng/testing/linker/trimmingTests.targets
+++ b/eng/testing/linker/trimmingTests.targets
@@ -38,7 +38,13 @@
-
+ <_SkippedAppSourceFiles Include="@(TestConsoleAppSourceFiles)" Condition="$([System.String]::Copy('%(TestConsoleAppSourceFiles.SkipOnTestRuntimes)').Contains('$(PackageRID)'))" />
+
+ <_SkippedAppSourceFiles Include="@(TestConsoleAppSourceFiles)" Condition="'$(RunNativeAotTestApps)' == 'true' and '%(TestConsoleAppSourceFiles.NativeAotIncompatible)' == 'true'" />
+
+ <_AppSourceFiles Include="@(TestConsoleAppSourceFiles)" Exclude="@(_SkippedAppSourceFiles)" />
+
+
%(FullPath)
@@ -81,6 +87,9 @@
<_additionalPropertiesString>@(_propertiesAsItems->'<%(Identity)>%(Value)</%(Identity)>', '%0a ')
+
+
+
+ Properties="Configuration=$(Configuration);BuildProjectReferences=false;TargetOS=$(TargetOS);TargetArchitecture=$(TargetArchitecture);_IsPublishing=true" />
-
+
diff --git a/eng/testing/performance/performance-setup.sh b/eng/testing/performance/performance-setup.sh
index ff04015375a3..489b3a22cccd 100755
--- a/eng/testing/performance/performance-setup.sh
+++ b/eng/testing/performance/performance-setup.sh
@@ -451,7 +451,7 @@ if [[ -n "$wasm_bundle_directory" ]]; then
# get required version
if [[ -z "$v8_version" ]]; then
- v8_version=`grep linux_V8Version $source_directory/eng/testing/ChromeVersions.props | sed -e 's,.*>\([^\<]*\)<.*,\1,g' | cut -d. -f 1-3`
+ v8_version=`grep linux_V8Version $source_directory/eng/testing/BrowserVersions.props | sed -e 's,.*>\([^\<]*\)<.*,\1,g' | cut -d. -f 1-3`
echo "V8 version: $v8_version"
fi
if [[ -z "$javascript_engine_path" ]]; then
diff --git a/eng/testing/scenarios/BuildWasmAppsJobsList.txt b/eng/testing/scenarios/BuildWasmAppsJobsList.txt
index 5ccb34b25e18..11bfdab2c741 100644
--- a/eng/testing/scenarios/BuildWasmAppsJobsList.txt
+++ b/eng/testing/scenarios/BuildWasmAppsJobsList.txt
@@ -3,7 +3,7 @@ Wasm.Build.NativeRebuild.Tests.NoopNativeRebuildTest
Wasm.Build.NativeRebuild.Tests.OptimizationFlagChangeTests
Wasm.Build.NativeRebuild.Tests.ReferenceNewAssemblyRebuildTest
Wasm.Build.NativeRebuild.Tests.SimpleSourceChangeRebuildTest
-Wasm.Build.Templates.Tests.InterpPgoTests
+Wasm.Build.Tests.TestAppScenarios.InterpPgoTests
Wasm.Build.Templates.Tests.NativeBuildTests
Wasm.Build.Tests.Blazor.AppsettingsTests
Wasm.Build.Tests.Blazor.BuildPublishTests
@@ -17,6 +17,7 @@ Wasm.Build.Tests.Blazor.NoopNativeRebuildTest
Wasm.Build.Tests.Blazor.WorkloadRequiredTests
Wasm.Build.Tests.Blazor.IcuTests
Wasm.Build.Tests.Blazor.IcuShardingTests
+Wasm.Build.Tests.Blazor.SignalRClientTests
Wasm.Build.Tests.BuildPublishTests
Wasm.Build.Tests.ConfigSrcTests
Wasm.Build.Tests.HybridGlobalizationTests
@@ -36,8 +37,8 @@ Wasm.Build.Tests.TestAppScenarios.AppSettingsTests
Wasm.Build.Tests.TestAppScenarios.LazyLoadingTests
Wasm.Build.Tests.TestAppScenarios.LibraryInitializerTests
Wasm.Build.Tests.TestAppScenarios.SatelliteLoadingTests
-Wasm.Build.Tests.TestAppScenarios.DownloadResourceProgressTests
-Wasm.Build.Tests.TestAppScenarios.SignalRClientTests
+Wasm.Build.Tests.TestAppScenarios.ModuleConfigTests
+Wasm.Build.Tests.AspNetCore.SignalRClientTests
Wasm.Build.Tests.WasmBuildAppTest
Wasm.Build.Tests.WasmNativeDefaultsTests
Wasm.Build.Tests.WasmRunOutOfAppBundleTests
diff --git a/eng/testing/tests.browser.targets b/eng/testing/tests.browser.targets
index 982b8589e76c..3ff4c3b50776 100644
--- a/eng/testing/tests.browser.targets
+++ b/eng/testing/tests.browser.targets
@@ -26,7 +26,10 @@
true
+ '$(Scenario)' == 'WasmTestOnChrome'">true
+ true
- <_WasmBrowserPathForTests Condition="'$(BROWSER_PATH_FOR_TESTS)' != ''">$(BROWSER_PATH_FOR_TESTS)
- <_WasmBrowserPathForTests Condition="'$(_WasmBrowserPathForTests)' == '' and '$(InstallChromeForTests)' == 'true'">$(ChromeBinaryPath)
+ <_WasmChromePathForTests Condition="'$(CHROME_PATH_FOR_TESTS)' != ''">$(CHROME_PATH_FOR_TESTS)
+ <_WasmChromePathForTests Condition="'$(_WasmChromePathForTests)' == '' and '$(InstallChromeForTests)' == 'true'">$(ChromeBinaryPath)
+
+ <_WasmFirefoxPathForTests Condition="'$(FIREFOX_PATH_FOR_TESTS)' != ''">$(FIREFOX_PATH_FOR_TESTS)
+ <_WasmFirefoxPathForTests Condition="'$(_WasmFirefoxPathForTests)' == '' and '$(InstallFirefoxForTests)' == 'true'">$(FirefoxBinaryPath)
<_WasmJSEnginePathForTests Condition="'$(V8_PATH_FOR_TESTS)' != ''">$(V8_PATH_FOR_TESTS)
<_WasmJSEnginePathForTests Condition="'$(_WasmJSEnginePathForTests)' == '' and '$(InstallV8ForTests)' == 'true'">$(V8BinaryPath)
@@ -87,8 +93,6 @@
<_AppArgs Condition="'$(IsFunctionalTest)' != 'true' and '$(WasmMainAssemblyFileName)' != ''">--run $(WasmMainAssemblyFileName)
<_AppArgs Condition="'$(IsFunctionalTest)' == 'true'">--run $(AssemblyName).dll
- $(WasmTestAppArgs) -backgroundExec
- $(WasmXHarnessMonoArgs) --setenv=IsWasmBackgroundExec=true
<_AppArgs Condition="'$(WasmTestAppArgs)' != ''">$(_AppArgs) $(WasmTestAppArgs)
$(WasmXHarnessMonoArgs) --setenv=XHARNESS_LOG_TEST_START=true
@@ -107,7 +111,8 @@
<_XHarnessArgs >$(_XHarnessArgs) -s dotnet.native.js.symbols
<_XHarnessArgs Condition="'$(_UseWasmSymbolicator)' == 'true'" >$(_XHarnessArgs) --symbol-patterns wasm-symbol-patterns.txt
<_XHarnessArgs Condition="'$(_UseWasmSymbolicator)' == 'true'" >$(_XHarnessArgs) --symbolicator WasmSymbolicator.dll,Microsoft.WebAssembly.Internal.SymbolicatorWrapperForXHarness
- <_XHarnessArgs Condition="'$(_WasmBrowserPathForTests)' != ''" >$(_XHarnessArgs) "--browser-path=$(_WasmBrowserPathForTests)"
+ <_XHarnessArgs Condition="'$(_WasmChromePathForTests)' != ''" >$(_XHarnessArgs) "--browser-path=$(_WasmChromePathForTests)"
+ <_XHarnessArgs Condition="'$(_WasmFirefoxPathForTests)' != ''" >$(_XHarnessArgs) "--browser-path=$(_WasmFirefoxPathForTests)"
<_XHarnessArgs Condition="'$(WasmXHarnessTestsTimeout)' != ''" >$(_XHarnessArgs) "--timeout=$(WasmXHarnessTestsTimeout)"
<_XHarnessArgs Condition="'$(WasmXHarnessVerbosity)' != ''" >$(_XHarnessArgs) --verbosity=$(WasmXHarnessVerbosity)
<_XHarnessArgs Condition="'$(WasmXHarnessArgsCli)' != ''" >$(_XHarnessArgs) $(WasmXHarnessArgsCli)
@@ -243,15 +248,25 @@
<_NodeNpmModuleStringTrimmed Include="@(_NodeNpmModuleString->Trim(':'))" />
+ WasmTestOnV8
@(_NodeNpmModuleStringTrimmed, ',')
+
+
+
@@ -259,6 +274,7 @@
+
diff --git a/eng/testing/tests.ioslike.targets b/eng/testing/tests.ioslike.targets
index 50f89bfef82a..dde49575d7ae 100644
--- a/eng/testing/tests.ioslike.targets
+++ b/eng/testing/tests.ioslike.targets
@@ -16,7 +16,7 @@
<_AOTBuildCommand Condition="'$(ContinuousIntegrationBuild)' != 'true'">$(_AOTBuildCommand) /p:RuntimeSrcDir=$(RepoRoot) /p:RuntimeConfig=$(Configuration)
- <_AOTBuildCommand>$(_AOTBuildCommand) /p:XHARNESS_EXECUTION_DIR="$XHARNESS_EXECUTION_DIR" /p:RunAOTCompilation=$(RunAOTCompilation) /p:UseNativeAOTRuntime=$(UseNativeAOTRuntime) /p:TargetOS=$(TargetOS) /p:TargetArchitecture=$(TargetArchitecture) /p:MonoForceInterpreter=$(MonoForceInterpreter) /p:MonoEnableLLVM=true /p:DevTeamProvisioning=$(DevTeamProvisioning) /p:UsePortableRuntimePack=true /p:Configuration=$(Configuration)
+ <_AOTBuildCommand>$(_AOTBuildCommand) /p:XHARNESS_EXECUTION_DIR="$XHARNESS_EXECUTION_DIR" /p:RunAOTCompilation=$(RunAOTCompilation) /p:UseNativeAOTRuntime=$(UseNativeAOTRuntime) /p:TargetOS=$(TargetOS) /p:TargetArchitecture=$(TargetArchitecture) /p:MonoForceInterpreter=$(MonoForceInterpreter) /p:MonoEnableLLVM=true /p:DevTeamProvisioning=$(DevTeamProvisioning) /p:UsePortableRuntimePack=true /p:Configuration=$(Configuration) /p:EnableAggressiveTrimming=$(EnableAggressiveTrimming)
<_AOTBuildCommand Condition="'$(NativeLib)' != ''">$(_AOTBuildCommand) /p:NativeLib=$(NativeLib) /p:BundlesResources=$(BundlesResources) /p:ForceLibraryModeGenerateAppBundle=$(ForceLibraryModeGenerateAppBundle)
<_AOTBuildCommand>$(_AOTBuildCommand)
@@ -46,11 +46,11 @@
PrepareForAppleBuildApp;$(AppleBuildDependsOn);_CopyTestArchive
-
+
AppleBuild
$(BundleTestAppleAppDependsOn);_BundleAOTTestAppleAppForHelix;_CopyTestArchive
-
+
$(BundleDir)publish
-
+
<_MainAssemblyPath Condition="'%(AppleAssembliesToBundle.FileName)' == $(AssemblyName) and '%(AppleAssembliesToBundle.Extension)' == '.dll'">%(AppleAssembliesToBundle.Identity)
$([System.IO.Path]::ChangeExtension($(_MainAssemblyPath), '.runtimeconfig.json'))
@@ -76,6 +76,8 @@
+
@@ -104,41 +106,62 @@
<_RuntimePackFiles Include="$(MicrosoftNetCoreAppRuntimePackRidLibTfmDir)**\*.*" />
<_RuntimePackFiles Include="$(MicrosoftNetCoreAppRuntimePackNativeDir)*.*" />
-
+
<_UnusedRuntimePackFiles Include="@(_PublishBundleFiles)" Exclude="@(_RuntimePackFiles->'$(AppBundlePath)/%(FileName)%(Extension)')" />
<_UsedRuntimePackFiles Include="@(_PublishBundleFiles)" Exclude="@(_UnusedRuntimePackFiles)" />
-
+
<_RuntimePackFilesToDelete Include="@(_RuntimePackFiles->'$(AppBundlePath)/%(FileName)%(Extension)')" />
+
+
+
+
+
- <_ApplePropertyNames Include="InvariantGlobalization" />
- <_ApplePropertyNames Include="HybridGlobalization" />
+
<_ApplePropertyNames Include="AssemblyName" />
- <_ApplePropertyNames Include="MonoEnableLLVM" />
+ <_ApplePropertyNames Include="IncludesTestRunner" />
<_ApplePropertyNames Include="MainLibraryFileName" />
+ <_ApplePropertyNames Include="MonoEnableLLVM" />
+ <_ApplePropertyNames Include="ShouldILStrip" />
<_ApplePropertyNames Include="UseConsoleUITemplate" />
<_ApplePropertyNames Include="UseRuntimeComponents" />
- <_ApplePropertyNames Include="IncludesTestRunner" />
- <_ApplePropertyNames Include="ShouldILStrip" />
+ <_ApplePropertyNames Include="_NetCoreAppToolCurrent" />
+
+
+ <_ApplePropertyNames Include="HybridGlobalization" />
+ <_ApplePropertyNames Include="InvariantGlobalization" />
+
+ <_AppleUsedRuntimePackFiles
+ Include="@(_UsedRuntimePackFiles->'%(FileName)%(Extension)')"
+ RemoveMetadata="_IsNative;TargetDir" />
<_ApplePropertiesToPass
- Include="$(%(_ApplePropertyNames.Identity))"
- Name="%(_ApplePropertyNames.Identity)"
- ConditionToUse__="%(_ApplePropertyNames.ConditionToUse__)" />
-
- <_AppleUsedRuntimePackFiles
- Include="@(_UsedRuntimePackFiles->'%(FileName)%(Extension)')"
- RemoveMetadata="_IsNative;TargetDir" />
-
+ Include="$(%(_ApplePropertyNames.Identity))"
+ Name="%(_ApplePropertyNames.Identity)"
+ ConditionToUse__="%(_ApplePropertyNames.ConditionToUse__)" />
+
<_AppleItemsToPass Include="@(_AppleUsedRuntimePackFiles)"
OriginalItemName__="_AppleUsedRuntimePackFiles" />
+ <_AppleItemsToPass Include="@(AppleReferenceSharedPathFiles->'%(FileName)%(Extension)')"
+ OriginalItemName__="AppleReferenceSharedPathFiles" />
+
+ <_AppleItemsToPass Include="@(ReferenceExtraPathFiles->'%(FileName)%(Extension)')"
+ OriginalItemName__="AppleReferenceExtraPathFiles" />
+
+ <_AppleItemsToPass Include="@(RuntimeHostConfigurationOption)"
+ OriginalItemName__="_AppleUsedRuntimeHostConfigurationOption" />
+
+ <_AppleItemsToPass Include="@(TrimmerRootAssembly)"
+ OriginalItemName__="TrimmerRootAssembly" />
+
+
true
true
$(NoWarn);IL2103;IL2105;IL2025;IL2111
-
- $(NoWarn);IL2035
-
- false
false
@@ -93,10 +90,9 @@
-
+
- link
- copyused
+ link
@@ -107,24 +103,11 @@
TrimMode="" is needed so the root assemblies are correctly identified -->
-
-
-
-
-
-
-
-
-
-
-
-
-
+ Include="%(ResolvedFileToPublish.FileName)" />
diff --git a/eng/testing/tests.targets b/eng/testing/tests.targets
index e63040ff750f..d2980871283f 100644
--- a/eng/testing/tests.targets
+++ b/eng/testing/tests.targets
@@ -9,11 +9,9 @@
AppleHelixRunnerTemplate.sh
AppleRunnerTemplate.sh
AndroidRunnerTemplate.sh
- WasiRunnerAOTTemplate.sh
- WasiRunnerTemplate.sh
+ WasiRunnerTemplate.sh
WasiRunnerTemplate.cmd
- WasmRunnerAOTTemplate.sh
- WasmRunnerTemplate.sh
+ WasmRunnerTemplate.sh
WasmRunnerTemplate.cmd
BionicRunnerTemplate.sh
BionicRunnerTemplate.cmd
diff --git a/eng/testing/tests.wasi.targets b/eng/testing/tests.wasi.targets
index d147fea218fe..e8f75ee3821b 100644
--- a/eng/testing/tests.wasi.targets
+++ b/eng/testing/tests.wasi.targets
@@ -46,7 +46,7 @@
<_XHarnessArgs Condition="'$(IsFunctionalTest)' == 'true'" >$(_XHarnessArgs) --expected-exit-code=$(ExpectedExitCode)
<_XHarnessArgs Condition="'$(WasmXHarnessArgs)' != ''" >$(_XHarnessArgs) $(WasmXHarnessArgs)
<_XHarnessArgs Condition="'$(WasmXHarnessTestsTimeout)' != ''" >$(_XHarnessArgs) "--timeout=$(WasmXHarnessTestsTimeout)"
- <_XHarnessArgs >$(_XHarnessArgs) --engine-arg=--max-wasm-stack=134217728
+ <_XHarnessArgs >$(_XHarnessArgs) --engine-arg=-W --engine-arg=max-wasm-stack=134217728
<_XHarnessArgs Condition="'$(WasmXHarnessArgsCli)' != ''" >$(_XHarnessArgs) $(WasmXHarnessArgsCli)
<_InvariantGlobalization Condition="'$(InvariantGlobalization)' == 'true'">--env=DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=true
@@ -147,6 +147,13 @@
+
+ WasmTestOnWasmtime
+
+
+
diff --git a/eng/testing/wasm-provisioning.targets b/eng/testing/wasm-provisioning.targets
index 4852fd5ecc2e..540fcfb035fa 100644
--- a/eng/testing/wasm-provisioning.targets
+++ b/eng/testing/wasm-provisioning.targets
@@ -11,21 +11,42 @@
false
+ false
false
- $(ArtifactsBinDir)firefox\
- $([MSBuild]::NormalizePath($(FirefoxDir), '.install-firefox-$(FirefoxRevision).stamp'))
<_BrowserStampDir>$(ArtifactsBinDir)\
Build
-
+
-
- 108.0.1
- https://ftp.mozilla.org/pub/firefox/releases/$(FirefoxRevision)/linux-x86_64/en-US/firefox-$(FirefoxRevision).tar.bz2
+
+ $(ArtifactsBinDir)firefox\
+ firefox
+ geckodriver
+ $(ArtifactsBinDir)geckodriver\
+
+
+ https://ftp.mozilla.org/pub/firefox/releases/$(linux_FirefoxRevision)/linux-x86_64/en-US/firefox-$(linux_FirefoxRevision).tar.bz2
+ https://github.com/mozilla/geckodriver/releases/download/v$(linux_GeckoDriverRevision)/geckodriver-v$(linux_GeckoDriverRevision)-linux64.tar.gz
firefox
+ geckodriver
+ $([MSBuild]::NormalizePath($(FirefoxDir), '.install-firefox-$(linux_FirefoxRevision).stamp'))
+ $([MSBuild]::NormalizePath($(GeckoDriverDir), '.install-geckodriver-$(linux_GeckoDriverRevision).stamp'))
+ $([MSBuild]::NormalizePath($(FirefoxDir), $(FirefoxDirName), $(FirefoxBinaryName)))
+ $([MSBuild]::NormalizePath($(GeckoDriverDir), $(GeckoDriverDirName), $(GeckoDriverBinaryName)))
+
+
+
+ https://ftp.mozilla.org/pub/firefox/releases/$(win_FirefoxRevision)/win64/en-US/Firefox%20Setup%20$(win_FirefoxRevision).exe
+ https://github.com/mozilla/geckodriver/releases/download/v$(win_GeckoDriverRevision)/geckodriver-v$(win_GeckoDriverRevision)-win64.zip
+ firefox.exe
+ geckodriver.exe
+ $([MSBuild]::NormalizePath($(FirefoxDir), '.install-firefox-$(win_FirefoxRevision).stamp'))
+ $([MSBuild]::NormalizePath($(GeckoDriverDir), '.install-geckodriver-$(win_GeckoDriverRevision).stamp'))
+ $([MSBuild]::NormalizePath($(FirefoxDir), $(FirefoxDirName), $(FirefoxBinaryName)))
+ $([MSBuild]::NormalizePath($(GeckoDriverDir), $(GeckoDriverDirName), $(GeckoDriverBinaryName)))
@@ -84,12 +105,6 @@
$([MSBuild]::NormalizePath($(V8Dir), $(V8BinaryName)))
-
- 108.0.1
- https://ftp.mozilla.org/pub/firefox/releases/$(FirefoxRevision)/linux-x86_64/en-US/firefox-$(FirefoxRevision).tar.bz2
- firefox
-
-
@@ -97,7 +112,7 @@
+ Text="No %24(ChromeVersion) set. This can be set in eng/testing/BrowserVersions.props" />
@@ -125,7 +140,7 @@
+ Text="No %24(ChromeVersion) set. This can be set in eng/testing/BrowserVersions.props" />
@@ -180,7 +195,7 @@ export __SCRIPT_DIR=%24( cd -- "%24( dirname -- "%24{BASH_SOURCE[0]}" )" &>
+ Condition="!Exists($(FirefoxStampFile)) and '$(InstallFirefoxForTests)' == 'true'">
<_StampFile Include="$(_BrowserStampDir).install-firefox*.stamp" />
@@ -188,21 +203,51 @@ export __SCRIPT_DIR=%24( cd -- "%24( dirname -- "%24{BASH_SOURCE[0]}" )" &>
+
+
-
-
-
-
- <_FirefoxBinaryPath>$([MSBuild]::NormalizePath($(FirefoxDir), $(FirefoxBinaryName)))
-
+
+
+
+
-
+
-
+
+
+
+
+ <_StampFile Include="$(_BrowserStampDir).install-geckodriver*.stamp" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/global.json b/global.json
index b3d764e6c152..5522bd311383 100644
--- a/global.json
+++ b/global.json
@@ -1,18 +1,18 @@
{
"sdk": {
- "version": "9.0.100-preview.1.24101.2",
+ "version": "9.0.100-preview.3.24204.13",
"allowPrerelease": true,
"rollForward": "major"
},
"tools": {
- "dotnet": "9.0.100-preview.1.24101.2"
+ "dotnet": "9.0.100-preview.3.24204.13"
},
"msbuild-sdks": {
- "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24205.4",
- "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.24205.4",
- "Microsoft.DotNet.SharedFramework.Sdk": "9.0.0-beta.24205.4",
+ "Microsoft.DotNet.Arcade.Sdk": "9.0.0-beta.24266.1",
+ "Microsoft.DotNet.Helix.Sdk": "9.0.0-beta.24266.1",
+ "Microsoft.DotNet.SharedFramework.Sdk": "9.0.0-beta.24266.1",
"Microsoft.Build.NoTargets": "3.7.0",
"Microsoft.Build.Traversal": "3.4.0",
- "Microsoft.NET.Sdk.IL": "9.0.0-preview.4.24201.1"
+ "Microsoft.NET.Sdk.IL": "9.0.0-preview.5.24262.2"
}
}
diff --git a/src/coreclr/CMakeLists.txt b/src/coreclr/CMakeLists.txt
index 68af87ce57e8..d8a255ae2d2b 100644
--- a/src/coreclr/CMakeLists.txt
+++ b/src/coreclr/CMakeLists.txt
@@ -214,6 +214,7 @@ if(CLR_CMAKE_HOST_UNIX)
# warnings and errors to be suppressed.
# Suppress these warnings here to avoid breaking the build.
add_compile_options($<$:-Wno-null-arithmetic>)
+ add_compile_options($<$:-Wno-sync-alignment>)
add_compile_options($<$:-Wno-conversion-null>)
add_compile_options($<$:-Wno-pointer-arith>)
diff --git a/src/coreclr/Directory.Build.props b/src/coreclr/Directory.Build.props
index 233bfbeacebf..2f86002cccf4 100644
--- a/src/coreclr/Directory.Build.props
+++ b/src/coreclr/Directory.Build.props
@@ -1,6 +1,6 @@
- true
+ true
$(__BuildType)
diff --git a/src/coreclr/System.Private.CoreLib/CompatibilitySuppressions.xml b/src/coreclr/System.Private.CoreLib/CompatibilitySuppressions.xml
deleted file mode 100644
index 97b65a274840..000000000000
--- a/src/coreclr/System.Private.CoreLib/CompatibilitySuppressions.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
- CP0015
- M:System.Diagnostics.Tracing.EventSource.Write``1(System.String,``0):[T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute]
-
-
- CP0015
- M:System.Diagnostics.Tracing.EventSource.Write``1(System.String,System.Diagnostics.Tracing.EventSourceOptions@,``0@):[T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute]
-
-
- CP0015
- M:System.Diagnostics.Tracing.EventSource.Write``1(System.String,System.Diagnostics.Tracing.EventSourceOptions@,System.Guid@,System.Guid@,``0@):[T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute]
-
-
- CP0015
- M:System.Diagnostics.Tracing.EventSource.WriteEvent(System.Int32,System.Object[]):[T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute]
-
-
- CP0015
- M:System.Diagnostics.Tracing.EventSource.WriteEventCore(System.Int32,System.Int32,System.Diagnostics.Tracing.EventSource.EventData*):[T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute]
-
-
- CP0015
- M:System.Diagnostics.Tracing.EventSource.WriteEventWithRelatedActivityId(System.Int32,System.Guid,System.Object[]):[T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute]
-
-
- CP0015
- M:System.Diagnostics.Tracing.EventSource.WriteEventWithRelatedActivityIdCore(System.Int32,System.Guid*,System.Int32,System.Diagnostics.Tracing.EventSource.EventData*):[T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute]
-
-
\ No newline at end of file
diff --git a/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj
index 9ef1024c449d..a37abf7a0c11 100644
--- a/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj
+++ b/src/coreclr/System.Private.CoreLib/System.Private.CoreLib.csproj
@@ -39,6 +39,7 @@
$(TargetArchitecture)
arm
+ AnyCPU
true
false
@@ -59,28 +60,21 @@
- x64
- false
$(DefineConstants);TARGET_AMD64
- x86
$(DefineConstants);TARGET_X86
- arm
$(DefineConstants);TARGET_ARM
- AnyCPU
$(DefineConstants);TARGET_ARM64
- AnyCPU
$(DefineConstants);TARGET_LOONGARCH64
- AnyCPU
$(DefineConstants);TARGET_RISCV64
@@ -198,7 +192,7 @@
-
+
diff --git a/src/coreclr/System.Private.CoreLib/src/Microsoft/Win32/OAVariantLib.cs b/src/coreclr/System.Private.CoreLib/src/Microsoft/Win32/OAVariantLib.cs
index a5fbad6504f3..a51ec6f0132e 100644
--- a/src/coreclr/System.Private.CoreLib/src/Microsoft/Win32/OAVariantLib.cs
+++ b/src/coreclr/System.Private.CoreLib/src/Microsoft/Win32/OAVariantLib.cs
@@ -13,11 +13,13 @@
===========================================================*/
using System;
+using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.Marshalling;
namespace Microsoft.Win32
{
@@ -26,48 +28,32 @@ internal static unsafe partial class OAVariantLib
#region Constants
// Constants for VariantChangeType from OleAuto.h
- public const int NoValueProp = 0x01;
- public const int AlphaBool = 0x02;
- public const int NoUserOverride = 0x04;
- public const int CalendarHijri = 0x08;
public const int LocalBool = 0x10;
- internal static readonly Type?[] ClassTypes = {
- typeof(Empty),
- typeof(void),
- typeof(bool),
- typeof(char),
- typeof(sbyte),
- typeof(byte),
- typeof(short),
- typeof(ushort),
- typeof(int),
- typeof(uint),
- typeof(long),
- typeof(ulong),
- typeof(float),
- typeof(double),
- typeof(string),
- typeof(void),
- typeof(DateTime),
- typeof(TimeSpan),
- typeof(object),
- typeof(decimal),
- null, // Enums - what do we do here?
- typeof(Missing),
- typeof(DBNull),
+ private static readonly Dictionary ClassTypes = new Dictionary
+ {
+ { typeof(bool), VarEnum.VT_BOOL },
+ { typeof(char), VarEnum.VT_I2 },
+ { typeof(sbyte), VarEnum.VT_I1 },
+ { typeof(byte), VarEnum.VT_UI1 },
+ { typeof(short), VarEnum.VT_I2 },
+ { typeof(ushort), VarEnum.VT_UI2 },
+ { typeof(int), VarEnum.VT_I4 },
+ { typeof(uint), VarEnum.VT_UI4 },
+ { typeof(long), VarEnum.VT_I8 },
+ { typeof(ulong), VarEnum.VT_UI8 },
+ { typeof(float), VarEnum.VT_R4 },
+ { typeof(double), VarEnum.VT_R8 },
+ { typeof(string), VarEnum.VT_BSTR },
+ { typeof(DateTime), VarEnum.VT_DATE },
+ { typeof(decimal), VarEnum.VT_DECIMAL },
};
- // Keep these numbers in sync w/ the above array.
- private const int CV_OBJECT = 0x12;
-
#endregion
#region Internal Methods
-#pragma warning disable CS8500
-
/**
* Changes a Variant from one type to another, calling the OLE
* Automation VariantChangeTypeEx routine. Note the legal types here are
@@ -75,53 +61,129 @@ internal static unsafe partial class OAVariantLib
* Variant and the types that CLR supports explicitly in the
* CLR Variant class.
*/
- internal static Variant ChangeType(Variant source, Type targetClass, short options, CultureInfo culture)
+ internal static object? ChangeType(object source, Type targetClass, short options, CultureInfo culture)
{
ArgumentNullException.ThrowIfNull(targetClass);
ArgumentNullException.ThrowIfNull(culture);
- Variant result = default;
- ChangeType(
- &result,
- &source,
- culture.LCID,
- targetClass.TypeHandle.Value,
- GetCVTypeFromClass(targetClass),
- options);
- return result;
- }
+ object? result = null;
- [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "OAVariant_ChangeType")]
- private static partial void ChangeType(Variant* result, Variant* source, int lcid, IntPtr typeHandle, int cvType, short flags);
+ if (Variant.IsSystemDrawingColor(targetClass))
+ {
+ if (source is int || source is uint)
+ {
+ uint sourceData = source is int ? (uint)(int)source : (uint)source;
+ // Int32/UInt32 can be converted to System.Drawing.Color
+ Variant.ConvertOleColorToSystemColor(ObjectHandleOnStack.Create(ref result), sourceData, targetClass.TypeHandle.Value);
+ Debug.Assert(result != null);
+ return result;
+ }
+ }
-#pragma warning restore CS8500
+ if (!ClassTypes.TryGetValue(targetClass, out VarEnum vt))
+ {
+ throw new NotSupportedException(SR.NotSupported_ChangeType);
+ }
- #endregion
+ ComVariant vOp = ToOAVariant(source);
+ ComVariant ret = default;
+ int hr = Interop.OleAut32.VariantChangeTypeEx(&ret, &vOp, culture.LCID, options, (ushort)vt);
- #region Private Helpers
+ using (vOp)
+ using (ret)
+ {
+ if (hr < 0)
+ {
+ OAFailed(hr);
+ }
- private static int GetCVTypeFromClass(Type ctype)
- {
- Debug.Assert(ctype != null);
- Debug.Assert(ClassTypes[CV_OBJECT] == typeof(object), "OAVariantLib::ClassTypes[CV_OBJECT] == Object.class");
+ result = FromOAVariant(ret);
+ if (targetClass == typeof(char))
+ {
+ result = (char)(uint)result!;
+ }
+ }
- // OleAut Binder works better if unrecognized
- // types were changed to Object.
- int cvtype = CV_OBJECT;
+ return result;
+ }
- for (int i = 0; i < ClassTypes.Length; i++)
+ private static void OAFailed(int hr)
+ {
+ switch (hr)
{
- if (ctype.Equals(ClassTypes[i]))
- {
- cvtype = i;
- break;
- }
+ case HResults.COR_E_OUTOFMEMORY:
+ throw new OutOfMemoryException();
+ case HResults.DISP_E_BADVARTYPE:
+ throw new NotSupportedException(SR.NotSupported_OleAutBadVarType);
+ case HResults.DISP_E_DIVBYZERO:
+ throw new DivideByZeroException();
+ case HResults.DISP_E_OVERFLOW:
+ throw new OverflowException();
+ case HResults.DISP_E_TYPEMISMATCH:
+ throw new InvalidCastException(SR.InvalidCast_OATypeMismatch);
+ case HResults.E_INVALIDARG:
+ throw new ArgumentException();
+ default:
+ Debug.Fail("Unrecognized HResult - OAVariantLib routine failed in an unexpected way!");
+ throw Marshal.GetExceptionForHR(hr);
}
+ }
- return cvtype;
+ private static ComVariant ToOAVariant(object input)
+ {
+ return input switch
+ {
+ string str => ComVariant.Create(str),
+ DateTime dateTime => ComVariant.Create(dateTime),
+ bool b => ComVariant.Create(b),
+ decimal d => ComVariant.Create(d),
+ sbyte i1 => ComVariant.Create(i1),
+ byte u1 => ComVariant.Create(u1),
+ short i2 => ComVariant.Create(i2),
+ ushort u2 => ComVariant.Create(u2),
+ int i4 => ComVariant.Create(i4),
+ uint u4 => ComVariant.Create(u4),
+ long i8 => ComVariant.Create(i8),
+ ulong u8 => ComVariant.Create(u8),
+ float r4 => ComVariant.Create(r4),
+ double r8 => ComVariant.Create(r8),
+ null => default,
+ Missing => throw new NotSupportedException(SR.NotSupported_ChangeType),
+ DBNull => ComVariant.Null,
+ _ => GetComIPFromObjectRef(input) // Convert the object to an IDispatch/IUnknown pointer.
+ };
+ }
+
+ private static ComVariant GetComIPFromObjectRef(object? obj)
+ {
+ IntPtr pUnk = GetIUnknownOrIDispatchForObject(ObjectHandleOnStack.Create(ref obj), out bool isIDispatch);
+ return ComVariant.CreateRaw(isIDispatch ? VarEnum.VT_DISPATCH : VarEnum.VT_UNKNOWN, pUnk);
}
+ [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MarshalNative_GetIUnknownOrIDispatchForObject")]
+ private static partial IntPtr GetIUnknownOrIDispatchForObject(ObjectHandleOnStack o, [MarshalAs(UnmanagedType.Bool)] out bool isIDispatch);
+
+ private static object? FromOAVariant(ComVariant input) =>
+ input.VarType switch
+ {
+ VarEnum.VT_BSTR => input.As(),
+ VarEnum.VT_DATE => input.As(),
+ VarEnum.VT_BOOL => input.As(),
+ VarEnum.VT_DECIMAL => input.As(),
+ VarEnum.VT_I1 => input.As(),
+ VarEnum.VT_UI1 => input.As(),
+ VarEnum.VT_I2 => input.As(),
+ VarEnum.VT_UI2 => input.As(),
+ VarEnum.VT_I4 or VarEnum.VT_INT => input.As(),
+ VarEnum.VT_UI4 or VarEnum.VT_UINT => input.As(),
+ VarEnum.VT_I8 => input.As(),
+ VarEnum.VT_UI8 => input.As(),
+ VarEnum.VT_R4 => input.As(),
+ VarEnum.VT_R8 => input.As(),
+ _ => throw new NotSupportedException(SR.NotSupported_ChangeType),
+ };
+
#endregion
}
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Array.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Array.CoreCLR.cs
index de7b3021c458..74e073984816 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Array.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Array.CoreCLR.cs
@@ -694,7 +694,7 @@ public ArrayInitializeCache(RuntimeType arrayType)
// it for type and executes it.
//
// The "T" will reflect the interface used to invoke the method. The actual runtime "this" will be
- // array that is castable to "T[]" (i.e. for primitivs and valuetypes, it will be exactly
+ // array that is castable to "T[]" (i.e. for primitives and valuetypes, it will be exactly
// "T[]" - for orefs, it may be a "U[]" where U derives from T.)
//----------------------------------------------------------------------------------------
internal sealed class SZArrayHelper
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Enum.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Enum.CoreCLR.cs
index 6f578ccad411..cc46e2a75d8b 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Enum.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Enum.CoreCLR.cs
@@ -14,9 +14,6 @@ public abstract partial class Enum
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Enum_GetValuesAndNames")]
private static partial void GetEnumValuesAndNames(QCallTypeHandle enumType, ObjectHandleOnStack values, ObjectHandleOnStack names, Interop.BOOL getNames);
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern object InternalBoxEnum(RuntimeType enumType, long value);
-
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern unsafe CorElementType InternalGetCorElementType(MethodTable* pMT);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/OleAutBinder.cs b/src/coreclr/System.Private.CoreLib/src/System/OleAutBinder.cs
index d1072ff86ec8..32a69bb155f1 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/OleAutBinder.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/OleAutBinder.cs
@@ -18,7 +18,6 @@ internal sealed class OleAutBinder : DefaultBinder
// This binder uses OLEAUT to change the type of the variant.
public override object ChangeType(object value, Type type, CultureInfo? cultureInfo)
{
- Variant myValue = new Variant(value);
cultureInfo ??= CultureInfo.CurrentCulture;
#if DISPLAY_DEBUG_INFO
@@ -62,7 +61,7 @@ public override object ChangeType(object value, Type type, CultureInfo? cultureI
#endif
// Specify the LocalBool flag to have BOOL values converted to local language rather
// than 0 or -1.
- object RetObj = OAVariantLib.ChangeType(myValue, type, OAVariantLib.LocalBool, cultureInfo).ToObject()!;
+ object RetObj = OAVariantLib.ChangeType(value, type, OAVariantLib.LocalBool, cultureInfo)!;
#if DISPLAY_DEBUG_INFO
Console.WriteLine("Object returned from ChangeType is of type: " + RetObj.GetType().Name);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdConstant.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdConstant.cs
index 498b6adf52e4..1ef9ed2e3317 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdConstant.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdConstant.cs
@@ -72,7 +72,7 @@ internal static class MdConstant
#endregion
}
- return RuntimeType.CreateEnum(fieldType, defaultValue);
+ return Enum.ToObject(fieldType, defaultValue);
}
else if (fieldType == typeof(DateTime))
{
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdImport.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdImport.cs
index d1944cbbf77c..c95e1630a04a 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdImport.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/MdImport.cs
@@ -171,39 +171,42 @@ public static bool IsTokenOfType(int token, params MetadataTokenType[] types)
public override string ToString() => string.Create(CultureInfo.InvariantCulture, stackalloc char[64], $"0x{Value:x8}");
}
- internal unsafe struct MetadataEnumResult
+ internal ref struct MetadataEnumResult
{
- // Keep the definition in sync with vm\ManagedMdImport.hpp
- private int[] largeResult;
- private int length;
- private fixed int smallResult[16];
+ internal int _length;
+
+ internal const int SmallIntArrayLength = 16;
+
+ [InlineArray(SmallIntArrayLength)]
+ internal struct SmallIntArray
+ {
+ public int e;
+ }
+ internal SmallIntArray _smallResult;
+ internal int[]? _largeResult;
- public int Length => length;
+ public int Length => _length;
public int this[int index]
{
get
{
Debug.Assert(0 <= index && index < Length);
- if (largeResult != null)
- return largeResult[index];
+ if (_largeResult != null)
+ return _largeResult[index];
- fixed (int* p = smallResult)
- return p[index];
+ return _smallResult[index];
}
}
}
#pragma warning disable CA1066 // IEquatable interface implementation isn't used
- internal readonly struct MetadataImport
+ internal readonly partial struct MetadataImport
#pragma warning restore CA1067
{
private readonly IntPtr m_metadataImport2;
- private readonly object? m_keepalive;
#region Override methods from Object
- internal static readonly MetadataImport EmptyImport = new MetadataImport((IntPtr)0, null);
-
public override int GetHashCode()
{
return HashCode.Combine(m_metadataImport2);
@@ -225,47 +228,104 @@ private bool Equals(MetadataImport import)
#region Static Members
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetMarshalAs(IntPtr pNativeType, int cNativeType, out int unmanagedType, out int safeArraySubType, out string? safeArrayUserDefinedSubType,
- out int arraySubType, out int sizeParamIndex, out int sizeConst, out string? marshalType, out string? marshalCookie,
+ private static extern unsafe bool GetMarshalAs(
+ IntPtr pNativeType,
+ int cNativeType,
+ out int unmanagedType,
+ out int safeArraySubType,
+ out byte* safeArrayUserDefinedSubType,
+ out int arraySubType,
+ out int sizeParamIndex,
+ out int sizeConst,
+ out byte* marshalType,
+ out byte* marshalCookie,
out int iidParamIndex);
- internal static void GetMarshalAs(ConstArray nativeType,
- out UnmanagedType unmanagedType, out VarEnum safeArraySubType, out string? safeArrayUserDefinedSubType,
- out UnmanagedType arraySubType, out int sizeParamIndex, out int sizeConst, out string? marshalType, out string? marshalCookie,
- out int iidParamIndex)
- {
- _GetMarshalAs(nativeType.Signature, (int)nativeType.Length,
- out int _unmanagedType, out int _safeArraySubType, out safeArrayUserDefinedSubType,
- out int _arraySubType, out sizeParamIndex, out sizeConst, out marshalType, out marshalCookie,
- out iidParamIndex);
- unmanagedType = (UnmanagedType)_unmanagedType;
- safeArraySubType = (VarEnum)_safeArraySubType;
- arraySubType = (UnmanagedType)_arraySubType;
- }
- #endregion
+ internal static unsafe MarshalAsAttribute GetMarshalAs(ConstArray nativeType, RuntimeModule scope)
+ {
+ if (!GetMarshalAs(
+ nativeType.Signature,
+ nativeType.Length,
+ out int unmanagedTypeRaw,
+ out int safeArraySubTypeRaw,
+ out byte* safeArrayUserDefinedSubTypeRaw,
+ out int arraySubTypeRaw,
+ out int sizeParamIndex,
+ out int sizeConst,
+ out byte* marshalTypeRaw,
+ out byte* marshalCookieRaw,
+ out int iidParamIndex))
+ {
+ throw new BadImageFormatException();
+ }
- #region Internal Static Members
- internal static void ThrowError(int hResult)
- {
- throw new MetadataException(hResult);
+ string? safeArrayUserDefinedTypeName = safeArrayUserDefinedSubTypeRaw == null
+ ? null
+ : Text.Encoding.UTF8.GetString(MemoryMarshal.CreateReadOnlySpanFromNullTerminated(safeArrayUserDefinedSubTypeRaw));
+ string? marshalTypeName = marshalTypeRaw == null
+ ? null
+ : Text.Encoding.UTF8.GetString(MemoryMarshal.CreateReadOnlySpanFromNullTerminated(marshalTypeRaw));
+ string? marshalCookie = marshalCookieRaw == null
+ ? null
+ : Text.Encoding.UTF8.GetString(MemoryMarshal.CreateReadOnlySpanFromNullTerminated(marshalCookieRaw));
+
+ RuntimeType? safeArrayUserDefinedType = string.IsNullOrEmpty(safeArrayUserDefinedTypeName) ? null :
+ TypeNameResolver.GetTypeReferencedByCustomAttribute(safeArrayUserDefinedTypeName, scope);
+ RuntimeType? marshalTypeRef = null;
+
+ try
+ {
+ marshalTypeRef = marshalTypeName is null ? null : TypeNameResolver.GetTypeReferencedByCustomAttribute(marshalTypeName, scope);
+ }
+ catch (TypeLoadException)
+ {
+ // The user may have supplied a bad type name string causing this TypeLoadException
+ // Regardless, we return the bad type name
+ Debug.Assert(marshalTypeName is not null);
+ }
+
+ MarshalAsAttribute attribute = new MarshalAsAttribute((UnmanagedType)unmanagedTypeRaw);
+
+ attribute.SafeArraySubType = (VarEnum)safeArraySubTypeRaw;
+ attribute.SafeArrayUserDefinedSubType = safeArrayUserDefinedType;
+ attribute.IidParameterIndex = iidParamIndex;
+ attribute.ArraySubType = (UnmanagedType)arraySubTypeRaw;
+ attribute.SizeParamIndex = (short)sizeParamIndex;
+ attribute.SizeConst = sizeConst;
+ attribute.MarshalType = marshalTypeName;
+ attribute.MarshalTypeRef = marshalTypeRef;
+ attribute.MarshalCookie = marshalCookie;
+
+ return attribute;
}
#endregion
#region Constructor
- internal MetadataImport(IntPtr metadataImport2, object? keepalive)
+ [MethodImpl(MethodImplOptions.InternalCall)]
+ private static extern unsafe IntPtr GetMetadataImport(RuntimeModule module);
+
+ internal MetadataImport(RuntimeModule module)
{
- m_metadataImport2 = metadataImport2;
- m_keepalive = keepalive;
+ ArgumentNullException.ThrowIfNull(module);
+
+ // The MetadataImport instance needs to be acquired in this manner
+ // since the instance can be replaced during HotReload and EnC scenarios.
+ m_metadataImport2 = GetMetadataImport(module);
}
#endregion
- #region FCalls
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _Enum(IntPtr scope, int type, int parent, out MetadataEnumResult result);
+ [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "MetadataImport_Enum")]
+ private static unsafe partial void Enum(IntPtr scope, int type, int parent, ref int length, int* shortResult, ObjectHandleOnStack longResult);
- public void Enum(MetadataTokenType type, int parent, out MetadataEnumResult result)
+ public unsafe void Enum(MetadataTokenType type, int parent, out MetadataEnumResult result)
{
- _Enum(m_metadataImport2, (int)type, parent, out result);
+ result = default;
+ int length = MetadataEnumResult.SmallIntArrayLength;
+ fixed (int* p = &result._smallResult.e)
+ {
+ Enum(m_metadataImport2, (int)type, parent, ref length, p, ObjectHandleOnStack.Create(ref result._largeResult));
+ }
+ result._length = length;
}
public void EnumNestedTypes(int mdTypeDef, out MetadataEnumResult result)
@@ -298,117 +358,131 @@ public void EnumEvents(int mdTypeDef, out MetadataEnumResult result)
Enum(MetadataTokenType.Event, mdTypeDef, out result);
}
+ private static unsafe string? ConvertMetadataStringPermitInvalidContent(char* stringMetadataEncoding, int length)
+ {
+ Debug.Assert(stringMetadataEncoding != null);
+ // Metadata encoding is always UTF-16LE, but user strings can be leveraged to encode invalid surrogates.
+ // This means we rely on the string's constructor rather than the stricter Encoding.Unicode API.
+ return new string(stringMetadataEncoding, 0, length);
+ }
+
+ #region FCalls
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern string? _GetDefaultValue(IntPtr scope, int mdToken, out long value, out int length, out int corElementType);
- public string? GetDefaultValue(int mdToken, out long value, out int length, out CorElementType corElementType)
+ private static extern unsafe int GetDefaultValue(
+ IntPtr scope,
+ int mdToken,
+ out long value,
+ out char* stringMetadataEncoding,
+ out int length,
+ out int corElementType);
+
+ public unsafe string? GetDefaultValue(int mdToken, out long value, out int length, out CorElementType corElementType)
{
- string? stringVal = _GetDefaultValue(m_metadataImport2, mdToken, out value, out length, out int _corElementType);
- corElementType = (CorElementType)_corElementType;
- return stringVal;
+ ThrowBadImageExceptionForHR(GetDefaultValue(m_metadataImport2, mdToken, out value, out char* stringMetadataEncoding, out length, out int corElementTypeRaw));
+
+ corElementType = (CorElementType)corElementTypeRaw;
+
+ if (corElementType is CorElementType.ELEMENT_TYPE_STRING
+ && stringMetadataEncoding != null)
+ {
+ return ConvertMetadataStringPermitInvalidContent(stringMetadataEncoding, length);
+ }
+
+ return null;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern unsafe void _GetUserString(IntPtr scope, int mdToken, void** name, out int length);
+ private static extern unsafe int GetUserString(IntPtr scope, int mdToken, out char* stringMetadataEncoding, out int length);
+
public unsafe string? GetUserString(int mdToken)
{
- void* name;
- _GetUserString(m_metadataImport2, mdToken, &name, out int length);
+ ThrowBadImageExceptionForHR(GetUserString(m_metadataImport2, mdToken, out char* stringMetadataEncoding, out int length));
- return name != null ?
- new string((char*)name, 0, length) :
+ return stringMetadataEncoding != null ?
+ ConvertMetadataStringPermitInvalidContent(stringMetadataEncoding, length) :
null;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern unsafe void _GetName(IntPtr scope, int mdToken, void** name);
+ private static extern unsafe int GetName(IntPtr scope, int mdToken, out byte* name);
+
public unsafe MdUtf8String GetName(int mdToken)
{
- void* name;
- _GetName(m_metadataImport2, mdToken, &name);
-
+ ThrowBadImageExceptionForHR(GetName(m_metadataImport2, mdToken, out byte* name));
return new MdUtf8String(name);
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern unsafe void _GetNamespace(IntPtr scope, int mdToken, void** namesp);
+ private static extern unsafe int GetNamespace(IntPtr scope, int mdToken, out byte* namesp);
+
public unsafe MdUtf8String GetNamespace(int mdToken)
{
- void* namesp;
- _GetNamespace(m_metadataImport2, mdToken, &namesp);
-
+ ThrowBadImageExceptionForHR(GetNamespace(m_metadataImport2, mdToken, out byte* namesp));
return new MdUtf8String(namesp);
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern unsafe void _GetEventProps(IntPtr scope, int mdToken, void** name, out int eventAttributes);
+ private static extern unsafe int GetEventProps(IntPtr scope, int mdToken, out void* name, out int eventAttributes);
+
public unsafe void GetEventProps(int mdToken, out void* name, out EventAttributes eventAttributes)
{
- void* _name;
- _GetEventProps(m_metadataImport2, mdToken, &_name, out int _eventAttributes);
- name = _name;
- eventAttributes = (EventAttributes)_eventAttributes;
+ ThrowBadImageExceptionForHR(GetEventProps(m_metadataImport2, mdToken, out name, out int eventAttributesRaw));
+ eventAttributes = (EventAttributes)eventAttributesRaw;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetFieldDefProps(IntPtr scope, int mdToken, out int fieldAttributes);
+ private static extern int GetFieldDefProps(IntPtr scope, int mdToken, out int fieldAttributes);
+
public void GetFieldDefProps(int mdToken, out FieldAttributes fieldAttributes)
{
- _GetFieldDefProps(m_metadataImport2, mdToken, out int _fieldAttributes);
- fieldAttributes = (FieldAttributes)_fieldAttributes;
+ ThrowBadImageExceptionForHR(GetFieldDefProps(m_metadataImport2, mdToken, out int fieldAttributesRaw));
+ fieldAttributes = (FieldAttributes)fieldAttributesRaw;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern unsafe void _GetPropertyProps(IntPtr scope,
- int mdToken, void** name, out int propertyAttributes, out ConstArray signature);
+ private static extern unsafe int GetPropertyProps(IntPtr scope, int mdToken, out void* name, out int propertyAttributes, out ConstArray signature);
+
public unsafe void GetPropertyProps(int mdToken, out void* name, out PropertyAttributes propertyAttributes, out ConstArray signature)
{
- void* _name;
- _GetPropertyProps(m_metadataImport2, mdToken, &_name, out int _propertyAttributes, out signature);
- name = _name;
- propertyAttributes = (PropertyAttributes)_propertyAttributes;
+ ThrowBadImageExceptionForHR(GetPropertyProps(m_metadataImport2, mdToken, out name, out int propertyAttributesRaw, out signature));
+ propertyAttributes = (PropertyAttributes)propertyAttributesRaw;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetParentToken(IntPtr scope,
- int mdToken, out int tkParent);
+ private static extern int GetParentToken(IntPtr scope, int mdToken, out int tkParent);
+
public int GetParentToken(int tkToken)
{
- _GetParentToken(m_metadataImport2, tkToken, out int tkParent);
+ ThrowBadImageExceptionForHR(GetParentToken(m_metadataImport2, tkToken, out int tkParent));
return tkParent;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetParamDefProps(IntPtr scope,
- int parameterToken, out int sequence, out int attributes);
+ private static extern int GetParamDefProps(IntPtr scope, int parameterToken, out int sequence, out int attributes);
+
public void GetParamDefProps(int parameterToken, out int sequence, out ParameterAttributes attributes)
{
-
- _GetParamDefProps(m_metadataImport2, parameterToken, out sequence, out int _attributes);
-
- attributes = (ParameterAttributes)_attributes;
+ ThrowBadImageExceptionForHR(GetParamDefProps(m_metadataImport2, parameterToken, out sequence, out int attributesRaw));
+ attributes = (ParameterAttributes)attributesRaw;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetGenericParamProps(IntPtr scope,
- int genericParameter,
- out int flags);
+ private static extern int GetGenericParamProps(IntPtr scope, int genericParameter, out int flags);
public void GetGenericParamProps(
int genericParameter,
out GenericParameterAttributes attributes)
{
- _GetGenericParamProps(m_metadataImport2, genericParameter, out int _attributes);
- attributes = (GenericParameterAttributes)_attributes;
+ ThrowBadImageExceptionForHR(GetGenericParamProps(m_metadataImport2, genericParameter, out int attributesRaw));
+ attributes = (GenericParameterAttributes)attributesRaw;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetScopeProps(IntPtr scope,
- out Guid mvid);
+ private static extern int GetScopeProps(IntPtr scope, out Guid mvid);
- public void GetScopeProps(
- out Guid mvid)
+ public void GetScopeProps(out Guid mvid)
{
- _GetScopeProps(m_metadataImport2, out mvid);
+ ThrowBadImageExceptionForHR(GetScopeProps(m_metadataImport2, out mvid));
}
public ConstArray GetMethodSignature(MetadataToken token)
@@ -420,47 +494,36 @@ public ConstArray GetMethodSignature(MetadataToken token)
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetSigOfMethodDef(IntPtr scope,
- int methodToken,
- ref ConstArray signature);
+ private static extern int GetSigOfMethodDef(IntPtr scope, int methodToken, ref ConstArray signature);
public ConstArray GetSigOfMethodDef(int methodToken)
{
ConstArray signature = default;
-
- _GetSigOfMethodDef(m_metadataImport2, methodToken, ref signature);
-
+ ThrowBadImageExceptionForHR(GetSigOfMethodDef(m_metadataImport2, methodToken, ref signature));
return signature;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetSignatureFromToken(IntPtr scope,
- int methodToken,
- ref ConstArray signature);
+ private static extern int GetSignatureFromToken(IntPtr scope, int methodToken, ref ConstArray signature);
public ConstArray GetSignatureFromToken(int token)
{
ConstArray signature = default;
-
- _GetSignatureFromToken(m_metadataImport2, token, ref signature);
-
+ ThrowBadImageExceptionForHR(GetSignatureFromToken(m_metadataImport2, token, ref signature));
return signature;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetMemberRefProps(IntPtr scope,
- int memberTokenRef,
- out ConstArray signature);
+ private static extern int GetMemberRefProps(IntPtr scope, int memberTokenRef, out ConstArray signature);
public ConstArray GetMemberRefProps(int memberTokenRef)
{
- _GetMemberRefProps(m_metadataImport2, memberTokenRef, out ConstArray signature);
-
+ ThrowBadImageExceptionForHR(GetMemberRefProps(m_metadataImport2, memberTokenRef, out ConstArray signature));
return signature;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetCustomAttributeProps(IntPtr scope,
+ private static extern int GetCustomAttributeProps(IntPtr scope,
int customAttributeToken,
out int constructorToken,
out ConstArray signature);
@@ -470,66 +533,62 @@ public void GetCustomAttributeProps(
out int constructorToken,
out ConstArray signature)
{
- _GetCustomAttributeProps(m_metadataImport2, customAttributeToken,
- out constructorToken, out signature);
+ ThrowBadImageExceptionForHR(GetCustomAttributeProps(m_metadataImport2, customAttributeToken, out constructorToken, out signature));
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetClassLayout(IntPtr scope,
- int typeTokenDef, out int packSize, out int classSize);
+ private static extern int GetClassLayout(IntPtr scope, int typeTokenDef, out int packSize, out int classSize);
+
public void GetClassLayout(
int typeTokenDef,
out int packSize,
out int classSize)
{
- _GetClassLayout(m_metadataImport2, typeTokenDef, out packSize, out classSize);
+ ThrowBadImageExceptionForHR(GetClassLayout(m_metadataImport2, typeTokenDef, out packSize, out classSize));
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern bool _GetFieldOffset(IntPtr scope,
- int typeTokenDef, int fieldTokenDef, out int offset);
+ private static extern int GetFieldOffset(IntPtr scope, int typeTokenDef, int fieldTokenDef, out int offset, out bool found);
+
public bool GetFieldOffset(
int typeTokenDef,
int fieldTokenDef,
out int offset)
{
- return _GetFieldOffset(m_metadataImport2, typeTokenDef, fieldTokenDef, out offset);
+ int hr = GetFieldOffset(m_metadataImport2, typeTokenDef, fieldTokenDef, out offset, out bool found);
+ if (!found && hr < 0)
+ {
+ throw new BadImageFormatException();
+ }
+ return found;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetSigOfFieldDef(IntPtr scope,
- int fieldToken,
- ref ConstArray fieldMarshal);
+ private static extern int GetSigOfFieldDef(IntPtr scope, int fieldToken, ref ConstArray fieldMarshal);
public ConstArray GetSigOfFieldDef(int fieldToken)
{
- ConstArray fieldMarshal = default;
-
- _GetSigOfFieldDef(m_metadataImport2, fieldToken, ref fieldMarshal);
-
- return fieldMarshal;
+ ConstArray sig = default;
+ ThrowBadImageExceptionForHR(GetSigOfFieldDef(m_metadataImport2, fieldToken, ref sig));
+ return sig;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern void _GetFieldMarshal(IntPtr scope,
- int fieldToken,
- ref ConstArray fieldMarshal);
+ private static extern int GetFieldMarshal(IntPtr scope, int fieldToken, ref ConstArray fieldMarshal);
public ConstArray GetFieldMarshal(int fieldToken)
{
ConstArray fieldMarshal = default;
-
- _GetFieldMarshal(m_metadataImport2, fieldToken, ref fieldMarshal);
-
+ ThrowBadImageExceptionForHR(GetFieldMarshal(m_metadataImport2, fieldToken, ref fieldMarshal));
return fieldMarshal;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern unsafe void _GetPInvokeMap(IntPtr scope,
+ private static extern unsafe int GetPInvokeMap(IntPtr scope,
int token,
out int attributes,
- void** importName,
- void** importDll);
+ out byte* importName,
+ out byte* importDll);
public unsafe void GetPInvokeMap(
int token,
@@ -537,28 +596,28 @@ public unsafe void GetPInvokeMap(
out string importName,
out string importDll)
{
- void* _importName, _importDll;
- _GetPInvokeMap(m_metadataImport2, token, out int _attributes, &_importName, &_importDll);
- importName = new MdUtf8String(_importName).ToString();
- importDll = new MdUtf8String(_importDll).ToString();
+ ThrowBadImageExceptionForHR(GetPInvokeMap(m_metadataImport2, token, out int attributesRaw, out byte* importNameRaw, out byte* importDllRaw));
- attributes = (PInvokeAttributes)_attributes;
+ importName = Text.Encoding.UTF8.GetString(MemoryMarshal.CreateReadOnlySpanFromNullTerminated(importNameRaw));
+ importDll = Text.Encoding.UTF8.GetString(MemoryMarshal.CreateReadOnlySpanFromNullTerminated(importDllRaw));
+ attributes = (PInvokeAttributes)attributesRaw;
}
[MethodImpl(MethodImplOptions.InternalCall)]
- private static extern bool _IsValidToken(IntPtr scope, int token);
+ private static extern bool IsValidToken(IntPtr scope, int token);
+
public bool IsValidToken(int token)
{
- return _IsValidToken(m_metadataImport2, token);
+ return IsValidToken(m_metadataImport2, token);
}
#endregion
- }
-
- internal sealed class MetadataException : Exception
- {
- private readonly int m_hr;
- internal MetadataException(int hr) { m_hr = hr; }
- public override string ToString() => $"{nameof(MetadataException)} HResult = {m_hr:x}.";
+ private static void ThrowBadImageExceptionForHR(int hr)
+ {
+ if (hr < 0)
+ {
+ throw new BadImageFormatException();
+ }
+ }
}
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs
index 53f2690948df..3af48057a870 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeAssembly.cs
@@ -249,7 +249,7 @@ private static partial void GetTypeCoreIgnoreCase(QCallAssembly assembly,
{
ArgumentException.ThrowIfNullOrEmpty(name);
- return TypeNameParser.GetType(name, topLevelAssembly: this,
+ return TypeNameResolver.GetType(name, topLevelAssembly: this,
throwOnError: throwOnError, ignoreCase: ignoreCase);
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeCustomAttributeData.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeCustomAttributeData.cs
index dd0b5cf897f4..e00b0b1854a3 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeCustomAttributeData.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeCustomAttributeData.cs
@@ -215,6 +215,7 @@ internal static CustomAttributeRecord[] GetCustomAttributeRecords(RuntimeModule
scope.GetCustomAttributeProps(tkCustomAttributeTokens[i],
out records[i].tkCtor.Value, out records[i].blob);
}
+ GC.KeepAlive(module);
return records;
}
@@ -250,13 +251,13 @@ internal static CustomAttributeTypedArgument Filter(IList a
private RuntimeCustomAttributeData(RuntimeModule scope, MetadataToken caCtorToken, in ConstArray blob)
{
m_scope = scope;
- m_ctor = (RuntimeConstructorInfo)RuntimeType.GetMethodBase(scope, caCtorToken)!;
+ m_ctor = (RuntimeConstructorInfo)RuntimeType.GetMethodBase(m_scope, caCtorToken)!;
if (m_ctor!.DeclaringType!.IsGenericType)
{
- MetadataImport metadataScope = scope.MetadataImport;
- Type attributeType = scope.ResolveType(metadataScope.GetParentToken(caCtorToken), null, null)!;
- m_ctor = (RuntimeConstructorInfo)scope.ResolveMethod(caCtorToken, attributeType.GenericTypeArguments, null)!.MethodHandle.GetMethodInfo();
+ MetadataImport metadataScope = m_scope.MetadataImport;
+ Type attributeType = m_scope.ResolveType(metadataScope.GetParentToken(caCtorToken), null, null)!;
+ m_ctor = (RuntimeConstructorInfo)m_scope.ResolveMethod(caCtorToken, attributeType.GenericTypeArguments, null)!.MethodHandle.GetMethodInfo();
}
ReadOnlySpan parameters = m_ctor.GetParametersAsSpan();
@@ -542,7 +543,7 @@ private static object EncodedValueToRawValue(PrimitiveValue val, CustomAttribute
}
private static RuntimeType ResolveType(RuntimeModule scope, string typeName)
{
- RuntimeType type = TypeNameParser.GetTypeReferencedByCustomAttribute(typeName, scope);
+ RuntimeType type = TypeNameResolver.GetTypeReferencedByCustomAttribute(typeName, scope);
Debug.Assert(type is not null);
return type;
}
@@ -898,7 +899,7 @@ private static CustomAttributeType ParseCustomAttributeType(ref CustomAttributeD
throw new BadImageFormatException();
}
- enumType = TypeNameParser.GetTypeReferencedByCustomAttribute(enumTypeMaybe, module);
+ enumType = TypeNameResolver.GetTypeReferencedByCustomAttribute(enumTypeMaybe, module);
if (!enumType.IsEnum)
{
throw new BadImageFormatException();
@@ -1466,6 +1467,7 @@ private static bool IsCustomAttributeDefined(
}
}
}
+ GC.KeepAlive(decoratedModule);
return false;
}
@@ -1615,6 +1617,7 @@ private static void AddCustomAttributes(
attributes.Add(attribute);
}
+ GC.KeepAlive(decoratedModule);
}
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
@@ -2194,10 +2197,11 @@ internal static bool IsDefined(RuntimeFieldInfo field, RuntimeType? caType)
if ((method.Attributes & MethodAttributes.PinvokeImpl) == 0)
return null;
- MetadataImport scope = ModuleHandle.GetMetadataImport(method.Module.ModuleHandle.GetRuntimeModule());
+ RuntimeModule module = method.Module.ModuleHandle.GetRuntimeModule();
+ MetadataImport scope = module.MetadataImport;
int token = method.MetadataToken;
-
scope.GetPInvokeMap(token, out PInvokeAttributes flags, out string entryPoint, out string dllName);
+ GC.KeepAlive(module);
CharSet charSet = CharSet.None;
@@ -2252,51 +2256,25 @@ internal static bool IsDefined(RuntimeFieldInfo field, RuntimeType? caType)
private static MarshalAsAttribute? GetMarshalAsCustomAttribute(int token, RuntimeModule scope)
{
- ConstArray nativeType = ModuleHandle.GetMetadataImport(scope).GetFieldMarshal(token);
+ ConstArray nativeType = scope.MetadataImport.GetFieldMarshal(token);
if (nativeType.Length == 0)
return null;
- MetadataImport.GetMarshalAs(nativeType,
- out UnmanagedType unmanagedType, out VarEnum safeArraySubType, out string? safeArrayUserDefinedTypeName, out UnmanagedType arraySubType, out int sizeParamIndex,
- out int sizeConst, out string? marshalTypeName, out string? marshalCookie, out int iidParamIndex);
-
- RuntimeType? safeArrayUserDefinedType = string.IsNullOrEmpty(safeArrayUserDefinedTypeName) ? null :
- TypeNameParser.GetTypeReferencedByCustomAttribute(safeArrayUserDefinedTypeName, scope);
- RuntimeType? marshalTypeRef = null;
-
- try
- {
- marshalTypeRef = marshalTypeName is null ? null : TypeNameParser.GetTypeReferencedByCustomAttribute(marshalTypeName, scope);
- }
- catch (TypeLoadException)
- {
- // The user may have supplied a bad type name string causing this TypeLoadException
- // Regardless, we return the bad type name
- Debug.Assert(marshalTypeName is not null);
- }
-
- MarshalAsAttribute attribute = new MarshalAsAttribute(unmanagedType);
-
- attribute.SafeArraySubType = safeArraySubType;
- attribute.SafeArrayUserDefinedSubType = safeArrayUserDefinedType;
- attribute.IidParameterIndex = iidParamIndex;
- attribute.ArraySubType = arraySubType;
- attribute.SizeParamIndex = (short)sizeParamIndex;
- attribute.SizeConst = sizeConst;
- attribute.MarshalType = marshalTypeName;
- attribute.MarshalTypeRef = marshalTypeRef;
- attribute.MarshalCookie = marshalCookie;
-
- return attribute;
+ return MetadataImport.GetMarshalAs(nativeType, scope);
}
private static FieldOffsetAttribute? GetFieldOffsetCustomAttribute(RuntimeFieldInfo field)
{
- if (field.DeclaringType is not null &&
- field.GetRuntimeModule().MetadataImport.GetFieldOffset(field.DeclaringType.MetadataToken, field.MetadataToken, out int fieldOffset))
- return new FieldOffsetAttribute(fieldOffset);
-
+ if (field.DeclaringType is not null)
+ {
+ RuntimeModule module = field.GetRuntimeModule();
+ if (module.MetadataImport.GetFieldOffset(field.DeclaringType.MetadataToken, field.MetadataToken, out int fieldOffset))
+ {
+ return new FieldOffsetAttribute(fieldOffset);
+ }
+ GC.KeepAlive(module);
+ }
return null;
}
@@ -2322,7 +2300,9 @@ internal static bool IsDefined(RuntimeFieldInfo field, RuntimeType? caType)
case TypeAttributes.UnicodeClass: charSet = CharSet.Unicode; break;
default: Debug.Fail("Unreachable code"); break;
}
- type.GetRuntimeModule().MetadataImport.GetClassLayout(type.MetadataToken, out int pack, out int size);
+ RuntimeModule module = type.GetRuntimeModule();
+ module.MetadataImport.GetClassLayout(type.MetadataToken, out int pack, out int size);
+ GC.KeepAlive(module);
StructLayoutAttribute attribute = new StructLayoutAttribute(layoutKind);
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs
index 8e7e4a05c73d..43760e17b4d9 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeModule.cs
@@ -202,7 +202,7 @@ public override byte[] ResolveSignature(int metadataToken)
if (declaringType.IsGenericType || declaringType.IsArray)
{
- int tkDeclaringType = ModuleHandle.GetMetadataImport(this).GetParentToken(metadataToken);
+ int tkDeclaringType = MetadataImport.GetParentToken(metadataToken);
declaringType = (RuntimeType)ResolveType(tkDeclaringType, genericTypeArguments, genericMethodArguments);
}
@@ -353,7 +353,7 @@ public override void GetPEKind(out PortableExecutableKinds peKind, out ImageFile
#region Internal Members
internal RuntimeType RuntimeType => m_runtimeType ??= ModuleHandle.GetModuleType(this);
- internal MetadataImport MetadataImport => ModuleHandle.GetMetadataImport(this);
+ internal MetadataImport MetadataImport => new MetadataImport(this);
#endregion
#region ICustomAttributeProvider Members
@@ -403,7 +403,7 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont
{
ArgumentException.ThrowIfNullOrEmpty(className);
- return TypeNameParser.GetType(className, topLevelAssembly: Assembly,
+ return TypeNameResolver.GetType(className, topLevelAssembly: Assembly,
throwOnError: throwOnError, ignoreCase: ignoreCase);
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeParameterInfo.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeParameterInfo.cs
index 5af77b790f49..24dd89c21131 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeParameterInfo.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimeParameterInfo.cs
@@ -29,6 +29,11 @@ internal static ParameterInfo GetReturnParameter(IRuntimeMethodInfo method, Memb
private static ParameterInfo[] GetParameters(
IRuntimeMethodInfo methodHandle, MemberInfo member, Signature sig, out ParameterInfo? returnParameter, bool fetchReturnParameter)
{
+ // The lifetime rules for MetadataImport expect these two objects to be the same instance.
+ // See the lifetime of MetadataImport, acquired through IRuntimeMethodInfo, but extended
+ // through the MemberInfo instance.
+ Debug.Assert(ReferenceEquals(methodHandle, member));
+
returnParameter = null;
int sigArgCount = sig.Arguments.Length;
ParameterInfo[] args =
@@ -43,7 +48,7 @@ private static ParameterInfo[] GetParameters(
// are generated on the fly by the runtime.
if (!MdToken.IsNullToken(tkMethodDef))
{
- MetadataImport scope = RuntimeTypeHandle.GetMetadataImport(RuntimeMethodHandle.GetDeclaringType(methodHandle));
+ MetadataImport scope = RuntimeMethodHandle.GetDeclaringType(methodHandle).GetRuntimeModule().MetadataImport;
scope.EnumParams(tkMethodDef, out MetadataEnumResult tkParamDefs);
@@ -73,7 +78,7 @@ private static ParameterInfo[] GetParameters(
}
else if (!fetchReturnParameter && position >= 0)
{
- // position beyong sigArgCount?
+ // position beyond sigArgCount?
if (position >= sigArgCount)
throw new BadImageFormatException(SR.BadImageFormat_ParameterSignatureMismatch);
@@ -86,7 +91,7 @@ private static ParameterInfo[] GetParameters(
// Fill in empty ParameterInfos for those without tokens
if (fetchReturnParameter)
{
- returnParameter ??= new RuntimeParameterInfo(sig, MetadataImport.EmptyImport, 0, -1, (ParameterAttributes)0, member);
+ returnParameter ??= new RuntimeParameterInfo(sig, default, 0, -1, (ParameterAttributes)0, member);
}
else
{
@@ -97,7 +102,7 @@ private static ParameterInfo[] GetParameters(
if (args[i] != null)
continue;
- args[i] = new RuntimeParameterInfo(sig, MetadataImport.EmptyImport, 0, i, (ParameterAttributes)0, member);
+ args[i] = new RuntimeParameterInfo(sig, default, 0, i, (ParameterAttributes)0, member);
}
}
}
@@ -165,7 +170,7 @@ private RuntimeParameterInfo(RuntimeParameterInfo accessor, MemberInfo member)
PositionImpl = accessor.Position;
AttrsImpl = accessor.Attributes;
- // Strictly speeking, property's don't contain parameter tokens
+ // Strictly speaking, properties don't contain parameter tokens
// However we need this to make ca's work... oh well...
m_tkParamDef = MdToken.IsNullToken(accessor.MetadataToken) ? (int)MetadataTokenType.ParamDef : accessor.MetadataToken;
m_scope = accessor.m_scope;
@@ -176,7 +181,7 @@ private RuntimeParameterInfo(
int position, ParameterAttributes attributes, MemberInfo member)
{
Debug.Assert(member != null);
- Debug.Assert(MdToken.IsNullToken(tkParamDef) == scope.Equals(MetadataImport.EmptyImport));
+ Debug.Assert(MdToken.IsNullToken(tkParamDef) == scope.Equals((MetadataImport)default));
Debug.Assert(MdToken.IsNullToken(tkParamDef) || MdToken.IsTokenOfType(tkParamDef, MetadataTokenType.ParamDef));
PositionImpl = position;
@@ -201,7 +206,7 @@ internal RuntimeParameterInfo(MethodInfo owner, string? name, Type parameterType
PositionImpl = position;
AttrsImpl = ParameterAttributes.None;
m_tkParamDef = (int)MetadataTokenType.ParamDef;
- m_scope = MetadataImport.EmptyImport;
+ m_scope = default;
}
#endregion
@@ -239,6 +244,7 @@ public override string? Name
if (!MdToken.IsNullToken(m_tkParamDef))
{
string name = m_scope.GetName(m_tkParamDef).ToString();
+ GC.KeepAlive(this);
NameImpl = name;
}
@@ -339,6 +345,7 @@ private bool TryGetDefaultValueInternal(bool raw, out object? defaultValue)
#region Look for a default value in metadata
// This will return DBNull.Value if no constant value is defined on m_tkParamDef in the metadata.
defaultValue = MdConstant.GetValue(m_scope, m_tkParamDef, ParameterType.TypeHandle, raw);
+ GC.KeepAlive(this);
// If default value is not specified in metadata, look for it in custom attributes
if (defaultValue == DBNull.Value)
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs
index 933e05d0bf78..d49ac821e684 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/RuntimePropertyInfo.cs
@@ -35,7 +35,8 @@ internal RuntimePropertyInfo(
Debug.Assert(reflectedTypeCache != null);
Debug.Assert(!reflectedTypeCache.IsGlobal);
- MetadataImport scope = declaredType.GetRuntimeModule().MetadataImport;
+ RuntimeModule module = declaredType.GetRuntimeModule();
+ MetadataImport scope = module.MetadataImport;
m_token = tkProperty;
m_reflectedTypeCache = reflectedTypeCache;
@@ -47,6 +48,7 @@ internal RuntimePropertyInfo(
out _, out _, out _,
out m_getterMethod, out m_setterMethod, out m_otherMethod,
out isPrivate, out m_bindingFlags);
+ GC.KeepAlive(module);
}
#endregion
@@ -65,9 +67,9 @@ internal Signature Signature
{
if (m_signature == null)
{
-
GetRuntimeModule().MetadataImport.GetPropertyProps(
m_token, out _, out _, out ConstArray sig);
+ GC.KeepAlive(this);
m_signature = new Signature(sig.Signature.ToPointer(), sig.Length, m_declaringType);
}
@@ -210,6 +212,7 @@ public override Type[] GetOptionalCustomModifiers()
internal object GetConstantValue(bool raw)
{
object? defaultValue = MdConstant.GetValue(GetRuntimeModule().MetadataImport, m_token, PropertyType.TypeHandle, raw);
+ GC.KeepAlive(this);
if (defaultValue == DBNull.Value)
// Arg_EnumLitValueNotFound -> "Literal value was not found."
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameParser.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameParser.CoreCLR.cs
deleted file mode 100644
index 2af4bb792d45..000000000000
--- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameParser.CoreCLR.cs
+++ /dev/null
@@ -1,301 +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.Diagnostics;
-using System.Diagnostics.CodeAnalysis;
-using System.IO;
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-using System.Runtime.Loader;
-using System.Text;
-using System.Threading;
-
-namespace System.Reflection
-{
- internal partial struct TypeNameParser
- {
- private Func? _assemblyResolver;
- private Func? _typeResolver;
- private bool _throwOnError;
- private bool _ignoreCase;
- private bool _extensibleParser;
- private bool _requireAssemblyQualifiedName;
- private bool _suppressContextualReflectionContext;
- private Assembly? _requestingAssembly;
- private Assembly? _topLevelAssembly;
-
- [RequiresUnreferencedCode("The type might be removed")]
- internal static Type? GetType(
- string typeName,
- Assembly requestingAssembly,
- bool throwOnError = false,
- bool ignoreCase = false)
- {
- return GetType(typeName, assemblyResolver: null, typeResolver: null, requestingAssembly: requestingAssembly,
- throwOnError: throwOnError, ignoreCase: ignoreCase, extensibleParser: false);
- }
-
- [RequiresUnreferencedCode("The type might be removed")]
- internal static Type? GetType(
- string typeName,
- Func? assemblyResolver,
- Func? typeResolver,
- Assembly? requestingAssembly,
- bool throwOnError = false,
- bool ignoreCase = false,
- bool extensibleParser = true)
- {
- ArgumentNullException.ThrowIfNull(typeName);
-
- // Compat: Empty name throws TypeLoadException instead of
- // the natural ArgumentException
- if (typeName.Length == 0)
- {
- if (throwOnError)
- throw new TypeLoadException(SR.Arg_TypeLoadNullStr);
- return null;
- }
-
- return new TypeNameParser(typeName)
- {
- _assemblyResolver = assemblyResolver,
- _typeResolver = typeResolver,
- _throwOnError = throwOnError,
- _ignoreCase = ignoreCase,
- _extensibleParser = extensibleParser,
- _requestingAssembly = requestingAssembly
- }.Parse();
- }
-
- [RequiresUnreferencedCode("The type might be removed")]
- internal static Type? GetType(
- string typeName,
- bool throwOnError,
- bool ignoreCase,
- Assembly topLevelAssembly)
- {
- return new TypeNameParser(typeName)
- {
- _throwOnError = throwOnError,
- _ignoreCase = ignoreCase,
- _topLevelAssembly = topLevelAssembly,
- _requestingAssembly = topLevelAssembly
- }.Parse();
- }
-
- // Resolve type name referenced by a custom attribute metadata.
- // It uses the standard Type.GetType(typeName, throwOnError: true) algorithm with the following modifications:
- // - ContextualReflectionContext is not taken into account
- // - The dependency between the returned type and the requesting assembly is recorded for the purpose of
- // lifetime tracking of collectible types.
- internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName, RuntimeModule scope)
- {
- ArgumentException.ThrowIfNullOrEmpty(typeName);
-
- RuntimeAssembly requestingAssembly = scope.GetRuntimeAssembly();
-
- RuntimeType? type = (RuntimeType?)new TypeNameParser(typeName)
- {
- _throwOnError = true,
- _suppressContextualReflectionContext = true,
- _requestingAssembly = requestingAssembly
- }.Parse();
-
- Debug.Assert(type != null);
-
- RuntimeTypeHandle.RegisterCollectibleTypeDependency(type, requestingAssembly);
-
- return type;
- }
-
- // Used by VM
- internal static unsafe RuntimeType? GetTypeHelper(char* pTypeName, RuntimeAssembly? requestingAssembly,
- bool throwOnError, bool requireAssemblyQualifiedName)
- {
- ReadOnlySpan typeName = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(pTypeName);
-
- // Compat: Empty name throws TypeLoadException instead of
- // the natural ArgumentException
- if (typeName.Length == 0)
- {
- if (throwOnError)
- throw new TypeLoadException(SR.Arg_TypeLoadNullStr);
- return null;
- }
-
- RuntimeType? type = (RuntimeType?)new TypeNameParser(typeName)
- {
- _requestingAssembly = requestingAssembly,
- _throwOnError = throwOnError,
- _suppressContextualReflectionContext = true,
- _requireAssemblyQualifiedName = requireAssemblyQualifiedName,
- }.Parse();
-
- if (type != null)
- RuntimeTypeHandle.RegisterCollectibleTypeDependency(type, requestingAssembly);
-
- return type;
- }
-
- private bool CheckTopLevelAssemblyQualifiedName()
- {
- if (_topLevelAssembly is not null)
- {
- if (_throwOnError)
- throw new ArgumentException(SR.Argument_AssemblyGetTypeCannotSpecifyAssembly);
- return false;
- }
- return true;
- }
-
- private Assembly? ResolveAssembly(string assemblyName)
- {
- Assembly? assembly;
- if (_assemblyResolver is not null)
- {
- assembly = _assemblyResolver(new AssemblyName(assemblyName));
- if (assembly is null && _throwOnError)
- {
- throw new FileNotFoundException(SR.Format(SR.FileNotFound_ResolveAssembly, assemblyName));
- }
- }
- else
- {
- assembly = RuntimeAssembly.InternalLoad(new AssemblyName(assemblyName), ref Unsafe.NullRef(),
- _suppressContextualReflectionContext ? null : AssemblyLoadContext.CurrentContextualReflectionContext,
- requestingAssembly: (RuntimeAssembly?)_requestingAssembly, throwOnFileNotFound: _throwOnError);
- }
- return assembly;
- }
-
- [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
- Justification = "TypeNameParser.GetType is marked as RequiresUnreferencedCode.")]
- [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern",
- Justification = "TypeNameParser.GetType is marked as RequiresUnreferencedCode.")]
- private Type? GetType(string typeName, ReadOnlySpan nestedTypeNames, string? assemblyNameIfAny)
- {
- Assembly? assembly;
-
- if (assemblyNameIfAny is not null)
- {
- assembly = ResolveAssembly(assemblyNameIfAny);
- if (assembly is null)
- return null;
- }
- else
- {
- assembly = _topLevelAssembly;
- }
-
- Type? type;
-
- // Resolve the top level type.
- if (_typeResolver is not null)
- {
- string escapedTypeName = EscapeTypeName(typeName);
-
- type = _typeResolver(assembly, escapedTypeName, _ignoreCase);
-
- if (type is null)
- {
- if (_throwOnError)
- {
- throw new TypeLoadException(assembly is null ?
- SR.Format(SR.TypeLoad_ResolveType, escapedTypeName) :
- SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, escapedTypeName, assembly.FullName));
- }
- return null;
- }
- }
- else
- {
- if (assembly is null)
- {
- if (_requireAssemblyQualifiedName)
- {
- if (_throwOnError)
- {
- throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveType, EscapeTypeName(typeName)));
- }
- return null;
- }
- return GetTypeFromDefaultAssemblies(typeName, nestedTypeNames);
- }
-
- if (assembly is RuntimeAssembly runtimeAssembly)
- {
- // Compat: Non-extensible parser allows ambiguous matches with ignore case lookup
- if (!_extensibleParser || !_ignoreCase)
- {
- return runtimeAssembly.GetTypeCore(typeName, nestedTypeNames, throwOnError: _throwOnError, ignoreCase: _ignoreCase);
- }
- type = runtimeAssembly.GetTypeCore(typeName, default, throwOnError: _throwOnError, ignoreCase: _ignoreCase);
- }
- else
- {
- // This is a third-party Assembly object. Emulate GetTypeCore() by calling the public GetType()
- // method. This is wasteful because it'll probably reparse a type string that we've already parsed
- // but it can't be helped.
- type = assembly.GetType(EscapeTypeName(typeName), throwOnError: _throwOnError, ignoreCase: _ignoreCase);
- }
-
- if (type is null)
- return null;
- }
-
- for (int i = 0; i < nestedTypeNames.Length; i++)
- {
- BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Public;
- if (_ignoreCase)
- bindingFlags |= BindingFlags.IgnoreCase;
-
- type = type.GetNestedType(nestedTypeNames[i], bindingFlags);
-
- if (type is null)
- {
- if (_throwOnError)
- {
- throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveNestedType,
- nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : typeName));
- }
- return null;
- }
- }
-
- return type;
- }
-
- private Type? GetTypeFromDefaultAssemblies(string typeName, ReadOnlySpan nestedTypeNames)
- {
- RuntimeAssembly? requestingAssembly = (RuntimeAssembly?)_requestingAssembly;
- if (requestingAssembly is not null)
- {
- Type? type = ((RuntimeAssembly)requestingAssembly).GetTypeCore(typeName, nestedTypeNames, throwOnError: false, ignoreCase: _ignoreCase);
- if (type is not null)
- return type;
- }
-
- RuntimeAssembly coreLib = (RuntimeAssembly)typeof(object).Assembly;
- if (requestingAssembly != coreLib)
- {
- Type? type = ((RuntimeAssembly)coreLib).GetTypeCore(typeName, nestedTypeNames, throwOnError: false, ignoreCase: _ignoreCase);
- if (type is not null)
- return type;
- }
-
- RuntimeAssembly? resolvedAssembly = AssemblyLoadContext.OnTypeResolve(requestingAssembly, EscapeTypeName(typeName, nestedTypeNames));
- if (resolvedAssembly is not null)
- {
- Type? type = resolvedAssembly.GetTypeCore(typeName, nestedTypeNames, throwOnError: false, ignoreCase: _ignoreCase);
- if (type is not null)
- return type;
- }
-
- if (_throwOnError)
- throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, EscapeTypeName(typeName), (requestingAssembly ?? coreLib).FullName));
-
- return null;
- }
- }
-}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.CoreCLR.cs
new file mode 100644
index 000000000000..78e2422b3410
--- /dev/null
+++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/TypeNameResolver.CoreCLR.cs
@@ -0,0 +1,312 @@
+// 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.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Reflection.Metadata;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+using System.Runtime.Loader;
+using System.Threading;
+
+namespace System.Reflection
+{
+ internal partial struct TypeNameResolver
+ {
+ private Func? _assemblyResolver;
+ private Func? _typeResolver;
+ private bool _throwOnError;
+ private bool _ignoreCase;
+ private bool _extensibleParser;
+ private bool _requireAssemblyQualifiedName;
+ private bool _suppressContextualReflectionContext;
+ private Assembly? _requestingAssembly;
+ private Assembly? _topLevelAssembly;
+
+ [RequiresUnreferencedCode("The type might be removed")]
+ internal static Type? GetType(
+ string typeName,
+ Assembly requestingAssembly,
+ bool throwOnError = false,
+ bool ignoreCase = false)
+ {
+ return GetType(typeName, assemblyResolver: null, typeResolver: null, requestingAssembly: requestingAssembly,
+ throwOnError: throwOnError, ignoreCase: ignoreCase, extensibleParser: false);
+ }
+
+ [RequiresUnreferencedCode("The type might be removed")]
+ internal static Type? GetType(
+ string typeName,
+ Func? assemblyResolver,
+ Func? typeResolver,
+ Assembly? requestingAssembly,
+ bool throwOnError = false,
+ bool ignoreCase = false,
+ bool extensibleParser = true)
+ {
+ ArgumentNullException.ThrowIfNull(typeName);
+
+ // Compat: Empty name throws TypeLoadException instead of
+ // the natural ArgumentException
+ if (typeName.Length == 0)
+ {
+ if (throwOnError)
+ throw new TypeLoadException(SR.Arg_TypeLoadNullStr);
+ return null;
+ }
+
+ TypeName? parsed = TypeNameParser.Parse(typeName, throwOnError);
+ if (parsed is null)
+ {
+ return null;
+ }
+
+ return new TypeNameResolver()
+ {
+ _assemblyResolver = assemblyResolver,
+ _typeResolver = typeResolver,
+ _throwOnError = throwOnError,
+ _ignoreCase = ignoreCase,
+ _extensibleParser = extensibleParser,
+ _requestingAssembly = requestingAssembly
+ }.Resolve(parsed);
+ }
+
+ [RequiresUnreferencedCode("The type might be removed")]
+ internal static Type? GetType(
+ string typeName,
+ bool throwOnError,
+ bool ignoreCase,
+ Assembly topLevelAssembly)
+ {
+ TypeName? parsed = TypeNameParser.Parse(typeName, throwOnError);
+
+ if (parsed is null)
+ {
+ return null;
+ }
+ else if (topLevelAssembly is not null && parsed.AssemblyName is not null)
+ {
+ return throwOnError ? throw new ArgumentException(SR.Argument_AssemblyGetTypeCannotSpecifyAssembly) : null;
+ }
+
+ return new TypeNameResolver()
+ {
+ _throwOnError = throwOnError,
+ _ignoreCase = ignoreCase,
+ _topLevelAssembly = topLevelAssembly,
+ _requestingAssembly = topLevelAssembly
+ }.Resolve(parsed);
+ }
+
+ // Resolve type name referenced by a custom attribute metadata.
+ // It uses the standard Type.GetType(typeName, throwOnError: true) algorithm with the following modifications:
+ // - ContextualReflectionContext is not taken into account
+ // - The dependency between the returned type and the requesting assembly is recorded for the purpose of
+ // lifetime tracking of collectible types.
+ internal static RuntimeType GetTypeReferencedByCustomAttribute(string typeName, RuntimeModule scope)
+ {
+ ArgumentException.ThrowIfNullOrEmpty(typeName);
+
+ RuntimeAssembly requestingAssembly = scope.GetRuntimeAssembly();
+
+ TypeName parsed = TypeName.Parse(typeName);
+ RuntimeType? type = (RuntimeType?)new TypeNameResolver()
+ {
+ _throwOnError = true,
+ _suppressContextualReflectionContext = true,
+ _requestingAssembly = requestingAssembly
+ }.Resolve(parsed);
+
+ Debug.Assert(type != null);
+
+ RuntimeTypeHandle.RegisterCollectibleTypeDependency(type, requestingAssembly);
+
+ return type;
+ }
+
+ // Used by VM
+ internal static unsafe RuntimeType? GetTypeHelper(char* pTypeName, RuntimeAssembly? requestingAssembly,
+ bool throwOnError, bool requireAssemblyQualifiedName)
+ {
+ ReadOnlySpan typeName = MemoryMarshal.CreateReadOnlySpanFromNullTerminated(pTypeName);
+
+ // Compat: Empty name throws TypeLoadException instead of
+ // the natural ArgumentException
+ if (typeName.Length == 0)
+ {
+ if (throwOnError)
+ throw new TypeLoadException(SR.Arg_TypeLoadNullStr);
+ return null;
+ }
+
+ TypeName? parsed = TypeNameParser.Parse(typeName, throwOnError);
+ if (parsed is null)
+ {
+ return null;
+ }
+
+ RuntimeType? type = (RuntimeType?)new TypeNameResolver()
+ {
+ _requestingAssembly = requestingAssembly,
+ _throwOnError = throwOnError,
+ _suppressContextualReflectionContext = true,
+ _requireAssemblyQualifiedName = requireAssemblyQualifiedName,
+ }.Resolve(parsed);
+
+ if (type != null)
+ RuntimeTypeHandle.RegisterCollectibleTypeDependency(type, requestingAssembly);
+
+ return type;
+ }
+
+ private Assembly? ResolveAssembly(AssemblyName assemblyName)
+ {
+ Assembly? assembly;
+ if (_assemblyResolver is not null)
+ {
+ assembly = _assemblyResolver(assemblyName);
+ if (assembly is null && _throwOnError)
+ {
+ throw new FileNotFoundException(SR.Format(SR.FileNotFound_ResolveAssembly, assemblyName));
+ }
+ }
+ else
+ {
+ assembly = RuntimeAssembly.InternalLoad(assemblyName, ref Unsafe.NullRef(),
+ _suppressContextualReflectionContext ? null : AssemblyLoadContext.CurrentContextualReflectionContext,
+ requestingAssembly: (RuntimeAssembly?)_requestingAssembly, throwOnFileNotFound: _throwOnError);
+ }
+ return assembly;
+ }
+
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode",
+ Justification = "TypeNameResolver.GetType is marked as RequiresUnreferencedCode.")]
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075:UnrecognizedReflectionPattern",
+ Justification = "TypeNameResolver.GetType is marked as RequiresUnreferencedCode.")]
+ private Type? GetType(string escapedTypeName, ReadOnlySpan nestedTypeNames, TypeName parsedName)
+ {
+ Assembly? assembly;
+
+ if (parsedName.AssemblyName is not null)
+ {
+ assembly = ResolveAssembly(parsedName.AssemblyName.ToAssemblyName());
+ if (assembly is null)
+ return null;
+ }
+ else
+ {
+ assembly = _topLevelAssembly;
+ }
+
+ Type? type;
+
+ // Resolve the top level type.
+ if (_typeResolver is not null)
+ {
+ type = _typeResolver(assembly, escapedTypeName, _ignoreCase);
+
+ if (type is null)
+ {
+ if (_throwOnError)
+ {
+ throw new TypeLoadException(assembly is null ?
+ SR.Format(SR.TypeLoad_ResolveType, escapedTypeName) :
+ SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, escapedTypeName, assembly.FullName));
+ }
+ return null;
+ }
+ }
+ else
+ {
+ if (assembly is null)
+ {
+ if (_requireAssemblyQualifiedName)
+ {
+ if (_throwOnError)
+ {
+ throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveType, escapedTypeName));
+ }
+ return null;
+ }
+ return GetTypeFromDefaultAssemblies(TypeNameHelpers.Unescape(escapedTypeName), nestedTypeNames, parsedName);
+ }
+
+ if (assembly is RuntimeAssembly runtimeAssembly)
+ {
+ string unescapedTypeName = TypeNameHelpers.Unescape(escapedTypeName);
+ // Compat: Non-extensible parser allows ambiguous matches with ignore case lookup
+ if (!_extensibleParser || !_ignoreCase)
+ {
+ return runtimeAssembly.GetTypeCore(unescapedTypeName, nestedTypeNames, throwOnError: _throwOnError, ignoreCase: _ignoreCase);
+ }
+ type = runtimeAssembly.GetTypeCore(unescapedTypeName, default, throwOnError: _throwOnError, ignoreCase: _ignoreCase);
+ }
+ else
+ {
+ // This is a third-party Assembly object. Emulate GetTypeCore() by calling the public GetType()
+ // method. This is wasteful because it'll probably reparse a type string that we've already parsed
+ // but it can't be helped.
+ type = assembly.GetType(escapedTypeName, throwOnError: _throwOnError, ignoreCase: _ignoreCase);
+ }
+
+ if (type is null)
+ return null;
+ }
+
+ for (int i = 0; i < nestedTypeNames.Length; i++)
+ {
+ BindingFlags bindingFlags = BindingFlags.NonPublic | BindingFlags.Public;
+ if (_ignoreCase)
+ bindingFlags |= BindingFlags.IgnoreCase;
+
+ type = type.GetNestedType(nestedTypeNames[i], bindingFlags);
+
+ if (type is null)
+ {
+ if (_throwOnError)
+ {
+ throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveNestedType,
+ nestedTypeNames[i], (i > 0) ? nestedTypeNames[i - 1] : TypeNameHelpers.Unescape(escapedTypeName)));
+ }
+ return null;
+ }
+ }
+
+ return type;
+ }
+
+ private Type? GetTypeFromDefaultAssemblies(string typeName, ReadOnlySpan nestedTypeNames, TypeName parsedName)
+ {
+ RuntimeAssembly? requestingAssembly = (RuntimeAssembly?)_requestingAssembly;
+ if (requestingAssembly is not null)
+ {
+ Type? type = requestingAssembly.GetTypeCore(typeName, nestedTypeNames, throwOnError: false, ignoreCase: _ignoreCase);
+ if (type is not null)
+ return type;
+ }
+
+ RuntimeAssembly coreLib = (RuntimeAssembly)typeof(object).Assembly;
+ if (requestingAssembly != coreLib)
+ {
+ Type? type = coreLib.GetTypeCore(typeName, nestedTypeNames, throwOnError: false, ignoreCase: _ignoreCase);
+ if (type is not null)
+ return type;
+ }
+
+ RuntimeAssembly? resolvedAssembly = AssemblyLoadContext.OnTypeResolve(requestingAssembly, parsedName.FullName);
+ if (resolvedAssembly is not null)
+ {
+ Type? type = resolvedAssembly.GetTypeCore(typeName, nestedTypeNames, throwOnError: false, ignoreCase: _ignoreCase);
+ if (type is not null)
+ return type;
+ }
+
+ if (_throwOnError)
+ throw new TypeLoadException(SR.Format(SR.TypeLoad_ResolveTypeFromAssembly, parsedName.FullName, (requestingAssembly ?? coreLib).FullName));
+
+ return null;
+ }
+ }
+}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs
index 69506c2feda1..43ddbfecf006 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/CompilerServices/RuntimeHelpers.CoreCLR.cs
@@ -458,6 +458,32 @@ private static unsafe void DispatchTailCalls(
return Unsafe.As(ref target);
}
}
+
+ [LibraryImport(QCall, EntryPoint = "ReflectionInvocation_SizeOf")]
+ [SuppressGCTransition]
+ private static partial int SizeOf(QCallTypeHandle handle);
+
+ ///
+ /// Get the size of an object of the given type.
+ ///
+ /// The type to get the size of.
+ /// The size of instances of the type.
+ /// The passed-in type is not a valid type to get the size of.
+ ///
+ /// This API returns the same value as for the type that represents.
+ ///
+ public static unsafe int SizeOf(RuntimeTypeHandle type)
+ {
+ if (type.IsNullHandle())
+ ThrowHelper.ThrowArgumentNullException(ExceptionArgument.type);
+
+ int result = SizeOf(new QCallTypeHandle(ref type));
+
+ if (result <= 0)
+ throw new ArgumentException(SR.Arg_TypeNotSupported);
+
+ return result;
+ }
}
// Helper class to assist with unsafe pinning of arbitrary objects.
// It's used by VM code.
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs
index bbdccc6cd2ee..64669dd5458f 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Runtime/InteropServices/Marshal.CoreCLR.cs
@@ -21,7 +21,7 @@ public static partial class Marshal
///
/// IUnknown is {00000000-0000-0000-C000-000000000046}
///
- internal static Guid IID_IUnknown = new Guid(0, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
+ internal static readonly Guid IID_IUnknown = new Guid(0, 0, 0, 0xC0, 0, 0, 0, 0, 0, 0, 0x46);
#endif //FEATURE_COMINTEROP
internal static int SizeOfHelper(RuntimeType t, [MarshalAs(UnmanagedType.Bool)] bool throwIfNotMarshalable)
@@ -929,7 +929,7 @@ public static object BindToMoniker(string monikerName)
ThrowExceptionForHR(MkParseDisplayName(bindctx, monikerName, out _, out IntPtr pmoniker));
try
{
- ThrowExceptionForHR(BindMoniker(pmoniker, 0, ref IID_IUnknown, out IntPtr ptr));
+ ThrowExceptionForHR(BindMoniker(pmoniker, 0, in IID_IUnknown, out IntPtr ptr));
try
{
return GetObjectForIUnknown(ptr);
@@ -956,7 +956,7 @@ public static object BindToMoniker(string monikerName)
private static partial int MkParseDisplayName(IntPtr pbc, [MarshalAs(UnmanagedType.LPWStr)] string szUserName, out uint pchEaten, out IntPtr ppmk);
[LibraryImport(Interop.Libraries.Ole32)]
- private static partial int BindMoniker(IntPtr pmk, uint grfOpt, ref Guid iidResult, out IntPtr ppvResult);
+ private static partial int BindMoniker(IntPtr pmk, uint grfOpt, in Guid iidResult, out IntPtr ppvResult);
[SupportedOSPlatform("windows")]
public static void ChangeWrapperHandleStrength(object otp, bool fIsWeak)
diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeHandles.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeHandles.cs
index 001a9fcdfee6..380981993451 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeHandles.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeHandles.cs
@@ -650,14 +650,6 @@ internal static bool SatisfiesConstraints(RuntimeType paramType, RuntimeType[]?
}
}
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern IntPtr _GetMetadataImport(RuntimeType type);
-
- internal static MetadataImport GetMetadataImport(RuntimeType type)
- {
- return new MetadataImport(_GetMetadataImport(type), type);
- }
-
[LibraryImport(RuntimeHelpers.QCall, EntryPoint = "RuntimeTypeHandle_RegisterCollectibleTypeDependency")]
private static partial void RegisterCollectibleTypeDependency(QCallTypeHandle type, QCallAssembly assembly);
@@ -1247,8 +1239,6 @@ internal ModuleHandle(RuntimeModule module)
}
#endregion
- #region Internal FCalls
-
internal RuntimeModule GetRuntimeModule()
{
return m_ptr;
@@ -1278,6 +1268,7 @@ public bool Equals(ModuleHandle handle)
public static bool operator !=(ModuleHandle left, ModuleHandle right) => !left.Equals(right);
+ #region Internal FCalls
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern IRuntimeMethodInfo GetDynamicMethod(Reflection.Emit.DynamicMethod method, RuntimeModule module, string name, byte[] sig, Resolver resolver);
@@ -1336,7 +1327,7 @@ public RuntimeTypeHandle ResolveTypeHandle(int typeToken, RuntimeTypeHandle[]? t
}
catch (Exception)
{
- if (!GetMetadataImport(module).IsValidToken(typeToken))
+ if (!module.MetadataImport.IsValidToken(typeToken))
throw new ArgumentOutOfRangeException(nameof(typeToken),
SR.Format(SR.Argument_InvalidToken, typeToken, new ModuleHandle(module)));
throw;
@@ -1389,7 +1380,7 @@ internal static RuntimeMethodHandleInternal ResolveMethodHandleInternal(RuntimeM
}
catch (Exception)
{
- if (!GetMetadataImport(module).IsValidToken(methodToken))
+ if (!module.MetadataImport.IsValidToken(methodToken))
throw new ArgumentOutOfRangeException(nameof(methodToken),
SR.Format(SR.Argument_InvalidToken, methodToken, new ModuleHandle(module)));
throw;
@@ -1442,7 +1433,7 @@ public RuntimeFieldHandle ResolveFieldHandle(int fieldToken, RuntimeTypeHandle[]
}
catch (Exception)
{
- if (!GetMetadataImport(module).IsValidToken(fieldToken))
+ if (!module.MetadataImport.IsValidToken(fieldToken))
throw new ArgumentOutOfRangeException(nameof(fieldToken),
SR.Format(SR.Argument_InvalidToken, fieldToken, new ModuleHandle(module)));
throw;
@@ -1485,14 +1476,6 @@ internal static void GetPEKind(RuntimeModule module, out PortableExecutableKinds
internal static extern int GetMDStreamVersion(RuntimeModule module);
public int MDStreamVersion => GetMDStreamVersion(GetRuntimeModule());
-
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern IntPtr _GetMetadataImport(RuntimeModule module);
-
- internal static MetadataImport GetMetadataImport(RuntimeModule module)
- {
- return new MetadataImport(_GetMetadataImport(module), module);
- }
#endregion
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs
index 6a1fae9e05c7..c6ea76fde9b8 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs
@@ -932,7 +932,8 @@ private void PopulateLiteralFields(Filter filter, RuntimeType declaringType, ref
if (MdToken.IsNullToken(tkDeclaringType))
return;
- MetadataImport scope = RuntimeTypeHandle.GetMetadataImport(declaringType);
+ RuntimeModule module = declaringType.GetRuntimeModule();
+ MetadataImport scope = module.MetadataImport;
scope.EnumFields(tkDeclaringType, out MetadataEnumResult tkFields);
@@ -976,6 +977,7 @@ private void PopulateLiteralFields(Filter filter, RuntimeType declaringType, ref
list.Add(runtimeFieldInfo);
}
}
+ GC.KeepAlive(module);
}
private void AddSpecialInterface(
@@ -1102,7 +1104,7 @@ private RuntimeType[] PopulateNestedClasses(Filter filter)
ListBuilder list = default;
ModuleHandle moduleHandle = new ModuleHandle(RuntimeTypeHandle.GetModule(declaringType));
- MetadataImport scope = ModuleHandle.GetMetadataImport(moduleHandle.GetRuntimeModule());
+ MetadataImport scope = moduleHandle.GetRuntimeModule().MetadataImport;
scope.EnumNestedTypes(tkEnclosingType, out MetadataEnumResult tkNestedClasses);
@@ -1174,7 +1176,8 @@ private void PopulateEvents(
if (MdToken.IsNullToken(tkDeclaringType))
return;
- MetadataImport scope = RuntimeTypeHandle.GetMetadataImport(declaringType);
+ RuntimeModule module = declaringType.GetRuntimeModule();
+ MetadataImport scope = module.MetadataImport;
scope.EnumEvents(tkDeclaringType, out MetadataEnumResult tkEvents);
@@ -1220,6 +1223,7 @@ private void PopulateEvents(
list.Add(eventInfo);
}
+ GC.KeepAlive(module);
}
private RuntimePropertyInfo[] PopulateProperties(Filter filter)
@@ -1286,7 +1290,8 @@ private void PopulateProperties(
if (MdToken.IsNullToken(tkDeclaringType))
return;
- MetadataImport scope = RuntimeTypeHandle.GetMetadataImport(declaringType);
+ RuntimeModule module = declaringType.GetRuntimeModule();
+ MetadataImport scope = module.MetadataImport;
scope.EnumProperties(tkDeclaringType, out MetadataEnumResult tkProperties);
@@ -1304,7 +1309,7 @@ private void PopulateProperties(
if (filter.RequiresStringComparison())
{
- MdUtf8String name = declaringType.GetRuntimeModule().MetadataImport.GetName(tkProperty);
+ MdUtf8String name = scope.GetName(tkProperty);
if (!filter.Match(name))
continue;
@@ -1399,6 +1404,7 @@ private void PopulateProperties(
list.Add(propertyInfo);
}
+ GC.KeepAlive(module);
}
#endregion
@@ -1571,7 +1577,9 @@ internal Type[] FunctionPointerReturnAndParameterTypes
while (type.IsNested)
type = type.DeclaringType!;
- m_namespace = RuntimeTypeHandle.GetMetadataImport((RuntimeType)type).GetNamespace(type.MetadataToken).ToString();
+ RuntimeModule module = ((RuntimeType)type).GetRuntimeModule();
+ m_namespace = module.MetadataImport.GetNamespace(type.MetadataToken).ToString();
+ GC.KeepAlive(module);
}
return m_namespace;
@@ -3499,8 +3507,9 @@ public override GenericParameterAttributes GenericParameterAttributes
if (!IsGenericParameter)
throw new InvalidOperationException(SR.Arg_NotGenericParameter);
-
- RuntimeTypeHandle.GetMetadataImport(this).GetGenericParamProps(MetadataToken, out GenericParameterAttributes attributes);
+ RuntimeModule module = GetRuntimeModule();
+ module.MetadataImport.GetGenericParamProps(MetadataToken, out GenericParameterAttributes attributes);
+ GC.KeepAlive(module);
return attributes;
}
@@ -3664,9 +3673,6 @@ public override Type MakeArrayType(int rank)
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern bool CanValueSpecialCast(RuntimeType valueType, RuntimeType targetType);
- [MethodImpl(MethodImplOptions.InternalCall)]
- internal static extern object AllocateValueType(RuntimeType type, object? value);
-
private CheckValueStatus TryChangeTypeSpecial(ref object value)
{
Pointer? pointer = value as Pointer;
@@ -3973,14 +3979,6 @@ internal object GetUninitializedObject()
#region Legacy internal static
- [MethodImpl(MethodImplOptions.InternalCall)]
- private static extern object _CreateEnum(RuntimeType enumType, long value);
-
- internal static object CreateEnum(RuntimeType enumType, long value)
- {
- return _CreateEnum(enumType, value);
- }
-
#if FEATURE_COMINTEROP
[MethodImpl(MethodImplOptions.InternalCall)]
private extern object InvokeDispMethod(
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Type.CoreCLR.cs b/src/coreclr/System.Private.CoreLib/src/System/Type.CoreCLR.cs
index 03a92b709eb1..8707db0cf7f6 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Type.CoreCLR.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Type.CoreCLR.cs
@@ -4,7 +4,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Runtime.CompilerServices;
-using System.Runtime.Versioning;
using System.Security;
using StackCrawlMark = System.Threading.StackCrawlMark;
@@ -17,7 +16,7 @@ public abstract partial class Type : MemberInfo, IReflect
public static Type? GetType(string typeName, bool throwOnError, bool ignoreCase)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return TypeNameParser.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark),
+ return TypeNameResolver.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark),
throwOnError: throwOnError, ignoreCase: ignoreCase);
}
@@ -26,7 +25,7 @@ public abstract partial class Type : MemberInfo, IReflect
public static Type? GetType(string typeName, bool throwOnError)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return TypeNameParser.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark),
+ return TypeNameResolver.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark),
throwOnError: throwOnError);
}
@@ -35,7 +34,7 @@ public abstract partial class Type : MemberInfo, IReflect
public static Type? GetType(string typeName)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return TypeNameParser.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark));
+ return TypeNameResolver.GetType(typeName, Assembly.GetExecutingAssembly(ref stackMark));
}
[RequiresUnreferencedCode("The type might be removed")]
@@ -46,7 +45,7 @@ public abstract partial class Type : MemberInfo, IReflect
Func? typeResolver)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return TypeNameParser.GetType(typeName, assemblyResolver, typeResolver,
+ return TypeNameResolver.GetType(typeName, assemblyResolver, typeResolver,
((assemblyResolver != null) && (typeResolver != null)) ? null : Assembly.GetExecutingAssembly(ref stackMark));
}
@@ -59,7 +58,7 @@ public abstract partial class Type : MemberInfo, IReflect
bool throwOnError)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return TypeNameParser.GetType(typeName, assemblyResolver, typeResolver,
+ return TypeNameResolver.GetType(typeName, assemblyResolver, typeResolver,
((assemblyResolver != null) && (typeResolver != null)) ? null : Assembly.GetExecutingAssembly(ref stackMark),
throwOnError: throwOnError);
}
@@ -74,7 +73,7 @@ public abstract partial class Type : MemberInfo, IReflect
bool ignoreCase)
{
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
- return TypeNameParser.GetType(typeName, assemblyResolver, typeResolver,
+ return TypeNameResolver.GetType(typeName, assemblyResolver, typeResolver,
((assemblyResolver != null) && (typeResolver != null)) ? null : Assembly.GetExecutingAssembly(ref stackMark),
throwOnError: throwOnError, ignoreCase: ignoreCase);
}
diff --git a/src/coreclr/System.Private.CoreLib/src/System/Variant.cs b/src/coreclr/System.Private.CoreLib/src/System/Variant.cs
index b945b28e08a7..f32f2b99e788 100644
--- a/src/coreclr/System.Private.CoreLib/src/System/Variant.cs
+++ b/src/coreclr/System.Private.CoreLib/src/System/Variant.cs
@@ -17,7 +17,7 @@
namespace System
{
- internal struct Variant
+ internal partial struct Variant
{
// Do Not change the order of these fields.
// They are mapped to the native VariantData * data structure.
@@ -70,6 +70,14 @@ internal struct Variant
internal static Variant Missing => new Variant(CV_MISSING, Type.Missing, 0);
internal static Variant DBNull => new Variant(CV_NULL, System.DBNull.Value, 0);
+ internal static bool IsSystemDrawingColor(Type type) => type.FullName == "System.Drawing.Color"; // Matches the behavior of IsTypeRefOrDef
+
+ [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Variant_ConvertSystemColorToOleColor")]
+ internal static partial uint ConvertSystemColorToOleColor(ObjectHandleOnStack obj);
+
+ [LibraryImport(RuntimeHelpers.QCall, EntryPoint = "Variant_ConvertOleColorToSystemColor")]
+ internal static partial void ConvertOleColorToSystemColor(ObjectHandleOnStack objret, uint value, IntPtr pMT);
+
//
// Native Methods
//
diff --git a/src/coreclr/binder/assemblybindercommon.cpp b/src/coreclr/binder/assemblybindercommon.cpp
index 55f9a0ae5336..e1de7af70677 100644
--- a/src/coreclr/binder/assemblybindercommon.cpp
+++ b/src/coreclr/binder/assemblybindercommon.cpp
@@ -1297,7 +1297,7 @@ HRESULT AssemblyBinderCommon::CreateDefaultBinder(DefaultAssemblyBinder** ppDefa
hr = pApplicationContext->Init();
if (SUCCEEDED(hr))
{
- pBinder->SetManagedAssemblyLoadContext(NULL);
+ pBinder->SetManagedAssemblyLoadContext((INT_PTR)NULL);
*ppDefaultBinder = pBinder.Extract();
}
}
diff --git a/src/coreclr/binder/customassemblybinder.cpp b/src/coreclr/binder/customassemblybinder.cpp
index ac1cf61bcf6a..99297c2bd9ce 100644
--- a/src/coreclr/binder/customassemblybinder.cpp
+++ b/src/coreclr/binder/customassemblybinder.cpp
@@ -242,13 +242,13 @@ void CustomAssemblyBinder::PrepareForLoadContextRelease(INT_PTR ptrManagedStrong
CustomAssemblyBinder::CustomAssemblyBinder()
{
m_pDefaultBinder = NULL;
- m_ptrManagedStrongAssemblyLoadContext = NULL;
+ m_ptrManagedStrongAssemblyLoadContext = (INT_PTR)NULL;
}
void CustomAssemblyBinder::ReleaseLoadContext()
{
- VERIFY(GetManagedAssemblyLoadContext() != NULL);
- VERIFY(m_ptrManagedStrongAssemblyLoadContext != NULL);
+ VERIFY(GetManagedAssemblyLoadContext() != (INT_PTR)NULL);
+ VERIFY(m_ptrManagedStrongAssemblyLoadContext != (INT_PTR)NULL);
// This method is called to release the weak and strong handles on the managed AssemblyLoadContext
// once the Unloading event has been fired
@@ -256,7 +256,7 @@ void CustomAssemblyBinder::ReleaseLoadContext()
DestroyLongWeakHandle(handle);
handle = reinterpret_cast(m_ptrManagedStrongAssemblyLoadContext);
DestroyHandle(handle);
- SetManagedAssemblyLoadContext(NULL);
+ SetManagedAssemblyLoadContext((INT_PTR)NULL);
// The AssemblyLoaderAllocator is in a process of shutdown and should not be used
// after this point.
diff --git a/src/coreclr/binder/defaultassemblybinder.cpp b/src/coreclr/binder/defaultassemblybinder.cpp
index d4ad4f3265ce..54a70e51f05e 100644
--- a/src/coreclr/binder/defaultassemblybinder.cpp
+++ b/src/coreclr/binder/defaultassemblybinder.cpp
@@ -63,7 +63,7 @@ HRESULT DefaultAssemblyBinder::BindUsingAssemblyName(BINDER_SPACE::AssemblyName
// 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 (pManagedAssemblyLoadContext == (INT_PTR)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
@@ -78,11 +78,11 @@ HRESULT DefaultAssemblyBinder::BindUsingAssemblyName(BINDER_SPACE::AssemblyName
CALL_MANAGED_METHOD_NORET(args)
pManagedAssemblyLoadContext = GetManagedAssemblyLoadContext();
- _ASSERTE(pManagedAssemblyLoadContext != NULL);
+ _ASSERTE(pManagedAssemblyLoadContext != (INT_PTR)NULL);
}
}
- if (pManagedAssemblyLoadContext != NULL)
+ if (pManagedAssemblyLoadContext != (INT_PTR)NULL)
{
hr = AssemblyBinderCommon::BindUsingHostAssemblyResolver(pManagedAssemblyLoadContext, pAssemblyName,
NULL, this, &pCoreCLRFoundAssembly);
diff --git a/src/coreclr/classlibnative/bcltype/CMakeLists.txt b/src/coreclr/classlibnative/bcltype/CMakeLists.txt
index 8e4baf95751e..e8cce56d1735 100644
--- a/src/coreclr/classlibnative/bcltype/CMakeLists.txt
+++ b/src/coreclr/classlibnative/bcltype/CMakeLists.txt
@@ -2,7 +2,6 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(BCLTYPE_SOURCES
arraynative.cpp
- oavariant.cpp
objectnative.cpp
system.cpp
varargsnative.cpp
diff --git a/src/coreclr/classlibnative/bcltype/arraynative.cpp b/src/coreclr/classlibnative/bcltype/arraynative.cpp
index 32bc52b96f1a..02ff0360ac4b 100644
--- a/src/coreclr/classlibnative/bcltype/arraynative.cpp
+++ b/src/coreclr/classlibnative/bcltype/arraynative.cpp
@@ -32,7 +32,7 @@ extern "C" PCODE QCALLTYPE Array_GetElementConstructorEntrypoint(QCall::TypeHand
{
QCALL_CONTRACT;
- PCODE ctorEntrypoint = NULL;
+ PCODE ctorEntrypoint = (PCODE)NULL;
BEGIN_QCALL;
diff --git a/src/coreclr/classlibnative/bcltype/arraynative.inl b/src/coreclr/classlibnative/bcltype/arraynative.inl
index 913b8c64939b..632b83905849 100644
--- a/src/coreclr/classlibnative/bcltype/arraynative.inl
+++ b/src/coreclr/classlibnative/bcltype/arraynative.inl
@@ -307,7 +307,12 @@ FORCEINLINE void InlinedMemmoveGCRefsHelper(void *dest, const void *src, size_t
_ASSERTE(CheckPointer(dest));
_ASSERTE(CheckPointer(src));
- GCHeapMemoryBarrier();
+ const bool notInHeap = ((BYTE*)dest < g_lowest_address || (BYTE*)dest >= g_highest_address);
+
+ if (!notInHeap)
+ {
+ GCHeapMemoryBarrier();
+ }
// To be able to copy forwards, the destination buffer cannot start inside the source buffer
if ((size_t)dest - (size_t)src >= len)
@@ -319,7 +324,10 @@ FORCEINLINE void InlinedMemmoveGCRefsHelper(void *dest, const void *src, size_t
InlinedBackwardGCSafeCopyHelper(dest, src, len);
}
- InlinedSetCardsAfterBulkCopyHelper((Object**)dest, len);
+ if (!notInHeap)
+ {
+ InlinedSetCardsAfterBulkCopyHelper((Object**)dest, len);
+ }
}
#endif // !_ARRAYNATIVE_INL_
diff --git a/src/coreclr/classlibnative/bcltype/oavariant.cpp b/src/coreclr/classlibnative/bcltype/oavariant.cpp
deleted file mode 100644
index ac8c55f359d8..000000000000
--- a/src/coreclr/classlibnative/bcltype/oavariant.cpp
+++ /dev/null
@@ -1,420 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-//
-// File: OAVariant.cpp
-//
-
-#include
-
-#ifdef FEATURE_COMINTEROP
-
-#include
-#include "excep.h"
-#include "oavariant.h"
-#include "comdatetime.h" // DateTime <-> OleAut date conversions
-#include "interoputil.h"
-#include "interopconverter.h"
-#include "excep.h"
-#include "string.h"
-#include "comutilnative.h" // for COMDate
-
-#define INVALID_MAPPING (BYTE)(-1)
-
-static const BYTE CVtoVTTable [] =
-{
- VT_EMPTY, // CV_EMPTY
- VT_VOID, // CV_VOID
- VT_BOOL, // CV_BOOLEAN
- VT_UI2, // CV_CHAR
- VT_I1, // CV_I1
- VT_UI1, // CV_U1
- VT_I2, // CV_I2
- VT_UI2, // CV_U2
- VT_I4, // CV_I4
- VT_UI4, // CV_U4
- VT_I8, // CV_I8
- VT_UI8, // CV_U8
- VT_R4, // CV_R4
- VT_R8, // CV_R8
- VT_BSTR, // CV_STRING
- INVALID_MAPPING, // CV_PTR
- VT_DATE, // CV_DATETIME
- INVALID_MAPPING, // CV_TIMESPAN
- VT_UNKNOWN, // CV_OBJECT
- VT_DECIMAL, // CV_DECIMAL
- VT_CY, // CV_CURRENCY
- INVALID_MAPPING, // CV_ENUM
- INVALID_MAPPING, // CV_MISSING
- VT_NULL, // CV_NULL
- INVALID_MAPPING // CV_LAST
-};
-
-static const BYTE VTtoCVTable[] =
-{
- CV_EMPTY, // VT_EMPTY
- CV_NULL, // VT_NULL
- CV_I2, // VT_I2
- CV_I4, // VT_I4
- CV_R4, // VT_R4
- CV_R8, // VT_R8
- CV_CURRENCY,// VT_CY
- CV_DATETIME,// VT_DATE
- CV_STRING, // VT_BSTR
- INVALID_MAPPING, // VT_DISPATCH
- INVALID_MAPPING, // VT_ERROR
- CV_BOOLEAN, // VT_BOOL
- CV_OBJECT, // VT_VARIANT
- CV_OBJECT, // VT_UNKNOWN
- CV_DECIMAL, // VT_DECIMAL
- INVALID_MAPPING, // An unused enum table entry
- CV_I1, // VT_I1
- CV_U1, // VT_UI1
- CV_U2, // VT_UI2
- CV_U4, // VT_UI4
- CV_I8, // VT_I8
- CV_U8, // VT_UI8
- CV_I4, // VT_INT
- CV_U4, // VT_UINT
- CV_VOID // VT_VOID
-};
-
-// Need translations from CVType to VARENUM and vice versa. CVTypes
-// is defined in olevariant.h. VARENUM is defined in OleAut's variant.h
-// Assumption here is we will only deal with VARIANTs and not other OLE
-// constructs such as property sets or safe arrays.
-static VARENUM CVtoVT(const CVTypes cv)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- PRECONDITION(cv >= 0 && cv < CV_LAST);
- }
- CONTRACTL_END;
-
- if (CVtoVTTable[cv] == INVALID_MAPPING)
- COMPlusThrow(kNotSupportedException, W("NotSupported_ChangeType"));
-
- return (VARENUM) CVtoVTTable[cv];
-}
-
-// Need translations from CVType to VARENUM and vice versa. CVTypes
-// is defined in olevariant.h. VARENUM is defined in OleAut's variant.h
-static CVTypes VTtoCV(const VARENUM vt)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- PRECONDITION(vt < VT_VOID);
- }
- CONTRACTL_END;
-
- if (vt <0 || vt > VT_VOID || VTtoCVTable[vt]==INVALID_MAPPING)
- COMPlusThrow(kNotSupportedException, W("NotSupported_ChangeType"));
-
- return (CVTypes) VTtoCVTable[vt];
-}
-
-
-// Converts a COM+ Variant to an OleAut Variant. Returns true if
-// there was a native object allocated by this method that must be freed,
-// else false.
-static bool ToOAVariant(VariantData const* src, VARIANT* oa)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_COOPERATIVE;
- INJECT_FAULT(COMPlusThrowOM());
- PRECONDITION(CheckPointer(src));
- PRECONDITION(CheckPointer(oa));
- }
- CONTRACTL_END;
-
- SafeVariantInit(oa);
- UINT64 * dest = (UINT64*) &V_UI1(oa);
- *dest = 0;
-
- WCHAR * chars;
- int strLen;
-
- // Set the data field of the OA Variant to be either the object reference
- // or the data (ie int) that it needs.
-
- switch (src->GetType())
- {
- case CV_STRING:
- if (src->GetObjRef() == NULL)
- {
- V_BSTR(oa) = NULL;
- V_VT(oa) = static_cast(CVtoVT(src->GetType()));
-
- // OA perf feature: VarClear calls SysFreeString(null), which access violates.
- return false;
- }
-
- ((STRINGREF) (src->GetObjRef()))->RefInterpretGetStringValuesDangerousForGC(&chars, &strLen);
- V_BSTR(oa) = SysAllocStringLen(chars, strLen);
- if (V_BSTR(oa) == NULL)
- COMPlusThrowOM();
-
- V_VT(oa) = static_cast(CVtoVT(src->GetType()));
-
- return true;
-
- case CV_CHAR:
- chars = (WCHAR*)src->GetData();
- V_BSTR(oa) = SysAllocStringLen(chars, 1);
- if (V_BSTR(oa) == NULL)
- COMPlusThrowOM();
-
- // We should override the VTtoVT default of VT_UI2 for this case.
- V_VT(oa) = VT_BSTR;
-
- return true;
-
- case CV_DATETIME:
- V_DATE(oa) = COMDateTime::TicksToDoubleDate(src->GetDataAsInt64());
- V_VT(oa) = static_cast(CVtoVT(src->GetType()));
- return false;
-
- case CV_BOOLEAN:
- V_BOOL(oa) = (src->GetDataAsInt64()==0 ? VARIANT_FALSE : VARIANT_TRUE);
- V_VT(oa) = static_cast(CVtoVT(src->GetType()));
- return false;
-
- case CV_DECIMAL:
- {
- OBJECTREF obj = src->GetObjRef();
- DECIMAL * d = (DECIMAL*) obj->GetData();
- // DECIMALs and Variants are the same size. Variants are a union between
- // all the normal Variant fields (vt, bval, etc) and a Decimal. Decimals
- // also have the first 2 bytes reserved, for a VT field.
-
- V_DECIMAL(oa) = *d;
- V_VT(oa) = VT_DECIMAL;
- return false;
- }
-
- case CV_OBJECT:
- {
- OBJECTREF obj = src->GetObjRef();
- GCPROTECT_BEGIN(obj)
- {
- IUnknown *pUnk = NULL;
-
- // Convert the object to an IDispatch/IUnknown pointer.
- ComIpType FetchedIpType = ComIpType_None;
- pUnk = GetComIPFromObjectRef(&obj, ComIpType_Both, &FetchedIpType);
- V_UNKNOWN(oa) = pUnk;
- V_VT(oa) = static_cast(FetchedIpType == ComIpType_Dispatch ? VT_DISPATCH : VT_UNKNOWN);
- }
- GCPROTECT_END();
- return true;
- }
-
- default:
- *dest = src->GetDataAsInt64();
- V_VT(oa) = static_cast(CVtoVT(src->GetType()));
- return false;
- }
-}
-
-// Converts an OleAut Variant into a COM+ Variant.
-// Note that we pass the VariantData Byref so that if GC happens, 'var' gets updated
-static void FromOAVariant(VARIANT const* src, VariantData*& var)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_COOPERATIVE;
- INJECT_FAULT(COMPlusThrowOM());
- PRECONDITION(CheckPointer(src));
- }
- CONTRACTL_END;
-
- // Clear the return variant value. It's allocated on
- // the stack and we only want valid state data in there.
- memset(var, 0, sizeof(VariantData));
-
- CVTypes type = VTtoCV((VARENUM) V_VT(src));
- var->SetType(type);
-
- switch (type)
- {
- case CV_STRING:
- {
- // BSTRs have an int with the string buffer length (not the string length)
- // followed by the data. The pointer to the BSTR points to the start of the
- // characters, NOT the start of the BSTR.
- WCHAR* chars = V_BSTR(src);
- int strLen = SysStringLen(V_BSTR(src));
- STRINGREF str = StringObject::NewString(chars, strLen);
- var->SetObjRef((OBJECTREF)str);
- break;
- }
- case CV_DATETIME:
- var->SetDataAsInt64(COMDateTime::DoubleDateToTicks(V_DATE(src)));
- break;
-
- case CV_BOOLEAN:
- var->SetDataAsInt64(V_BOOL(src) == VARIANT_FALSE ? FALSE : TRUE);
- break;
-
- case CV_DECIMAL:
- {
- MethodTable * pDecimalMT = GetTypeHandleForCVType(CV_DECIMAL).GetMethodTable();
- _ASSERTE(pDecimalMT);
- OBJECTREF pDecimalRef = AllocateObject(pDecimalMT);
-
- *(DECIMAL *) pDecimalRef->GetData() = V_DECIMAL(src);
- var->SetObjRef(pDecimalRef);
- break;
- }
-
- // All types less than 4 bytes need an explicit cast from their original
- // type to be sign extended to 8 bytes. This makes Variant's ToInt32
- // function simpler for these types.
- case CV_I1:
- var->SetDataAsInt64(V_I1(src));
- break;
-
- case CV_U1:
- var->SetDataAsInt64(V_UI1(src));
- break;
-
- case CV_I2:
- var->SetDataAsInt64(V_I2(src));
- break;
-
- case CV_U2:
- var->SetDataAsInt64(V_UI2(src));
- break;
-
- case CV_EMPTY:
- case CV_NULL:
- // Must set up the Variant's m_or to the appropriate classes.
- // Note that OleAut doesn't have any VT_MISSING.
- VariantData::NewVariant(var, type, NULL DEBUG_ARG(TRUE));
- break;
-
- case CV_OBJECT:
- {
- // Convert the IUnknown pointer to an OBJECTREF.
- OBJECTREF oref = NULL;
- GCPROTECT_BEGIN(oref);
- GetObjectRefFromComIP(&oref, V_UNKNOWN(src));
- var->SetObjRef(oref);
- GCPROTECT_END();
- break;
- }
- default:
- // Copy all the bits there, and make sure we don't do any float to int conversions.
- void* data = (void*)&(V_UI1(src));
- var->SetData(data);
- break;
- }
-}
-
-static void OAFailed(HRESULT hr)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- PRECONDITION(FAILED(hr));
- }
- CONTRACTL_END;
-
- switch (hr)
- {
- case E_OUTOFMEMORY:
- COMPlusThrowOM();
-
- case DISP_E_BADVARTYPE:
- COMPlusThrow(kNotSupportedException, W("NotSupported_OleAutBadVarType"));
-
- case DISP_E_DIVBYZERO:
- COMPlusThrow(kDivideByZeroException);
-
- case DISP_E_OVERFLOW:
- COMPlusThrow(kOverflowException);
-
- case DISP_E_TYPEMISMATCH:
- COMPlusThrow(kInvalidCastException, W("InvalidCast_OATypeMismatch"));
-
- case E_INVALIDARG:
- COMPlusThrow(kArgumentException);
-
- default:
- _ASSERTE(!"Unrecognized HResult - OAVariantLib routine failed in an unexpected way!");
- COMPlusThrowHR(hr);
- }
-}
-
-extern "C" void QCALLTYPE OAVariant_ChangeType(VariantData* result, VariantData* source, LCID lcid, void* targetType, int cvType, INT16 flags)
-{
- CONTRACTL
- {
- QCALL_CHECK;
- PRECONDITION(CheckPointer(result));
- }
- CONTRACTL_END;
-
- BEGIN_QCALL;
-
- GCX_COOP();
-
- bool converted = false;
-
- TypeHandle thTarget = TypeHandle::FromPtr(targetType);
- if (cvType == CV_OBJECT && IsTypeRefOrDef(g_ColorClassName, thTarget.GetModule(), thTarget.GetCl()))
- {
- CVTypes sourceType = source->GetType();
- if (sourceType == CV_I4 || sourceType == CV_U4)
- {
- // Int32/UInt32 can be converted to System.Drawing.Color
- SYSTEMCOLOR SystemColor;
- ConvertOleColorToSystemColor(source->GetDataAsUInt32(), &SystemColor);
-
- result->SetObjRef(thTarget.AsMethodTable()->Box(&SystemColor));
- result->SetType(CV_OBJECT);
-
- converted = true;
- }
- }
-
- if (!converted)
- {
- VariantHolder ret;
- VariantHolder vOp;
-
- VARENUM vt = CVtoVT((CVTypes) cvType);
- ToOAVariant(source, &vOp);
-
- HRESULT hr = SafeVariantChangeTypeEx(&ret, &vOp, lcid, flags, static_cast(vt));
-
- if (FAILED(hr))
- OAFailed(hr);
-
- if ((CVTypes) cvType == CV_CHAR)
- {
- result->SetType(CV_CHAR);
- result->SetDataAsUInt16(V_UI2(&ret));
- }
- else
- {
- FromOAVariant(&ret, result);
- }
- }
-
- END_QCALL;
-}
-
-#endif // FEATURE_COMINTEROP
diff --git a/src/coreclr/classlibnative/bcltype/oavariant.h b/src/coreclr/classlibnative/bcltype/oavariant.h
deleted file mode 100644
index 2ee4de551b69..000000000000
--- a/src/coreclr/classlibnative/bcltype/oavariant.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-//
-// File: OAVariant.h
-//
-
-#ifndef _OAVARIANT_H_
-#define _OAVARIANT_H_
-
-#ifndef FEATURE_COMINTEROP
-#error FEATURE_COMINTEROP is required for this file
-#endif // FEATURE_COMINTEROP
-
-#include "olevariant.h"
-
-extern "C" void QCALLTYPE OAVariant_ChangeType(VariantData* result, VariantData* source, LCID lcid, void* targetType, int cvType, INT16 flags);
-
-#endif // _OAVARIANT_H_
diff --git a/src/coreclr/classlibnative/bcltype/variant.cpp b/src/coreclr/classlibnative/bcltype/variant.cpp
index a269644d7970..1a3cf7e75bb4 100644
--- a/src/coreclr/classlibnative/bcltype/variant.cpp
+++ b/src/coreclr/classlibnative/bcltype/variant.cpp
@@ -20,6 +20,7 @@
#include "vars.hpp"
#include "variant.h"
#include "string.h"
+
#include "field.h"
// The following values are used to represent underlying
@@ -286,4 +287,35 @@ int COMVariant::GetEnumFlags(TypeHandle th)
}
}
+extern "C" uint32_t QCALLTYPE Variant_ConvertSystemColorToOleColor(QCall::ObjectHandleOnStack obj)
+{
+ QCALL_CONTRACT;
+
+ uint32_t ret = 0;
+
+ BEGIN_QCALL;
+
+ GCX_COOP();
+ OBJECTREF srcObj = obj.Get();
+ ret = ConvertSystemColorToOleColor(&srcObj);
+
+ END_QCALL;
+
+ return ret;
+}
+
+extern "C" void QCALLTYPE Variant_ConvertOleColorToSystemColor(QCall::ObjectHandleOnStack objRet, uint32_t oleColor, MethodTable* pMT)
+{
+ QCALL_CONTRACT;
+
+ BEGIN_QCALL;
+
+ GCX_COOP();
+ SYSTEMCOLOR systemColor{};
+ ConvertOleColorToSystemColor(oleColor, &systemColor);
+ objRet.Set(pMT->Box(&systemColor));
+
+ END_QCALL;
+}
+
#endif // FEATURE_COMINTEROP
diff --git a/src/coreclr/classlibnative/bcltype/variant.h b/src/coreclr/classlibnative/bcltype/variant.h
index aae0a5f9741a..12c5a3d36d53 100644
--- a/src/coreclr/classlibnative/bcltype/variant.h
+++ b/src/coreclr/classlibnative/bcltype/variant.h
@@ -40,5 +40,8 @@ class COMVariant
static int GetEnumFlags(TypeHandle th);
};
+extern "C" uint32_t QCALLTYPE Variant_ConvertSystemColorToOleColor(QCall::ObjectHandleOnStack obj);
+extern "C" void QCALLTYPE Variant_ConvertOleColorToSystemColor(QCall::ObjectHandleOnStack objRet, uint32_t oleColor, MethodTable* pMT);
+
#endif // _VARIANT_H_
diff --git a/src/coreclr/clrdefinitions.cmake b/src/coreclr/clrdefinitions.cmake
index a739bc6660f6..831f133cd2bc 100644
--- a/src/coreclr/clrdefinitions.cmake
+++ b/src/coreclr/clrdefinitions.cmake
@@ -16,6 +16,7 @@ elseif (CLR_CMAKE_TARGET_ARCH_ARM)
add_definitions(-DFEATURE_EMULATE_SINGLESTEP)
elseif (CLR_CMAKE_TARGET_ARCH_RISCV64)
add_definitions(-DFEATURE_EMULATE_SINGLESTEP)
+ add_compile_definitions($<$>>:FEATURE_MULTIREG_RETURN>)
endif (CLR_CMAKE_TARGET_ARCH_ARM64)
if (CLR_CMAKE_TARGET_UNIX)
@@ -41,7 +42,6 @@ if(CLR_CMAKE_TARGET_LINUX_MUSL)
add_definitions(-DNO_FIXED_STACK_LIMIT)
endif(CLR_CMAKE_TARGET_LINUX_MUSL)
-add_definitions(-D_BLD_CLR)
add_definitions(-DDEBUGGING_SUPPORTED)
add_compile_definitions($<$>>:PROFILING_SUPPORTED>)
add_compile_definitions($<$>:PROFILING_SUPPORTED_DATA>)
@@ -222,7 +222,7 @@ if (NOT CLR_CMAKE_TARGET_ARCH_I386 OR NOT CLR_CMAKE_TARGET_WIN32)
add_compile_definitions($<$>>:FEATURE_EH_FUNCLETS>)
endif (NOT CLR_CMAKE_TARGET_ARCH_I386 OR NOT CLR_CMAKE_TARGET_WIN32)
-if (CLR_CMAKE_TARGET_WIN32 AND CLR_CMAKE_TARGET_ARCH_AMD64)
+if (CLR_CMAKE_TARGET_WIN32 AND (CLR_CMAKE_TARGET_ARCH_AMD64 OR CLR_CMAKE_TARGET_ARCH_ARM64))
add_definitions(-DFEATURE_SPECIAL_USER_MODE_APC)
endif()
diff --git a/src/coreclr/debug/createdump/crashinfo.cpp b/src/coreclr/debug/createdump/crashinfo.cpp
index 93e0111376f1..72c27bd38ee4 100644
--- a/src/coreclr/debug/createdump/crashinfo.cpp
+++ b/src/coreclr/debug/createdump/crashinfo.cpp
@@ -927,6 +927,17 @@ CrashInfo::SearchMemoryRegions(const std::set& regions, const Memo
return nullptr;
}
+// Declare the prototype for the Itanium C++ ABI demangler API.
+// We may not have the Itanium C++ ABI header available even when we're building against this ABI
+// so we'll declare the prototype ourselves.
+// See Itanium C++ ABI, March 14, 2017 Revision, Chapter 3, Section 3.4
+namespace abi {
+ extern "C" char* __cxa_demangle (const char* mangled_name,
+ char* buf,
+ size_t* n,
+ int* status);
+}
+
//
// Lookup a symbol in a module. The caller needs to call "free()" on symbol returned.
//
diff --git a/src/coreclr/debug/createdump/createdump.h b/src/coreclr/debug/createdump/createdump.h
index 4095a5693794..bb385f6acdde 100644
--- a/src/coreclr/debug/createdump/createdump.h
+++ b/src/coreclr/debug/createdump/createdump.h
@@ -72,7 +72,6 @@ typedef int T_CONTEXT;
#include
#include
#include
-#include
#ifdef __APPLE__
#include
#else
diff --git a/src/coreclr/debug/daccess/CMakeLists.txt b/src/coreclr/debug/daccess/CMakeLists.txt
index 5332e957c9ec..9ed71521d428 100644
--- a/src/coreclr/debug/daccess/CMakeLists.txt
+++ b/src/coreclr/debug/daccess/CMakeLists.txt
@@ -1,5 +1,7 @@
add_definitions(-DFEATURE_NO_HOST)
+add_subdirectory(${CLR_SRC_NATIVE_DIR}/managed/cdacreader/cmake ${CLR_ARTIFACTS_OBJ_DIR}/cdacreader)
+
include_directories(BEFORE ${VM_DIR})
include_directories(BEFORE ${VM_DIR}/${ARCH_SOURCES_DIR})
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR})
@@ -12,6 +14,7 @@ if(CLR_CMAKE_HOST_UNIX)
endif(CLR_CMAKE_HOST_UNIX)
set(DACCESS_SOURCES
+ cdac.cpp
dacdbiimpl.cpp
dacdbiimpllocks.cpp
dacdbiimplstackwalk.cpp
@@ -40,6 +43,7 @@ convert_to_absolute_path(DACCESS_SOURCES ${DACCESS_SOURCES})
add_library_clr(daccess ${DACCESS_SOURCES})
set_target_properties(daccess PROPERTIES DAC_COMPONENT TRUE)
target_precompile_headers(daccess PRIVATE [["stdafx.h"]])
+target_link_libraries(daccess PRIVATE cdacreader_api)
add_dependencies(daccess eventing_headers)
diff --git a/src/coreclr/debug/daccess/cdac.cpp b/src/coreclr/debug/daccess/cdac.cpp
new file mode 100644
index 000000000000..b7bb7585e6bc
--- /dev/null
+++ b/src/coreclr/debug/daccess/cdac.cpp
@@ -0,0 +1,88 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#include "cdac.h"
+#include
+#include
+#include "dbgutil.h"
+#include
+
+#define CDAC_LIB_NAME MAKEDLLNAME_W(W("cdacreader"))
+
+namespace
+{
+ bool TryLoadCDACLibrary(HMODULE *phCDAC)
+ {
+ // Load cdacreader from next to DAC binary
+ PathString path;
+ if (FAILED(GetClrModuleDirectory(path)))
+ return false;
+
+ path.Append(CDAC_LIB_NAME);
+ *phCDAC = CLRLoadLibrary(path.GetUnicode());
+ if (*phCDAC == NULL)
+ return false;
+
+ return true;
+ }
+
+ int ReadFromTargetCallback(uint64_t addr, uint8_t* dest, uint32_t count, void* context)
+ {
+ ICorDebugDataTarget* target = reinterpret_cast(context);
+ HRESULT hr = ReadFromDataTarget(target, addr, dest, count);
+ if (FAILED(hr))
+ return hr;
+
+ return S_OK;
+ }
+}
+
+CDAC CDAC::Create(uint64_t descriptorAddr, ICorDebugDataTarget* target)
+{
+ HMODULE cdacLib;
+ if (!TryLoadCDACLibrary(&cdacLib))
+ return {};
+
+ decltype(&cdac_reader_init) init = reinterpret_cast(::GetProcAddress(cdacLib, "cdac_reader_init"));
+ _ASSERTE(init != nullptr);
+
+ intptr_t handle;
+ if (init(descriptorAddr, &ReadFromTargetCallback, target, &handle) != 0)
+ {
+ ::FreeLibrary(cdacLib);
+ return {};
+ }
+
+ return CDAC{cdacLib, handle, target};
+}
+
+CDAC::CDAC(HMODULE module, intptr_t handle, ICorDebugDataTarget* target)
+ : m_module{module}
+ , m_cdac_handle{handle}
+ , m_target{target}
+{
+ _ASSERTE(m_module != NULL && m_cdac_handle != 0 && m_target != NULL);
+
+ m_target->AddRef();
+ decltype(&cdac_reader_get_sos_interface) getSosInterface = reinterpret_cast(::GetProcAddress(m_module, "cdac_reader_get_sos_interface"));
+ _ASSERTE(getSosInterface != nullptr);
+ getSosInterface(m_cdac_handle, &m_sos);
+}
+
+CDAC::~CDAC()
+{
+ if (m_cdac_handle)
+ {
+ decltype(&cdac_reader_free) free = reinterpret_cast(::GetProcAddress(m_module, "cdac_reader_free"));
+ _ASSERTE(free != nullptr);
+ free(m_cdac_handle);
+ }
+
+ if (m_module != NULL)
+ ::FreeLibrary(m_module);
+}
+
+IUnknown* CDAC::SosInterface()
+{
+ return m_sos;
+}
diff --git a/src/coreclr/debug/daccess/cdac.h b/src/coreclr/debug/daccess/cdac.h
new file mode 100644
index 000000000000..51078ffcf2e4
--- /dev/null
+++ b/src/coreclr/debug/daccess/cdac.h
@@ -0,0 +1,65 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#ifndef CDAC_H
+#define CDAC_H
+
+class CDAC final
+{
+public: // static
+ static CDAC Create(uint64_t descriptorAddr, ICorDebugDataTarget *pDataTarget);
+
+public:
+ CDAC() = default;
+
+ CDAC(const CDAC&) = delete;
+ CDAC& operator=(const CDAC&) = delete;
+
+ CDAC(CDAC&& other)
+ : m_module{ other.m_module }
+ , m_cdac_handle{ other.m_cdac_handle }
+ , m_target{ other.m_target.Extract() }
+ , m_sos{ other.m_sos.Extract() }
+ {
+ other.m_module = NULL;
+ other.m_cdac_handle = 0;
+ other.m_target = NULL;
+ other.m_sos = NULL;
+ }
+
+ CDAC& operator=(CDAC&& other)
+ {
+ m_module = other.m_module;
+ m_cdac_handle = other.m_cdac_handle;
+ m_target = other.m_target.Extract();
+ m_sos = other.m_sos.Extract();
+
+ other.m_module = NULL;
+ other.m_cdac_handle = 0;
+ other.m_target = NULL;
+ other.m_sos = NULL;
+
+ return *this;
+ }
+
+ ~CDAC();
+
+ bool IsValid() const
+ {
+ return m_module != NULL && m_cdac_handle != 0;
+ }
+
+ // This does not AddRef the returned interface
+ IUnknown* SosInterface();
+
+private:
+ CDAC(HMODULE module, intptr_t handle, ICorDebugDataTarget* target);
+
+private:
+ HMODULE m_module;
+ intptr_t m_cdac_handle;
+ NonVMComHolder m_target;
+ NonVMComHolder m_sos;
+};
+
+#endif // CDAC_H
diff --git a/src/coreclr/debug/daccess/daccess.cpp b/src/coreclr/debug/daccess/daccess.cpp
index d6b8d99d7c37..09c41e2c84bf 100644
--- a/src/coreclr/debug/daccess/daccess.cpp
+++ b/src/coreclr/debug/daccess/daccess.cpp
@@ -23,11 +23,15 @@
#include "dwreport.h"
#include "primitives.h"
#include "dbgutil.h"
+#include "cdac.h"
+#include
#ifdef USE_DAC_TABLE_RVA
#include
#else
extern "C" bool TryGetSymbol(ICorDebugDataTarget* dataTarget, uint64_t baseAddress, const char* symbolName, uint64_t* symbolAddress);
+// cDAC depends on symbol lookup to find the contract descriptor
+#define CAN_USE_CDAC
#endif
#include "dwbucketmanager.hpp"
@@ -1748,7 +1752,7 @@ DacInstanceManager::Find(TADDR addr)
{
#if defined(DAC_MEASURE_PERF)
- unsigned _int64 nStart, nEnd;
+ uint64_t nStart, nEnd;
g_nFindCalls++;
nStart = GetCycleCount();
#endif // #if defined(DAC_MEASURE_PERF)
@@ -3034,6 +3038,7 @@ class DacStreamManager
//----------------------------------------------------------------------------
ClrDataAccess::ClrDataAccess(ICorDebugDataTarget * pTarget, ICLRDataTarget * pLegacyTarget/*=0*/)
+ : m_cdac{}
{
SUPPORTS_DAC_HOST_ONLY; // ctor does no marshalling - don't check with DacCop
@@ -3123,7 +3128,6 @@ ClrDataAccess::ClrDataAccess(ICorDebugDataTarget * pTarget, ICLRDataTarget * pLe
// see ClrDataAccess::VerifyDlls for details.
m_fEnableDllVerificationAsserts = false;
#endif
-
}
ClrDataAccess::~ClrDataAccess(void)
@@ -4324,7 +4328,7 @@ ClrDataAccess::TranslateExceptionRecordToNotification(
GcEvtArgs pubGcEvtArgs = {};
ULONG32 notifyType = 0;
DWORD catcherNativeOffset = 0;
- TADDR nativeCodeLocation = NULL;
+ TADDR nativeCodeLocation = (TADDR)NULL;
DAC_ENTER();
@@ -4706,7 +4710,7 @@ ClrDataAccess::SetAllCodeNotifications(
BOOL changedTable;
TADDR modulePtr = mod ?
PTR_HOST_TO_TADDR(((ClrDataModule*)mod)->GetModule()) :
- NULL;
+ (TADDR)NULL;
if (jn.SetAllNotifications(modulePtr, (USHORT)flags, &changedTable))
{
@@ -4822,7 +4826,7 @@ ClrDataAccess::GetCodeNotifications(
}
else
{
- TADDR modulePtr = NULL;
+ TADDR modulePtr = (TADDR)NULL;
if (singleMod)
{
modulePtr = PTR_HOST_TO_TADDR(((ClrDataModule*)singleMod)->
@@ -4908,7 +4912,7 @@ ClrDataAccess::SetCodeNotifications(
goto Exit;
}
- TADDR modulePtr = NULL;
+ TADDR modulePtr = (TADDR)NULL;
if (singleMod)
{
modulePtr =
@@ -5491,6 +5495,30 @@ ClrDataAccess::Initialize(void)
IfFailRet(GetDacGlobalValues());
IfFailRet(DacGetHostVtPtrs());
+// TODO: [cdac] TryGetSymbol is only implemented for Linux, OSX, and Windows.
+#ifdef CAN_USE_CDAC
+ CLRConfigNoCache enable = CLRConfigNoCache::Get("ENABLE_CDAC");
+ if (enable.IsSet())
+ {
+ DWORD val;
+ if (enable.TryAsInteger(10, val) && val == 1)
+ {
+ uint64_t contractDescriptorAddr = 0;
+ if (TryGetSymbol(m_pTarget, m_globalBase, "DotNetRuntimeContractDescriptor", &contractDescriptorAddr))
+ {
+ m_cdac = CDAC::Create(contractDescriptorAddr, m_pTarget);
+ if (m_cdac.IsValid())
+ {
+ // Get SOS interfaces from the cDAC if available.
+ IUnknown* unk = m_cdac.SosInterface();
+ (void)unk->QueryInterface(__uuidof(ISOSDacInterface), (void**)&m_cdacSos);
+ (void)unk->QueryInterface(__uuidof(ISOSDacInterface9), (void**)&m_cdacSos9);
+ }
+ }
+ }
+ }
+#endif
+
//
// DAC is now setup and ready to use
//
@@ -5952,10 +5980,10 @@ ClrDataAccess::GetMethodVarInfo(MethodDesc* methodDesc,
COUNT_T countNativeVarInfo;
NewHolder nativeVars(NULL);
TADDR nativeCodeStartAddr;
- if (address != NULL)
+ if (address != (TADDR)NULL)
{
NativeCodeVersion requestedNativeCodeVersion = ExecutionManager::GetNativeCodeVersion(address);
- if (requestedNativeCodeVersion.IsNull() || requestedNativeCodeVersion.GetNativeCode() == NULL)
+ if (requestedNativeCodeVersion.IsNull() || requestedNativeCodeVersion.GetNativeCode() == (PCODE)NULL)
{
return E_INVALIDARG;
}
@@ -6010,10 +6038,10 @@ ClrDataAccess::GetMethodNativeMap(MethodDesc* methodDesc,
// Use the DebugInfoStore to get IL->Native maps.
// It doesn't matter whether we're jitted, ngenned etc.
TADDR nativeCodeStartAddr;
- if (address != NULL)
+ if (address != (TADDR)NULL)
{
NativeCodeVersion requestedNativeCodeVersion = ExecutionManager::GetNativeCodeVersion(address);
- if (requestedNativeCodeVersion.IsNull() || requestedNativeCodeVersion.GetNativeCode() == NULL)
+ if (requestedNativeCodeVersion.IsNull() || requestedNativeCodeVersion.GetNativeCode() == (PCODE)NULL)
{
return E_INVALIDARG;
}
@@ -6922,7 +6950,7 @@ GetDacTableAddress(ICorDebugDataTarget* dataTarget, ULONG64 baseAddress, PULONG6
return E_INVALIDARG;
}
#endif
- // On MacOS, FreeBSD or NetBSD use the RVA include file
+ // On FreeBSD, NetBSD, or SunOS use the RVA include file
*dacTableAddress = baseAddress + DAC_TABLE_RVA;
#else
// Otherwise, try to get the dac table address via the export symbol
@@ -6947,7 +6975,7 @@ ClrDataAccess::GetDacGlobalValues()
{
return CORDBG_E_MISSING_DEBUGGER_EXPORTS;
}
- if (m_dacGlobals.ThreadStore__s_pThreadStore == NULL)
+ if (m_dacGlobals.ThreadStore__s_pThreadStore == (TADDR)NULL)
{
return CORDBG_E_UNSUPPORTED;
}
@@ -7746,6 +7774,8 @@ void CALLBACK DacHandleWalker::EnumCallback(PTR_UNCHECKED_OBJECTREF handle, uint
data.Type = param->Type;
if (param->Type == HNDTYPE_DEPENDENT)
data.Secondary = GetDependentHandleSecondary(handle.GetAddr()).GetAddr();
+ else if (param->Type == HNDTYPE_WEAK_INTERIOR_POINTER)
+ data.Secondary = TO_CDADDR(HndGetHandleExtraInfo(handle.GetAddr()));
else
data.Secondary = 0;
data.AppDomain = param->AppDomain;
diff --git a/src/coreclr/debug/daccess/dacdbiimpl.cpp b/src/coreclr/debug/daccess/dacdbiimpl.cpp
index d1a0a1ada64d..715c87dedafe 100644
--- a/src/coreclr/debug/daccess/dacdbiimpl.cpp
+++ b/src/coreclr/debug/daccess/dacdbiimpl.cpp
@@ -1240,7 +1240,7 @@ mdSignature DacDbiInterfaceImpl::GetILCodeAndSigHelper(Module * pModule,
pIL->cbSize = header.GetCodeSize();
// Now we get the signature token
- if (header.LocalVarSigTok != NULL)
+ if (header.LocalVarSigTok != mdTokenNil)
{
mdSig = header.GetLocalVarSigTok();
}
@@ -1314,14 +1314,14 @@ void DacDbiInterfaceImpl::GetMethodRegionInfo(MethodDesc * pMethodDe
}
CONTRACTL_END;
- IJitManager::MethodRegionInfo methodRegionInfo = {NULL, 0, NULL, 0};
+ IJitManager::MethodRegionInfo methodRegionInfo = {(TADDR)NULL, 0, (TADDR)NULL, 0};
PCODE functionAddress = pMethodDesc->GetNativeCode();
// get the start address of the hot region and initialize the jit manager
pCodeInfo->m_rgCodeRegions[kHot].pAddress = CORDB_ADDRESS(PCODEToPINSTR(functionAddress));
// if the start address is NULL, the code isn't available yet, so just return
- if (functionAddress != NULL)
+ if (functionAddress != (PCODE)NULL)
{
EECodeInfo codeInfo(functionAddress);
_ASSERTE(codeInfo.IsValid());
@@ -1372,7 +1372,7 @@ void DacDbiInterfaceImpl::GetNativeCodeInfo(VMPTR_DomainAssembly vmDomai
if(pMethodDesc != NULL)
{
GetMethodRegionInfo(pMethodDesc, pCodeInfo);
- if (pCodeInfo->m_rgCodeRegions[kHot].pAddress != NULL)
+ if (pCodeInfo->m_rgCodeRegions[kHot].pAddress != (CORDB_ADDRESS)NULL)
{
pCodeInfo->isInstantiatedGeneric = pMethodDesc->HasClassOrMethodInstantiation();
LookupEnCVersions(pModule,
@@ -1397,14 +1397,14 @@ void DacDbiInterfaceImpl::GetNativeCodeInfoForAddr(VMPTR_MethodDesc vmMe
_ASSERTE(pCodeInfo != NULL);
- if (hotCodeStartAddr == NULL)
+ if (hotCodeStartAddr == (CORDB_ADDRESS)NULL)
{
// if the start address is NULL, the code isn't available yet, so just return
_ASSERTE(!pCodeInfo->IsValid());
return;
}
- IJitManager::MethodRegionInfo methodRegionInfo = {NULL, 0, NULL, 0};
+ IJitManager::MethodRegionInfo methodRegionInfo = {(TADDR)NULL, 0, (TADDR)NULL, 0};
TADDR codeAddr = CORDB_ADDRESS_TO_TADDR(hotCodeStartAddr);
#ifdef TARGET_ARM
@@ -1655,7 +1655,7 @@ void DacDbiInterfaceImpl::ComputeFieldData(PTR_FieldDesc pFD,
if (pCurrentFieldData->OkToGetOrSetStaticAddress())
{
- pCurrentFieldData->SetStaticAddress(NULL);
+ pCurrentFieldData->SetStaticAddress((TADDR)NULL);
}
}
else
@@ -3192,7 +3192,7 @@ CORDB_ADDRESS DacDbiInterfaceImpl::GetThreadStaticAddress(VMPTR_FieldDesc vmFiel
Thread * pRuntimeThread = vmRuntimeThread.GetDacPtr();
PTR_FieldDesc pFieldDesc = vmField.GetDacPtr();
- TADDR fieldAddress = NULL;
+ TADDR fieldAddress = (TADDR)NULL;
_ASSERTE(pRuntimeThread != NULL);
@@ -3441,7 +3441,7 @@ HRESULT DacDbiInterfaceImpl::GetDelegateType(VMPTR_Object delegateObject, Delega
PTR_Object pInvocationList = OBJECTREFToObject(pDelObj->GetInvocationList());
- if (invocationCount == NULL)
+ if (invocationCount == 0)
{
if (pInvocationList == NULL)
{
@@ -3449,7 +3449,7 @@ HRESULT DacDbiInterfaceImpl::GetDelegateType(VMPTR_Object delegateObject, Delega
// Special case: This might fail in a VSD delegate (instance open virtual)...
// TODO: There is the special signatures cases missing.
TADDR targetMethodPtr = PCODEToPINSTR(pDelObj->GetMethodPtrAux());
- if (targetMethodPtr == NULL)
+ if (targetMethodPtr == (TADDR)NULL)
{
// Static extension methods, other closed static delegates, and instance delegates fall into this category.
*delegateType = kClosedDelegate;
@@ -3501,7 +3501,7 @@ HRESULT DacDbiInterfaceImpl::GetDelegateFunctionData(
HRESULT hr = S_OK;
PTR_DelegateObject pDelObj = dac_cast(delegateObject.GetDacPtr());
- TADDR targetMethodPtr = NULL;
+ TADDR targetMethodPtr = (TADDR)NULL;
VMPTR_MethodDesc pMD;
switch (delegateType)
@@ -3552,7 +3552,7 @@ HRESULT DacDbiInterfaceImpl::GetDelegateTargetObject(
}
default:
- ppTargetObj->SetDacTargetPtr(NULL);
+ ppTargetObj->SetDacTargetPtr((TADDR)NULL);
break;
}
@@ -4388,7 +4388,7 @@ void DacDbiInterfaceImpl::GetModuleData(VMPTR_Module vmModule, ModuleInfo * pDat
// Get PE BaseAddress and Size
// For dynamic modules, these are 0. Else,
- pData->pPEBaseAddress = NULL;
+ pData->pPEBaseAddress = (CORDB_ADDRESS)NULL;
pData->nPESize = 0;
if (!fIsDynamic)
@@ -4765,7 +4765,7 @@ BOOL DacDbiInterfaceImpl::HasUnhandledException(VMPTR_Thread vmThread)
// most managed exceptions are just a throwable bound to a
// native exception. In that case this handle will be non-null
OBJECTHANDLE ohException = pThread->GetThrowableAsHandle();
- if (ohException != NULL)
+ if (ohException != (OBJECTHANDLE)NULL)
{
// during the UEF we set the unhandled bit, if it is set the exception
// was unhandled
@@ -4854,7 +4854,7 @@ VMPTR_OBJECTHANDLE DacDbiInterfaceImpl::GetCurrentException(VMPTR_Thread vmThrea
// OBJECTHANDLEs are really just TADDRs.
OBJECTHANDLE ohException = pThread->GetThrowableAsHandle(); // ohException can be NULL
- if (ohException == NULL)
+ if (ohException == (OBJECTHANDLE)NULL)
{
if (pThread->IsLastThrownObjectUnhandled())
{
@@ -4872,7 +4872,7 @@ VMPTR_OBJECTHANDLE DacDbiInterfaceImpl::GetObjectForCCW(CORDB_ADDRESS ccwPtr)
{
DD_ENTER_MAY_THROW;
- OBJECTHANDLE ohCCW = NULL;
+ OBJECTHANDLE ohCCW = (OBJECTHANDLE)NULL;
#ifdef FEATURE_COMWRAPPERS
if (DACTryGetComWrappersHandleFromCCW(ccwPtr, &ohCCW) != S_OK)
@@ -4922,12 +4922,7 @@ VMPTR_AppDomain DacDbiInterfaceImpl::GetCurrentAppDomain(VMPTR_Thread vmThread)
DD_ENTER_MAY_THROW;
Thread * pThread = vmThread.GetDacPtr();
- AppDomain * pAppDomain = pThread->GetDomain();
-
- if (pAppDomain == NULL)
- {
- ThrowHR(E_FAIL);
- }
+ AppDomain * pAppDomain = AppDomain::GetCurrentDomain();
VMPTR_AppDomain vmAppDomain = VMPTR_AppDomain::NullPtr();
vmAppDomain.SetDacTargetPtr(PTR_HOST_TO_TADDR(pAppDomain));
@@ -4963,13 +4958,13 @@ CLR_DEBUGGING_PROCESS_FLAGS DacDbiInterfaceImpl::GetAttachStateFlags()
// Non-null Target Address of hijack function.
TADDR DacDbiInterfaceImpl::GetHijackAddress()
{
- TADDR addr = NULL;
+ TADDR addr = (TADDR)NULL;
if (g_pDebugger != NULL)
{
// Get the start address of the redirect function for unhandled exceptions.
addr = dac_cast(g_pDebugger->m_rgHijackFunction[Debugger::kUnhandledException].StartAddress());
}
- if (addr == NULL)
+ if (addr == (TADDR)NULL)
{
ThrowHR(CORDBG_E_NOTREADY);
}
@@ -5209,8 +5204,8 @@ void DacDbiInterfaceImpl::Hijack(
// space used by the OS exception dispatcher. We are using the latter approach here.
//
- CORDB_ADDRESS espOSContext = NULL;
- CORDB_ADDRESS espOSRecord = NULL;
+ CORDB_ADDRESS espOSContext = (CORDB_ADDRESS)NULL;
+ CORDB_ADDRESS espOSRecord = (CORDB_ADDRESS)NULL;
if (pThread != NULL && pThread->IsExceptionInProgress())
{
espOSContext = (CORDB_ADDRESS)PTR_TO_TADDR(pThread->GetExceptionState()->GetContextRecord());
@@ -5360,10 +5355,10 @@ TargetBuffer DacDbiInterfaceImpl::GetVarArgSig(CORDB_ADDRESS VASigCookieAddr,
DD_ENTER_MAY_THROW;
_ASSERTE(pArgBase != NULL);
- *pArgBase = NULL;
+ *pArgBase = (CORDB_ADDRESS)NULL;
// First, read the VASigCookie pointer.
- TADDR taVASigCookie = NULL;
+ TADDR taVASigCookie = (TADDR)NULL;
SafeReadStructOrThrow(VASigCookieAddr, &taVASigCookie);
// Now create a DAC copy of VASigCookie.
@@ -5665,7 +5660,7 @@ CORDB_ADDRESS DacDbiInterfaceImpl::GetDebuggerControlBlockAddress()
return CORDB_ADDRESS(dac_cast(g_pDebugger->m_pRCThread->GetDCB()));
}
- return NULL;
+ return (CORDB_ADDRESS)NULL;
}
// DacDbi API: Get the context for a particular thread of the target process
@@ -6541,7 +6536,7 @@ HRESULT DacHeapWalker::Init(CORDB_ADDRESS start, CORDB_ADDRESS end)
if (ctx == NULL)
continue;
- if ((CORDB_ADDRESS)ctx->alloc_ptr != NULL)
+ if ((CORDB_ADDRESS)ctx->alloc_ptr != (CORDB_ADDRESS)NULL)
{
mAllocInfo[j].Ptr = (CORDB_ADDRESS)ctx->alloc_ptr;
mAllocInfo[j].Limit = (CORDB_ADDRESS)ctx->alloc_limit;
@@ -6856,7 +6851,7 @@ HRESULT DacDbiInterfaceImpl::WalkHeap(HeapWalkHandle handle,
{
objects[i].address = addr;
objects[i].type.token1 = mt;
- objects[i].type.token2 = NULL;
+ objects[i].type.token2 = 0;
objects[i].size = size;
i++;
}
@@ -7477,7 +7472,7 @@ HRESULT DacDbiInterfaceImpl::GetDefinesBitField(ULONG32 *pDefines)
if (g_pDebugger == NULL)
return CORDBG_E_NOTREADY;
-
+
*pDefines = g_pDebugger->m_defines;
return S_OK;
}
diff --git a/src/coreclr/debug/daccess/dacdbiimplstackwalk.cpp b/src/coreclr/debug/daccess/dacdbiimplstackwalk.cpp
index 0707a7253699..4ccaa7a5fa76 100644
--- a/src/coreclr/debug/daccess/dacdbiimplstackwalk.cpp
+++ b/src/coreclr/debug/daccess/dacdbiimplstackwalk.cpp
@@ -505,7 +505,7 @@ void DacDbiInterfaceImpl::EnumerateInternalFrames(VMPTR_Thread
Thread * pThread = vmThread.GetDacPtr();
Frame * pFrame = pThread->GetFrame();
- AppDomain * pAppDomain = pThread->GetDomain(INDEBUG(TRUE));
+ AppDomain * pAppDomain = AppDomain::GetCurrentDomain();
// This used to be only true for Enter-Managed chains.
// Since we don't have chains anymore, this can always be false.
@@ -589,7 +589,7 @@ void DacDbiInterfaceImpl::EnumerateInternalFrames(VMPTR_Thread
}
else
{
- frameData.stubFrame.funcMetadataToken = (pMD == NULL ? NULL : pMD->GetMemberDef());
+ frameData.stubFrame.funcMetadataToken = (pMD == NULL ? mdTokenNil : pMD->GetMemberDef());
frameData.stubFrame.vmDomainAssembly.SetHostPtr(pDomainAssembly);
frameData.stubFrame.vmMethodDesc.SetHostPtr(pMD);
}
@@ -832,7 +832,7 @@ void DacDbiInterfaceImpl::InitFrameData(StackFrameIterator * pIter,
}
else
{
- pFrameData->v.exactGenericArgsToken = NULL;
+ pFrameData->v.exactGenericArgsToken = (GENERICS_TYPE_TOKEN)NULL;
pFrameData->v.dwExactGenericArgsTokenIndex = (DWORD)ICorDebugInfo::MAX_ILNUM;
}
@@ -1249,7 +1249,7 @@ void DacDbiInterfaceImpl::UpdateContextFromRegDisp(REGDISPLAY * pRegDisp,
PTR_CONTEXT DacDbiInterfaceImpl::RetrieveHijackedContext(REGDISPLAY * pRD)
{
- CORDB_ADDRESS ContextPointerAddr = NULL;
+ CORDB_ADDRESS ContextPointerAddr = (CORDB_ADDRESS)NULL;
TADDR controlPC = PCODEToPINSTR(GetControlPC(pRD));
diff --git a/src/coreclr/debug/daccess/dacfn.cpp b/src/coreclr/debug/daccess/dacfn.cpp
index c3131e2d571e..2c9f28481d21 100644
--- a/src/coreclr/debug/daccess/dacfn.cpp
+++ b/src/coreclr/debug/daccess/dacfn.cpp
@@ -154,7 +154,7 @@ DacReadAll(TADDR addr, PVOID buffer, ULONG32 size, bool throwEx)
ULONG32 returned;
#if defined(DAC_MEASURE_PERF)
- unsigned __int64 nStart, nEnd;
+ uint64_t nStart, nEnd;
nStart = GetCycleCount();
#endif // #if defined(DAC_MEASURE_PERF)
@@ -1525,7 +1525,7 @@ HRESULT DacReplacePatchesInHostMemory(MemoryRange range, PVOID pBuffer)
{
CORDB_ADDRESS patchAddress = (CORDB_ADDRESS)dac_cast(pPatch->address);
- if (patchAddress != NULL)
+ if (patchAddress != (CORDB_ADDRESS)NULL)
{
PRD_TYPE opcode = pPatch->opcode;
diff --git a/src/coreclr/debug/daccess/dacimpl.h b/src/coreclr/debug/daccess/dacimpl.h
index e698eed4c180..8b1771d7132e 100644
--- a/src/coreclr/debug/daccess/dacimpl.h
+++ b/src/coreclr/debug/daccess/dacimpl.h
@@ -794,6 +794,7 @@ class DacStreamManager;
#endif // FEATURE_MINIMETADATA_IN_TRIAGEDUMPS
+#include "cdac.h"
//----------------------------------------------------------------------------
//
@@ -1208,7 +1209,7 @@ class ClrDataAccess
CLRDATA_ADDRESS *allocLimit);
// ISOSDacInterface13
- virtual HRESULT STDMETHODCALLTYPE TraverseLoaderHeap(CLRDATA_ADDRESS loaderHeapAddr, LoaderHeapKind kind, VISITHEAP pCallback);
+ virtual HRESULT STDMETHODCALLTYPE TraverseLoaderHeap(CLRDATA_ADDRESS loaderHeapAddr, LoaderHeapKind kind, VISITHEAP pCallback);
virtual HRESULT STDMETHODCALLTYPE GetDomainLoaderAllocator(CLRDATA_ADDRESS domainAddress, CLRDATA_ADDRESS *pLoaderAllocator);
virtual HRESULT STDMETHODCALLTYPE GetLoaderAllocatorHeapNames(int count, const char **ppNames, int *pNeeded);
virtual HRESULT STDMETHODCALLTYPE GetLoaderAllocatorHeaps(CLRDATA_ADDRESS loaderAllocator, int count, CLRDATA_ADDRESS *pLoaderHeaps, LoaderHeapKind *pKinds, int *pNeeded);
@@ -1221,13 +1222,15 @@ class ClrDataAccess
virtual HRESULT STDMETHODCALLTYPE GetStaticBaseAddress(CLRDATA_ADDRESS methodTable, CLRDATA_ADDRESS *nonGCStaticsAddress, CLRDATA_ADDRESS *GCStaticsAddress);
virtual HRESULT STDMETHODCALLTYPE GetThreadStaticBaseAddress(CLRDATA_ADDRESS methodTable, CLRDATA_ADDRESS thread, CLRDATA_ADDRESS *nonGCStaticsAddress, CLRDATA_ADDRESS *GCStaticsAddress);
virtual HRESULT STDMETHODCALLTYPE GetMethodTableInitializationFlags(CLRDATA_ADDRESS methodTable, MethodTableInitializationFlags *initializationStatus);
-
+
//
// ClrDataAccess.
//
HRESULT Initialize(void);
+ HRESULT GetThreadStoreDataImpl(struct DacpThreadStoreData *data);
+
BOOL IsExceptionFromManagedCode(EXCEPTION_RECORD * pExceptionRecord);
#ifndef TARGET_UNIX
HRESULT GetWatsonBuckets(DWORD dwThreadId, GenericModeBlock * pGM);
@@ -1414,6 +1417,10 @@ class ClrDataAccess
ULONG32 m_instanceAge;
bool m_debugMode;
+ CDAC m_cdac;
+ NonVMComHolder m_cdacSos;
+ NonVMComHolder m_cdacSos9;
+
#ifdef FEATURE_MINIMETADATA_IN_TRIAGEDUMPS
protected:
@@ -1964,7 +1971,7 @@ class DacMemoryEnumerator : public DefaultCOMImplGetNativeCode();
- if (addr != NULL)
+ if (addr != (PCODE)NULL)
{
EECodeInfo codeInfo(addr);
if (codeInfo.IsValid())
{
- IJitManager::MethodRegionInfo methodRegionInfo = { NULL, 0, NULL, 0 };
+ IJitManager::MethodRegionInfo methodRegionInfo = { (TADDR)NULL, 0, (TADDR)NULL, 0 };
codeInfo.GetMethodRegionInfo(&methodRegionInfo);
}
}
@@ -764,7 +764,7 @@ HRESULT ClrDataAccess::EnumMemWalkStackHelper(CLRDataEnumMemoryFlags flags,
#if defined(DAC_MEASURE_PERF)
g_nStackWalk = 1;
- unsigned __int64 nStart= GetCycleCount();
+ uint64_t nStart= GetCycleCount();
#endif
HRESULT status = S_OK;
@@ -785,7 +785,7 @@ HRESULT ClrDataAccess::EnumMemWalkStackHelper(CLRDataEnumMemoryFlags flags,
{
bool frameHadContext = false;
status = pStackWalk->GetFrame(&pFrame);
- PCODE addr = NULL;
+ PCODE addr = (PCODE)NULL;
if (status == S_OK && pFrame != NULL)
{
// write out the code that ip pointed to
@@ -917,7 +917,7 @@ HRESULT ClrDataAccess::EnumMemWalkStackHelper(CLRDataEnumMemoryFlags flags,
// This method has a generic type token which is required to figure out the exact instantiation
// of the method.
// We need to use the variable index of the generic type token in order to do the look up.
- CLRDATA_ADDRESS address = NULL;
+ CLRDATA_ADDRESS address = (CLRDATA_ADDRESS)NULL;
DWORD dwExactGenericArgsTokenIndex = 0;
ReleaseHolder pDV(NULL);
ReleaseHolder pAssociatedValue(NULL);
@@ -955,7 +955,7 @@ HRESULT ClrDataAccess::EnumMemWalkStackHelper(CLRDataEnumMemoryFlags flags,
#if defined(FEATURE_EH_FUNCLETS) && defined(USE_GC_INFO_DECODER)
- if (addr != NULL)
+ if (addr != (PCODE)NULL)
{
EECodeInfo codeInfo(addr);
@@ -997,7 +997,7 @@ HRESULT ClrDataAccess::EnumMemWalkStackHelper(CLRDataEnumMemoryFlags flags,
EX_END_CATCH(RethrowCancelExceptions)
#if defined(DAC_MEASURE_PERF)
- unsigned __int64 nEnd = GetCycleCount();
+ uint64_t nEnd = GetCycleCount();
g_nStackTotalTime += nEnd - nStart;
g_nStackWalk = 0;
#endif // #if defined(DAC_MEASURE_PERF)
@@ -1961,8 +1961,8 @@ ClrDataAccess::EnumMemoryRegions(IN ICLRDataEnumMemoryRegionsCallback* callback,
g_nFindStackTotalTime = 0;
LARGE_INTEGER nClockFrequency;
- unsigned __int64 nStart = 0;
- unsigned __int64 nEnd = 0;
+ uint64_t nStart = 0;
+ uint64_t nEnd = 0;
QueryPerformanceFrequency(&nClockFrequency);
diff --git a/src/coreclr/debug/daccess/request.cpp b/src/coreclr/debug/daccess/request.cpp
index dea3b8544ab9..4657aadf2296 100644
--- a/src/coreclr/debug/daccess/request.cpp
+++ b/src/coreclr/debug/daccess/request.cpp
@@ -38,6 +38,8 @@ typedef DPTR(InteropLib::ABI::ManagedObjectWrapperLayout) PTR_ManagedObjectWrapp
#include "rejit.h"
#include "request_common.h"
+#include "cdac.h"
+
// GC headers define these to EE-specific stuff that we don't want.
#undef EnterCriticalSection
#undef LeaveCriticalSection
@@ -67,13 +69,13 @@ typedef DPTR(InteropLib::ABI::ManagedObjectWrapperLayout) PTR_ManagedObjectWrapp
TADDR DACGetMethodTableFromObjectPointer(TADDR objAddr, ICorDebugDataTarget * target)
{
ULONG32 returned = 0;
- TADDR Value = NULL;
+ TADDR Value = (TADDR)NULL;
HRESULT hr = target->ReadVirtual(objAddr, (PBYTE)&Value, sizeof(TADDR), &returned);
if ((hr != S_OK) || (returned != sizeof(TADDR)))
{
- return NULL;
+ return (TADDR)NULL;
}
#if TARGET_64BIT
@@ -88,7 +90,7 @@ TADDR DACGetMethodTableFromObjectPointer(TADDR objAddr, ICorDebugDataTarget * ta
PTR_SyncBlock DACGetSyncBlockFromObjectPointer(TADDR objAddr, ICorDebugDataTarget * target)
{
ULONG32 returned = 0;
- DWORD Value = NULL;
+ DWORD Value = 0;
HRESULT hr = target->ReadVirtual(objAddr - sizeof(DWORD), (PBYTE)&Value, sizeof(DWORD), &returned);
@@ -299,31 +301,64 @@ HRESULT ClrDataAccess::GetThreadStoreData(struct DacpThreadStoreData *threadStor
{
SOSDacEnter();
- ThreadStore* threadStore = ThreadStore::s_pThreadStore;
- if (!threadStore)
+ if (m_cdacSos != NULL)
{
- hr = E_UNEXPECTED;
+ // Try the cDAC first - it will return E_NOTIMPL if it doesn't support this method yet. Fall back to the DAC.
+ hr = m_cdacSos->GetThreadStoreData(threadStoreData);
+ if (FAILED(hr))
+ {
+ hr = GetThreadStoreDataImpl(threadStoreData);
+ }
+#ifdef _DEBUG
+ else
+ {
+ // Assert that the data is the same as what we get from the DAC.
+ DacpThreadStoreData threadStoreDataLocal;
+ HRESULT hrLocal = GetThreadStoreDataImpl(&threadStoreDataLocal);
+ _ASSERTE(hr == hrLocal);
+ _ASSERTE(threadStoreData->threadCount == threadStoreDataLocal.threadCount);
+ _ASSERTE(threadStoreData->unstartedThreadCount == threadStoreDataLocal.unstartedThreadCount);
+ _ASSERTE(threadStoreData->backgroundThreadCount == threadStoreDataLocal.backgroundThreadCount);
+ _ASSERTE(threadStoreData->pendingThreadCount == threadStoreDataLocal.pendingThreadCount);
+ _ASSERTE(threadStoreData->deadThreadCount == threadStoreDataLocal.deadThreadCount);
+ _ASSERTE(threadStoreData->fHostConfig == threadStoreDataLocal.fHostConfig);
+ _ASSERTE(threadStoreData->firstThread == threadStoreDataLocal.firstThread);
+ _ASSERTE(threadStoreData->finalizerThread == threadStoreDataLocal.finalizerThread);
+ _ASSERTE(threadStoreData->gcThread == threadStoreDataLocal.gcThread);
+ }
+#endif
}
else
{
- // initialize the fields of our local structure
- threadStoreData->threadCount = threadStore->m_ThreadCount;
- threadStoreData->unstartedThreadCount = threadStore->m_UnstartedThreadCount;
- threadStoreData->backgroundThreadCount = threadStore->m_BackgroundThreadCount;
- threadStoreData->pendingThreadCount = threadStore->m_PendingThreadCount;
- threadStoreData->deadThreadCount = threadStore->m_DeadThreadCount;
- threadStoreData->fHostConfig = FALSE;
-
- // identify the "important" threads
- threadStoreData->firstThread = HOST_CDADDR(threadStore->m_ThreadList.GetHead());
- threadStoreData->finalizerThread = HOST_CDADDR(g_pFinalizerThread);
- threadStoreData->gcThread = HOST_CDADDR(g_pSuspensionThread);
+ hr = GetThreadStoreDataImpl(threadStoreData);
}
SOSDacLeave();
return hr;
}
+HRESULT ClrDataAccess::GetThreadStoreDataImpl(struct DacpThreadStoreData *threadStoreData)
+{
+ ThreadStore* threadStore = ThreadStore::s_pThreadStore;
+ if (!threadStore)
+ return E_UNEXPECTED;
+
+ // initialize the fields of our local structure
+ threadStoreData->threadCount = threadStore->m_ThreadCount;
+ threadStoreData->unstartedThreadCount = threadStore->m_UnstartedThreadCount;
+ threadStoreData->backgroundThreadCount = threadStore->m_BackgroundThreadCount;
+ threadStoreData->pendingThreadCount = threadStore->m_PendingThreadCount;
+ threadStoreData->deadThreadCount = threadStore->m_DeadThreadCount;
+ threadStoreData->fHostConfig = FALSE;
+
+ // identify the "important" threads
+ threadStoreData->firstThread = HOST_CDADDR(threadStore->m_ThreadList.GetHead());
+ threadStoreData->finalizerThread = HOST_CDADDR(g_pFinalizerThread);
+ threadStoreData->gcThread = HOST_CDADDR(g_pSuspensionThread);
+
+ return S_OK;
+}
+
HRESULT
ClrDataAccess::GetStressLogAddress(CLRDATA_ADDRESS *stressLog)
{
@@ -414,7 +449,7 @@ ClrDataAccess::GetMethodTableSlot(CLRDATA_ADDRESS mt, unsigned int slot, CLRDATA
HRESULT
ClrDataAccess::GetCodeHeapList(CLRDATA_ADDRESS jitManager, unsigned int count, struct DacpJitCodeHeapInfo codeHeaps[], unsigned int *pNeeded)
{
- if (jitManager == NULL)
+ if (jitManager == (CLRDATA_ADDRESS)NULL)
return E_INVALIDARG;
SOSDacEnter();
@@ -743,16 +778,16 @@ ClrDataAccess::GetThreadData(CLRDATA_ADDRESS threadAddr, struct DacpThreadData *
threadData->allocContextPtr = TO_CDADDR(thread->m_alloc_context.alloc_ptr);
threadData->allocContextLimit = TO_CDADDR(thread->m_alloc_context.alloc_limit);
- threadData->fiberData = NULL;
+ threadData->fiberData = (CLRDATA_ADDRESS)NULL;
threadData->pFrame = PTR_CDADDR(thread->m_pFrame);
- threadData->context = PTR_CDADDR(thread->m_pDomain);
- threadData->domain = PTR_CDADDR(thread->m_pDomain);
+ threadData->context = PTR_CDADDR(AppDomain::GetCurrentDomain());
+ threadData->domain = PTR_CDADDR(AppDomain::GetCurrentDomain());
threadData->lockCount = (DWORD)-1;
#ifndef TARGET_UNIX
threadData->teb = TO_CDADDR(thread->m_pTEB);
#else
- threadData->teb = NULL;
+ threadData->teb = (CLRDATA_ADDRESS)NULL;
#endif
threadData->lastThrownObjectHandle =
TO_CDADDR(thread->m_LastThrownObjectHandle);
@@ -868,7 +903,7 @@ HRESULT ClrDataAccess::GetMethodDescData(
*pcNeededRevertedRejitData = 0;
NativeCodeVersion requestedNativeCodeVersion, activeNativeCodeVersion;
- if (ip != NULL)
+ if (ip != (CLRDATA_ADDRESS)NULL)
{
requestedNativeCodeVersion = ExecutionManager::GetNativeCodeVersion(CLRDATA_ADDRESS_TO_TADDR(ip));
}
@@ -885,7 +920,7 @@ HRESULT ClrDataAccess::GetMethodDescData(
methodDescData->requestedIP = ip;
methodDescData->bIsDynamic = (pMD->IsLCGMethod()) ? TRUE : FALSE;
methodDescData->wSlotNumber = pMD->GetSlot();
- if (!requestedNativeCodeVersion.IsNull() && requestedNativeCodeVersion.GetNativeCode() != NULL)
+ if (!requestedNativeCodeVersion.IsNull() && requestedNativeCodeVersion.GetNativeCode() != (PCODE)NULL)
{
methodDescData->bHasNativeCode = TRUE;
methodDescData->NativeCodeAddr = TO_CDADDR(PCODEToPINSTR(requestedNativeCodeVersion.GetNativeCode()));
@@ -895,7 +930,7 @@ HRESULT ClrDataAccess::GetMethodDescData(
methodDescData->bHasNativeCode = FALSE;
methodDescData->NativeCodeAddr = (CLRDATA_ADDRESS)-1;
}
- methodDescData->AddressOfNativeCodeSlot = pMD->HasNativeCodeSlot() ? TO_CDADDR(dac_cast(pMD->GetAddrOfNativeCodeSlot())) : NULL;
+ methodDescData->AddressOfNativeCodeSlot = pMD->HasNativeCodeSlot() ? TO_CDADDR(dac_cast(pMD->GetAddrOfNativeCodeSlot())) : (CLRDATA_ADDRESS)NULL;
methodDescData->MDToken = pMD->GetMemberDef();
methodDescData->MethodDescPtr = methodDesc;
methodDescData->MethodTablePtr = HOST_CDADDR(pMD->GetMethodTable());
@@ -929,7 +964,7 @@ HRESULT ClrDataAccess::GetMethodDescData(
// Requested ReJitInfo
_ASSERTE(methodDescData->rejitDataRequested.rejitID == 0);
- if (ip != NULL && !requestedNativeCodeVersion.IsNull())
+ if (ip != (CLRDATA_ADDRESS)NULL && !requestedNativeCodeVersion.IsNull())
{
CopyNativeCodeVersionToReJitData(
requestedNativeCodeVersion,
@@ -1091,8 +1126,8 @@ HRESULT ClrDataAccess::GetTieredVersions(
goto cleanup;
}
- TADDR r2rImageBase = NULL;
- TADDR r2rImageEnd = NULL;
+ TADDR r2rImageBase = (TADDR)NULL;
+ TADDR r2rImageEnd = (TADDR)NULL;
{
PTR_Module pModule = (PTR_Module)pMD->GetModule();
if (pModule->IsReadyToRun())
@@ -1221,10 +1256,10 @@ ClrDataAccess::GetCodeHeaderData(CLRDATA_ADDRESS ip, struct DacpCodeHeaderData *
{
codeHeaderData->MethodDescPtr = HOST_CDADDR(methodDescI);
codeHeaderData->JITType = TYPE_UNKNOWN;
- codeHeaderData->GCInfo = NULL;
- codeHeaderData->MethodStart = NULL;
+ codeHeaderData->GCInfo = (CLRDATA_ADDRESS)NULL;
+ codeHeaderData->MethodStart = (CLRDATA_ADDRESS)NULL;
codeHeaderData->MethodSize = 0;
- codeHeaderData->ColdRegionStart = NULL;
+ codeHeaderData->ColdRegionStart = (CLRDATA_ADDRESS)NULL;
}
}
else
@@ -1239,7 +1274,7 @@ ClrDataAccess::GetCodeHeaderData(CLRDATA_ADDRESS ip, struct DacpCodeHeaderData *
_ASSERTE(FitsIn(methodSize));
codeHeaderData->MethodSize = static_cast(methodSize);
- IJitManager::MethodRegionInfo methodRegionInfo = {NULL, 0, NULL, 0};
+ IJitManager::MethodRegionInfo methodRegionInfo = {(TADDR)NULL, 0, (TADDR)NULL, 0};
codeInfo.GetMethodRegionInfo(&methodRegionInfo);
codeHeaderData->HotRegionSize = (DWORD) methodRegionInfo.hotSize;
@@ -1261,7 +1296,7 @@ ClrDataAccess::GetMethodDescPtrFromFrame(CLRDATA_ADDRESS frameAddr, CLRDATA_ADDR
Frame *pFrame = PTR_Frame(TO_TADDR(frameAddr));
CLRDATA_ADDRESS methodDescAddr = HOST_CDADDR(pFrame->GetFunction());
- if ((methodDescAddr == NULL) || !DacValidateMD(PTR_MethodDesc(TO_TADDR(methodDescAddr))))
+ if ((methodDescAddr == (CLRDATA_ADDRESS)NULL) || !DacValidateMD(PTR_MethodDesc(TO_TADDR(methodDescAddr))))
{
hr = E_INVALIDARG;
}
@@ -1292,7 +1327,7 @@ ClrDataAccess::GetMethodDescPtrFromIP(CLRDATA_ADDRESS ip, CLRDATA_ADDRESS * ppMD
else
{
CLRDATA_ADDRESS pMD = HOST_CDADDR(codeInfo.GetMethodDesc());
- if ((pMD == NULL) || !DacValidateMD(PTR_MethodDesc(TO_TADDR(pMD))))
+ if ((pMD == (CLRDATA_ADDRESS)NULL) || !DacValidateMD(PTR_MethodDesc(TO_TADDR(pMD))))
{
hr = E_INVALIDARG;
}
@@ -1475,7 +1510,7 @@ ClrDataAccess::GetObjectClassName(CLRDATA_ADDRESS obj, unsigned int count, _Inou
// scans of the gc heap.
PTR_MethodTable mt = NULL;
TADDR mtTADDR = DACGetMethodTableFromObjectPointer(CLRDATA_ADDRESS_TO_TADDR(obj), m_pTarget);
- if (mtTADDR != NULL)
+ if (mtTADDR != (TADDR)NULL)
mt = PTR_MethodTable(mtTADDR);
else
hr = E_INVALIDARG;
@@ -1834,12 +1869,12 @@ ClrDataAccess::GetFieldDescData(CLRDATA_ADDRESS addr, struct DacpFieldDescData *
}
else
{
- FieldDescData->MTOfType = NULL;
+ FieldDescData->MTOfType = (CLRDATA_ADDRESS)NULL;
}
}
EX_CATCH
{
- FieldDescData->MTOfType = NULL;
+ FieldDescData->MTOfType = (CLRDATA_ADDRESS)NULL;
}
EX_END_CATCH(SwallowAllExceptions)
@@ -1864,7 +1899,7 @@ ClrDataAccess::GetFieldDescData(CLRDATA_ADDRESS addr, struct DacpFieldDescData *
{
// There is no encoded token of field type
FieldDescData->TokenOfType = mdTypeDefNil;
- if (FieldDescData->MTOfType == NULL)
+ if (FieldDescData->MTOfType == (CLRDATA_ADDRESS)NULL)
{
// If there is no encoded token (that is, it is primitive type) and no MethodTable for it, remember the
// element_type from signature
@@ -2100,7 +2135,7 @@ ClrDataAccess::GetPEFileBase(CLRDATA_ADDRESS addr, CLRDATA_ADDRESS *base)
if (!pPEAssembly->IsDynamic())
*base = TO_CDADDR(pPEAssembly->GetIJWBase());
else
- *base = NULL;
+ *base = (CLRDATA_ADDRESS)NULL;
SOSDacLeave();
return hr;
@@ -2112,7 +2147,7 @@ DWORD DACGetNumComponents(TADDR addr, ICorDebugDataTarget* target)
// array components.
addr+=sizeof(size_t);
ULONG32 returned = 0;
- DWORD Value = NULL;
+ DWORD Value = 0;
HRESULT hr = target->ReadVirtual(addr, (PBYTE)&Value, sizeof(DWORD), &returned);
if ((hr != S_OK) || (returned != sizeof(DWORD)))
@@ -2132,7 +2167,7 @@ ClrDataAccess::GetObjectData(CLRDATA_ADDRESS addr, struct DacpObjectData *object
ZeroMemory (objectData, sizeof(DacpObjectData));
TADDR mtTADDR = DACGetMethodTableFromObjectPointer(CLRDATA_ADDRESS_TO_TADDR(addr),m_pTarget);
- if (mtTADDR==NULL)
+ if (mtTADDR==(TADDR)NULL)
hr = E_INVALIDARG;
BOOL bFree = FALSE;
@@ -2261,7 +2296,7 @@ ClrDataAccess::GetAppDomainStoreData(struct DacpAppDomainStoreData *adsData)
SOSDacEnter();
adsData->systemDomain = HOST_CDADDR(SystemDomain::System());
- adsData->sharedDomain = NULL;
+ adsData->sharedDomain = (CLRDATA_ADDRESS)NULL;
// Get an accurate count of appdomains.
adsData->DomainCount = 0;
@@ -2332,7 +2367,7 @@ ClrDataAccess::GetAppDomainData(CLRDATA_ADDRESS addr, struct DacpAppDomainData *
HRESULT
ClrDataAccess::GetFailedAssemblyData(CLRDATA_ADDRESS assembly, unsigned int *pContext, HRESULT *pResult)
{
- if (assembly == NULL || (pContext == NULL && pResult == NULL))
+ if (assembly == (CLRDATA_ADDRESS)NULL || (pContext == NULL && pResult == NULL))
{
return E_INVALIDARG;
}
@@ -2358,7 +2393,7 @@ HRESULT
ClrDataAccess::GetFailedAssemblyLocation(CLRDATA_ADDRESS assembly, unsigned int count,
_Inout_updates_z_(count) WCHAR *location, unsigned int *pNeeded)
{
- if (assembly == NULL || (location == NULL && pNeeded == NULL) || (location != NULL && count == 0))
+ if (assembly == (CLRDATA_ADDRESS)NULL || (location == NULL && pNeeded == NULL) || (location != NULL && count == 0))
return E_INVALIDARG;
SOSDacEnter();
@@ -2377,7 +2412,7 @@ ClrDataAccess::GetFailedAssemblyLocation(CLRDATA_ADDRESS assembly, unsigned int
HRESULT
ClrDataAccess::GetFailedAssemblyDisplayName(CLRDATA_ADDRESS assembly, unsigned int count, _Inout_updates_z_(count) WCHAR *name, unsigned int *pNeeded)
{
- if (assembly == NULL || (name == NULL && pNeeded == NULL) || (name != NULL && count == 0))
+ if (assembly == (CLRDATA_ADDRESS)NULL || (name == NULL && pNeeded == NULL) || (name != NULL && count == 0))
return E_INVALIDARG;
SOSDacEnter();
@@ -2407,7 +2442,7 @@ ClrDataAccess::GetFailedAssemblyDisplayName(CLRDATA_ADDRESS assembly, unsigned i
HRESULT
ClrDataAccess::GetAssemblyList(CLRDATA_ADDRESS addr, int count, CLRDATA_ADDRESS values[], int *pNeeded)
{
- if (addr == NULL)
+ if (addr == (CLRDATA_ADDRESS)NULL)
return E_INVALIDARG;
SOSDacEnter();
@@ -2459,7 +2494,7 @@ HRESULT
ClrDataAccess::GetFailedAssemblyList(CLRDATA_ADDRESS appDomain, int count,
CLRDATA_ADDRESS values[], unsigned int *pNeeded)
{
- if ((appDomain == NULL) || (values == NULL && pNeeded == NULL))
+ if ((appDomain == (CLRDATA_ADDRESS)NULL) || (values == NULL && pNeeded == NULL))
{
return E_INVALIDARG;
}
@@ -2554,7 +2589,7 @@ ClrDataAccess::GetAppDomainConfigFile(CLRDATA_ADDRESS appDomain, int count,
HRESULT
ClrDataAccess::GetAssemblyData(CLRDATA_ADDRESS cdBaseDomainPtr, CLRDATA_ADDRESS assembly, struct DacpAssemblyData *assemblyData)
{
- if (assembly == NULL && cdBaseDomainPtr == NULL)
+ if (assembly == (CLRDATA_ADDRESS)NULL && cdBaseDomainPtr == (CLRDATA_ADDRESS)NULL)
{
return E_INVALIDARG;
}
@@ -2568,7 +2603,7 @@ ClrDataAccess::GetAssemblyData(CLRDATA_ADDRESS cdBaseDomainPtr, CLRDATA_ADDRESS
// If the specified BaseDomain is an AppDomain, get a pointer to it
AppDomain * pDomain = NULL;
- if (cdBaseDomainPtr != NULL)
+ if (cdBaseDomainPtr != (CLRDATA_ADDRESS)NULL)
{
assemblyData->BaseDomainPtr = cdBaseDomainPtr;
PTR_BaseDomain baseDomain = PTR_BaseDomain(TO_TADDR(cdBaseDomainPtr));
@@ -2636,7 +2671,7 @@ ClrDataAccess::GetAssemblyName(CLRDATA_ADDRESS assembly, unsigned int count, _In
HRESULT
ClrDataAccess::GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, _Inout_updates_z_(count) WCHAR *location, unsigned int *pNeeded)
{
- if ((assembly == NULL) || (location == NULL && pNeeded == NULL) || (location != NULL && count == 0))
+ if ((assembly == (CLRDATA_ADDRESS)NULL) || (location == NULL && pNeeded == NULL) || (location != NULL && count == 0))
{
return E_INVALIDARG;
}
@@ -2721,7 +2756,7 @@ ClrDataAccess::GetGCHeapStaticData(struct DacpGcHeapDetails *detailsData)
SOSDacEnter();
- detailsData->heapAddr = NULL;
+ detailsData->heapAddr = (CLRDATA_ADDRESS)NULL;
detailsData->lowest_address = PTR_CDADDR(g_lowest_address);
detailsData->highest_address = PTR_CDADDR(g_highest_address);
@@ -2825,7 +2860,7 @@ ClrDataAccess::GetHeapSegmentData(CLRDATA_ADDRESS seg, struct DacpHeapSegmentDat
heapSegment->mem = (CLRDATA_ADDRESS)(ULONG_PTR) pSegment->mem;
heapSegment->next = (CLRDATA_ADDRESS)dac_cast(pSegment->next);
heapSegment->flags = pSegment->flags;
- heapSegment->gc_heap = NULL;
+ heapSegment->gc_heap = (CLRDATA_ADDRESS)NULL;
heapSegment->background_allocated = (CLRDATA_ADDRESS)(ULONG_PTR)pSegment->background_allocated;
if (seg == (CLRDATA_ADDRESS)*g_gcDacGlobals->ephemeral_heap_segment)
@@ -3255,7 +3290,7 @@ ClrDataAccess::GetThreadLocalModuleData(CLRDATA_ADDRESS thread, unsigned int ind
HRESULT ClrDataAccess::GetHandleEnum(ISOSHandleEnum **ppHandleEnum)
{
unsigned int types[] = {HNDTYPE_WEAK_SHORT, HNDTYPE_WEAK_LONG, HNDTYPE_STRONG, HNDTYPE_PINNED, HNDTYPE_DEPENDENT,
- HNDTYPE_SIZEDREF,
+ HNDTYPE_SIZEDREF, HNDTYPE_WEAK_INTERIOR_POINTER,
#if defined(FEATURE_COMINTEROP) || defined(FEATURE_COMWRAPPERS) || defined(FEATURE_OBJCMARSHAL)
HNDTYPE_REFCOUNTED,
#endif // FEATURE_COMINTEROP || FEATURE_COMWRAPPERS || FEATURE_OBJCMARSHAL
@@ -3736,7 +3771,7 @@ ClrDataAccess::GetSyncBlockCleanupData(CLRDATA_ADDRESS syncBlock, struct DacpSyn
ZeroMemory (syncBlockCData, sizeof(DacpSyncBlockCleanupData));
SyncBlock *pBlock = NULL;
- if (syncBlock == NULL && SyncBlockCache::s_pSyncBlockCache->m_pCleanupBlockList)
+ if (syncBlock == (CLRDATA_ADDRESS)NULL && SyncBlockCache::s_pSyncBlockCache->m_pCleanupBlockList)
{
pBlock = (SyncBlock *) PTR_SyncBlock(
PTR_HOST_TO_TADDR(SyncBlockCache::s_pSyncBlockCache->m_pCleanupBlockList) - offsetof(SyncBlock, m_Link));
@@ -4235,7 +4270,7 @@ BOOL ClrDataAccess::DACGetComWrappersCCWVTableQIAddress(CLRDATA_ADDRESS ccwPtr,
HRESULT hr = S_OK;
ULONG32 bytesRead = 0;
TADDR ccw = CLRDATA_ADDRESS_TO_TADDR(ccwPtr);
- *vTableAddress = NULL;
+ *vTableAddress = (TADDR)NULL;
if (FAILED(m_pTarget->ReadVirtual(ccw, (PBYTE)vTableAddress, sizeof(TADDR), &bytesRead))
|| bytesRead != sizeof(TADDR)
|| vTableAddress == NULL)
@@ -4243,7 +4278,7 @@ BOOL ClrDataAccess::DACGetComWrappersCCWVTableQIAddress(CLRDATA_ADDRESS ccwPtr,
return FALSE;
}
- *qiAddress = NULL;
+ *qiAddress = (TADDR)NULL;
if (FAILED(m_pTarget->ReadVirtual(*vTableAddress, (PBYTE)qiAddress, sizeof(TADDR), &bytesRead))
|| bytesRead != sizeof(TADDR)
|| qiAddress == NULL)
@@ -4262,8 +4297,8 @@ BOOL ClrDataAccess::DACGetComWrappersCCWVTableQIAddress(CLRDATA_ADDRESS ccwPtr,
BOOL ClrDataAccess::DACIsComWrappersCCW(CLRDATA_ADDRESS ccwPtr)
{
- TADDR vTableAddress = NULL;
- TADDR qiAddress = NULL;
+ TADDR vTableAddress = (TADDR)NULL;
+ TADDR qiAddress = (TADDR)NULL;
if (!DACGetComWrappersCCWVTableQIAddress(ccwPtr, &vTableAddress, &qiAddress))
{
return FALSE;
@@ -4277,7 +4312,7 @@ TADDR ClrDataAccess::DACGetManagedObjectWrapperFromCCW(CLRDATA_ADDRESS ccwPtr)
{
if (!DACIsComWrappersCCW(ccwPtr))
{
- return NULL;
+ return (TADDR)NULL;
}
ULONG32 bytesRead = 0;
@@ -4286,7 +4321,7 @@ TADDR ClrDataAccess::DACGetManagedObjectWrapperFromCCW(CLRDATA_ADDRESS ccwPtr)
if (FAILED(m_pTarget->ReadVirtual(managedObjectWrapperPtrPtr, (PBYTE)&managedObjectWrapperPtr, sizeof(TADDR), &bytesRead))
|| bytesRead != sizeof(TADDR))
{
- return NULL;
+ return (TADDR)NULL;
}
return managedObjectWrapperPtr;
@@ -4299,7 +4334,7 @@ HRESULT ClrDataAccess::DACTryGetComWrappersHandleFromCCW(CLRDATA_ADDRESS ccwPtr,
ULONG32 bytesRead = 0;
OBJECTHANDLE handle;
- if (ccwPtr == 0 || objHandle == NULL)
+ if (ccwPtr == 0 || objHandle == 0)
{
hr = E_INVALIDARG;
goto ErrExit;
@@ -4315,7 +4350,7 @@ HRESULT ClrDataAccess::DACTryGetComWrappersHandleFromCCW(CLRDATA_ADDRESS ccwPtr,
// Return ManagedObjectWrapper as an OBJECTHANDLE. (The OBJECTHANDLE is guaranteed to live at offset 0).
managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccwPtr);
- if (managedObjectWrapperPtr == NULL)
+ if (managedObjectWrapperPtr == (TADDR)NULL)
{
hr = E_FAIL;
goto ErrExit;
@@ -4382,7 +4417,7 @@ HRESULT ClrDataAccess::GetCCWData(CLRDATA_ADDRESS ccw, struct DacpCCWData *ccwDa
ccwData->isExtendsCOMObject = pCCW->GetSimpleWrapper()->IsExtendsCOMObject();
ccwData->isAggregated = pCCW->GetSimpleWrapper()->IsAggregated();
- if (pCCW->GetObjectHandle() != NULL)
+ if (pCCW->GetObjectHandle() != (OBJECTHANDLE)NULL)
ccwData->managedObject = PTR_CDADDR(ObjectFromHandle(pCCW->GetObjectHandle()));
// count the number of COM vtables
@@ -4535,7 +4570,7 @@ HRESULT ClrDataAccess::GetClrNotification(CLRDATA_ADDRESS arguments[], int count
*pNeeded = MAX_CLR_NOTIFICATION_ARGS;
- if (g_clrNotificationArguments[0] == NULL)
+ if (g_clrNotificationArguments[0] == (CLRDATA_ADDRESS)NULL)
{
hr = E_FAIL;
}
@@ -4645,7 +4680,7 @@ HRESULT ClrDataAccess::GetProfilerModifiedILInformation(CLRDATA_ADDRESS methodDe
pILData->type = DacpProfilerILData::Unmodified;
pILData->rejitID = 0;
- pILData->il = NULL;
+ pILData->il = (CLRDATA_ADDRESS)NULL;
PTR_MethodDesc pMD = PTR_MethodDesc(TO_TADDR(methodDesc));
CodeVersionManager* pCodeVersionManager = pMD->GetCodeVersionManager();
@@ -4658,7 +4693,7 @@ HRESULT ClrDataAccess::GetProfilerModifiedILInformation(CLRDATA_ADDRESS methodDe
}
TADDR pDynamicIL = pMD->GetModule()->GetDynamicIL(pMD->GetMemberDef());
- if (pDynamicIL != NULL)
+ if (pDynamicIL != (TADDR)NULL)
{
pILData->type = DacpProfilerILData::ILModified;
pILData->il = (CLRDATA_ADDRESS)pDynamicIL;
@@ -4701,7 +4736,7 @@ HRESULT ClrDataAccess::GetMethodsWithProfilerModifiedIL(CLRDATA_ADDRESS mod, CLR
TADDR pDynamicIL = pModule->GetDynamicIL(pMD->GetMemberDef());
ILCodeVersion ilVersion = pCodeVersionManager->GetActiveILCodeVersion(pMD);
- if (ilVersion.GetRejitState() != ILCodeVersion::kStateActive || !ilVersion.HasDefaultIL() || pDynamicIL != NULL)
+ if (ilVersion.GetRejitState() != ILCodeVersion::kStateActive || !ilVersion.HasDefaultIL() || pDynamicIL != (TADDR)NULL)
{
methodDescs[*pcMethodDescs] = PTR_CDADDR(pMD);
++(*pcMethodDescs);
@@ -4824,7 +4859,7 @@ HRESULT ClrDataAccess::GetFinalizationFillPointers(unsigned int cFillPointers, C
HRESULT ClrDataAccess::GetGenerationTableSvr(CLRDATA_ADDRESS heapAddr, unsigned int cGenerations, struct DacpGenerationData *pGenerationData, unsigned int *pNeeded)
{
- if (heapAddr == NULL || (cGenerations > 0 && pGenerationData == NULL))
+ if (heapAddr == (CLRDATA_ADDRESS)NULL || (cGenerations > 0 && pGenerationData == NULL))
{
return E_INVALIDARG;
}
@@ -4874,7 +4909,7 @@ HRESULT ClrDataAccess::GetGenerationTableSvr(CLRDATA_ADDRESS heapAddr, unsigned
HRESULT ClrDataAccess::GetFinalizationFillPointersSvr(CLRDATA_ADDRESS heapAddr, unsigned int cFillPointers, CLRDATA_ADDRESS *pFinalizationFillPointers, unsigned int *pNeeded)
{
- if (heapAddr == NULL || (cFillPointers > 0 && pFinalizationFillPointers == NULL))
+ if (heapAddr == (CLRDATA_ADDRESS)NULL || (cFillPointers > 0 && pFinalizationFillPointers == NULL))
{
return E_INVALIDARG;
}
@@ -4951,7 +4986,15 @@ HRESULT ClrDataAccess::GetBreakingChangeVersion(int* pVersion)
if (pVersion == nullptr)
return E_INVALIDARG;
- *pVersion = SOS_BREAKING_CHANGE_VERSION;
+ if (m_cdacSos9 != nullptr && SUCCEEDED(m_cdacSos9->GetBreakingChangeVersion(pVersion)))
+ {
+ _ASSERTE(*pVersion == SOS_BREAKING_CHANGE_VERSION);
+ }
+ else
+ {
+ *pVersion = SOS_BREAKING_CHANGE_VERSION;
+ }
+
return S_OK;
}
@@ -5052,7 +5095,7 @@ HRESULT ClrDataAccess::IsComWrappersCCW(CLRDATA_ADDRESS ccw, BOOL *isComWrappers
if (isComWrappersCCW != NULL)
{
TADDR managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccw);
- *isComWrappersCCW = managedObjectWrapperPtr != NULL;
+ *isComWrappersCCW = managedObjectWrapperPtr != (TADDR)NULL;
hr = *isComWrappersCCW ? S_OK : S_FALSE;
}
@@ -5074,7 +5117,7 @@ HRESULT ClrDataAccess::GetComWrappersCCWData(CLRDATA_ADDRESS ccw, CLRDATA_ADDRES
SOSDacEnter();
TADDR managedObjectWrapperPtr = DACGetManagedObjectWrapperFromCCW(ccw);
- if (managedObjectWrapperPtr != NULL)
+ if (managedObjectWrapperPtr != (TADDR)NULL)
{
PTR_ManagedObjectWrapper pMOW(managedObjectWrapperPtr);
@@ -5245,7 +5288,7 @@ HRESULT ClrDataAccess::IsTrackedType(
SOSDacEnter();
TADDR mtTADDR = DACGetMethodTableFromObjectPointer(CLRDATA_ADDRESS_TO_TADDR(objAddr), m_pTarget);
- if (mtTADDR==NULL)
+ if (mtTADDR==(TADDR)NULL)
hr = E_INVALIDARG;
BOOL bFree = FALSE;
@@ -5280,7 +5323,7 @@ HRESULT ClrDataAccess::GetTaggedMemory(
return E_INVALIDARG;
}
- *taggedMemory = NULL;
+ *taggedMemory = (TADDR)NULL;
*taggedMemorySizeInBytes = 0;
SOSDacEnter();
@@ -5406,10 +5449,10 @@ HRESULT STDMETHODCALLTYPE ClrDataAccess::GetStaticBaseAddress(CLRDATA_ADDRESS me
{
if (!nonGCStaticsAddress && !GCStaticsAddress)
return E_POINTER;
-
+
if (!methodTable)
return E_INVALIDARG;
-
+
SOSDacEnter();
PTR_MethodTable mTable = PTR_MethodTable(TO_TADDR(methodTable));
@@ -5440,13 +5483,13 @@ HRESULT STDMETHODCALLTYPE ClrDataAccess::GetThreadStaticBaseAddress(CLRDATA_ADDR
{
if (!nonGCStaticsAddress && !GCStaticsAddress)
return E_POINTER;
-
+
if (!methodTable)
return E_INVALIDARG;
if (!threadPtr)
return E_INVALIDARG;
-
+
SOSDacEnter();
PTR_MethodTable mTable = PTR_MethodTable(TO_TADDR(methodTable));
diff --git a/src/coreclr/debug/daccess/task.cpp b/src/coreclr/debug/daccess/task.cpp
index b0215cdf780e..d878fae66897 100644
--- a/src/coreclr/debug/daccess/task.cpp
+++ b/src/coreclr/debug/daccess/task.cpp
@@ -121,16 +121,8 @@ ClrDataTask::GetCurrentAppDomain(
EX_TRY
{
- if (m_thread->GetDomain())
- {
- *appDomain = new (nothrow)
- ClrDataAppDomain(m_dac, m_thread->GetDomain());
- status = *appDomain ? S_OK : E_OUTOFMEMORY;
- }
- else
- {
- status = E_INVALIDARG;
- }
+ *appDomain = new (nothrow) ClrDataAppDomain(m_dac, AppDomain::GetCurrentDomain());
+ status = *appDomain ? S_OK : E_OUTOFMEMORY;
}
EX_CATCH
{
@@ -549,7 +541,7 @@ ClrDataTask::GetLastExceptionState(
{
*exception = new (nothrow)
ClrDataExceptionState(m_dac,
- m_thread->GetDomain(),
+ AppDomain::GetCurrentDomain(),
m_thread,
CLRDATA_EXCEPTION_PARTIAL,
NULL,
@@ -4962,7 +4954,7 @@ ClrDataExceptionState::NewFromThread(ClrDataAccess* dac,
exIf = new (nothrow)
ClrDataExceptionState(dac,
- thread->GetDomain(),
+ AppDomain::GetCurrentDomain(),
thread,
CLRDATA_EXCEPTION_DEFAULT,
exState,
@@ -5122,7 +5114,7 @@ EnumMethodDefinitions::CdStart(Module* mod,
{
HRESULT status;
- *handle = NULL;
+ *handle = 0;
if (!mod)
{
diff --git a/src/coreclr/debug/di/divalue.cpp b/src/coreclr/debug/di/divalue.cpp
index 9645ee76526b..853bac550e45 100644
--- a/src/coreclr/debug/di/divalue.cpp
+++ b/src/coreclr/debug/di/divalue.cpp
@@ -458,7 +458,7 @@ HRESULT CordbValue::InternalCreateHandle(CorDebugHandleType handleType,
true,
m_appdomain->GetADToken());
- CORDB_ADDRESS addr = GetValueHome() != NULL ? GetValueHome()->GetAddress() : NULL;
+ CORDB_ADDRESS addr = GetValueHome() != NULL ? GetValueHome()->GetAddress() : (CORDB_ADDRESS)NULL;
event.CreateHandle.objectToken = CORDB_ADDRESS_TO_PTR(addr);
event.CreateHandle.handleType = handleType;
@@ -546,7 +546,7 @@ CordbGenericValue::CordbGenericValue(CordbAppDomain * pAppdomain,
// Arguments:
// input: pType - the type of the value
CordbGenericValue::CordbGenericValue(CordbType * pType)
- : CordbValue(NULL, pType, NULL, true),
+ : CordbValue(NULL, pType, (CORDB_ADDRESS)NULL, true),
m_pValueHome(NULL)
{
// The only purpose of a literal value is to hold a RS literal value.
@@ -776,7 +776,7 @@ CordbReferenceValue::CordbReferenceValue(CordbAppDomain * pAppdomai
// Arguments:
// input: pType - the type of the value
CordbReferenceValue::CordbReferenceValue(CordbType * pType)
- : CordbValue(NULL, pType, NULL, true, pType->GetAppDomain()->GetSweepableExitNeuterList())
+ : CordbValue(NULL, pType, (CORDB_ADDRESS)NULL, true, pType->GetAppDomain()->GetSweepableExitNeuterList())
{
memset(&m_info, 0, sizeof(m_info));
@@ -905,7 +905,7 @@ HRESULT CordbReferenceValue::GetAddress(CORDB_ADDRESS *pAddress)
PUBLIC_REENTRANT_API_ENTRY(this);
VALIDATE_POINTER_TO_OBJECT(pAddress, CORDB_ADDRESS *);
- *pAddress = m_valueHome.m_pHome ? m_valueHome.m_pHome->GetAddress() : NULL;
+ *pAddress = m_valueHome.m_pHome ? m_valueHome.m_pHome->GetAddress() : (CORDB_ADDRESS)NULL;
return (S_OK);
}
@@ -940,7 +940,7 @@ HRESULT CordbReferenceValue::GetValue(CORDB_ADDRESS *pAddress)
// Copy out the value, which is simply the value the object reference.
if (m_isLiteral)
- *pAddress = NULL;
+ *pAddress = (CORDB_ADDRESS)NULL;
else
*pAddress = PTR_TO_CORDB_ADDRESS(m_info.objRef);
@@ -1840,6 +1840,10 @@ HRESULT CordbObjectValue::QueryInterface(REFIID id, void **pInterface)
{
*pInterface = static_cast(static_cast(this));
}
+ else if (id == IID_ICorDebugExceptionObjectValue2 && m_fIsExceptionObject)
+ {
+ *pInterface = static_cast(static_cast(this));
+ }
else if (id == IID_ICorDebugComObjectValue && m_fIsRcw)
{
*pInterface = static_cast(this);
@@ -2489,6 +2493,41 @@ HRESULT CordbObjectValue::EnumerateExceptionCallStack(ICorDebugExceptionObjectCa
return hr;
}
+HRESULT CordbObjectValue::ForceCatchHandlerFoundEvents(BOOL enableEvents)
+{
+ PUBLIC_API_ENTRY(this);
+ FAIL_IF_NEUTERED(this);
+ ATT_REQUIRE_STOPPED_MAY_FAIL(GetProcess());
+
+ HRESULT hr = S_OK;
+
+ EX_TRY
+ {
+ CordbProcess * pProcess = GetProcess();
+
+ CORDB_ADDRESS objAddr = m_valueHome.GetAddress();
+
+ IDacDbiInterface* pDAC = GetProcess()->GetDAC();
+ VMPTR_Object vmObj = pDAC->GetObject(objAddr);
+
+ DebuggerIPCEvent event;
+ CordbAppDomain * pAppDomain = GetAppDomain();
+ _ASSERTE (pAppDomain != NULL);
+
+ pProcess->InitIPCEvent(&event, DB_IPCE_FORCE_CATCH_HANDLER_FOUND, true, pAppDomain->GetADToken());
+ event.ForceCatchHandlerFoundData.enableEvents = enableEvents;
+ event.ForceCatchHandlerFoundData.vmObj = vmObj;
+
+ hr = pProcess->m_cordb->SendIPCEvent(pProcess, &event, sizeof(DebuggerIPCEvent));
+
+ _ASSERTE(event.type == DB_IPCE_CATCH_HANDLER_FOUND_RESULT);
+
+ hr = event.hr;
+ }
+ EX_CATCH_HRESULT(hr);
+ return hr;
+}
+
HRESULT CordbObjectValue::IsExceptionObject()
{
HRESULT hr = S_OK;
@@ -2501,7 +2540,7 @@ HRESULT CordbObjectValue::IsExceptionObject()
{
CORDB_ADDRESS objAddr = m_valueHome.GetAddress();
- if (objAddr == NULL)
+ if (objAddr == (CORDB_ADDRESS)NULL)
{
// object is a literal
hr = S_FALSE;
@@ -2533,7 +2572,7 @@ HRESULT CordbObjectValue::IsRcw()
{
CORDB_ADDRESS objAddr = m_valueHome.GetAddress();
- if (objAddr == NULL)
+ if (objAddr == (CORDB_ADDRESS)NULL)
{
// object is a literal
hr = S_FALSE;
@@ -2565,7 +2604,7 @@ HRESULT CordbObjectValue::IsDelegate()
{
CORDB_ADDRESS objAddr = m_valueHome.GetAddress();
- if (objAddr == NULL)
+ if (objAddr == (CORDB_ADDRESS)NULL)
{
// object is a literal
hr = S_FALSE;
@@ -4104,7 +4143,7 @@ CordbHandleValue::CordbHandleValue(
CordbAppDomain * pAppdomain,
CordbType * pType, // The type of object that we create handle on
CorDebugHandleType handleType) // strong or weak handle
- : CordbValue(pAppdomain, pType, NULL, false,
+ : CordbValue(pAppdomain, pType, (CORDB_ADDRESS)NULL, false,
pAppdomain->GetSweepableExitNeuterList()
)
{
diff --git a/src/coreclr/debug/di/module.cpp b/src/coreclr/debug/di/module.cpp
index 1f4216908637..d184206c08e3 100644
--- a/src/coreclr/debug/di/module.cpp
+++ b/src/coreclr/debug/di/module.cpp
@@ -526,9 +526,9 @@ void CordbModule::RefreshMetaData()
// So far we've only got a reader for in-memory-writable metadata (MDInternalRW implementation)
// We could make a reader for MDInternalRO, but no need yet. This also ensures we don't encroach into common
// scenario where we can map a file on disk.
- TADDR remoteMDInternalRWAddr = NULL;
+ TADDR remoteMDInternalRWAddr = (TADDR)NULL;
GetProcess()->GetDAC()->GetPEFileMDInternalRW(m_vmPEFile, &remoteMDInternalRWAddr);
- if (remoteMDInternalRWAddr != NULL)
+ if (remoteMDInternalRWAddr != (TADDR)NULL)
{
// we should only be doing this once to initialize, we don't support reopen with this technique
_ASSERTE(m_pIMImport == NULL);
@@ -4125,7 +4125,7 @@ HRESULT CordbNativeCode::GetAddress(CORDB_ADDRESS * pStart)
// Since we don't do code-pitching, the address points directly to the code.
*pStart = (m_rgCodeRegions[kHot].pAddress);
- if (*pStart == NULL)
+ if (*pStart == (CORDB_ADDRESS)NULL)
{
return CORDBG_E_CODE_NOT_AVAILABLE;
}
@@ -4661,7 +4661,7 @@ int CordbNativeCode::GetCallInstructionLength(BYTE *ip, ULONG32 count)
return -1;
#elif defined(TARGET_AMD64)
- BYTE rex = NULL;
+ BYTE rex = 0;
BYTE prefix = *ip;
BOOL fContainsPrefix = FALSE;
@@ -4743,7 +4743,7 @@ int CordbNativeCode::GetCallInstructionLength(BYTE *ip, ULONG32 count)
BYTE rex_x = 0;
BYTE rex_r = 0;
- if (rex != NULL)
+ if (rex != 0)
{
rex_b = (rex & 0x1); // high bit to modrm r/m field or SIB base field or OPCODE reg field -- Hmm, when which?
rex_x = (rex & 0x2) >> 1; // high bit to sib index field
@@ -4757,7 +4757,7 @@ int CordbNativeCode::GetCallInstructionLength(BYTE *ip, ULONG32 count)
{
BYTE modrm = *ip++;
- _ASSERT(modrm != NULL);
+ _ASSERT(modrm != 0);
BYTE mod = (modrm & 0xC0) >> 6;
BYTE reg = (modrm & 0x38) >> 3;
@@ -4788,7 +4788,7 @@ int CordbNativeCode::GetCallInstructionLength(BYTE *ip, ULONG32 count)
// Get values from the SIB byte
//
BYTE sib = *ip;
- _ASSERT(sib != NULL);
+ _ASSERT(sib != 0);
BYTE base = (sib & 0x07);
base |= (rex_b << 3);
diff --git a/src/coreclr/debug/di/process.cpp b/src/coreclr/debug/di/process.cpp
index 13aa3ec623e4..38c11c89127b 100644
--- a/src/coreclr/debug/di/process.cpp
+++ b/src/coreclr/debug/di/process.cpp
@@ -5318,7 +5318,7 @@ void CordbProcess::RawDispatchEvent(
// if the class is NULL, that means the debugger never enabled notifications for it. Otherwise,
// the CordbClass instance would already have been created when the notifications were
// enabled.
- if ((pNotificationClass != NULL) && pNotificationClass->CustomNotificationsEnabled())
+ if (pNotificationClass != NULL)
{
PUBLIC_CALLBACK_IN_THIS_SCOPE(this, pLockHolder, pEvent);
@@ -6608,7 +6608,7 @@ HRESULT CordbProcess::ReadMemory(CORDB_ADDRESS address,
VALIDATE_POINTER_TO_OBJECT_ARRAY(buffer, BYTE, size, true, true);
VALIDATE_POINTER_TO_OBJECT(buffer, SIZE_T *);
- if (address == NULL)
+ if (address == (CORDB_ADDRESS)NULL)
return E_INVALIDARG;
// If no read parameter is supplied, we ignore it. This matches the semantics of kernel32!ReadProcessMemory.
@@ -6706,8 +6706,8 @@ HRESULT CordbProcess::AdjustBuffer( CORDB_ADDRESS address,
_ASSERTE(m_initialized);
_ASSERTE(this->ThreadHoldsProcessLock());
- if ( address == NULL
- || size == NULL
+ if ( address == (CORDB_ADDRESS)NULL
+ || size == 0
|| buffer == NULL
|| (mode != AB_READ && mode != AB_WRITE) )
return E_INVALIDARG;
@@ -7167,7 +7167,7 @@ HRESULT CordbProcess::WriteMemory(CORDB_ADDRESS address, DWORD size,
_ASSERTE(m_runtimeOffsetsInitialized);
- if (size == 0 || address == NULL)
+ if (size == 0 || address == (CORDB_ADDRESS)NULL)
return E_INVALIDARG;
VALIDATE_POINTER_TO_OBJECT_ARRAY(buffer, BYTE, size, true, true);
@@ -7500,9 +7500,9 @@ void CordbProcess::GetEventBlock(BOOL * pfBlockExists)
// This is not technically necessary for Mac debugging. The event channel doesn't rely on
// knowing the target address of the DCB on the LS.
- CORDB_ADDRESS pLeftSideDCB = NULL;
+ CORDB_ADDRESS pLeftSideDCB = (CORDB_ADDRESS)NULL;
pLeftSideDCB = (GetDAC()->GetDebuggerControlBlockAddress());
- if (pLeftSideDCB == NULL)
+ if (pLeftSideDCB == (CORDB_ADDRESS)NULL)
{
*pfBlockExists = false;
ThrowHR(CORDBG_E_DEBUGGING_NOT_POSSIBLE);
@@ -9746,7 +9746,7 @@ bool CordbProcess::CopyManagedEventFromTarget(
// Determine if the event is really a debug event, and for our instance.
CORDB_ADDRESS ptrRemoteManagedEvent = IsEventDebuggerNotification(pRecord, m_clrInstanceId);
- if (ptrRemoteManagedEvent == NULL)
+ if (ptrRemoteManagedEvent == (CORDB_ADDRESS)NULL)
{
return false;
}
@@ -10734,6 +10734,7 @@ HRESULT CordbRCEventThread::WaitForIPCEventFromProcess(CordbProcess * pProcess,
CordbAppDomain * pAppDomain,
DebuggerIPCEvent * pEvent)
{
+
CORDBRequireProcessStateOKAndSync(pProcess, pAppDomain);
DWORD dwStatus;
@@ -11413,14 +11414,37 @@ const EXCEPTION_RECORD * CordbProcess::ValidateExceptionRecord(
HRESULT CordbProcess::SetEnableCustomNotification(ICorDebugClass * pClass, BOOL fEnable)
{
HRESULT hr = S_OK;
- PUBLIC_API_BEGIN(this); // takes the lock
+ PUBLIC_API_ENTRY(this);
+ FAIL_IF_NEUTERED(this);
+ ATT_REQUIRE_STOPPED_MAY_FAIL(GetProcess());
ValidateOrThrow(pClass);
- ((CordbClass *)pClass)->SetCustomNotifications(fEnable);
+ CordbProcess * pProcess = GetProcess();
+ RSLockHolder lockHolder(pProcess->GetProcessLock());
- PUBLIC_API_END(hr);
- return hr;
+ DebuggerIPCEvent event;
+ CordbClass *pCordbClass = static_cast(pClass);
+ _ASSERTE(pCordbClass != NULL);
+ CordbAppDomain * pAppDomain = pCordbClass->GetAppDomain();
+ _ASSERTE (pAppDomain != NULL);
+ CordbModule *pModule = pCordbClass->GetModule();
+
+ pProcess->InitIPCEvent(&event,
+ DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION,
+ true,
+ pAppDomain->GetADToken());
+ event.CustomNotificationData.vmModule = pModule->GetRuntimeModule();
+ event.CustomNotificationData.classMetadataToken = pCordbClass->MDToken();
+ event.CustomNotificationData.Enabled = fEnable;
+
+ lockHolder.Release();
+ hr = pProcess->m_cordb->SendIPCEvent(pProcess, &event, sizeof(DebuggerIPCEvent));
+ lockHolder.Acquire();
+
+ _ASSERTE(event.type == DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION_RESULT);
+
+ return event.hr;
} // CordbProcess::SetEnableCustomNotification
//---------------------------------------------------------------------------------------
@@ -14913,7 +14937,7 @@ HRESULT CordbProcess::GetReferenceValueFromGCHandle(
EX_TRY
{
- if (gcHandle == NULL)
+ if (gcHandle == (UINT_PTR)0)
{
ThrowHR(CORDBG_E_BAD_REFERENCE_VALUE);
}
diff --git a/src/coreclr/debug/di/rsclass.cpp b/src/coreclr/debug/di/rsclass.cpp
index 55f83b48a6d2..d60d1777de0b 100644
--- a/src/coreclr/debug/di/rsclass.cpp
+++ b/src/coreclr/debug/di/rsclass.cpp
@@ -34,8 +34,7 @@ CordbClass::CordbClass(CordbModule *m, mdTypeDef classMetadataToken)
m_fIsValueClassKnown(false),
m_fIsValueClass(false),
m_fHasTypeParams(false),
- m_continueCounterLastSync(0),
- m_fCustomNotificationsEnabled(false)
+ m_continueCounterLastSync(0)
{
m_classInfo.Clear();
}
@@ -237,7 +236,7 @@ HRESULT CordbClass::GetStaticFieldValue2(CordbModule * pModule,
return CORDBG_E_FIELD_NOT_STATIC;
}
- CORDB_ADDRESS pRmtStaticValue = NULL;
+ CORDB_ADDRESS pRmtStaticValue = (CORDB_ADDRESS)NULL;
CordbProcess * pProcess = pModule->GetProcess();
if (!pFieldData->m_fFldIsTLS)
@@ -300,7 +299,7 @@ HRESULT CordbClass::GetStaticFieldValue2(CordbModule * pModule,
}
}
- if (pRmtStaticValue == NULL)
+ if (pRmtStaticValue == (CORDB_ADDRESS)NULL)
{
// type probably wasn't loaded yet.
// The debugger may chose to func-eval the creation of an instance of this type and try again.
@@ -812,7 +811,7 @@ BOOL CordbClass::GotUnallocatedStatic(DacDbiArrayList * pFieldList)
while ((count < pFieldList->Count()) && !fGotUnallocatedStatic )
{
if ((*pFieldList)[count].OkToGetOrSetStaticAddress() &&
- (*pFieldList)[count].GetStaticAddress() == NULL )
+ (*pFieldList)[count].GetStaticAddress() == (CORDB_ADDRESS)NULL )
{
// The address for a regular static field isn't available yet
// How can this happen? Statics appear to get allocated during domain load.
@@ -938,7 +937,7 @@ void CordbClass::InitEnCFieldInfo(EnCHangingFieldInfo * pEncField,
{
// the field is static, we don't need any additional data
pEncField->Init(VMPTR_Object::NullPtr(), /* vmObject */
- NULL, /* offsetToVars */
+ 0, /* offsetToVars */
fieldToken,
ELEMENT_TYPE_MAX,
classToken,
diff --git a/src/coreclr/debug/di/rspriv.h b/src/coreclr/debug/di/rspriv.h
index 63886b56bfa5..ee9f4e9849a4 100644
--- a/src/coreclr/debug/di/rspriv.h
+++ b/src/coreclr/debug/di/rspriv.h
@@ -3475,7 +3475,7 @@ class CordbProcess :
* are passed in, while going through the table we'll undo patches
* in buffer at the same time
*/
- HRESULT RefreshPatchTable(CORDB_ADDRESS address = NULL, SIZE_T size = NULL, BYTE buffer[] = NULL);
+ HRESULT RefreshPatchTable(CORDB_ADDRESS address = 0, SIZE_T size = 0, BYTE buffer[] = NULL);
// Find if a patch exists at a given address.
HRESULT FindPatchByAddress(CORDB_ADDRESS address, bool *patchFound, bool *patchIsUnmanaged);
@@ -5100,10 +5100,6 @@ class CordbClass : public CordbBase, public ICorDebugClass, public ICorDebugClas
public:
- // set or clear the custom notifications flag to control whether we ignore custom debugger notifications
- void SetCustomNotifications(BOOL fEnable) { m_fCustomNotificationsEnabled = fEnable; }
- BOOL CustomNotificationsEnabled () { return m_fCustomNotificationsEnabled; }
-
HRESULT GetFieldInfo(mdFieldDef fldToken, FieldData ** ppFieldData);
// If you want to force the init to happen even if we think the class
@@ -5178,9 +5174,6 @@ class CordbClass : public CordbBase, public ICorDebugClass, public ICorDebugClas
// their value will be hung off the FieldDesc. Hold information about such fields here.
CordbHangingFieldTable m_hangingFieldsStatic;
- // this indicates whether we should send custom debugger notifications
- BOOL m_fCustomNotificationsEnabled;
-
};
@@ -5934,7 +5927,7 @@ class CordbNativeCode : public CordbCode,
ULONG32 GetColdSize();
// Return true if the Code is split into hot + cold regions.
- bool HasColdRegion() { return m_rgCodeRegions[kCold].pAddress != NULL; }
+ bool HasColdRegion() { return m_rgCodeRegions[kCold].pAddress != (CORDB_ADDRESS)NULL; }
// Get the number of fixed arguments for this function (the "this"
// but not varargs)
@@ -8406,7 +8399,7 @@ class RegisterValueHome: public ValueHome
// gets the remote address for the value or returns NULL if none exists
virtual
- CORDB_ADDRESS GetAddress() { return NULL; };
+ CORDB_ADDRESS GetAddress() { return (CORDB_ADDRESS)NULL; };
// Gets a value and returns it in dest
virtual
@@ -8925,7 +8918,7 @@ class CordbGenericValue : public CordbValue, public ICorDebugGenericValue, publi
FAIL_IF_NEUTERED(this);
VALIDATE_POINTER_TO_OBJECT_OR_NULL(pAddress, CORDB_ADDRESS *);
- *pAddress = m_pValueHome ? m_pValueHome->GetAddress() : NULL;
+ *pAddress = m_pValueHome ? m_pValueHome->GetAddress() : (CORDB_ADDRESS)NULL;
return (S_OK);
}
@@ -9170,6 +9163,7 @@ class CordbObjectValue : public CordbValue,
public ICorDebugHeapValue3,
public ICorDebugHeapValue4,
public ICorDebugExceptionObjectValue,
+ public ICorDebugExceptionObjectValue2,
public ICorDebugComObjectValue,
public ICorDebugDelegateObjectValue
{
@@ -9292,6 +9286,11 @@ class CordbObjectValue : public CordbValue,
//-----------------------------------------------------------
COM_METHOD EnumerateExceptionCallStack(ICorDebugExceptionObjectCallStackEnum** ppCallStackEnum);
+ //-----------------------------------------------------------
+ // ICorDebugExceptionObjectValue2
+ //-----------------------------------------------------------
+ COM_METHOD ForceCatchHandlerFoundEvents(BOOL enableEvents);
+
//-----------------------------------------------------------
// ICorDebugComObjectValue
//-----------------------------------------------------------
diff --git a/src/coreclr/debug/di/rsthread.cpp b/src/coreclr/debug/di/rsthread.cpp
index 1f455dad376d..f8c81ed692cb 100644
--- a/src/coreclr/debug/di/rsthread.cpp
+++ b/src/coreclr/debug/di/rsthread.cpp
@@ -656,7 +656,7 @@ void CordbThread::RefreshHandle(HANDLE * phThread)
hThread,
GetCurrentProcess(),
&m_hCachedThread,
- NULL,
+ 0,
FALSE,
DUPLICATE_SAME_ACCESS);
*phThread = m_hCachedThread;
@@ -5335,11 +5335,11 @@ HRESULT CordbInternalFrame::GetStackRange(CORDB_ADDRESS *pStart,
{
if (pStart != NULL)
{
- *pStart = NULL;
+ *pStart = (CORDB_ADDRESS)NULL;
}
if (pEnd != NULL)
{
- *pEnd = NULL;
+ *pEnd = (CORDB_ADDRESS)NULL;
}
return E_NOTIMPL;
}
@@ -5956,11 +5956,11 @@ HRESULT CordbNativeFrame::GetStackRange(CORDB_ADDRESS *pStart,
{
if (pStart != NULL)
{
- *pStart = NULL;
+ *pStart = (CORDB_ADDRESS)NULL;
}
if (pEnd != NULL)
{
- *pEnd = NULL;
+ *pEnd = (CORDB_ADDRESS)NULL;
}
return E_NOTIMPL;
}
@@ -7304,7 +7304,7 @@ SIZE_T CordbNativeFrame::GetInspectionIP()
bool CordbNativeFrame::IsFunclet()
{
#ifdef FEATURE_EH_FUNCLETS
- return (m_misc.parentIP != NULL);
+ return (m_misc.parentIP != (SIZE_T)NULL);
#else
return false;
#endif // FEATURE_EH_FUNCLETS
@@ -7406,7 +7406,7 @@ CordbJITILFrame::CordbJITILFrame(CordbNativeFrame * pNativeFrame,
m_fVarArgFnx(fVarArgFnx),
m_allArgsCount(0),
m_rgbSigParserBuf(NULL),
- m_FirstArgAddr(NULL),
+ m_FirstArgAddr((CORDB_ADDRESS)NULL),
m_rgNVI(NULL),
m_genericArgs(),
m_genericArgsLoaded(false),
@@ -7533,7 +7533,7 @@ HRESULT CordbJITILFrame::Init()
// The stackwalking code can't always successfully retrieve the generics type token.
// For example, on 64-bit, the JIT only encodes the generics type token location if
// a method has catch clause for a generic exception (e.g. "catch(MyException e)").
- if ((m_dwFrameParamsTokenIndex != (DWORD)ICorDebugInfo::MAX_ILNUM) && (m_frameParamsToken == NULL))
+ if ((m_dwFrameParamsTokenIndex != (DWORD)ICorDebugInfo::MAX_ILNUM) && (m_frameParamsToken == (GENERICS_TYPE_TOKEN)NULL))
{
// All variables are unavailable in the prolog and the epilog.
// This includes the generics type token. Failing to get the token just means that
@@ -9314,7 +9314,7 @@ HRESULT CordbEval::GatherArgInfo(ICorDebugValue *pValue,
argData->fullArgType = buffer;
argData->fullArgTypeNodeCount = fullArgTypeNodeCount;
// Is it enregistered?
- if ((addr == NULL) && (pVCObjVal->GetValueHome() != NULL))
+ if ((addr == (CORDB_ADDRESS)NULL) && (pVCObjVal->GetValueHome() != NULL))
{
pVCObjVal->GetValueHome()->CopyToIPCEType(&(argData->argHome));
}
@@ -9332,7 +9332,7 @@ HRESULT CordbEval::GatherArgInfo(ICorDebugValue *pValue,
CordbGenericValue *gv = (CordbGenericValue*)pValue;
argData->argIsLiteral = gv->CopyLiteralData(argData->argLiteralData);
// Is it enregistered?
- if ((addr == NULL) && (gv->GetValueHome() != NULL))
+ if ((addr == (CORDB_ADDRESS)NULL) && (gv->GetValueHome() != NULL))
{
gv->GetValueHome()->CopyToIPCEType(&(argData->argHome));
}
diff --git a/src/coreclr/debug/ee/amd64/walker.cpp b/src/coreclr/debug/ee/amd64/walker.cpp
index 815366def5b0..ce9ea611754b 100644
--- a/src/coreclr/debug/ee/amd64/walker.cpp
+++ b/src/coreclr/debug/ee/amd64/walker.cpp
@@ -29,7 +29,7 @@ void NativeWalker::Decode()
m_skipIP = NULL;
m_nextIP = NULL;
- BYTE rex = NULL;
+ BYTE rex = 0;
LOG((LF_CORDB, LL_INFO100000, "NW:Decode: m_ip 0x%p\n", m_ip));
@@ -117,7 +117,7 @@ void NativeWalker::Decode()
BYTE rex_x = 0;
BYTE rex_r = 0;
- if (rex != NULL)
+ if (rex != 0)
{
rex_b = (rex & 0x1); // high bit to modrm r/m field or SIB base field or OPCODE reg field -- Hmm, when which?
rex_x = (rex & 0x2) >> 1; // high bit to sib index field
@@ -275,7 +275,7 @@ void NativeWalker::Decode()
// the instruction uses r8-r15, add in the extra byte to the displacement
// for the REX prefix which was used to specify the extended register
- if (rex != NULL)
+ if (rex != 0)
{
displace++;
}
diff --git a/src/coreclr/debug/ee/controller.cpp b/src/coreclr/debug/ee/controller.cpp
index 1c689b8eee54..98f532f2e771 100644
--- a/src/coreclr/debug/ee/controller.cpp
+++ b/src/coreclr/debug/ee/controller.cpp
@@ -770,7 +770,7 @@ DebuggerControllerPatch *DebuggerPatchTable::GetNextPatch(DebuggerControllerPatc
#ifdef _DEBUG
void DebuggerPatchTable::CheckPatchTable()
{
- if (NULL != m_pcEntries)
+ if ((TADDR)NULL != m_pcEntries)
{
LOG((LF_CORDB,LL_INFO1000, "DPT:CPT: %u\n", m_iEntries));
DebuggerControllerPatch *dcp;
@@ -793,7 +793,7 @@ int DebuggerPatchTable::GetNumberOfPatches()
{
int total = 0;
- if (NULL != m_pcEntries)
+ if ((TADDR)NULL != m_pcEntries)
{
DebuggerControllerPatch *dcp;
ULONG i = 0;
@@ -2069,7 +2069,7 @@ BOOL DebuggerController::AddBindAndActivatePatchForMethodDesc(MethodDesc *fd,
kind,
fp,
pAppDomain,
- NULL,
+ 0,
dji);
if (DebuggerController::BindPatch(patch, fd, NULL))
@@ -2430,7 +2430,7 @@ bool DebuggerController::MatchPatch(Thread *thread,
// the appdomain switches halfway through a step.
if (patch->pAppDomain != NULL)
{
- AppDomain *pAppDomainCur = thread->GetDomain();
+ AppDomain *pAppDomainCur = AppDomain::GetCurrentDomain();
if (pAppDomainCur != patch->pAppDomain)
{
@@ -2517,7 +2517,7 @@ DebuggerPatchSkip *DebuggerController::ActivatePatchSkip(Thread *thread,
//
// !!! check result
LOG((LF_CORDB,LL_INFO10000, "DC::APS: About to skip from PC=0x%p\n", PC));
- skip = new (interopsafe) DebuggerPatchSkip(thread, patch, thread->GetDomain());
+ skip = new (interopsafe) DebuggerPatchSkip(thread, patch);
TRACE_ALLOC(skip);
}
@@ -2962,7 +2962,7 @@ DPOSS_ACTION DebuggerController::DispatchPatchOrSingleStep(Thread *thread, CONTE
if (!event->m_deleted)
{
#ifdef DEBUGGING_SUPPORTED
- if (thread->GetDomain()->IsDebuggerAttached())
+ if (AppDomain::GetCurrentDomain()->IsDebuggerAttached())
{
if (event->SendEvent(thread, fIpChanged))
{
@@ -4295,9 +4295,8 @@ bool DebuggerController::DispatchNativeException(EXCEPTION_RECORD *pException,
// * -------------------------------------------------------------------------
DebuggerPatchSkip::DebuggerPatchSkip(Thread *thread,
- DebuggerControllerPatch *patch,
- AppDomain *pAppDomain)
- : DebuggerController(thread, pAppDomain),
+ DebuggerControllerPatch *patch)
+ : DebuggerController(thread, AppDomain::GetCurrentDomain()),
m_address(patch->address)
{
LOG((LF_CORDB, LL_INFO10000,
@@ -4656,17 +4655,6 @@ TP_RESULT DebuggerPatchSkip::TriggerExceptionHook(Thread *thread, CONTEXT * cont
}
CONTRACTL_END;
- if (m_pAppDomain != NULL)
- {
- AppDomain *pAppDomainCur = thread->GetDomain();
-
- if (pAppDomainCur != m_pAppDomain)
- {
- LOG((LF_CORDB,LL_INFO10000, "DPS::TEH: Appdomain mismatch - not skiiping!\n"));
- return TPR_IGNORE;
- }
- }
-
LOG((LF_CORDB,LL_INFO10000, "DPS::TEH: doing the patch-skip thing\n"));
#if defined(TARGET_ARM64) && !defined(FEATURE_EMULATE_SINGLESTEP)
@@ -4797,18 +4785,6 @@ bool DebuggerPatchSkip::TriggerSingleStep(Thread *thread, const BYTE *ip)
{
LOG((LF_CORDB,LL_INFO10000, "DPS::TSS: basically a no-op\n"));
- if (m_pAppDomain != NULL)
- {
- AppDomain *pAppDomainCur = thread->GetDomain();
-
- if (pAppDomainCur != m_pAppDomain)
- {
- LOG((LF_CORDB,LL_INFO10000, "DPS::TSS: Appdomain mismatch - "
- "not SingSteping!!\n"));
- return false;
- }
- }
-
#if defined(TARGET_AMD64)
// Dev11 91932: for RIP-relative writes we need to copy the value that was written in our buffer to the actual address
_ASSERTE(m_pSharedPatchBypassBuffer);
@@ -6082,6 +6058,8 @@ bool DebuggerStepper::TrapStep(ControllerStackInfo *info, bool in)
}
}
LOG((LF_CORDB,LL_INFO1000,"Ending TrapStep\n"));
+
+ return false;
}
bool DebuggerStepper::IsAddrWithinFrame(DebuggerJitInfo *dji,
@@ -7110,7 +7088,7 @@ TP_RESULT DebuggerStepper::TriggerPatch(DebuggerControllerPatch *patch,
dji = g_pDebugger->GetJitInfoFromAddr((TADDR) traceManagerRetAddr);
MethodDesc* mdNative = NULL;
- PCODE pcodeNative = NULL;
+ PCODE pcodeNative = (PCODE)NULL;
if (dji != NULL)
{
mdNative = dji->m_nativeCodeVersion.GetMethodDesc();
@@ -8259,7 +8237,7 @@ void DebuggerThreadStarter::TriggerTraceCall(Thread *thread, const BYTE *ip)
{
LOG((LF_CORDB, LL_EVERYTHING, "DTS::TTC called\n"));
#ifdef DEBUGGING_SUPPORTED
- if (thread->GetDomain()->IsDebuggerAttached())
+ if (AppDomain::GetCurrentDomain()->IsDebuggerAttached())
{
TraceDestination trace;
diff --git a/src/coreclr/debug/ee/controller.h b/src/coreclr/debug/ee/controller.h
index b838e11c0f85..23f6c5125e16 100644
--- a/src/coreclr/debug/ee/controller.h
+++ b/src/coreclr/debug/ee/controller.h
@@ -1453,8 +1453,7 @@ class DebuggerPatchSkip : public DebuggerController
friend class DebuggerController;
DebuggerPatchSkip(Thread *thread,
- DebuggerControllerPatch *patch,
- AppDomain *pAppDomain);
+ DebuggerControllerPatch *patch);
~DebuggerPatchSkip();
diff --git a/src/coreclr/debug/ee/debugger.cpp b/src/coreclr/debug/ee/debugger.cpp
index 79aa2d5f13fc..1d15dd957607 100644
--- a/src/coreclr/debug/ee/debugger.cpp
+++ b/src/coreclr/debug/ee/debugger.cpp
@@ -915,6 +915,8 @@ Debugger::Debugger()
m_unrecoverableError(FALSE),
m_ignoreThreadDetach(FALSE),
m_pMethodInfos(NULL),
+ m_pForceCatchHandlerFoundEventsTable(NULL),
+ m_pCustomNotificationTable(NULL),
m_mutex(CrstDebuggerMutex, (CrstFlags)(CRST_UNSAFE_ANYMODE | CRST_REENTRANCY | CRST_DEBUGGER_THREAD)),
#ifdef _DEBUG
m_mutexOwner(0),
@@ -956,10 +958,8 @@ Debugger::Debugger()
m_processId = GetCurrentProcessId();
- // Initialize these in ctor because we free them in dtor.
- // And we can't set them to some safe uninited value (like NULL).
-
-
+ m_pForceCatchHandlerFoundEventsTable = new ForceCatchHandlerFoundTable();
+ m_pCustomNotificationTable = new CustomNotificationTable();
//------------------------------------------------------------------------------
// Metadata data structure version numbers
@@ -971,7 +971,7 @@ Debugger::Debugger()
m_mdDataStructureVersion = 1;
m_fOutOfProcessSetContextEnabled =
#if defined(OUT_OF_PROCESS_SETTHREADCONTEXT) && !defined(DACCESS_COMPILE)
- Thread::AreCetShadowStacksEnabled() || CLRConfig::GetConfigValue(CLRConfig::EXTERNAL_OutOfProcessSetContext) != 0;
+ Thread::AreShadowStacksEnabled() || CLRConfig::GetConfigValue(CLRConfig::EXTERNAL_OutOfProcessSetContext) != 0;
#else
FALSE;
#endif
@@ -1353,7 +1353,7 @@ DebuggerEval::DebuggerEval(CONTEXT * pContext, DebuggerIPCE_FuncEvalInfo * pEval
m_debuggerModule = g_pDebugger->LookupOrCreateModule(pEvalInfo->vmDomainAssembly);
m_funcEvalKey = pEvalInfo->funcEvalKey;
m_argCount = pEvalInfo->argCount;
- m_targetCodeAddr = NULL;
+ m_targetCodeAddr = (TADDR)NULL;
m_stringSize = pEvalInfo->stringSize;
m_arrayRank = pEvalInfo->arrayRank;
m_genericArgsCount = pEvalInfo->genericArgsCount;
@@ -2238,7 +2238,7 @@ DebuggerLazyInit::DebuggerLazyInit() :
m_exAttachEvent(NULL),
m_exUnmanagedAttachEvent(NULL),
m_garbageCollectionBlockerEvent(NULL),
- m_DebuggerHandlingCtrlC(NULL)
+ m_DebuggerHandlingCtrlC(FALSE)
{
}
@@ -2724,7 +2724,7 @@ DebuggerJitInfo *Debugger::GetJitInfoWorker(MethodDesc *fd, const BYTE *pbAddr,
else
{
PCODE startAddr = g_pEEInterface->GetNativeCodeStartAddress((PCODE)pbAddr);
- if (startAddr == NULL)
+ if (startAddr == (PCODE)NULL)
{
LOG((LF_CORDB,LL_INFO1000,"D::GJIW: Couldn't find a DJI by address 0x%p, "
"so it might be a stub or thunk\n", pbAddr));
@@ -2748,7 +2748,7 @@ DebuggerJitInfo *Debugger::GetJitInfoWorker(MethodDesc *fd, const BYTE *pbAddr,
#endif // LOGGING
}
- if (startAddr != NULL)
+ if (startAddr != (PCODE)NULL)
{
dji = dmi->FindOrCreateInitAndAddJitInfo(fd, startAddr);
}
@@ -3488,7 +3488,7 @@ HRESULT Debugger::SetIP( bool fCanSetIPOnly, Thread *thread,Module *module,
BOOL exact;
SIZE_T offsetNatTo;
- PCODE pbDest = NULL;
+ PCODE pbDest = (PCODE)NULL;
BYTE *pbBase = NULL;
CONTEXT *pCtx = NULL;
DWORD dwSize = 0;
@@ -5828,7 +5828,7 @@ void Debugger::SuspendForGarbageCollectionCompleted()
InitIPCEvent(ipce1,
DB_IPCE_BEFORE_GARBAGE_COLLECTION,
pThread,
- pThread->GetDomain());
+ AppDomain::GetCurrentDomain());
m_pRCThread->SendIPCEvent();
this->SuspendComplete(true);
@@ -5866,7 +5866,7 @@ void Debugger::ResumeForGarbageCollectionStarted()
InitIPCEvent(ipce1,
DB_IPCE_AFTER_GARBAGE_COLLECTION,
pThread,
- pThread->GetDomain());
+ AppDomain::GetCurrentDomain());
m_pRCThread->SendIPCEvent();
this->SuspendComplete(true);
@@ -5916,7 +5916,7 @@ void Debugger::SendDataBreakpoint(Thread *thread, CONTEXT *context,
InitIPCEvent(ipce,
DB_IPCE_DATA_BREAKPOINT,
thread,
- thread->GetDomain());
+ AppDomain::GetCurrentDomain());
//_ASSERTE(breakpoint->m_pAppDomain == ipce->vmAppDomain.GetRawPtr());
m_pRCThread->SendIPCEvent();
@@ -5963,7 +5963,7 @@ void Debugger::SendBreakpoint(Thread *thread, CONTEXT *context,
InitIPCEvent(ipce,
DB_IPCE_BREAKPOINT,
thread,
- thread->GetDomain());
+ AppDomain::GetCurrentDomain());
ipce->BreakpointData.breakpointToken.Set(breakpoint);
_ASSERTE( breakpoint->m_pAppDomain == ipce->vmAppDomain.GetRawPtr());
@@ -6036,7 +6036,7 @@ void Debugger::SendRawUserBreakpoint(Thread * pThread)
InitIPCEvent(pEvent,
DB_IPCE_USER_BREAKPOINT,
pThread,
- pThread->GetDomain());
+ AppDomain::GetCurrentDomain());
m_pRCThread->SendIPCEvent();
}
@@ -6068,7 +6068,7 @@ void Debugger::SendInterceptExceptionComplete(Thread *thread)
InitIPCEvent(ipce,
DB_IPCE_INTERCEPT_EXCEPTION_COMPLETE,
thread,
- thread->GetDomain());
+ AppDomain::GetCurrentDomain());
m_pRCThread->SendIPCEvent();
}
@@ -6107,7 +6107,7 @@ void Debugger::SendStep(Thread *thread, CONTEXT *context,
InitIPCEvent(ipce,
DB_IPCE_STEP_COMPLETE,
thread,
- thread->GetDomain());
+ AppDomain::GetCurrentDomain());
ipce->StepData.stepperToken.Set(stepper);
ipce->StepData.reason = reason;
m_pRCThread->SendIPCEvent();
@@ -6148,7 +6148,7 @@ void Debugger::LockAndSendEnCRemapEvent(DebuggerJitInfo * dji, SIZE_T currentIP,
InitIPCEvent(ipce,
DB_IPCE_ENC_REMAP,
thread,
- thread->GetDomain());
+ AppDomain::GetCurrentDomain());
ipce->EnCRemap.currentVersionNumber = dji->m_encVersion;
ipce->EnCRemap.resumeVersionNumber = dji->m_methodInfo->GetCurrentEnCVersion();;
@@ -6161,7 +6161,7 @@ void Debugger::LockAndSendEnCRemapEvent(DebuggerJitInfo * dji, SIZE_T currentIP,
Module *pRuntimeModule = pMD->GetModule();
- DebuggerModule * pDModule = LookupOrCreateModule(pRuntimeModule, thread->GetDomain());
+ DebuggerModule * pDModule = LookupOrCreateModule(pRuntimeModule, AppDomain::GetCurrentDomain());
ipce->EnCRemap.vmDomainAssembly.SetRawPtr((pDModule ? pDModule->GetDomainAssembly() : NULL));
LOG((LF_CORDB, LL_INFO10000, "D::LASEnCRE: %s::%s dmod:%p\n",
@@ -6200,13 +6200,13 @@ void Debugger::LockAndSendEnCRemapCompleteEvent(MethodDesc *pMD)
InitIPCEvent(ipce,
DB_IPCE_ENC_REMAP_COMPLETE,
thread,
- thread->GetDomain());
+ AppDomain::GetCurrentDomain());
ipce->EnCRemapComplete.funcMetadataToken = pMD->GetMemberDef();
Module *pRuntimeModule = pMD->GetModule();
- DebuggerModule * pDModule = LookupOrCreateModule(pRuntimeModule, thread->GetDomain());
+ DebuggerModule * pDModule = LookupOrCreateModule(pRuntimeModule, AppDomain::GetCurrentDomain());
ipce->EnCRemapComplete.vmDomainAssembly.SetRawPtr((pDModule ? pDModule->GetDomainAssembly() : NULL));
LOG((LF_CORDB, LL_INFO10000, "D::LASEnCRE: %s::%s dmod:%p, methodDef:0x%08x \n",
@@ -6321,7 +6321,7 @@ void Debugger::LockAndSendBreakpointSetError(PATCH_UNORDERED_ARRAY * listUnbinda
i+1, count, controller, controller->GetDCType()));
// Send a breakpoint set error event to the Right Side.
- InitIPCEvent(ipce, DB_IPCE_BREAKPOINT_SET_ERROR, thread, thread->GetDomain());
+ InitIPCEvent(ipce, DB_IPCE_BREAKPOINT_SET_ERROR, thread, AppDomain::GetCurrentDomain());
ipce->BreakpointSetErrorData.breakpointToken.Set(static_cast (controller));
@@ -7294,7 +7294,7 @@ HRESULT Debugger::SendExceptionHelperAndBlock(
//
// Send pre-Whidbey EXCEPTION IPC event.
//
- InitIPCEvent(ipce, DB_IPCE_EXCEPTION, pThread, pThread->GetDomain());
+ InitIPCEvent(ipce, DB_IPCE_EXCEPTION, pThread, AppDomain::GetCurrentDomain());
ipce->Exception.vmExceptionHandle.SetRawPtr(exceptionHandle);
ipce->Exception.firstChance = (eventType == DEBUG_EXCEPTION_FIRST_CHANCE);
@@ -7306,7 +7306,7 @@ HRESULT Debugger::SendExceptionHelperAndBlock(
//
// Send Whidbey EXCEPTION IPC event.
//
- InitIPCEvent(ipce, DB_IPCE_EXCEPTION_CALLBACK2, pThread, pThread->GetDomain());
+ InitIPCEvent(ipce, DB_IPCE_EXCEPTION_CALLBACK2, pThread, AppDomain::GetCurrentDomain());
ipce->ExceptionCallback2.framePointer = framePointer;
ipce->ExceptionCallback2.eventType = eventType;
@@ -7448,8 +7448,8 @@ void Debugger::SendExceptionEventsWorker(
g_pDebugger->IncThreadsAtUnsafePlaces();
}
} // end of GCX_CCOP_EEINTERFACE();
- } //end if (m_sendExceptionsOutsideOfJMC && !SentDebugFirstChance())
+ } //end if (m_sendExceptionsOutsideOfJMC && !SentDebugFirstChance())
//
// If this is a JMC function, then we send a USER's first chance as well.
//
@@ -7459,7 +7459,7 @@ void Debugger::SendExceptionEventsWorker(
{
SENDIPCEVENT_BEGIN(this, pThread);
- InitIPCEvent(ipce, DB_IPCE_EXCEPTION_CALLBACK2, pThread, pThread->GetDomain());
+ InitIPCEvent(ipce, DB_IPCE_EXCEPTION_CALLBACK2, pThread, AppDomain::GetCurrentDomain());
ipce->ExceptionCallback2.framePointer = framePointer;
ipce->ExceptionCallback2.eventType = DEBUG_EXCEPTION_USER_FIRST_CHANCE;
@@ -7846,11 +7846,14 @@ void Debugger::FirstChanceManagedExceptionCatcherFound(Thread *pThread,
}
}
+ BOOL forceSendCatchHandlerFound = FALSE;
+ {
+ GCX_COOP_EEINTERFACE();
+ forceSendCatchHandlerFound = ShouldSendCatchHandlerFound(pThread);
+ }
// Here we check if debugger opted-out of receiving exception related events from outside of JMC methods
// or this exception ever crossed JMC frame (in this case we have already sent user first chance event)
- if (m_sendExceptionsOutsideOfJMC ||
- isInJMCFunction ||
- pThread->GetExceptionState()->GetFlags()->SentDebugUserFirstChance())
+ if (isInJMCFunction || forceSendCatchHandlerFound)
{
if (pDebugJitInfo != NULL)
{
@@ -7979,9 +7982,15 @@ LONG Debugger::NotifyOfCHFFilter(EXCEPTION_POINTERS* pExceptionPointers, PVOID p
pExceptionPointers);
}
+ BOOL forceSendCatchHandlerFound = FALSE;
+ {
+ GCX_COOP_EEINTERFACE();
+ forceSendCatchHandlerFound = ShouldSendCatchHandlerFound(pThread);
+ }
+
// Here we check if debugger opted-out of receiving exception related events from outside of JMC methods
// or this exception ever crossed JMC frame (in this case we have already sent user first chance event)
- if (m_sendExceptionsOutsideOfJMC || pExState->GetFlags()->SentDebugUserFirstChance())
+ if (forceSendCatchHandlerFound)
{
SendCatchHandlerFound(pThread, fp, offset, dwFlags);
}
@@ -8008,6 +8017,48 @@ LONG Debugger::NotifyOfCHFFilter(EXCEPTION_POINTERS* pExceptionPointers, PVOID p
return EXCEPTION_CONTINUE_SEARCH;
}
+BOOL Debugger::ShouldSendCatchHandlerFound(Thread* pThread)
+{
+ CONTRACTL
+ {
+ THROWS;
+ GC_NOTRIGGER;
+ MODE_COOPERATIVE;
+ }
+ CONTRACTL_END;
+
+ ThreadExceptionState* pExState = pThread->GetExceptionState();
+ if (m_sendExceptionsOutsideOfJMC || pExState->GetFlags()->SentDebugUserFirstChance())
+ {
+ return TRUE;
+ }
+ else
+ {
+ BOOL forceSendCatchHandlerFound = FALSE;
+ OBJECTHANDLE objHandle = pThread->GetThrowableAsHandle();
+ OBJECTHANDLE retrievedHandle = m_pForceCatchHandlerFoundEventsTable->Lookup(objHandle); //destroy handle
+ if (retrievedHandle != NULL)
+ {
+ forceSendCatchHandlerFound = TRUE;
+ }
+ return forceSendCatchHandlerFound;
+ }
+}
+
+BOOL Debugger::ShouldSendCustomNotification(DomainAssembly *pAssembly, mdTypeDef typeDef)
+{
+ CONTRACTL
+ {
+ THROWS;
+ GC_NOTRIGGER;
+ MODE_ANY;
+ }
+ CONTRACTL_END;
+
+ Module *pModule = pAssembly->GetModule();
+ TypeInModule tim(pModule, typeDef);
+ return !(m_pCustomNotificationTable->Lookup(tim).IsNull());
+}
// Actually send the catch handler found event.
// This can be used to send CHF for both regular managed catchers as well
@@ -8068,7 +8119,7 @@ void Debugger::SendCatchHandlerFound(
//
// Send Whidbey EXCEPTION IPC event.
//
- InitIPCEvent(ipce, DB_IPCE_EXCEPTION_CALLBACK2, pThread, pThread->GetDomain());
+ InitIPCEvent(ipce, DB_IPCE_EXCEPTION_CALLBACK2, pThread, AppDomain::GetCurrentDomain());
ipce->ExceptionCallback2.framePointer = fp;
ipce->ExceptionCallback2.eventType = DEBUG_EXCEPTION_CATCH_HANDLER_FOUND;
@@ -8171,7 +8222,7 @@ void Debugger::ManagedExceptionUnwindBegin(Thread *pThread)
//
// Send Whidbey EXCEPTION IPC event.
//
- InitIPCEvent(ipce, DB_IPCE_EXCEPTION_UNWIND, pThread, pThread->GetDomain());
+ InitIPCEvent(ipce, DB_IPCE_EXCEPTION_UNWIND, pThread, AppDomain::GetCurrentDomain());
ipce->ExceptionUnwind.eventType = DEBUG_EXCEPTION_UNWIND_BEGIN;
ipce->ExceptionUnwind.dwFlags = 0;
@@ -8546,8 +8597,8 @@ LONG Debugger::LastChanceManagedException(EXCEPTION_POINTERS * pExceptionInfo,
// attach stuff out here and not bother with the flag.
hr = SendException(thread,
FALSE,
- ((pContext != NULL) ? (SIZE_T)GetIP(pContext) : NULL),
- ((pContext != NULL) ? (SIZE_T)GetSP(pContext) : NULL),
+ ((pContext != NULL) ? (SIZE_T)GetIP(pContext) : 0),
+ ((pContext != NULL) ? (SIZE_T)GetSP(pContext) : 0),
continuable,
!!jitAttachRequested, // If we are JIT attaching on an unhandled exceptioin, we force
!!jitAttachRequested, // the exception to be uninterceptable.
@@ -8952,7 +9003,7 @@ void Debugger::ThreadStarted(Thread* pRuntimeThread)
return;
LOG((LF_CORDB, LL_INFO100, "D::TS: thread attach : ID=%#x AD:%#x\n",
- GetThreadIdHelper(pRuntimeThread), pRuntimeThread->GetDomain()));
+ GetThreadIdHelper(pRuntimeThread), AppDomain::GetCurrentDomain()));
// We just need to send a VMPTR_Thread. The RS will get everything else it needs from DAC.
//
@@ -8966,7 +9017,7 @@ void Debugger::ThreadStarted(Thread* pRuntimeThread)
InitIPCEvent(ipce,
DB_IPCE_THREAD_ATTACH,
pRuntimeThread,
- pRuntimeThread->GetDomain());
+ AppDomain::GetCurrentDomain());
m_pRCThread->SendIPCEvent();
@@ -9019,7 +9070,7 @@ void Debugger::DetachThread(Thread *pRuntimeThread)
LOG((LF_CORDB, LL_INFO100, "D::DT: thread detach : ID=%#x AD:%#x.\n",
- GetThreadIdHelper(pRuntimeThread), pRuntimeThread->GetDomain()));
+ GetThreadIdHelper(pRuntimeThread), AppDomain::GetCurrentDomain()));
// We may be killing a thread before the Thread-starter fired.
@@ -9040,7 +9091,7 @@ void Debugger::DetachThread(Thread *pRuntimeThread)
InitIPCEvent(pEvent,
DB_IPCE_THREAD_DETACH,
pRuntimeThread,
- pRuntimeThread->GetDomain());
+ AppDomain::GetCurrentDomain());
m_pRCThread->SendIPCEvent();
@@ -10015,7 +10066,7 @@ void Debugger::FuncEvalComplete(Thread* pThread, DebuggerEval *pDE)
// We can't easily convert our ADID to an AppDomain* (SystemDomain::GetAppDomainFromId)
// because we can't prove that the AppDomain* would be valid (not unloaded).
//
- AppDomain *pDomain = pThread->GetDomain();
+ AppDomain *pDomain = AppDomain::GetCurrentDomain();
AppDomain *pResultDomain = ((pDE->m_debuggerModule == NULL) ? pDomain : pDE->m_debuggerModule->GetAppDomain());
// Send a func eval complete event to the Right Side.
@@ -10427,6 +10478,47 @@ bool Debugger::HandleIPCEvent(DebuggerIPCEvent * pEvent)
}
break;
+ case DB_IPCE_FORCE_CATCH_HANDLER_FOUND:
+ {
+ BOOL enableEvents = pEvent->ForceCatchHandlerFoundData.enableEvents;
+ AppDomain *pAppDomain = pEvent->vmAppDomain.GetRawPtr();
+ OBJECTREF exObj = ObjectToOBJECTREF(pEvent->ForceCatchHandlerFoundData.vmObj.GetRawPtr());
+ HRESULT hr = E_INVALIDARG;
+
+ hr = UpdateForceCatchHandlerFoundTable(enableEvents, exObj, pAppDomain);
+
+ DebuggerIPCEvent * pIPCResult = m_pRCThread->GetIPCEventReceiveBuffer();
+ InitIPCEvent(pIPCResult,
+ DB_IPCE_CATCH_HANDLER_FOUND_RESULT,
+ g_pEEInterface->GetThread(),
+ pEvent->vmAppDomain);
+
+ pIPCResult->hr = hr;
+
+ m_pRCThread->SendIPCReply();
+ }
+ break;
+
+ case DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION:
+ {
+ Module * pModule = pEvent->CustomNotificationData.vmModule.GetRawPtr();
+ mdTypeDef classToken = pEvent->CustomNotificationData.classMetadataToken;
+ BOOL enabled = pEvent->CustomNotificationData.Enabled;
+
+ HRESULT hr = UpdateCustomNotificationTable(pModule, classToken, enabled);
+
+ DebuggerIPCEvent * pIPCResult = m_pRCThread->GetIPCEventReceiveBuffer();
+ InitIPCEvent(pIPCResult,
+ DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION_RESULT,
+ g_pEEInterface->GetThread(),
+ pEvent->vmAppDomain);
+
+ pIPCResult->hr = hr;
+
+ m_pRCThread->SendIPCReply();
+ }
+ break;
+
case DB_IPCE_BREAKPOINT_ADD:
{
@@ -10953,7 +11045,7 @@ bool Debugger::HandleIPCEvent(DebuggerIPCEvent * pEvent)
Thread * pThread = pEvent->FuncEval.vmThreadToken.GetRawPtr();
- InitIPCEvent(pEvent, DB_IPCE_FUNC_EVAL_SETUP_RESULT, pThread, pThread->GetDomain());
+ InitIPCEvent(pEvent, DB_IPCE_FUNC_EVAL_SETUP_RESULT, pThread, AppDomain::GetCurrentDomain());
BYTE * pbArgDataArea = NULL;
DebuggerEval * pDebuggerEvalKey = NULL;
@@ -12221,13 +12313,14 @@ HRESULT Debugger::DeoptimizeMethodHelper(Module* pModule, mdMethodDef methodDef)
ILCodeVersion ilCodeVersion;
CodeVersionManager *pCodeVersionManager = pModule->GetCodeVersionManager();
+ LOG((LF_TIEREDCOMPILATION, LL_INFO100, "Debugger::DeoptimizeMethodHelper Module=%p Method=0x%08x\n",
+ pModule, methodDef));
+
{
CodeVersionManager::LockHolder codeVersioningLockHolder;
if (FAILED(hr = pCodeVersionManager->AddILCodeVersion(pModule, methodDef, &ilCodeVersion, TRUE)))
{
- LOG((LF_TIEREDCOMPILATION, LL_INFO100, "TieredCompilationManager::DeOptimizeMethodHelper Module=0x%x Method=0x%x, AddILCodeVersion returned hr 0x%x\n",
- pModule, methodDef,
- hr));
+ LOG((LF_TIEREDCOMPILATION, LL_INFO100, "Debugger::DeoptimizeMethodHelper AddILCodeVersion returned hr 0x%x\n", hr));
return hr;
}
@@ -12243,8 +12336,7 @@ HRESULT Debugger::DeoptimizeMethodHelper(Module* pModule, mdMethodDef methodDef)
{
if (FAILED(hr = pCodeVersionManager->SetActiveILCodeVersions(&ilCodeVersion, 1, NULL)))
{
- LOG((LF_TIEREDCOMPILATION, LL_INFO100, "TieredCompilationManager::DeOptimizeMethodHelper Module=0x%x Method=0x%x, SetActiveILCodeVersions returned hr 0x%x\n",
- pModule, methodDef,
+ LOG((LF_TIEREDCOMPILATION, LL_INFO100, "Debugger::DeoptimizeMethodHelper SetActiveILCodeVersions returned hr 0x%x\n",
hr));
return hr;
}
@@ -12266,7 +12358,7 @@ HRESULT Debugger::DeoptimizeMethod(Module* pModule, mdMethodDef methodDef)
HRESULT hr = DeoptimizeMethodHelper(pModule, methodDef);
if (FAILED(hr))
{
- LOG((LF_TIEREDCOMPILATION, LL_INFO100, "TieredCompilationManager::DeOptimizeMethod Module=0x%x Method=0x%x,, initial ReJIT returned hr 0x%x, aborting\n",
+ LOG((LF_TIEREDCOMPILATION, LL_INFO100, "Debugger::DeoptimizeMethod Module=%p Method=0x%08x, initial ReJIT returned hr 0x%x, aborting\n",
pModule, methodDef, hr));
return hr;
}
@@ -12350,6 +12442,73 @@ HRESULT Debugger::IsMethodDeoptimized(Module *pModule, mdMethodDef methodDef, BO
return S_OK;
}
+HRESULT Debugger::UpdateCustomNotificationTable(Module *pModule, mdTypeDef classToken, BOOL enabled)
+{
+ CONTRACTL
+ {
+ THROWS;
+ CAN_TAKE_LOCK;
+ GC_NOTRIGGER;
+ }
+ CONTRACTL_END;
+
+ TypeInModule tim(pModule, classToken);
+ if (enabled)
+ {
+ if (m_pCustomNotificationTable->Lookup(tim).IsNull())
+ {
+ m_pCustomNotificationTable->Add(tim);
+ }
+ }
+ else
+ {
+ if (!(m_pCustomNotificationTable->Lookup(tim).IsNull()))
+ {
+ m_pCustomNotificationTable->Remove(tim);
+ }
+ }
+
+ return S_OK;
+}
+
+HRESULT Debugger::UpdateForceCatchHandlerFoundTable(BOOL enableEvents, OBJECTREF exObj, AppDomain *pAppDomain)
+{
+ CONTRACTL
+ {
+ THROWS;
+ CAN_TAKE_LOCK;
+ GC_NOTRIGGER;
+ }
+ CONTRACTL_END;
+
+ OBJECTHANDLE objHandle = pAppDomain->CreateLongWeakHandle(exObj);
+ if (objHandle == NULL)
+ {
+ return E_INVALIDARG;
+ }
+ if (enableEvents)
+ {
+ OBJECTHANDLE objHandleFound = m_pForceCatchHandlerFoundEventsTable->Lookup(objHandle);
+ if (objHandleFound == NULL)
+ {
+ m_pForceCatchHandlerFoundEventsTable->Add(objHandle);
+ }
+ else
+ {
+ DestroyLongWeakHandle(objHandle);
+ }
+ }
+ else
+ {
+ if (m_pForceCatchHandlerFoundEventsTable->Lookup(objHandle) != NULL)
+ {
+ m_pForceCatchHandlerFoundEventsTable->Remove(objHandle);
+ }
+ DestroyLongWeakHandle(objHandle);
+ }
+ return S_OK;
+}
+
//
// UnrecoverableError causes the Left Side to enter a state where no more
// debugging can occur and we leave around enough information for the
@@ -13984,7 +14143,7 @@ bool Debugger::GetILOffsetFromNative (MethodDesc *pFunc, const BYTE *pbAddr,
}
PCODE methodStartAddress = g_pEEInterface->GetNativeCodeStartAddress((PCODE)pbAddr);
- if (methodStartAddress == NULL)
+ if (methodStartAddress == (PCODE)NULL)
{
return false;
}
@@ -14143,7 +14302,7 @@ void Debugger::SendRawMDANotification(
DebuggerIPCEvent* ipce = m_pRCThread->GetIPCEventSendBuffer();
Thread * pThread = params->m_pThread;
- AppDomain *pAppDomain = (pThread != NULL) ? pThread->GetDomain() : NULL;
+ AppDomain *pAppDomain = (pThread != NULL) ? AppDomain::GetCurrentDomain() : NULL;
InitIPCEvent(ipce,
DB_IPCE_MDA_NOTIFICATION,
@@ -14324,7 +14483,7 @@ void Debugger::SendLogMessage(int iLevel,
// Send the message only if the debugger is attached to this appdomain.
// Note the debugger may detach at any time, so we'll have to check
// this again after we get the lock.
- AppDomain *pAppDomain = g_pEEInterface->GetThread()->GetDomain();
+ AppDomain *pAppDomain = AppDomain::GetCurrentDomain();
if (!CORDebuggerAttached())
{
@@ -14430,7 +14589,7 @@ void Debugger::SendLogSwitchSetting(int iLevel,
InitIPCEvent(ipce,
DB_IPCE_LOGSWITCH_SET_MESSAGE,
pThread,
- pThread->GetDomain());
+ AppDomain::GetCurrentDomain());
ipce->LogSwitchSettingMessage.iLevel = iLevel;
ipce->LogSwitchSettingMessage.iReason = iReason;
@@ -14487,13 +14646,13 @@ void Debugger::SendCustomDebuggerNotification(Thread * pThread,
Thread *curThread = g_pEEInterface->GetThread();
SENDIPCEVENT_BEGIN(this, curThread);
- if (CORDebuggerAttached())
+ if (CORDebuggerAttached() && ShouldSendCustomNotification(pDomain, classToken))
{
DebuggerIPCEvent* ipce = m_pRCThread->GetIPCEventSendBuffer();
InitIPCEvent(ipce,
DB_IPCE_CUSTOM_NOTIFICATION,
curThread,
- curThread->GetDomain());
+ AppDomain::GetCurrentDomain());
VMPTR_DomainAssembly vmDomainAssembly = VMPTR_DomainAssembly::MakePtr(pDomain);
@@ -15615,8 +15774,7 @@ HRESULT Debugger::NameChangeEvent(AppDomain *pAppDomain, Thread *pThread)
InitIPCEvent(ipce,
DB_IPCE_NAME_CHANGE,
curThread,
- curThread->GetDomain());
-
+ AppDomain::GetCurrentDomain());
if (pAppDomain)
{
diff --git a/src/coreclr/debug/ee/debugger.h b/src/coreclr/debug/ee/debugger.h
index 2b8573e31b36..24caa135f0e7 100644
--- a/src/coreclr/debug/ee/debugger.h
+++ b/src/coreclr/debug/ee/debugger.h
@@ -535,6 +535,143 @@ struct DebuggerPendingFuncEval
typedef DPTR(struct DebuggerPendingFuncEval) PTR_DebuggerPendingFuncEval;
+/* ------------------------------------------------------------------------ *
+ * SHash to hold weak object handles of exceptions with ForceCatchHandlerFound equal to true
+ * ------------------------------------------------------------------------ */
+#ifndef DACCESS_COMPILE
+class EMPTY_BASES_DECL ForceCatchHandlerFoundSHashTraits : public DefaultSHashTraits
+{
+ public:
+ typedef OBJECTHANDLE element_t;
+ typedef OBJECTHANDLE key_t;
+ static const bool s_supports_autoremove = true;
+ static const bool s_NoThrow = false;
+ static const bool s_RemovePerEntryCleanupAction = true;
+
+ static BOOL Equals(const OBJECTHANDLE &e, const OBJECTHANDLE &f)
+ {
+ return ObjectFromHandle(e) == ObjectFromHandle(f);
+ }
+ static OBJECTHANDLE GetKey(const OBJECTHANDLE &e)
+ {
+ return e;
+ }
+ static INT32 Hash(const OBJECTHANDLE &e)
+ {
+ return ObjectFromHandle(e)->GetHashCodeEx();
+ }
+ static bool ShouldDelete(const OBJECTHANDLE &e)
+ {
+ return ObjectHandleIsNull(e);
+ }
+ static OBJECTHANDLE Null()
+ {
+ OBJECTHANDLE e = (OBJECTHANDLE)(TADDR)0;
+ return e;
+ }
+ static bool IsNull(const OBJECTHANDLE &e)
+ {
+ return e == (OBJECTHANDLE)(TADDR)0;
+ }
+ static OBJECTHANDLE Deleted()
+ {
+ OBJECTHANDLE e = (OBJECTHANDLE)(TADDR)-1;
+ return e;
+ }
+ static bool IsDeleted(const OBJECTHANDLE &e)
+ {
+ return e == (OBJECTHANDLE)(TADDR)-1;
+ }
+ static void OnRemovePerEntryCleanupAction(const OBJECTHANDLE &e)
+ {
+ DestroyLongWeakHandle(e);
+ }
+};
+typedef SHash ForceCatchHandlerFoundTable;
+
+class TypeInModule
+{
+private:
+ Module *m_module;
+ mdTypeDef m_typeDef;
+
+public:
+
+ bool operator ==(const TypeInModule& other) const
+ {
+ return m_module == other.m_module && m_typeDef == other.m_typeDef;
+ }
+
+ bool operator !=(const TypeInModule& other) const
+ {
+ return !(*this == other);
+ }
+
+ bool IsNull() const
+ {
+ return m_module == NULL && m_typeDef == 0;
+ }
+
+ INT32 Hash() const
+ {
+ return (INT32)((UINT_PTR)m_module ^ m_typeDef);
+ }
+
+ TypeInModule(Module * module, mdTypeDef typeDef)
+ :m_module(module), m_typeDef(typeDef)
+ {
+ LIMITED_METHOD_DAC_CONTRACT;
+ }
+
+ TypeInModule()
+ :m_module(NULL), m_typeDef(0)
+ {
+ LIMITED_METHOD_DAC_CONTRACT;
+ }
+};
+
+class EMPTY_BASES_DECL CustomNotificationSHashTraits : public DefaultSHashTraits
+{
+ public:
+ typedef TypeInModule element_t;
+ typedef TypeInModule key_t;
+ static const bool s_NoThrow = false;
+
+ static BOOL Equals(const TypeInModule &e, const TypeInModule &f)
+ {
+ return e == f;
+ }
+ static TypeInModule GetKey(const TypeInModule &e)
+ {
+ return e;
+ }
+ static INT32 Hash(const TypeInModule &e)
+ {
+ return e.Hash();
+ }
+ static TypeInModule Null()
+ {
+ TypeInModule tim;
+ return tim;
+ }
+ static bool IsNull(const TypeInModule &e)
+ {
+ return e.IsNull();
+ }
+ static TypeInModule Deleted()
+ {
+ TypeInModule tim((Module *)-1, -1);
+ return tim;
+ }
+ static bool IsDeleted(const TypeInModule &e)
+ {
+ TypeInModule tim((Module *)-1, -1);
+ return e == tim;
+ }
+};
+typedef SHash CustomNotificationTable;
+#endif
+
/* ------------------------------------------------------------------------ *
* DebuggerRCThread class -- the Runtime Controller thread.
* ------------------------------------------------------------------------ */
@@ -1237,8 +1374,8 @@ class CodeRegionInfo
{
public:
CodeRegionInfo() :
- m_addrOfHotCode(NULL),
- m_addrOfColdCode(NULL),
+ m_addrOfHotCode((PCODE)NULL),
+ m_addrOfColdCode((PCODE)NULL),
m_sizeOfHotCode(0),
m_sizeOfColdCode(0)
{
@@ -1273,7 +1410,7 @@ class CodeRegionInfo
{
LIMITED_METHOD_CONTRACT;
- if (m_addrOfHotCode != NULL)
+ if (m_addrOfHotCode != (PCODE)NULL)
{
if (offset < m_sizeOfHotCode)
{
@@ -1289,7 +1426,7 @@ class CodeRegionInfo
}
else
{
- return NULL;
+ return (PCODE)NULL;
}
}
@@ -1312,7 +1449,7 @@ class CodeRegionInfo
}
_ASSERTE(!"addressToOffset called with invalid address");
- return NULL;
+ return 0;
}
// Determines whether the address lies within the method
@@ -1917,6 +2054,10 @@ class Debugger : public DebugInterface
Module *classModule,
BOOL fIsLoadEvent);
+ BOOL ShouldSendCatchHandlerFound(Thread* pThread);
+
+ BOOL ShouldSendCustomNotification(DomainAssembly *pAssembly, mdTypeDef typeDef);
+
void SendCatchHandlerFound(Thread *pThread,
FramePointer fp,
SIZE_T nOffset,
@@ -2218,6 +2359,8 @@ class Debugger : public DebugInterface
HRESULT DeoptimizeMethod(Module* pModule, mdMethodDef methodDef);
#endif //DACCESS_COMPILE
HRESULT IsMethodDeoptimized(Module *pModule, mdMethodDef methodDef, BOOL *pResult);
+ HRESULT UpdateForceCatchHandlerFoundTable(BOOL enableEvents, OBJECTREF exObj, AppDomain *pAppDomain);
+ HRESULT UpdateCustomNotificationTable(Module *pModule, mdTypeDef classToken, BOOL enabled);
//
// The debugger mutex is used to protect any "global" Left Side
@@ -2710,10 +2853,9 @@ class Debugger : public DebugInterface
Thread *pThread = g_pEEInterface->GetThread();
AppDomain *pAppDomain = NULL;
-
if (pThread)
{
- pAppDomain = pThread->GetDomain();
+ pAppDomain = AppDomain::GetCurrentDomain();
}
InitIPCEvent(ipce,
@@ -2806,6 +2948,13 @@ class Debugger : public DebugInterface
BOOL m_unrecoverableError;
BOOL m_ignoreThreadDetach;
PTR_DebuggerMethodInfoTable m_pMethodInfos;
+ #ifdef DACCESS_COMPILE
+ VOID *m_pForceCatchHandlerFoundEventsTable;
+ VOID *m_pCustomNotificationTable;
+ #else
+ ForceCatchHandlerFoundTable *m_pForceCatchHandlerFoundEventsTable;
+ CustomNotificationTable *m_pCustomNotificationTable;
+ #endif
// This is the main debugger lock. It is a large lock and used to synchronize complex operations
@@ -3550,7 +3699,7 @@ inline void * __cdecl operator new[](size_t n, const InteropSafe&)
return result;
}
-inline void * __cdecl operator new(size_t n, const InteropSafe&, const NoThrow&) throw()
+inline void * __cdecl operator new(size_t n, const InteropSafe&, const std::nothrow_t&) noexcept
{
CONTRACTL
{
@@ -3569,7 +3718,7 @@ inline void * __cdecl operator new(size_t n, const InteropSafe&, const NoThrow&)
return result;
}
-inline void * __cdecl operator new[](size_t n, const InteropSafe&, const NoThrow&) throw()
+inline void * __cdecl operator new[](size_t n, const InteropSafe&, const std::nothrow_t&) noexcept
{
CONTRACTL
{
@@ -3744,7 +3893,7 @@ HANDLE OpenWin32EventOrThrow(
// debugger may not be expecting it. Instead, just leave the lock and retry.
// When we leave, we'll enter coop mode first and get suspended if a suspension is in progress.
// Afterwards, we'll transition back into preemptive mode, and we'll block because this thread
-// has been suspended by the debugger (see code:Thread::RareEnablePreemptiveGC).
+// has been suspended by the debugger (see code:Thread::RareDisablePreemptiveGC).
#define SENDIPCEVENT_BEGIN_EX(pDebugger, thread, gcxStmt) \
{ \
FireEtwDebugIPCEventStart(); \
diff --git a/src/coreclr/debug/ee/debugger.inl b/src/coreclr/debug/ee/debugger.inl
index 8b7a973f48ef..4a8ea12740f7 100644
--- a/src/coreclr/debug/ee/debugger.inl
+++ b/src/coreclr/debug/ee/debugger.inl
@@ -202,7 +202,7 @@ inline TADDR FuncEvalFrame::GetReturnAddressPtr()
if (GetDebuggerEval()->m_evalDuringException)
{
- return NULL;
+ return (TADDR)NULL;
}
else
{
diff --git a/src/coreclr/debug/ee/frameinfo.cpp b/src/coreclr/debug/ee/frameinfo.cpp
index 9193f90b6dc3..d7f9604b6ad7 100644
--- a/src/coreclr/debug/ee/frameinfo.cpp
+++ b/src/coreclr/debug/ee/frameinfo.cpp
@@ -760,7 +760,7 @@ void FrameInfo::InitFromStubHelper(
this->internal = false;
this->managed = true;
this->relOffset = 0;
- this->ambientSP = NULL;
+ this->ambientSP = (TADDR)NULL;
// Method associated w/a stub will never have a JitManager.
@@ -1019,7 +1019,7 @@ StackWalkAction TrackUMChain(CrawlFrame *pCF, DebuggerFrameData *d)
// If we have a valid reg-display (non-null IP) then update it.
// We may have an invalid reg-display if we have an exit frame on an inactive thread.
REGDISPLAY * pNewRD = pCF->GetRegisterSet();
- if (GetControlPC(pNewRD) != NULL)
+ if (GetControlPC(pNewRD) != (PCODE)NULL)
{
LOG((LF_CORDB, LL_EVERYTHING, "DWSP. updating RD while tracking UM chain\n"));
CopyREGDISPLAY(d->GetUMChainStartRD(), pNewRD);
@@ -1538,7 +1538,7 @@ StackWalkAction DebuggerWalkStackProc(CrawlFrame *pCF, void *data)
#endif // FEATURE_EH_FUNCLETS
d->info.frame = frame;
- d->info.ambientSP = NULL;
+ d->info.ambientSP = (TADDR)NULL;
// Record the appdomain that the thread was in when it
// was running code for this frame.
diff --git a/src/coreclr/debug/ee/funceval.cpp b/src/coreclr/debug/ee/funceval.cpp
index a7e888452c78..c0ed54095cea 100644
--- a/src/coreclr/debug/ee/funceval.cpp
+++ b/src/coreclr/debug/ee/funceval.cpp
@@ -1018,7 +1018,7 @@ static void GetFuncEvalArgValue(DebuggerEval *pDE,
}
else
{
- *pArgument = NULL;
+ *pArgument = (ARG_SLOT)NULL;
}
}
}
@@ -1051,7 +1051,7 @@ static void GetFuncEvalArgValue(DebuggerEval *pDE,
}
else
{
- *pArgument = NULL;
+ *pArgument = (ARG_SLOT)NULL;
}
}
else
@@ -1069,7 +1069,7 @@ static void GetFuncEvalArgValue(DebuggerEval *pDE,
}
else
{
- *pArgument = NULL;
+ *pArgument = (ARG_SLOT)NULL;
}
}
else
@@ -2955,7 +2955,7 @@ void UnpackFuncEvalResult(DebuggerEval *pDE,
IsElementTypeSpecial(retClassET))
{
LOG((LF_CORDB, LL_EVERYTHING, "Creating strong handle for boxed DoNormalFuncEval result.\n"));
- OBJECTHANDLE oh = pDE->m_thread->GetDomain()->CreateStrongHandle(ArgSlotToObj(pDE->m_result[0]));
+ OBJECTHANDLE oh = AppDomain::GetCurrentDomain()->CreateStrongHandle(ArgSlotToObj(pDE->m_result[0]));
pDE->m_result[0] = (INT64)(LONG_PTR)oh;
pDE->m_vmObjectHandle = VMPTR_OBJECTHANDLE::MakePtr(oh);
}
@@ -3139,7 +3139,7 @@ static void RecordFuncEvalException(DebuggerEval *pDE,
pDE->m_result[0] = ObjToArgSlot(ppException);
pDE->m_resultType = ppException->GetTypeHandle();
- OBJECTHANDLE oh = pDE->m_thread->GetDomain()->CreateStrongHandle(ArgSlotToObj(pDE->m_result[0]));
+ OBJECTHANDLE oh = AppDomain::GetCurrentDomain()->CreateStrongHandle(ArgSlotToObj(pDE->m_result[0]));
pDE->m_result[0] = (ARG_SLOT)(LONG_PTR)oh;
pDE->m_vmObjectHandle = VMPTR_OBJECTHANDLE::MakePtr(oh);
@@ -3682,7 +3682,7 @@ void FuncEvalHijackRealWorker(DebuggerEval *pDE, Thread* pThread, FuncEvalFrame*
pDE->m_retValueBoxing = Debugger::AllBoxed;
// Make a strong handle for the result.
- OBJECTHANDLE oh = pDE->m_thread->GetDomain()->CreateStrongHandle(newObj);
+ OBJECTHANDLE oh = AppDomain::GetCurrentDomain()->CreateStrongHandle(newObj);
pDE->m_result[0] = (ARG_SLOT)(LONG_PTR)oh;
pDE->m_vmObjectHandle = VMPTR_OBJECTHANDLE::MakePtr(oh);
@@ -3712,7 +3712,7 @@ void FuncEvalHijackRealWorker(DebuggerEval *pDE, Thread* pThread, FuncEvalFrame*
pDE->m_resultType = newObj->GetTypeHandle();
// Place the result in a strong handle to protect it from a collection.
- OBJECTHANDLE oh = pDE->m_thread->GetDomain()->CreateStrongHandle(newObj);
+ OBJECTHANDLE oh = AppDomain::GetCurrentDomain()->CreateStrongHandle(newObj);
pDE->m_result[0] = (ARG_SLOT)(LONG_PTR)oh;
pDE->m_vmObjectHandle = VMPTR_OBJECTHANDLE::MakePtr(oh);
@@ -3758,7 +3758,7 @@ void FuncEvalHijackRealWorker(DebuggerEval *pDE, Thread* pThread, FuncEvalFrame*
pDE->m_resultType = newObj->GetTypeHandle();
// Place the result in a strong handle to protect it from a collection.
- OBJECTHANDLE oh = pDE->m_thread->GetDomain()->CreateStrongHandle(newObj);
+ OBJECTHANDLE oh = AppDomain::GetCurrentDomain()->CreateStrongHandle(newObj);
pDE->m_result[0] = (ARG_SLOT)(LONG_PTR)oh;
pDE->m_vmObjectHandle = VMPTR_OBJECTHANDLE::MakePtr(oh);
@@ -3967,7 +3967,7 @@ void * STDCALL FuncEvalHijackWorker(DebuggerEval *pDE)
//
SENDIPCEVENT_BEGIN(g_pDebugger, pDE->m_thread);
- if ((pDE->m_thread->GetDomain() != NULL) && pDE->m_thread->GetDomain()->IsDebuggerAttached())
+ if ((AppDomain::GetCurrentDomain() != NULL) && AppDomain::GetCurrentDomain()->IsDebuggerAttached())
{
if (CORDebuggerAttached())
diff --git a/src/coreclr/debug/ee/functioninfo.cpp b/src/coreclr/debug/ee/functioninfo.cpp
index fad9ac786ba7..41a16ef76316 100644
--- a/src/coreclr/debug/ee/functioninfo.cpp
+++ b/src/coreclr/debug/ee/functioninfo.cpp
@@ -253,7 +253,7 @@ DebuggerJitInfo::DebuggerJitInfo(DebuggerMethodInfo *minfo, NativeCodeVersion na
m_encBreakpointsApplied(false),
#endif //FEATURE_METADATA_UPDATER
m_methodInfo(minfo),
- m_addrOfCode(NULL),
+ m_addrOfCode((CORDB_ADDRESS)NULL),
m_sizeOfCode(0), m_prevJitInfo(NULL), m_nextJitInfo(NULL),
m_lastIL(0),
m_sequenceMap(NULL),
@@ -1572,10 +1572,10 @@ DebuggerJitInfo *DebuggerMethodInfo::FindOrCreateInitAndAddJitInfo(MethodDesc* f
return NULL;
}
- if (startAddr == NULL)
+ if (startAddr == (PCODE)NULL)
{
startAddr = g_pEEInterface->GetFunctionAddress(fd);
- if (startAddr == NULL)
+ if (startAddr == (PCODE)NULL)
{
//The only case this should happen is if we are trying to get the DJI for a method that has not been jitted yet.
return NULL;
@@ -2355,7 +2355,7 @@ PTR_DebuggerJitInfo DebuggerMethodInfo::GetLatestJitInfo(MethodDesc *mdesc)
// This ensures that there is an entry in the DJI list for this particular MethodDesc.
// in the case of generic code it may not be the first entry in the list.
- FindOrCreateInitAndAddJitInfo(mdesc, NULL /* startAddr */);
+ FindOrCreateInitAndAddJitInfo(mdesc, (PCODE)NULL /* startAddr */);
#endif // #ifndef DACCESS_COMPILE
diff --git a/src/coreclr/debug/inc/common.h b/src/coreclr/debug/inc/common.h
index 16cfb852896d..8051138b93a0 100644
--- a/src/coreclr/debug/inc/common.h
+++ b/src/coreclr/debug/inc/common.h
@@ -17,15 +17,11 @@
inline CORDB_ADDRESS PTR_TO_CORDB_ADDRESS(const void* ptr)
{
SUPPORTS_DAC;
- // Cast a void* to a ULONG is not 64-bit safe and triggers compiler warning C3411.
- // But this is x86 only, so we know it's ok. Use PtrToUlong to do the conversion
- // without invoking the error.
- return (CORDB_ADDRESS)(PtrToUlong(ptr));
+ return (CORDB_ADDRESS)(ULONG)(UINT_PTR)ptr;
}
inline CORDB_ADDRESS PTR_TO_CORDB_ADDRESS(UINT_PTR ptr)
{
SUPPORTS_DAC;
- // PtrToUlong
return (CORDB_ADDRESS)(ULONG)(ptr);
}
#else
diff --git a/src/coreclr/debug/inc/dacdbistructures.h b/src/coreclr/debug/inc/dacdbistructures.h
index ccb92dfd5209..e91cd9fb9bb4 100644
--- a/src/coreclr/debug/inc/dacdbistructures.h
+++ b/src/coreclr/debug/inc/dacdbistructures.h
@@ -499,7 +499,7 @@ class MSLAYOUT NativeCodeFunctionData
// method hasn't been jitted yet.
// In all cases, we can check the hot region start address to determine whether the rest of the
// the information is valid.
- BOOL IsValid() { return (m_rgCodeRegions[kHot].pAddress != NULL); }
+ BOOL IsValid() { return (m_rgCodeRegions[kHot].pAddress != (CORDB_ADDRESS)NULL); }
void Clear();
// data members
diff --git a/src/coreclr/debug/inc/dacdbistructures.inl b/src/coreclr/debug/inc/dacdbistructures.inl
index e31583faff58..a408a2c1ffb8 100644
--- a/src/coreclr/debug/inc/dacdbistructures.inl
+++ b/src/coreclr/debug/inc/dacdbistructures.inl
@@ -166,7 +166,7 @@ unsigned int DacDbiArrayList::Count() const
inline
TargetBuffer::TargetBuffer()
{
- this->pAddress = NULL;
+ this->pAddress = (CORDB_ADDRESS)NULL;
this->cbSize = 0;
}
@@ -219,7 +219,7 @@ TargetBuffer TargetBuffer::SubBuffer(ULONG byteOffset, ULONG byteLength) const
inline
void TargetBuffer::Clear()
{
- pAddress = NULL;
+ pAddress = (CORDB_ADDRESS)NULL;
cbSize = 0;
}
@@ -637,14 +637,14 @@ void FieldData::ClearFields()
m_fldSignatureCache = NULL;
m_fldSignatureCacheSize = 0;
m_fldInstanceOffset = 0;
- m_pFldStaticAddress = NULL;
+ m_pFldStaticAddress = (TADDR)NULL;
}
inline
BOOL FieldData::OkToGetOrSetInstanceOffset()
{
return (!m_fFldIsStatic && !m_fFldIsRVA && !m_fFldIsTLS &&
- m_fFldStorageAvailable && (m_pFldStaticAddress == NULL));
+ m_fFldStorageAvailable && (m_pFldStaticAddress == (TADDR)NULL));
}
// If this is an instance field, store its offset
@@ -655,7 +655,7 @@ void FieldData::SetInstanceOffset(SIZE_T offset)
_ASSERTE(!m_fFldIsRVA);
_ASSERTE(!m_fFldIsTLS);
_ASSERTE(m_fFldStorageAvailable);
- _ASSERTE(m_pFldStaticAddress == NULL);
+ _ASSERTE(m_pFldStaticAddress == (TADDR)NULL);
m_fldInstanceOffset = offset;
}
@@ -685,7 +685,7 @@ SIZE_T FieldData::GetInstanceOffset()
_ASSERTE(!m_fFldIsRVA);
_ASSERTE(!m_fFldIsTLS);
_ASSERTE(m_fFldStorageAvailable);
- _ASSERTE(m_pFldStaticAddress == NULL);
+ _ASSERTE(m_pFldStaticAddress == (TADDR)NULL);
return m_fldInstanceOffset;
}
@@ -695,7 +695,7 @@ TADDR FieldData::GetStaticAddress()
{
_ASSERTE(m_fFldIsStatic);
_ASSERTE(!m_fFldIsTLS);
- _ASSERTE(m_fFldStorageAvailable || (m_pFldStaticAddress == NULL));
+ _ASSERTE(m_fFldStorageAvailable || (m_pFldStaticAddress == (TADDR)NULL));
_ASSERTE(m_fldInstanceOffset == 0);
return m_pFldStaticAddress;
}
diff --git a/src/coreclr/debug/inc/dbgappdomain.h b/src/coreclr/debug/inc/dbgappdomain.h
index 6ef343d01e72..de8a06b38c9e 100644
--- a/src/coreclr/debug/inc/dbgappdomain.h
+++ b/src/coreclr/debug/inc/dbgappdomain.h
@@ -117,7 +117,7 @@ struct RemoteHANDLE {
BOOL DuplicateToLocalProcess(HANDLE hProcess, HANDLE* pHandle)
{
return DuplicateHandle(hProcess, m_hLocal, GetCurrentProcess(), pHandle,
- NULL, FALSE, DUPLICATE_SAME_ACCESS);
+ 0, FALSE, DUPLICATE_SAME_ACCESS);
}
void CloseInRemoteProcess(HANDLE hProcess)
@@ -127,7 +127,7 @@ struct RemoteHANDLE {
HANDLE hTmp;
if (DuplicateHandle(hProcess, hHandle, GetCurrentProcess(), &hTmp,
- NULL, FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
+ 0, FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE))
{
CloseHandle(hTmp);
}
diff --git a/src/coreclr/debug/inc/dbgipcevents.h b/src/coreclr/debug/inc/dbgipcevents.h
index 1545aa280837..6c39939f0030 100644
--- a/src/coreclr/debug/inc/dbgipcevents.h
+++ b/src/coreclr/debug/inc/dbgipcevents.h
@@ -10,7 +10,7 @@
#ifndef _DbgIPCEvents_h_
#define _DbgIPCEvents_h_
-#include
+#include
#include
#include
#include // for ICorDebugInfo::VarLocType & VarLoc
@@ -25,6 +25,8 @@
#include "./common.h"
+using std::nothrow;
+
//-----------------------------------------------------------------------------
// V3 additions to IPC protocol between LS and RS.
//-----------------------------------------------------------------------------
@@ -780,7 +782,7 @@ class MSLAYOUT VMPTR_Base
#endif // _PREFAST_
VMPTR_This dummy;
- dummy.m_addr = NULL;
+ dummy.m_addr = (TADDR)NULL;
return dummy;
#ifdef _PREFAST_
@@ -2054,6 +2056,19 @@ struct MSLAYOUT DebuggerIPCEvent
VMPTR_Module pModule;
} DisableOptData;
+ struct MSLAYOUT
+ {
+ BOOL enableEvents;
+ VMPTR_Object vmObj;
+ } ForceCatchHandlerFoundData;
+
+ struct MSLAYOUT
+ {
+ VMPTR_Module vmModule;
+ mdTypeDef classMetadataToken;
+ BOOL Enabled;
+ } CustomNotificationData;
+
struct MSLAYOUT
{
LSPTR_BREAKPOINT breakpointToken;
diff --git a/src/coreclr/debug/inc/dbgipceventtypes.h b/src/coreclr/debug/inc/dbgipceventtypes.h
index 9c3a09afcf9b..0c028619b69e 100644
--- a/src/coreclr/debug/inc/dbgipceventtypes.h
+++ b/src/coreclr/debug/inc/dbgipceventtypes.h
@@ -93,7 +93,9 @@ IPC_EVENT_TYPE1(DB_IPCE_DATA_BREAKPOINT ,0x0160)
IPC_EVENT_TYPE1(DB_IPCE_BEFORE_GARBAGE_COLLECTION ,0x0161)
IPC_EVENT_TYPE1(DB_IPCE_AFTER_GARBAGE_COLLECTION ,0x0162)
IPC_EVENT_TYPE1(DB_IPCE_DISABLE_OPTS_RESULT ,0x0163)
-IPC_EVENT_TYPE0(DB_IPCE_RUNTIME_LAST ,0x0165) // The last event from runtime
+IPC_EVENT_TYPE1(DB_IPCE_CATCH_HANDLER_FOUND_RESULT ,0x0165)
+IPC_EVENT_TYPE1(DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION_RESULT, 0x0166)
+IPC_EVENT_TYPE0(DB_IPCE_RUNTIME_LAST ,0x0167) // The last event from runtime
@@ -143,5 +145,7 @@ IPC_EVENT_TYPE2(DB_IPCE_GET_GCHANDLE_INFO ,0x0251)
IPC_EVENT_TYPE2(DB_IPCE_RESOLVE_UPDATE_METADATA_1 ,0x0256)
IPC_EVENT_TYPE2(DB_IPCE_RESOLVE_UPDATE_METADATA_2 ,0x0257)
IPC_EVENT_TYPE2(DB_IPCE_DISABLE_OPTS ,0x0258)
-IPC_EVENT_TYPE0(DB_IPCE_DEBUGGER_LAST ,0x025A) // The last event from the debugger
+IPC_EVENT_TYPE2(DB_IPCE_FORCE_CATCH_HANDLER_FOUND ,0x025A)
+IPC_EVENT_TYPE2(DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION, 0x025B)
+IPC_EVENT_TYPE0(DB_IPCE_DEBUGGER_LAST ,0x025C) // The last event from the debugger
diff --git a/src/coreclr/debug/runtimeinfo/CMakeLists.txt b/src/coreclr/debug/runtimeinfo/CMakeLists.txt
index e6d45ada1201..77ecf9a4dd9b 100644
--- a/src/coreclr/debug/runtimeinfo/CMakeLists.txt
+++ b/src/coreclr/debug/runtimeinfo/CMakeLists.txt
@@ -37,3 +37,58 @@ endif()
# publish runtimeinfo lib
install_clr(TARGETS runtimeinfo DESTINATIONS lib COMPONENT runtime)
+
+
+# cDAC contract descriptor
+
+if (NOT CDAC_BUILD_TOOL_BINARY_PATH)
+ # if CDAC_BUILD_TOOL_BINARY_PATH is unspecified (for example for a build without a .NET SDK or msbuild),
+ # link a stub contract descriptor into the runtime
+ add_library_clr(cdac_contract_descriptor OBJECT contractdescriptorstub.c)
+ message(STATUS "Using a stub cDAC contract descriptor")
+else()
+ # generate a contract descriptor using cdac-build-tool from a data descriptor and contract json file
+
+ add_library(cdac_data_descriptor OBJECT datadescriptor.cpp)
+ # don't build the data descriptor before the VM (and any of its dependencies' generated headers)
+ add_dependencies(cdac_data_descriptor cee_wks_core)
+ if(CLR_CMAKE_TARGET_WIN32)
+ # turn off whole program optimization:
+ # 1. it creates object files that cdac-build-tool can't read
+ # 2. we never link cdac_data_descriptor into the final product - it's only job is to be scraped
+ target_compile_options(cdac_data_descriptor PRIVATE /GL-)
+ endif()
+ target_include_directories(cdac_data_descriptor BEFORE PRIVATE ${VM_DIR})
+ target_include_directories(cdac_data_descriptor BEFORE PRIVATE ${VM_DIR}/${ARCH_SOURCES_DIR})
+ target_include_directories(cdac_data_descriptor PRIVATE ${CLR_DIR}/interop/inc)
+
+ set(GENERATED_CDAC_DESCRIPTOR_DIR "${CMAKE_CURRENT_BINARY_DIR}/cdac")
+ set(CONTRACT_DESCRIPTOR_OUTPUT "${GENERATED_CDAC_DESCRIPTOR_DIR}/contract-descriptor.c")
+ if(NOT EXISTS "${CDAC_BUILD_TOOL_BINARY_PATH}")
+ message(FATAL_ERROR "${CDAC_BUILD_TOOL_BINARY_PATH} does not exist")
+ endif()
+
+ set(CONTRACT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/contracts.jsonc")
+
+ # generate the contract descriptor by running cdac-build-tool
+ # n.b. this just uses `dotnet` from the PATH. InitializeDotNetCli adds the apropropriate directory
+ add_custom_command(
+ OUTPUT "${CONTRACT_DESCRIPTOR_OUTPUT}"
+ VERBATIM
+ COMMAND ${CLR_DOTNET_HOST_PATH} ${CDAC_BUILD_TOOL_BINARY_PATH} compose -o "${CONTRACT_DESCRIPTOR_OUTPUT}" -c "${CONTRACT_FILE}" $
+ DEPENDS cdac_data_descriptor cee_wks_core $ "${CONTRACT_FILE}"
+ USES_TERMINAL
+ )
+
+ # It is important that cdac_contract_descriptor is an object library;
+ # if it was static, linking it into the final dll would not export
+ # DotNetRuntimeContractDescriptor since it is not referenced anywhere.
+ add_library_clr(cdac_contract_descriptor OBJECT
+ "${CONTRACT_DESCRIPTOR_OUTPUT}"
+ contractpointerdata.cpp
+ )
+ target_include_directories(cdac_contract_descriptor BEFORE PRIVATE ${VM_DIR})
+ target_include_directories(cdac_contract_descriptor BEFORE PRIVATE ${VM_DIR}/${ARCH_SOURCES_DIR})
+ target_include_directories(cdac_contract_descriptor PRIVATE ${CLR_DIR}/interop/inc)
+ add_dependencies(cdac_contract_descriptor cdac_data_descriptor cee_wks_core)
+endif()
diff --git a/src/coreclr/debug/runtimeinfo/contractdescriptorstub.c b/src/coreclr/debug/runtimeinfo/contractdescriptorstub.c
new file mode 100644
index 000000000000..59421a6692d2
--- /dev/null
+++ b/src/coreclr/debug/runtimeinfo/contractdescriptorstub.c
@@ -0,0 +1,39 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#include
+
+#ifdef _MSC_VER
+#define DLLEXPORT __declspec(dllexport)
+#else
+#define DLLEXPORT __attribute__((visibility("default")))
+#endif
+
+struct DotNetRuntimeContractDescriptor
+{
+ uint64_t magic;
+ uint32_t flags;
+ const uint32_t descriptor_size;
+ const char *descriptor;
+ const uint32_t pointer_data_count;
+ uint32_t pad0;
+ const uintptr_t *pointer_data;
+};
+
+extern const uintptr_t contractDescriptorPointerData[];
+
+// just the placeholder pointer
+const uintptr_t contractDescriptorPointerData[] = { (uintptr_t)0 };
+
+DLLEXPORT struct DotNetRuntimeContractDescriptor DotNetRuntimeContractDescriptor;
+
+#define STUB_DESCRIPTOR "{\"version\":0,\"baseline\":\"empty\",\"contracts\":{},\"types\":{},\"globals\":{}}"
+
+DLLEXPORT struct DotNetRuntimeContractDescriptor DotNetRuntimeContractDescriptor = {
+ .magic = 0x0043414443434e44ull, // "DNCCDAC\0"
+ .flags = 0x1u & (sizeof(void*) == 4 ? 0x02u : 0x00u),
+ .descriptor_size = sizeof(STUB_DESCRIPTOR),
+ .descriptor = STUB_DESCRIPTOR,
+ .pointer_data_count = 1,
+ .pointer_data = &contractDescriptorPointerData[0],
+};
diff --git a/src/coreclr/debug/runtimeinfo/contractpointerdata.cpp b/src/coreclr/debug/runtimeinfo/contractpointerdata.cpp
new file mode 100644
index 000000000000..ae1440af4219
--- /dev/null
+++ b/src/coreclr/debug/runtimeinfo/contractpointerdata.cpp
@@ -0,0 +1,23 @@
+// 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
+#include
+
+#include "threads.h"
+
+extern "C"
+{
+
+// without an extern declaration, clang does not emit this global into the object file
+extern const uintptr_t contractDescriptorPointerData[];
+
+const uintptr_t contractDescriptorPointerData[] = {
+ (uintptr_t)0, // placeholder
+#define CDAC_GLOBAL_POINTER(name,value) (uintptr_t)(value),
+#include "datadescriptor.h"
+};
+
+}
diff --git a/src/coreclr/debug/runtimeinfo/contracts.jsonc b/src/coreclr/debug/runtimeinfo/contracts.jsonc
new file mode 100644
index 000000000000..ab82fbc38c40
--- /dev/null
+++ b/src/coreclr/debug/runtimeinfo/contracts.jsonc
@@ -0,0 +1,15 @@
+//algorithmic contracts for coreclr
+// The format of this file is: JSON with comments
+// {
+// "CONTRACT NAME": VERSION,
+// ...
+// }
+// CONTRACT NAME is an arbitrary string, VERSION is an integer
+//
+// cdac-build-tool can take multiple "-c contract_file" arguments
+// so to conditionally include contracts, put additional contracts in a separate file
+{
+ "Thread": 1,
+ "SOSBreakingChangeVersion": 1 // example contract: "runtime exports an SOS breaking change version global"
+}
+
diff --git a/src/coreclr/debug/runtimeinfo/datadescriptor.cpp b/src/coreclr/debug/runtimeinfo/datadescriptor.cpp
new file mode 100644
index 000000000000..99fe1cca7eec
--- /dev/null
+++ b/src/coreclr/debug/runtimeinfo/datadescriptor.cpp
@@ -0,0 +1,297 @@
+// 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
+#include
+
+#include "static_assert.h"
+
+#include
+#include "threads.h"
+
+// begin blob definition
+
+extern "C"
+{
+
+struct TypeSpec
+{
+ uint32_t Name;
+ uint32_t Fields;
+ uint16_t Size; // note: C++ fragile no designated initializers - Size must come after Name and Fields
+};
+
+struct FieldSpec
+{
+ uint32_t Name;
+ uint32_t TypeName;
+ uint16_t FieldOffset;
+};
+
+struct GlobalLiteralSpec
+{
+ uint32_t Name;
+ uint32_t TypeName;
+ uint64_t Value;
+};
+
+struct GlobalPointerSpec
+{
+ uint32_t Name;
+ uint32_t PointerDataIndex;
+};
+
+#define CONCAT(token1,token2) token1 ## token2
+#define CONCAT4(token1, token2, token3, token4) token1 ## token2 ## token3 ## token4
+
+#define MAKE_TYPELEN_NAME(tyname) CONCAT(cdac_string_pool_typename__, tyname)
+#define MAKE_FIELDLEN_NAME(tyname,membername) CONCAT4(cdac_string_pool_membername__, tyname, __, membername)
+#define MAKE_FIELDTYPELEN_NAME(tyname,membername) CONCAT4(cdac_string_pool_membertypename__, tyname, __, membername)
+#define MAKE_GLOBALLEN_NAME(globalname) CONCAT(cdac_string_pool_globalname__, globalname)
+#define MAKE_GLOBALTYPELEN_NAME(globalname) CONCAT(cdac_string_pool_globaltypename__, globalname)
+
+// define a struct where the size of each field is the length of some string. we will use offsetof to get
+// the offset of each struct element, which will be equal to the offset of the beginning of that string in the
+// string pool.
+struct CDacStringPoolSizes
+{
+ char cdac_string_pool_nil; // make the first real string start at offset 1
+#define DECL_LEN(membername,len) char membername[(len)];
+#define CDAC_BASELINE(name) DECL_LEN(cdac_string_pool_baseline_, (sizeof(name)))
+#define CDAC_TYPE_BEGIN(name) DECL_LEN(MAKE_TYPELEN_NAME(name), sizeof(#name))
+#define CDAC_TYPE_FIELD(tyname,membertyname,membername,offset) DECL_LEN(MAKE_FIELDLEN_NAME(tyname,membername), sizeof(#membername)) \
+ DECL_LEN(MAKE_FIELDTYPELEN_NAME(tyname,membername), sizeof(#membertyname))
+#define CDAC_GLOBAL_POINTER(name,value) DECL_LEN(MAKE_GLOBALLEN_NAME(name), sizeof(#name))
+#define CDAC_GLOBAL(name,tyname,value) DECL_LEN(MAKE_GLOBALLEN_NAME(name), sizeof(#name)) \
+ DECL_LEN(MAKE_GLOBALTYPELEN_NAME(name), sizeof(#tyname))
+#include "datadescriptor.h"
+ char cdac_string_pool_trailing_nil;
+#undef DECL_LEN
+};
+
+#define GET_TYPE_NAME(name) offsetof(struct CDacStringPoolSizes, MAKE_TYPELEN_NAME(name))
+#define GET_FIELD_NAME(tyname,membername) offsetof(struct CDacStringPoolSizes, MAKE_FIELDLEN_NAME(tyname,membername))
+#define GET_FIELDTYPE_NAME(tyname,membername) offsetof(struct CDacStringPoolSizes, MAKE_FIELDTYPELEN_NAME(tyname,membername))
+#define GET_GLOBAL_NAME(globalname) offsetof(struct CDacStringPoolSizes, MAKE_GLOBALLEN_NAME(globalname))
+#define GET_GLOBALTYPE_NAME(globalname) offsetof(struct CDacStringPoolSizes, MAKE_GLOBALTYPELEN_NAME(globalname))
+
+// count the types
+enum
+{
+ CDacBlobTypesCount =
+#define CDAC_TYPES_BEGIN() 0
+#define CDAC_TYPE_BEGIN(name) + 1
+#include "datadescriptor.h"
+};
+
+// count the field pool size.
+// there's 1 placeholder element at the start, and 1 endmarker after each type
+enum
+{
+ CDacBlobFieldsPoolCount =
+#define CDAC_TYPES_BEGIN() 1
+#define CDAC_TYPE_FIELD(tyname,membertyname,membername,offset) + 1
+#define CDAC_TYPE_END(name) + 1
+#include "datadescriptor.h"
+};
+
+// count the literal globals
+enum
+{
+ CDacBlobGlobalLiteralsCount =
+#define CDAC_GLOBALS_BEGIN() 0
+#define CDAC_GLOBAL(name,tyname,value) + 1
+#include "datadescriptor.h"
+};
+
+// count the aux vector globals
+enum
+{
+ CDacBlobGlobalPointersCount =
+#define CDAC_GLOBALS_BEGIN() 0
+#define CDAC_GLOBAL_POINTER(name,value) + 1
+#include "datadescriptor.h"
+};
+
+
+#define MAKE_TYPEFIELDS_TYNAME(tyname) CONCAT(CDacFieldsPoolTypeStart__, tyname)
+
+// index of each run of fields.
+// we make a struct containing one 1-byte field for each field in the run, and then take the offset of the
+// struct to get the index of the run of fields.
+// this looks like
+//
+// struct CDacFieldsPoolSizes {
+// char cdac_fields_pool_start_placeholder__;
+// struct CDacFieldsPoolTypeStart__MethodTable {
+// char cdac_fields_pool_member__MethodTable__GCHandle;
+// char cdac_fields_pool_member__MethodTable_endmarker;
+// } CDacFieldsPoolTypeStart__MethodTable;
+// ...
+// };
+//
+// so that offsetof(struct CDacFieldsPoolSizes, CDacFieldsPoolTypeStart__MethodTable) will give the offset of the
+// method table field descriptors in the run of fields
+struct CDacFieldsPoolSizes
+{
+#define DECL_LEN(membername) char membername;
+#define CDAC_TYPES_BEGIN() DECL_LEN(cdac_fields_pool_start_placeholder__)
+#define CDAC_TYPE_BEGIN(name) struct MAKE_TYPEFIELDS_TYNAME(name) {
+#define CDAC_TYPE_FIELD(tyname,membertyname,membername,offset) DECL_LEN(CONCAT4(cdac_fields_pool_member__, tyname, __, membername))
+#define CDAC_TYPE_END(name) DECL_LEN(CONCAT4(cdac_fields_pool_member__, tyname, _, endmarker)) \
+ } MAKE_TYPEFIELDS_TYNAME(name);
+#include "datadescriptor.h"
+#undef DECL_LEN
+};
+
+#define GET_TYPE_FIELDS(tyname) offsetof(struct CDacFieldsPoolSizes, MAKE_TYPEFIELDS_TYNAME(tyname))
+
+// index of each global pointer
+//
+// struct CDacGlobalPointerIndex
+// {
+// char placeholder;
+// char firstGlobalPointerName;
+// char secondGlobalPointerName;
+// ...
+//}
+//
+// offsetof (CDACGlobalPointerIndex, NAME) returns the index of the global
+struct CDacGlobalPointerIndex
+{
+#define DECL_LEN(membername) char membername;
+#define CDAC_GLOBALS_BEGIN() DECL_LEN(cdac_global_pointer_index_start_placeholder__)
+#define CDAC_GLOBAL_POINTER(name,value) DECL_LEN(CONCAT(cdac_global_pointer_index__, name))
+#include "datadescriptor.h"
+#undef DECL_LEN
+};
+
+#define GET_GLOBAL_POINTER_INDEX(name) offsetof(struct CDacGlobalPointerIndex, CONCAT(cdac_global_pointer_index__, name))
+
+struct BinaryBlobDataDescriptor
+{
+ // The blob begins with a directory that gives the relative offsets of the `Baseline`, `Types`,
+ // `FieldsPool`, `GlobalLiteralValues`, `GlobalPointerValues` and `Names` fields of the blob.
+ // The number of elements of each of the arrays is next. This is followed by the sizes of the
+ // spec structs. Since `BinaryBlobDataDescriptor` is created via macros, we want to embed the
+ // `offsetof` and `sizeof` of the components of the blob into the blob itself without having to
+ // account for any padding that the C/C++ compiler may introduce to enforce alignment.
+ // Additionally the `Directory` tries to follow a common C/C++ alignment rule (we don't want
+ // padding introduced in the directory itself): N-byte members are aligned to start on N-byte
+ // boundaries.
+ struct Directory {
+ uint32_t FlagsAndBaselineStart;
+ uint32_t TypesStart;
+
+ uint32_t FieldsPoolStart;
+ uint32_t GlobalLiteralValuesStart;
+
+ uint32_t GlobalPointersStart;
+ uint32_t NamesPoolStart;
+
+ uint32_t TypeCount;
+ uint32_t FieldsPoolCount;
+
+ uint32_t GlobalLiteralValuesCount;
+ uint32_t GlobalPointerValuesCount;
+
+ uint32_t NamesPoolCount;
+
+ uint8_t TypeSpecSize;
+ uint8_t FieldSpecSize;
+ uint8_t GlobalLiteralSpecSize;
+ uint8_t GlobalPointerSpecSize;
+ } Directory;
+ uint32_t PlatformFlags;
+ uint32_t BaselineName;
+ struct TypeSpec Types[CDacBlobTypesCount];
+ struct FieldSpec FieldsPool[CDacBlobFieldsPoolCount];
+ struct GlobalLiteralSpec GlobalLiteralValues[CDacBlobGlobalLiteralsCount];
+ struct GlobalPointerSpec GlobalPointerValues[CDacBlobGlobalPointersCount];
+ uint8_t NamesPool[sizeof(struct CDacStringPoolSizes)];
+ uint8_t EndMagic[4];
+};
+
+struct MagicAndBlob {
+ uint64_t magic;
+ struct BinaryBlobDataDescriptor Blob;
+};
+
+// we only support 32-bit and 64-bit right now
+static_assert_no_msg(sizeof(void*) == 4 || sizeof(void*) == 8);
+
+// C-style designated initializers are a C++20 feature. Have to use plain old aggregate initialization instead.
+
+DLLEXPORT
+struct MagicAndBlob BlobDataDescriptor = {
+ /*.magic = */ 0x00424F4C42434144ull,// "DACBLOB",
+ /*.Blob =*/ {
+ /*.Directory =*/ {
+ /* .FlagsAndBaselineStart = */ offsetof(struct BinaryBlobDataDescriptor, PlatformFlags),
+ /* .TypesStart = */ offsetof(struct BinaryBlobDataDescriptor, Types),
+ /* .FieldsPoolStart = */ offsetof(struct BinaryBlobDataDescriptor, FieldsPool),
+ /* .GlobalLiteralValuesStart = */ offsetof(struct BinaryBlobDataDescriptor, GlobalLiteralValues),
+ /* .GlobalPointersStart = */ offsetof(struct BinaryBlobDataDescriptor, GlobalPointerValues),
+ /* .NamesPoolStart = */ offsetof(struct BinaryBlobDataDescriptor, NamesPool),
+ /* .TypeCount = */ CDacBlobTypesCount,
+ /* .FieldsPoolCount = */ CDacBlobFieldsPoolCount,
+ /* .GlobalLiteralValuesCount = */ CDacBlobGlobalLiteralsCount,
+ /* .GlobalPointerValuesCount = */ CDacBlobGlobalPointersCount,
+ /* .NamesPoolCount = */ sizeof(struct CDacStringPoolSizes),
+ /* .TypeSpecSize = */ sizeof(struct TypeSpec),
+ /* .FieldSpecSize = */ sizeof(struct FieldSpec),
+ /* .GlobalLiteralSpecSize = */ sizeof(struct GlobalLiteralSpec),
+ /* .GlobalPointerSpecSize = */ sizeof(struct GlobalPointerSpec),
+ },
+ /* .PlatformFlags = */ (sizeof(void*) == 4 ? 0x02 : 0) | 0x01,
+ /* .BaselineName = */ offsetof(struct CDacStringPoolSizes, cdac_string_pool_baseline_),
+
+ /* .Types = */ {
+#define CDAC_TYPE_BEGIN(name) { \
+ /* .Name = */ GET_TYPE_NAME(name), \
+ /* .Fields = */ GET_TYPE_FIELDS(name),
+#define CDAC_TYPE_INDETERMINATE(name) /*.Size = */ 0,
+#define CDAC_TYPE_SIZE(size) /* .Size = */ size,
+#define CDAC_TYPE_END(name) },
+#include "datadescriptor.h"
+ },
+
+ /* .FieldsPool = */ {
+#define CDAC_TYPES_BEGIN() {0,},
+#define CDAC_TYPE_FIELD(tyname,membertyname,membername,offset) { \
+ /* .Name = */ GET_FIELD_NAME(tyname,membername), \
+ /* .TypeName = */ GET_FIELDTYPE_NAME(tyname,membername), \
+ /* .FieldOffset = */ offset, \
+},
+#define CDAC_TYPE_END(name) { 0, },
+#include "datadescriptor.h"
+ },
+
+ /* .GlobalLiteralValues = */ {
+#define CDAC_GLOBAL(name,tyname,value) { /*.Name = */ GET_GLOBAL_NAME(name), /* .TypeName = */ GET_GLOBALTYPE_NAME(name), /* .Value = */ value },
+#include "datadescriptor.h"
+ },
+
+ /* .GlobalPointerValues = */ {
+#define CDAC_GLOBAL_POINTER(name,value) { /* .Name = */ GET_GLOBAL_NAME(name), /* .PointerDataIndex = */ GET_GLOBAL_POINTER_INDEX(name) },
+#include "datadescriptor.h"
+ },
+
+ /* .NamesPool = */ ("\0" // starts with a nul
+#define CDAC_BASELINE(name) name "\0"
+#define CDAC_TYPE_BEGIN(name) #name "\0"
+#define CDAC_TYPE_FIELD(tyname,membertyname,membername,offset) #membername "\0" #membertyname "\0"
+#define CDAC_GLOBAL_POINTER(name,value) #name "\0"
+#define CDAC_GLOBAL(name,tyname,value) #name "\0" #tyname "\0"
+#include "datadescriptor.h"
+ ),
+
+ /* .EndMagic = */ { 0x01, 0x02, 0x03, 0x04 },
+ }
+};
+
+// end blob definition
+
+} // extern "C"
diff --git a/src/coreclr/debug/runtimeinfo/datadescriptor.h b/src/coreclr/debug/runtimeinfo/datadescriptor.h
new file mode 100644
index 000000000000..2687ceff5535
--- /dev/null
+++ b/src/coreclr/debug/runtimeinfo/datadescriptor.h
@@ -0,0 +1,145 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+//
+// No include guards. This file is included multiple times.
+
+// The format is:
+// CDAC_BASELINE("string") baseline data contract that the runtime should follow. "empty" is reasonable
+// CDAC_TYPES_BEGIN()
+// ... ...
+// CDAC_TYPES_END()
+// CDAC_GLOBALS_BEGIN()
+// ... ...
+// CDAC_GLOBALS_END()
+//
+// In the format is:
+// CDAC_TYPE_BEGIN(cdacTypeIdentifier) // defined a new data descriptor named cdacIdentifier
+//
+// CDAC_TYPE_SIZE(k) -or- CDAC_TYPE_INDETERMINATE(cdacTypeIdentifier) specifies that the type has
+// size k (bytes - usually sizeof(SomeNativeType)) or specify that the type's size is not provided
+// It is important that CDAC_TYPE_SIZE or CDAC_TYPE_INDETERMINATE immediately follows
+// CDAC_TYPE_BEGIN
+//
+// CDAC_TYPE_FIELD(cdacTypeIdentifier, cdacFieldTypeIdentifier, cdacFieldName, k) specifies the
+// field of "cdacTypeIdentifier" that has name cdacFieldName and has the type
+// "cdacFieldtypeIdentifier" located at offset k in the type layout. k is usually
+// offsetof(SomeClass, m_FieldName) if the field is public
+//
+// if the field is private, the convention is that SomeClass declares a friend struct
+// cdac_offsets and provides a specialization of cdac_offsets with a public constexpr
+// size_t member that holds the offset:
+//
+// class MyClass {
+// private:
+// void* m_myField;
+// friend template cdac_offsets;
+// };
+// template<> struct cdac_offsets {
+// static constexpr size_t MyField = offsetof(MyClass, m_myField);
+// };
+//
+// then the field layout can be specified as
+// CDAC_TYPE_FIELD(MyClassLayout, pointer, MyField, cdac_offsets::MyField)
+// There can be zero or more CDAC_TYPE_FIELD entries per type layout
+//
+// CDAC_TYPE_END(cdacTypeIdentifier) specifies the end of the type layout for cdacTypeIdentifier
+//
+// In the format is:
+//
+// CDAC_GLOBAL(cdacGlobalName, cdacTypeIdentifier, value)
+// or
+// CDAC_GLOBAL_POINTER(cdacGlobalName, cdacTypeIdentifier, address)
+//
+// Zero or more globals can be defined
+//
+// if a global is given with CDAC_GLOBAL(), `value` should be a constexpr uint64_t (or convertible
+// to uint64_t) for example, it can be a literal constant or a preprocessor definition
+//
+// if a global is a CDAC_GLOBAL_POINTER(), address should be a constexpr pointer or a constexpr
+// uintptr_t
+//
+//
+//
+// This file is compiled using the target architecture. Preprocessor defines for the target
+// platform will be available. It is ok to use `#ifdef`.
+
+#ifndef CDAC_BASELINE
+#define CDAC_BASELINE(identifier)
+#endif
+#ifndef CDAC_TYPES_BEGIN
+#define CDAC_TYPES_BEGIN()
+#endif
+#ifndef CDAC_TYPE_BEGIN
+#define CDAC_TYPE_BEGIN(tyname)
+#endif
+#ifndef CDAC_TYPE_SIZE
+#define CDAC_TYPE_SIZE(k)
+#endif
+#ifndef CDAC_TYPE_INDETERMINATE
+#define CDAC_TYPE_INDETERMINATE(tyname)
+#endif
+#ifndef CDAC_TYPE_FIELD
+#define CDAC_TYPE_FIELD(tyname,fieldtyname,fieldname,off)
+#endif
+#ifndef CDAC_TYPE_END
+#define CDAC_TYPE_END(tyname)
+#endif
+#ifndef CDAC_TYPES_END
+#define CDAC_TYPES_END()
+#endif
+#ifndef CDAC_GLOBALS_BEGIN
+#define CDAC_GLOBALS_BEGIN()
+#endif
+#ifndef CDAC_GLOBAL
+#define CDAC_GLOBAL(globalname,tyname,val)
+#endif
+#ifndef CDAC_GLOBAL_POINTER
+#define CDAC_GLOBAL_POINTER(globalname,addr)
+#endif
+#ifndef CDAC_GLOBALS_END
+#define CDAC_GLOBALS_END()
+#endif
+
+CDAC_BASELINE("empty")
+CDAC_TYPES_BEGIN()
+
+CDAC_TYPE_BEGIN(Thread)
+CDAC_TYPE_INDETERMINATE(Thread)
+CDAC_TYPE_FIELD(Thread, GCHandle, GCHandle, cdac_offsets::ExposedObject)
+CDAC_TYPE_FIELD(Thread, pointer, LinkNext, cdac_offsets::Link)
+CDAC_TYPE_END(Thread)
+
+CDAC_TYPE_BEGIN(ThreadStore)
+CDAC_TYPE_INDETERMINATE(ThreadStore)
+CDAC_TYPE_FIELD(ThreadStore, /*omit type*/, ThreadCount, cdac_offsets::ThreadCount)
+CDAC_TYPE_FIELD(ThreadStore, /*omit type*/, ThreadList, cdac_offsets::ThreadList)
+CDAC_TYPE_END(ThreadStore)
+
+CDAC_TYPE_BEGIN(GCHandle)
+CDAC_TYPE_SIZE(sizeof(OBJECTHANDLE))
+CDAC_TYPE_END(GCHandle)
+
+CDAC_TYPES_END()
+
+CDAC_GLOBALS_BEGIN()
+CDAC_GLOBAL_POINTER(ThreadStore, &ThreadStore::s_pThreadStore)
+#if FEATURE_EH_FUNCLETS
+CDAC_GLOBAL(FeatureEHFunclets, uint8, 1)
+#else
+CDAC_GLOBAL(FeatureEHFunclets, uint8, 0)
+#endif
+CDAC_GLOBAL(SOSBreakingChangeVersion, uint8, SOS_BREAKING_CHANGE_VERSION)
+CDAC_GLOBALS_END()
+
+#undef CDAC_BASELINE
+#undef CDAC_TYPES_BEGIN
+#undef CDAC_TYPE_BEGIN
+#undef CDAC_TYPE_INDETERMINATE
+#undef CDAC_TYPE_SIZE
+#undef CDAC_TYPE_FIELD
+#undef CDAC_TYPE_END
+#undef CDAC_TYPES_END
+#undef CDAC_GLOBALS_BEGIN
+#undef CDAC_GLOBAL
+#undef CDAC_GLOBAL_POINTER
+#undef CDAC_GLOBALS_END
diff --git a/src/coreclr/debug/shared/dbgtransportsession.cpp b/src/coreclr/debug/shared/dbgtransportsession.cpp
index 3bebb8282aed..f05cb0007c8e 100644
--- a/src/coreclr/debug/shared/dbgtransportsession.cpp
+++ b/src/coreclr/debug/shared/dbgtransportsession.cpp
@@ -2203,6 +2203,7 @@ DWORD DbgTransportSession::GetEventSize(DebuggerIPCEvent *pEvent)
case DB_IPCE_BEFORE_GARBAGE_COLLECTION:
case DB_IPCE_AFTER_GARBAGE_COLLECTION:
case DB_IPCE_DISABLE_OPTS_RESULT:
+ case DB_IPCE_CATCH_HANDLER_FOUND_RESULT:
cbAdditionalSize = 0;
break;
@@ -2502,6 +2503,14 @@ DWORD DbgTransportSession::GetEventSize(DebuggerIPCEvent *pEvent)
cbAdditionalSize = sizeof(pEvent->DisableOptData);
break;
+ case DB_IPCE_FORCE_CATCH_HANDLER_FOUND:
+ cbAdditionalSize = sizeof(pEvent->ForceCatchHandlerFoundData);
+ break;
+
+ case DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION:
+ cbAdditionalSize = sizeof(pEvent->CustomNotificationData);
+ break;
+
default:
STRESS_LOG1(LF_CORDB, LL_INFO1000, "Unknown debugger event type: 0x%x\n", (pEvent->type & DB_IPCE_TYPE_MASK));
_ASSERTE(!"Unknown debugger event type");
diff --git a/src/coreclr/debug/shared/utils.cpp b/src/coreclr/debug/shared/utils.cpp
index 73badc2e0575..b3fdc5bc3494 100644
--- a/src/coreclr/debug/shared/utils.cpp
+++ b/src/coreclr/debug/shared/utils.cpp
@@ -46,7 +46,7 @@ CORDB_ADDRESS IsEventDebuggerNotification(
// If it's not even our exception code, then it's not ours.
if (pRecord->ExceptionCode != CLRDBG_NOTIFICATION_EXCEPTION_CODE)
{
- return NULL;
+ return (CORDB_ADDRESS)NULL;
}
//
@@ -57,7 +57,7 @@ CORDB_ADDRESS IsEventDebuggerNotification(
//
if (pRecord->NumberParameters != 3)
{
- return NULL;
+ return (CORDB_ADDRESS)NULL;
}
// 1st argument should always be the cookie.
@@ -66,7 +66,7 @@ CORDB_ADDRESS IsEventDebuggerNotification(
DWORD cookie = (DWORD) pRecord->ExceptionInformation[0];
if (cookie != CLRDBG_EXCEPTION_DATA_CHECKSUM)
{
- return NULL;
+ return (CORDB_ADDRESS)NULL;
}
// TODO: We don't do this check in case of non-windows debugging now, because we don't support
@@ -79,7 +79,7 @@ CORDB_ADDRESS IsEventDebuggerNotification(
CORDB_ADDRESS pTargetBase = GetExceptionInfoAsAddress(pRecord, 1);
if (pTargetBase != pClrBaseAddress)
{
- return NULL;
+ return (CORDB_ADDRESS)NULL;
}
#endif
diff --git a/src/coreclr/dlls/mscordac/mscordac_unixexports.src b/src/coreclr/dlls/mscordac/mscordac_unixexports.src
index ad056eb1104e..3257e6f37960 100644
--- a/src/coreclr/dlls/mscordac/mscordac_unixexports.src
+++ b/src/coreclr/dlls/mscordac/mscordac_unixexports.src
@@ -60,8 +60,6 @@ nativeStringResourceTable_mscorrc
#vsprintf_s
#_snprintf_s
#_vsnprintf_s
-#_itow_s
-#_i64tow_s
#memcpy_s
#sscanf_s
diff --git a/src/coreclr/dlls/mscoree/coreclr/CMakeLists.txt b/src/coreclr/dlls/mscoree/coreclr/CMakeLists.txt
index c600af1fb6aa..7ba58d0297f9 100644
--- a/src/coreclr/dlls/mscoree/coreclr/CMakeLists.txt
+++ b/src/coreclr/dlls/mscoree/coreclr/CMakeLists.txt
@@ -109,6 +109,7 @@ set(CORECLR_LIBRARIES
interop
coreclrminipal
gc_pal
+ cdac_contract_descriptor
)
if(CLR_CMAKE_TARGET_ARCH_AMD64)
diff --git a/src/coreclr/dlls/mscoree/exports.cpp b/src/coreclr/dlls/mscoree/exports.cpp
index f1cfb2faf5c8..8c28aa0545a8 100644
--- a/src/coreclr/dlls/mscoree/exports.cpp
+++ b/src/coreclr/dlls/mscoree/exports.cpp
@@ -26,7 +26,7 @@
#define ASSERTE_ALL_BUILDS(expr) _ASSERTE_ALL_BUILDS((expr))
#ifdef TARGET_UNIX
-#define NO_HOSTING_API_RETURN_ADDRESS ((void*)ULONG_PTR_MAX)
+#define NO_HOSTING_API_RETURN_ADDRESS ((void*)UINTPTR_MAX)
void* g_hostingApiReturnAddress = NO_HOSTING_API_RETURN_ADDRESS;
class HostingApiFrameHolder
diff --git a/src/coreclr/dlls/mscoree/mscorwks_ntdef.src b/src/coreclr/dlls/mscoree/mscorwks_ntdef.src
index 0ac421b63e07..a2076bd62433 100644
--- a/src/coreclr/dlls/mscoree/mscorwks_ntdef.src
+++ b/src/coreclr/dlls/mscoree/mscorwks_ntdef.src
@@ -28,3 +28,6 @@ EXPORTS
; Used by profilers
MetaDataGetDispenser
+
+ ; cDAC contract descriptor
+ DotNetRuntimeContractDescriptor
diff --git a/src/coreclr/dlls/mscoree/mscorwks_unixexports.src b/src/coreclr/dlls/mscoree/mscorwks_unixexports.src
index a35a59c09560..3eacb7fa4848 100644
--- a/src/coreclr/dlls/mscoree/mscorwks_unixexports.src
+++ b/src/coreclr/dlls/mscoree/mscorwks_unixexports.src
@@ -14,3 +14,6 @@ g_dacTable
; Used by profilers
MetaDataGetDispenser
+
+; cDAC contract descriptor
+DotNetRuntimeContractDescriptor
diff --git a/src/coreclr/dlls/mscorpe/ceefilegenwriter.cpp b/src/coreclr/dlls/mscorpe/ceefilegenwriter.cpp
index b6cc342c741d..37611c4fb446 100644
--- a/src/coreclr/dlls/mscorpe/ceefilegenwriter.cpp
+++ b/src/coreclr/dlls/mscorpe/ceefilegenwriter.cpp
@@ -256,13 +256,13 @@ CeeFileGenWriter::CeeFileGenWriter() // ctor is protected
m_dllCount = 0;
m_dwManifestSize = 0;
- m_dwManifestRVA = NULL;
+ m_dwManifestRVA = 0;
m_dwStrongNameSize = 0;
- m_dwStrongNameRVA = NULL;
+ m_dwStrongNameRVA = 0;
m_dwVTableSize = 0;
- m_dwVTableRVA = NULL;
+ m_dwVTableRVA = 0;
m_iDataDlls = NULL;
diff --git a/src/coreclr/dlls/mscorrc/mscorrc.rc b/src/coreclr/dlls/mscorrc/mscorrc.rc
index b95946881f10..5b4faf05edb4 100644
--- a/src/coreclr/dlls/mscorrc/mscorrc.rc
+++ b/src/coreclr/dlls/mscorrc/mscorrc.rc
@@ -113,7 +113,6 @@ BEGIN
COR_E_FILELOAD "Unable to load file '%1'."
COR_E_ASSEMBLYEXPECTED "The module '%1' was expected to contain an assembly manifest."
FUSION_E_REF_DEF_MISMATCH "The located assembly's manifest definition with name '%1' does not match the assembly reference."
- FUSION_E_PRIVATE_ASM_DISALLOWED "Assembly '%1' is required to be strongly named."
FUSION_E_INVALID_NAME "The given assembly name, '%1', was invalid."
FUSION_E_APP_DOMAIN_LOCKED "The requested assembly version conflicts with what is already bound in the app domain or specified in the manifest."
IDS_EE_HASH_VAL_FAILED "Hash validation failed for file or assembly '%1'."
diff --git a/src/coreclr/gc/env/volatile.h b/src/coreclr/gc/env/volatile.h
index c40e5c2d6096..e1c014543139 100644
--- a/src/coreclr/gc/env/volatile.h
+++ b/src/coreclr/gc/env/volatile.h
@@ -161,16 +161,16 @@ T VolatileLoad(T const * pt)
switch (sizeof(T))
{
case 1:
- *(unsigned __int8* )pv = __ldar8 ((unsigned __int8 volatile*)pt);
+ *(uint8_t* )pv = __ldar8 ((uint8_t volatile*)pt);
break;
case 2:
- *(unsigned __int16*)pv = __ldar16((unsigned __int16 volatile*)pt);
+ *(uint16_t*)pv = __ldar16((uint16_t volatile*)pt);
break;
case 4:
- *(unsigned __int32*)pv = __ldar32((unsigned __int32 volatile*)pt);
+ *(uint32_t*)pv = __ldar32((uint32_t volatile*)pt);
break;
case 8:
- *(unsigned __int64*)pv = __ldar64((unsigned __int64 volatile*)pt);
+ *(uint64_t*)pv = __ldar64((uint64_t volatile*)pt);
break;
default:
val = *(T volatile const*)pt;
@@ -240,16 +240,16 @@ void VolatileStore(T* pt, T val)
switch (sizeof(T))
{
case 1:
- __stlr8 ((unsigned __int8 volatile*)pt, *(unsigned __int8* )pv);
+ __stlr8 ((uint8_t volatile*)pt, *(uint8_t* )pv);
break;
case 2:
- __stlr16((unsigned __int16 volatile*)pt, *(unsigned __int16*)pv);
+ __stlr16((uint16_t volatile*)pt, *(uint16_t*)pv);
break;
case 4:
- __stlr32((unsigned __int32 volatile*)pt, *(unsigned __int32*)pv);
+ __stlr32((uint32_t volatile*)pt, *(uint32_t*)pv);
break;
case 8:
- __stlr64((unsigned __int64 volatile*)pt, *(unsigned __int64*)pv);
+ __stlr64((uint64_t volatile*)pt, *(uint64_t*)pv);
break;
default:
__dmb(_ARM64_BARRIER_ISH);
diff --git a/src/coreclr/gc/gc.cpp b/src/coreclr/gc/gc.cpp
index e43047cf6e11..79b4b9ee2383 100644
--- a/src/coreclr/gc/gc.cpp
+++ b/src/coreclr/gc/gc.cpp
@@ -386,9 +386,15 @@ int relative_index_power2_free_space (size_t power2)
return ((index < MIN_INDEX_POWER2) ? -1 : (index - MIN_INDEX_POWER2));
}
+inline
+float mb (size_t num)
+{
+ return (float)((float)num / 1000.0 / 1000.0);
+}
+
#ifdef BACKGROUND_GC
uint32_t bgc_alloc_spin_count = 140;
-uint32_t bgc_alloc_spin_count_loh = 16;
+uint32_t bgc_alloc_spin_count_uoh = 16;
uint32_t bgc_alloc_spin = 2;
inline
@@ -2657,13 +2663,10 @@ size_t gc_heap::end_loh_size = 0;
size_t gc_heap::bgc_begin_poh_size = 0;
size_t gc_heap::end_poh_size = 0;
+size_t gc_heap::uoh_a_no_bgc[uoh_generation_count] = {};
+size_t gc_heap::uoh_a_bgc_marking[uoh_generation_count] = {};
+size_t gc_heap::uoh_a_bgc_planning[uoh_generation_count] = {};
#ifdef BGC_SERVO_TUNING
-uint64_t gc_heap::loh_a_no_bgc = 0;
-
-uint64_t gc_heap::loh_a_bgc_marking = 0;
-
-uint64_t gc_heap::loh_a_bgc_planning = 0;
-
size_t gc_heap::bgc_maxgen_end_fl_size = 0;
#endif //BGC_SERVO_TUNING
@@ -2794,9 +2797,9 @@ FinalizerWorkItem* gc_heap::finalizer_work;
BOOL gc_heap::proceed_with_gc_p = FALSE;
GCSpinLock gc_heap::gc_lock;
-#ifdef BGC_SERVO_TUNING
-uint64_t gc_heap::total_loh_a_last_bgc = 0;
-#endif //BGC_SERVO_TUNING
+#ifdef BACKGROUND_GC
+uint64_t gc_heap::total_uoh_a_last_bgc = 0;
+#endif //BACKGROUND_GC
#ifdef USE_REGIONS
region_free_list gc_heap::global_regions_to_decommit[count_free_region_kinds];
@@ -6970,6 +6973,7 @@ void gc_heap::gc_thread_function ()
{
assert (dynamic_adaptation_mode == dynamic_adaptation_to_application_sizes);
+ wait_on_time_out_p = true;
dynamic_heap_count_data_t::sample& sample = dynamic_heap_count_data.samples[dynamic_heap_count_data.sample_index];
wait_time = min (wait_time, (uint32_t)(sample.elapsed_between_gcs / 1000 / 3));
wait_time = max (wait_time, 1u);
@@ -15039,10 +15043,13 @@ gc_heap::init_gc_heap (int h_number)
make_mark_stack(arr);
#ifdef BACKGROUND_GC
+ for (int i = uoh_start_generation; i < total_generation_count; i++)
+ {
+ uoh_a_no_bgc[i - uoh_start_generation] = 0;
+ uoh_a_bgc_marking[i - uoh_start_generation] = 0;
+ uoh_a_bgc_planning[i - uoh_start_generation] = 0;
+ }
#ifdef BGC_SERVO_TUNING
- loh_a_no_bgc = 0;
- loh_a_bgc_marking = 0;
- loh_a_bgc_planning = 0;
bgc_maxgen_end_fl_size = 0;
#endif //BGC_SERVO_TUNING
freeable_soh_segment = 0;
@@ -18424,6 +18431,31 @@ bool gc_heap::should_retry_other_heap (int gen_number, size_t size)
}
}
+#ifdef BACKGROUND_GC
+void gc_heap::bgc_record_uoh_allocation(int gen_number, size_t size)
+{
+ assert((gen_number >= uoh_start_generation) && (gen_number < total_generation_count));
+
+ if (gc_heap::background_running_p())
+ {
+ background_uoh_alloc_count++;
+
+ if (current_c_gc_state == c_gc_state_planning)
+ {
+ uoh_a_bgc_planning[gen_number - uoh_start_generation] += size;
+ }
+ else
+ {
+ uoh_a_bgc_marking[gen_number - uoh_start_generation] += size;
+ }
+ }
+ else
+ {
+ uoh_a_no_bgc[gen_number - uoh_start_generation] += size;
+ }
+}
+#endif //BACKGROUND_GC
+
allocation_state gc_heap::allocate_uoh (int gen_number,
size_t size,
alloc_context* acontext,
@@ -18446,26 +18478,12 @@ allocation_state gc_heap::allocate_uoh (int gen_number,
#endif //RECORD_LOH_STATE
#ifdef BACKGROUND_GC
+ bgc_record_uoh_allocation(gen_number, size);
+
if (gc_heap::background_running_p())
{
-#ifdef BGC_SERVO_TUNING
- bool planning_p = (current_c_gc_state == c_gc_state_planning);
-#endif //BGC_SERVO_TUNING
-
- background_uoh_alloc_count++;
- //if ((background_loh_alloc_count % bgc_alloc_spin_count_loh) == 0)
+ //if ((background_uoh_alloc_count % bgc_alloc_spin_count_uoh) == 0)
{
-#ifdef BGC_SERVO_TUNING
- if (planning_p)
- {
- loh_a_bgc_planning += size;
- }
- else
- {
- loh_a_bgc_marking += size;
- }
-#endif //BGC_SERVO_TUNING
-
int spin_for_allocation = (gen_number == loh_generation) ?
bgc_loh_allocate_spin() :
bgc_poh_allocate_spin();
@@ -18491,12 +18509,6 @@ allocation_state gc_heap::allocate_uoh (int gen_number,
}
}
}
-#ifdef BGC_SERVO_TUNING
- else
- {
- loh_a_no_bgc += size;
- }
-#endif //BGC_SERVO_TUNING
#endif //BACKGROUND_GC
gc_reason gr = reason_oos_loh;
@@ -20954,14 +20966,14 @@ size_t gc_heap::get_total_allocated_since_last_gc()
{
gc_heap* hp = gc_heap::g_heaps[i];
#else //MULTIPLE_HEAPS
- {
- gc_heap* hp = pGenGCHeap;
+ {
+ gc_heap* hp = pGenGCHeap;
#endif //MULTIPLE_HEAPS
- total_allocated_size += hp->allocated_since_last_gc[0] + hp->allocated_since_last_gc[1];
- hp->allocated_since_last_gc[0] = 0;
- hp->allocated_since_last_gc[1] = 0;
- }
- return total_allocated_size;
+ total_allocated_size += hp->allocated_since_last_gc[0] + hp->allocated_since_last_gc[1];
+ hp->allocated_since_last_gc[0] = 0;
+ hp->allocated_since_last_gc[1] = 0;
+ }
+ return total_allocated_size;
}
// Gets what's allocated on both SOH, LOH, etc that hasn't been collected.
@@ -22023,20 +22035,44 @@ void gc_heap::update_end_gc_time_per_heap()
#ifdef DYNAMIC_HEAP_COUNT
if ((heap_number == 0) && (dynamic_adaptation_mode == dynamic_adaptation_to_application_sizes))
{
+ size_t desired_per_heap = dd_desired_allocation (dynamic_data_of (0));
if (settings.gc_index > 1)
{
+ size_t gc_index = VolatileLoadWithoutBarrier (&settings.gc_index);
dynamic_heap_count_data_t::sample& sample = dynamic_heap_count_data.samples[dynamic_heap_count_data.sample_index];
sample.elapsed_between_gcs = end_gc_time - last_suspended_end_time;
sample.gc_pause_time = dd_gc_elapsed_time (dynamic_data_of (0));
sample.msl_wait_time = get_msl_wait_time ();
+ sample.gc_index = gc_index;
// could cache this - we will get it again soon in do_post_gc
sample.gc_survived_size = get_total_promoted ();
- dprintf (6666, ("sample#%d: this GC end %I64d - last sus end %I64d = %I64d, this GC pause %I64d, msl wait %I64d",
- dynamic_heap_count_data.sample_index, end_gc_time, last_suspended_end_time, sample.elapsed_between_gcs, sample.gc_pause_time, sample.msl_wait_time));
+ // We check to see if we want to adjust the budget here for DATAS.
+ size_t desired_per_heap_datas = desired_per_heap;
+ float tcp = (sample.elapsed_between_gcs ?
+ (((float)sample.msl_wait_time / n_heaps + sample.gc_pause_time) * 100.0f / (float)sample.elapsed_between_gcs) : 0.0f);
+ size_t total_soh_stable_size = get_total_soh_stable_size();
+ desired_per_heap_datas = dynamic_heap_count_data.compute_gen0_budget_per_heap (total_soh_stable_size, tcp, desired_per_heap);
+ dprintf (6666, ("gen0 new_alloc %Id (%.3fmb), from datas: %Id (%.3fmb)",
+ desired_per_heap, mb (desired_per_heap), desired_per_heap_datas, mb (desired_per_heap_datas)));
+ dprintf (6666, ("budget DATAS %Id, previous %Id", desired_per_heap_datas, desired_per_heap));
+
+ sample.gen0_budget_per_heap = (int)desired_per_heap_datas;
+ if (desired_per_heap_datas != desired_per_heap)
+ {
+ dprintf (6666, ("adjusted budget for DATAS, assigning to all heaps"));
+ assign_new_budget (0, desired_per_heap_datas);
+ }
+
+ dprintf (6666, ("sample#%d: %d heaps, this GC end %I64d - last sus end %I64d = %I64d, this GC pause %.3fms, msl wait %I64dus, tcp %.3f, surv %zd, gc speed %.3fmb/ms (%.3fkb/ms/heap)",
+ dynamic_heap_count_data.sample_index, n_heaps, end_gc_time, last_suspended_end_time, sample.elapsed_between_gcs,
+ (sample.gc_pause_time / 1000.0), sample.msl_wait_time, ((float)((sample.msl_wait_time / n_heaps) + sample.gc_pause_time) * 100.0 / (float)sample.elapsed_between_gcs),
+ sample.gc_survived_size,
+ (sample.gc_pause_time ? (sample.gc_survived_size / 1000.0 / sample.gc_pause_time) : 0),
+ (sample.gc_pause_time ? ((float)sample.gc_survived_size / sample.gc_pause_time / n_heaps) : 0)));
GCEventFireHeapCountSample_V1 (
- (uint64_t)VolatileLoadWithoutBarrier (&settings.gc_index),
+ (uint64_t)gc_index,
sample.elapsed_between_gcs,
sample.gc_pause_time,
sample.msl_wait_time);
@@ -22061,6 +22097,17 @@ void gc_heap::update_end_gc_time_per_heap()
calculate_new_heap_count ();
}
+ else
+ {
+ // For DATAS we can't just take the BCS because it's likely very large and that could totally make the max heap size larger. We just take the
+ // min budget.
+ size_t min_desired = dd_min_size (dynamic_data_of (0));
+ if (min_desired != desired_per_heap)
+ {
+ dprintf (6666, ("use the min budget for DATAS, assigning to all heaps"));
+ assign_new_budget (0, min_desired);
+ }
+ }
last_suspended_end_time = end_gc_time;
}
@@ -22527,14 +22574,6 @@ void gc_heap::gc1()
limit = total_generation_count-1;
}
- size_t total_max_gen_size = 0;
- for (int i = 0; i < gc_heap::n_heaps; i++)
- {
- gc_heap* hp = gc_heap::g_heaps[i];
- dynamic_data* dd = hp->dynamic_data_of (max_generation);
- total_max_gen_size += dd_current_size (dd) + dd_desired_allocation (dd);
- }
-
for (int gen = 0; gen <= limit; gen++)
{
size_t total_desired = 0;
@@ -22569,18 +22608,6 @@ void gc_heap::gc1()
if (gen == 0)
{
-#ifdef DYNAMIC_HEAP_COUNT
- if (dynamic_adaptation_mode == dynamic_adaptation_to_application_sizes)
- {
- size_t new_allocation_datas = dynamic_heap_count_data.compute_gen0_new_allocation (total_max_gen_size);
- new_allocation_datas = Align (new_allocation_datas, get_alignment_constant (gen <= max_generation));
- dprintf (6666, ("gen0 new_alloc %Id (%.3fmb), from datas: %Id (%.3fmb)",
- desired_per_heap, ((double)desired_per_heap / 1000.0 / 1000.0),
- new_allocation_datas, ((double)new_allocation_datas / 1000.0 / 1000.0)));
- desired_per_heap = min (desired_per_heap, new_allocation_datas);
- }
-#endif //DYNAMIC_HEAP_COUNT
-
// to avoid spikes in mem usage due to short terms fluctuations in survivorship,
// apply some smoothing.
size_t desired_per_heap_before_smoothing = desired_per_heap;
@@ -22607,9 +22634,10 @@ void gc_heap::gc1()
}
}
#ifdef HOST_64BIT
+ size_t desired_per_heap_before_trim = desired_per_heap;
desired_per_heap = joined_youngest_desired (desired_per_heap);
- dprintf (6666, ("final gen0 new_alloc: total desired: %Id (%.3fmb/heap), before smooth %zd -> after smooth %zd -> after joined %zd",
+ dprintf (6666, ("final gen0 bcs: total desired: %Id (%.3fmb/heap), before smooth %zd -> after smooth %zd -> after joined %zd",
total_desired, ((double)(total_desired / n_heaps)/ 1000.0 / 1000.0),
desired_per_heap_before_smoothing, desired_per_heap_after_smoothing, desired_per_heap));
#endif // HOST_64BIT
@@ -22772,6 +22800,47 @@ void gc_heap::gc1()
}
#ifdef DYNAMIC_HEAP_COUNT
+size_t gc_heap::get_total_soh_stable_size()
+{
+ size_t total_stable_size = 0;
+ bool use_max_gen_p = (dynamic_heap_count_data.current_gen2_samples_count > 0);
+ int gen_number = max_generation;
+ for (int i = 0; i < gc_heap::n_heaps; i++)
+ {
+ gc_heap* hp = g_heaps[i];
+
+ if (use_max_gen_p)
+ {
+ dynamic_data* dd = hp->dynamic_data_of (gen_number);
+ total_stable_size += dd_current_size (dd) + dd_desired_allocation (dd);
+ }
+ else
+ {
+ total_stable_size += hp->generation_size (max_generation - 1) / 2;
+ }
+ }
+
+ return total_stable_size;
+}
+
+void gc_heap::assign_new_budget (int gen_number, size_t desired_per_heap)
+{
+ for (int i = 0; i < gc_heap::n_heaps; i++)
+ {
+ gc_heap* hp = gc_heap::g_heaps[i];
+ dynamic_data* dd = hp->dynamic_data_of (gen_number);
+ dd_desired_allocation (dd) = desired_per_heap;
+ dd_gc_new_allocation (dd) = desired_per_heap;
+ dd_new_allocation (dd) = desired_per_heap;
+ if (gen_number == 0)
+ {
+ hp->fgn_last_alloc = desired_per_heap;
+ }
+ }
+
+ gc_data_global.final_youngest_desired = desired_per_heap;
+}
+
bool gc_heap::prepare_rethread_fl_items()
{
if (!min_fl_list)
@@ -24244,9 +24313,6 @@ size_t gc_heap::get_promoted_bytes()
dprintf (3, ("h%d getting surv", heap_number));
size_t promoted = 0;
-#ifdef _MSC_VER
-#pragma loop(no_vector)
-#endif
for (size_t i = 0; i < region_count; i++)
{
if (survived_per_region[i] > 0)
@@ -25209,7 +25275,7 @@ float mean (float* arr, int size)
int max_times_to_print_tcp = 0;
// Return the slope, and the average values in the avg arg.
-float slope (float* y, int n, float* avg)
+float gc_heap::dynamic_heap_count_data_t::slope (float* y, int n, float* avg)
{
assert (n > 0);
@@ -25250,7 +25316,7 @@ float slope (float* y, int n, float* avg)
return (numerator / denominator);
}
-int gc_heap::calculate_new_heap_count ()
+void gc_heap::calculate_new_heap_count ()
{
assert (dynamic_adaptation_mode == dynamic_adaptation_to_application_sizes);
@@ -25262,7 +25328,7 @@ int gc_heap::calculate_new_heap_count ()
(dynamic_heap_count_data.current_gen2_samples_count < (dynamic_heap_count_data.processed_gen2_samples_count + dynamic_heap_count_data_t::sample_size)))
{
dprintf (6666, ("not enough GCs, skipping"));
- return n_heaps;
+ return;
}
bool process_eph_samples_p = (dynamic_heap_count_data.current_samples_count >= (dynamic_heap_count_data.processed_samples_count + dynamic_heap_count_data_t::sample_size));
@@ -25281,12 +25347,14 @@ int gc_heap::calculate_new_heap_count ()
for (int i = 0; i < dynamic_heap_count_data_t::sample_size; i++)
{
dynamic_heap_count_data_t::sample& sample = dynamic_heap_count_data.samples[i];
+ assert (sample.elapsed_between_gcs > 0);
throughput_cost_percents[i] = (sample.elapsed_between_gcs ? (((float)sample.msl_wait_time / n_heaps + sample.gc_pause_time) * 100.0f / (float)sample.elapsed_between_gcs) : 0.0f);
assert (throughput_cost_percents[i] >= 0.0);
if (throughput_cost_percents[i] > 100.0)
throughput_cost_percents[i] = 100.0;
- dprintf (6666, ("sample %d: msl %I64d / %d + pause %I64d / elapsed %I64d = throughput_cost_percent: %.3f", i,
- sample.msl_wait_time, n_heaps, sample.gc_pause_time, sample.elapsed_between_gcs, throughput_cost_percents[i]));
+ dprintf (6666, ("sample %d in GC#%Id msl %I64d / %d + pause %I64d / elapsed %I64d = tcp: %.3f, surv %zd, gc speed %zd/ms", i,
+ sample.gc_index, sample.msl_wait_time, n_heaps, sample.gc_pause_time, sample.elapsed_between_gcs, throughput_cost_percents[i],
+ sample.gc_survived_size, (sample.gc_pause_time ? (sample.gc_survived_size * 1000 / sample.gc_pause_time) : 0)));
}
float median_throughput_cost_percent = median_of_3 (throughput_cost_percents[0], throughput_cost_percents[1], throughput_cost_percents[2]);
@@ -25328,80 +25396,12 @@ int gc_heap::calculate_new_heap_count ()
median_throughput_cost_percent = min_tcp;
}
- // apply exponential smoothing and use 1/3 for the smoothing factor
- const float smoothing = 3;
- float smoothed_median_throughput_cost_percent = dynamic_heap_count_data.smoothed_median_throughput_cost_percent;
- if (smoothed_median_throughput_cost_percent != 0.0f)
- {
- // average it with the previous value
- smoothed_median_throughput_cost_percent = median_throughput_cost_percent / smoothing + (smoothed_median_throughput_cost_percent / smoothing) * (smoothing - 1);
- }
- else
- {
- smoothed_median_throughput_cost_percent = median_throughput_cost_percent;
- }
-
- dprintf (6666, ("median tcp: %.3f, smoothed tcp: %.3f, avg tcp: %.3f, gen2 tcp %.3f(%.3f, %.3f, %.3f)",
- median_throughput_cost_percent, smoothed_median_throughput_cost_percent, avg_throughput_cost_percent, median_gen2_tcp_percent,
+ dprintf (6666, ("median tcp: %.3f, avg tcp: %.3f, gen2 tcp %.3f(%.3f, %.3f, %.3f)",
+ median_throughput_cost_percent, avg_throughput_cost_percent, median_gen2_tcp_percent,
dynamic_heap_count_data.gen2_samples[0].gc_percent, dynamic_heap_count_data.gen2_samples[1].gc_percent, dynamic_heap_count_data.gen2_samples[2].gc_percent));
- //
- // I'm keeping the old logic for now just to handle gen2.
- //
- size_t heap_size = 0;
- for (int i = 0; i < n_heaps; i++)
- {
- gc_heap* hp = g_heaps[i];
-
- for (int gen_idx = 0; gen_idx < total_generation_count; gen_idx++)
- {
- dynamic_data* dd = hp->dynamic_data_of (gen_idx);
-
- // estimate the size of each generation as the live data size plus the budget
- heap_size += dd_current_size (dd) + dd_desired_allocation (dd);
- dprintf (3, ("h%d g%d current: %zd desired allocation: %zd", i, gen_idx, dd_promoted_size (dd), dd_desired_allocation (dd)));
- }
- }
-
- // estimate the space cost of adding a heap as the min gen0 budget
- size_t heap_space_cost_per_heap = dd_min_size (g_heaps[0]->dynamic_data_of (0));
-
- // compute the % space cost of adding a heap
- float percent_heap_space_cost_per_heap = heap_space_cost_per_heap * 100.0f / heap_size;
-
- // compute reasonable step sizes for the heap count
- //
- // on the way up, we essentially multiply the heap count by 1.5, so we go 1, 2, 3, 5, 8 ...
- // we don't go all the way to the number of CPUs, but stay 1 or 2 short
- int step_up = (n_heaps + 1) / 2;
int extra_heaps = (n_max_heaps >= 16) + (n_max_heaps >= 64);
int actual_n_max_heaps = n_max_heaps - extra_heaps;
- int max_growth = max ((n_max_heaps / 4), (1 + (actual_n_max_heaps > 3)));
-
- step_up = min (step_up, (actual_n_max_heaps - n_heaps));
-
- // on the way down, we essentially divide the heap count by 1.5
- int step_down = (n_heaps + 1) / 3;
-
- // estimate the potential time benefit of going up a step
- float tcp_reduction_per_step_up = smoothed_median_throughput_cost_percent * step_up / (n_heaps + step_up);
-
- // estimate the potential time cost of going down a step
- float tcp_increase_per_step_down = smoothed_median_throughput_cost_percent * step_down / (n_heaps - step_down);
-
- // estimate the potential space cost of going up a step
- float scp_increase_per_step_up = percent_heap_space_cost_per_heap * step_up;
-
- // estimate the potential space saving of going down a step
- float scp_decrease_per_step_down = percent_heap_space_cost_per_heap * step_down;
-
- dprintf (6666, ("[CHP] u %d, d %d | space cost %Id / heap %Id(%.2fmb) = scp %.3f (u: %.3f, d: %.3f) | stcp %.3f, u * %.1f = %.3f, d * %.1f = %.3f",
- step_up, step_down,
- heap_space_cost_per_heap, heap_size, ((float)heap_size / (float)1000 / (float)1000), percent_heap_space_cost_per_heap,
- scp_increase_per_step_up, scp_decrease_per_step_down,
- smoothed_median_throughput_cost_percent,
- ((float)step_up / (float)(n_heaps + step_up)), tcp_reduction_per_step_up,
- ((float)step_down / (float)(n_heaps - step_down)), tcp_increase_per_step_down));
#ifdef STRESS_DYNAMIC_HEAP_COUNT
// quick hack for initial testing
@@ -25417,357 +25417,133 @@ int gc_heap::calculate_new_heap_count ()
#else //STRESS_DYNAMIC_HEAP_COUNT
int new_n_heaps = n_heaps;
- // target_tcp should be configurable.
- float target_tcp = 5.0;
- float target_gen2_tcp = 10.0;
- float log_base = (float)1.11;
-
- dynamic_heap_count_data.add_to_recorded_tcp (median_throughput_cost_percent);
-
- // This is the average of whatever is in the recorded tcp buffer.
- float avg_recorded_tcp = 0.0;
-
- size_t num_gcs_since_last_change = current_gc_index - dynamic_heap_count_data.last_changed_gc_index;
+ float target_tcp = dynamic_heap_count_data.target_tcp;
+ float target_gen2_tcp = dynamic_heap_count_data.target_gen2_tcp;
if (process_eph_samples_p)
{
- dynamic_heap_count_data.last_processed_stcp = smoothed_median_throughput_cost_percent;
-
- if ((median_throughput_cost_percent > 10.0f) || (smoothed_median_throughput_cost_percent > target_tcp))
- {
- // If median is high but stcp is lower than target, and if this situation continues, stcp will quickly be above target anyway; otherwise
- // we treat it as an outlier.
- if (smoothed_median_throughput_cost_percent >= (target_tcp + 1.0))
- {
- float step_up_float = (float)(1 + actual_n_max_heaps * log_with_base ((smoothed_median_throughput_cost_percent - target_tcp), log_base) / 100.0);
- int step_up_int = (int)step_up_float;
-
- dprintf (6666, ("[CHP0] inc %d(%.3f), last inc %d, %Id GCs elapsed, last stcp %.3f",
- step_up_int, step_up_float, (int)dynamic_heap_count_data.last_changed_count,
- num_gcs_since_last_change, dynamic_heap_count_data.last_changed_stcp));
-
- // Don't adjust if we just adjusted last time we checked, unless we are in an extreme situation.
- if ((smoothed_median_throughput_cost_percent < 20.0f) &&
- (avg_throughput_cost_percent < 20.0f) &&
- (num_gcs_since_last_change < (2 * dynamic_heap_count_data_t::sample_size)))
- {
- dprintf (6666, ("[CHP0] we just adjusted %Id GCs ago, skipping", num_gcs_since_last_change));
- }
- else
- {
- if (step_up_int)
- {
- if (dynamic_heap_count_data.dec_failure_count)
- {
- dprintf (6666, ("[CHP0] intending to grow, reset dec failure count (was %d)", dynamic_heap_count_data.dec_failure_count));
- dynamic_heap_count_data.dec_failure_count = 0;
- }
-
- if (((int)dynamic_heap_count_data.last_changed_count > 0) && (dynamic_heap_count_data.last_changed_gc_index > 0.0) &&
- (num_gcs_since_last_change <= (3 * dynamic_heap_count_data_t::sample_size)))
- {
- dprintf (6666, ("[CHP0-0] just grew %d GCs ago, no change", num_gcs_since_last_change));
- step_up_int = 0;
- }
- else
- {
- // If the calculation tells us to grow, we should check to see if the slope has been coming down rapidly, if so there's no reason to grow.
- int above_target_tcp_count = dynamic_heap_count_data.rearrange_recorded_tcp ();
- float above_target_tcp_slope = slope (dynamic_heap_count_data.recorded_tcp_rearranged, above_target_tcp_count, &avg_recorded_tcp);
- float diff_pct = (target_tcp - avg_recorded_tcp) / target_tcp;
- float adjusted_target_tcp = dynamic_heap_count_data.get_range_upper (target_tcp);
-
- dprintf (6666, ("[CHP0] slope of last %d samples is %.3f. avg %.3f (%.3f%%), current tcp %.3f, adjusted target is %.3f, failure count is %d",
- above_target_tcp_count, above_target_tcp_slope, avg_recorded_tcp, (diff_pct * 100.0),
- median_throughput_cost_percent, adjusted_target_tcp, dynamic_heap_count_data.inc_failure_count));
-
- if (dynamic_heap_count_data.is_tcp_in_range (diff_pct, above_target_tcp_slope))
- {
- step_up_int = 0;
- dprintf (6666, ("[CHP0-1] slope %.3f and already close to target %.3f (%.3f%%), no change", above_target_tcp_slope, avg_recorded_tcp, (diff_pct * 100.0)));
- }
- else
- {
- if (above_target_tcp_slope < 0.0)
- {
- // If we are already trending down and the tcp is small enough, just wait.
- if ((median_throughput_cost_percent < adjusted_target_tcp) || (avg_recorded_tcp < adjusted_target_tcp))
- {
- step_up_int = 0;
- dprintf (6666, ("[CHP0-2] trending down, slope is %.3f, tcp is %.3f, avg is %.3f, already below adjusted target %.3f, no change",
- above_target_tcp_slope, median_throughput_cost_percent, avg_recorded_tcp, adjusted_target_tcp));
- }
- }
- else
- {
- // We are trending up, but we have too few samples and the avg is already small enough.
- if ((above_target_tcp_count <= dynamic_heap_count_data.inc_recheck_threshold) && (avg_recorded_tcp < adjusted_target_tcp))
- {
- step_up_int = 0;
- dprintf (6666, ("[CHP0-3] trending up, only %d samples, slope is %.3f, avg is %.3f already below adjusted target %.3f, no change",
- above_target_tcp_count, above_target_tcp_slope, avg_recorded_tcp, adjusted_target_tcp));
- }
- }
- }
- }
-
- // If we still decided to grow, check if we need to grow aggressively.
- if (step_up_int)
- {
- if (((int)dynamic_heap_count_data.last_changed_count > 0) && (dynamic_heap_count_data.last_changed_gc_index > 0.0))
- {
- if (num_gcs_since_last_change > (16 * dynamic_heap_count_data_t::sample_size))
- {
- dynamic_heap_count_data.inc_failure_count = 0;
- dprintf (6666, ("[CHP0-4] grew %d GCs ago, too far in the past, set aggressive factor to 0, grow from %d -> %d more heaps",
- num_gcs_since_last_change, dynamic_heap_count_data.inc_failure_count, step_up_int, (step_up_int * (dynamic_heap_count_data.inc_failure_count + 1))));
- }
- else
- {
- (dynamic_heap_count_data.inc_failure_count)++;
- dprintf (6666, ("[CHP0-4] grew %d GCs ago, aggressive factor is %d, grow more aggressively from %d -> %d more heaps",
- num_gcs_since_last_change, dynamic_heap_count_data.inc_failure_count, step_up_int, (step_up_int * (dynamic_heap_count_data.inc_failure_count + 1))));
- }
- step_up_int *= dynamic_heap_count_data.inc_failure_count + 1;
- }
- }
- }
+ dynamic_heap_count_data.add_to_recorded_tcp (median_throughput_cost_percent);
- step_up_int = min (step_up_int, max_growth);
-
- new_n_heaps = n_heaps + step_up_int;
- new_n_heaps = min (new_n_heaps, actual_n_max_heaps);
-
- // If we are going to grow to be very close to max heap, it's better to just grow to it.
- if ((new_n_heaps < actual_n_max_heaps) && dynamic_heap_count_data.is_close_to_max (new_n_heaps, actual_n_max_heaps))
- {
- dprintf (6666, ("[CHP0-5] %d is close to max heaps %d, grow to max", new_n_heaps, actual_n_max_heaps));
- new_n_heaps = actual_n_max_heaps;
- }
-
- if (new_n_heaps > n_heaps)
- {
- dynamic_heap_count_data.last_changed_gc_index = current_gc_index;
- dynamic_heap_count_data.last_changed_count = step_up_float;
- dynamic_heap_count_data.last_changed_stcp = smoothed_median_throughput_cost_percent;
- }
-
- dprintf (6666, ("[CHP0] tcp %.3f, stcp %.3f -> (%d -> %.3f) -> %d + %d = %d -> %d",
- median_throughput_cost_percent, smoothed_median_throughput_cost_percent,
- actual_n_max_heaps, step_up_float, step_up_int, n_heaps, (n_heaps + step_up_int), new_n_heaps));
- }
- }
- }
- else
+ float tcp_to_consider = 0.0;
+ if (dynamic_heap_count_data.should_change (median_throughput_cost_percent, &tcp_to_consider, current_gc_index))
{
- // When we are below target, we accumulate the distance to target and only adjust when we've accumulated enough in this state. Note that
- // this can include tcp's that are slightly above target, as long as it's not high enough for us to adjust the heap count. If we are just
- // oscillating around target, this makes those tcp's cancel each other out.
- if (dynamic_heap_count_data.below_target_accumulation == 0)
+ size_t total_soh_stable_size = get_total_soh_stable_size();
+ size_t total_bcd = dynamic_heap_count_data.compute_total_gen0_budget (total_soh_stable_size);
+ int max_heap_count_datas = (int)(total_bcd / dynamic_heap_count_data.min_gen0_new_allocation);
+ int min_heap_count_datas = (int)(total_bcd / dynamic_heap_count_data.max_gen0_new_allocation);
+ int max_heap_count_growth_step = dynamic_heap_count_data.get_max_growth (n_heaps);
+ int max_heap_count_growth_datas = max_heap_count_datas - n_heaps;
+ if (max_heap_count_growth_datas < 0)
{
- dynamic_heap_count_data.first_below_target_gc_index = current_gc_index;
- dynamic_heap_count_data.init_recorded_tcp ();
- dynamic_heap_count_data.add_to_recorded_tcp (median_throughput_cost_percent);
+ max_heap_count_growth_datas = 0;
}
- dprintf (6666, ("[CHP1] last time adjusted %s by %d at GC#%Id (%Id GCs since), stcp was %.3f, now stcp is %.3f",
- ((dynamic_heap_count_data.last_changed_count > 0.0) ? "up" : "down"), (int)dynamic_heap_count_data.last_changed_count,
- dynamic_heap_count_data.last_changed_gc_index, num_gcs_since_last_change,
- dynamic_heap_count_data.last_changed_stcp, smoothed_median_throughput_cost_percent));
+ int max_heap_count_growth_core = actual_n_max_heaps - n_heaps;
+ int max_heap_count_growth = min (max_heap_count_growth_step, min (max_heap_count_growth_datas, max_heap_count_growth_core));
- float below_target_diff = target_tcp - median_throughput_cost_percent;
- dynamic_heap_count_data.below_target_accumulation += below_target_diff;
+ float distance = tcp_to_consider - target_tcp;
- dprintf (6666, ("[CHP1] below target for the past %Id GCs, accumulated %.3f, min (10%% of max is %.2f, 20%% of hc is %.2f)",
- (current_gc_index - dynamic_heap_count_data.first_below_target_gc_index), dynamic_heap_count_data.below_target_accumulation,
- (actual_n_max_heaps * 0.1), (n_heaps * 0.2)));
+ dprintf (6666, ("median tcp %.3f, recent tcp %.3f - target %.1f = %.3f", median_throughput_cost_percent, tcp_to_consider, target_tcp, distance));
- if (dynamic_heap_count_data.below_target_accumulation >= dynamic_heap_count_data.below_target_threshold)
+ float diff_pct = distance / target_tcp;
+ // Different for above and below target to avoid oscillation.
+ float hc_change_factor = (float)((diff_pct > 0.0) ? 1.5 : 3.0);
+ float change_float = diff_pct / hc_change_factor * (float)n_heaps;
+ float change_float_rounded = (float)round(change_float);
+ int change_int = (int)change_float_rounded;
+ dprintf (6666, ("diff pct %.3f / %.1f * %d = %d (%.3f), max hc allowed by datas %d | by core %d, max growth per step %d, max growth by datas %d | by core %d",
+ diff_pct, hc_change_factor, n_heaps, change_int, ((float)change_int / n_heaps), max_heap_count_datas, actual_n_max_heaps,
+ max_heap_count_growth_step, max_heap_count_growth_datas, max_heap_count_growth_core));
+
+ if (change_int > 0)
{
- int below_target_tcp_count = dynamic_heap_count_data.rearrange_recorded_tcp ();
- float below_target_tcp_slope = slope (dynamic_heap_count_data.recorded_tcp_rearranged, below_target_tcp_count, &avg_recorded_tcp);
- float diff_pct = (target_tcp - smoothed_median_throughput_cost_percent) / target_tcp;
- int step_down_int = (int)(diff_pct / 2.0 * n_heaps);
- if ((step_down_int == 0) && dynamic_heap_count_data.is_tcp_far_below (diff_pct))
+ int agg_factor = dynamic_heap_count_data.get_aggressiveness (change_int);
+ if (agg_factor > 1)
{
- dprintf (6666, ("[CHP1] we are far below target, reduce by 1 heap"));
- step_down_int = 1;
+ change_int *= agg_factor;
+ dprintf (6666, ("agg factor is %d, change by %d heaps", agg_factor, change_int));
}
+ }
- dprintf (6666, ("[CHP1] observed %d tcp's <= or ~ target, avg %.3f, slope %.3f, stcp %.3f%% below target, shrink by %.3f%% * %d = %d heaps",
- below_target_tcp_count, avg_recorded_tcp, below_target_tcp_slope, (diff_pct * 100.0), (diff_pct * 50.0), n_heaps, step_down_int));
+ if (change_int)
+ {
+ dynamic_heap_count_data_t::adjust_metric adj_metric = dynamic_heap_count_data.should_change_hc (max_heap_count_datas, min_heap_count_datas,
+ max_heap_count_growth, change_int, current_gc_index);
- bool shrink_p = false;
- if (dynamic_heap_count_data.is_tcp_in_range (diff_pct, below_target_tcp_slope))
+ // If we decide to change budget, we let the next GC calculate the right budget, ie, we delay changing by one GC which is acceptable.
+ if (adj_metric != dynamic_heap_count_data_t::adjust_metric::adjust_hc)
{
- step_down_int = 0;
- dprintf (6666, ("[CHP1-0] slope %.3f is flat and stcp is already close to target %.3f (%.3f%%), no change",
- below_target_tcp_slope, smoothed_median_throughput_cost_percent, (diff_pct * 100.0)));
- }
- else
- {
- // If we adjusted last time and it was unsuccessful, we need to inc our failure count.
- // If we have a non zero failure count, we don't want to adjust for a while if we continue to be in that same situation.
- bool last_dec_p = (dynamic_heap_count_data.last_changed_gc_index > 0) && (dynamic_heap_count_data.last_changed_count < 0.0);
- float last_dec_tcp_diff_pct = (last_dec_p ?
- ((smoothed_median_throughput_cost_percent - dynamic_heap_count_data.last_changed_stcp) / dynamic_heap_count_data.last_changed_stcp) : 0.0f);
- bool stable_p = last_dec_p && ((last_dec_tcp_diff_pct <= 0.2) && (last_dec_tcp_diff_pct >= -0.2));
- dprintf (6666, ("[CHP1] since last adjustment stcp changed %.3f->%.3f = %.3f%%, %s, dec_failure_count is %d",
- dynamic_heap_count_data.last_changed_stcp, smoothed_median_throughput_cost_percent, (last_dec_tcp_diff_pct * 100.0),
- (stable_p ? "stable" : "not stable"), dynamic_heap_count_data.dec_failure_count));
-
- bool check_dec_p = true;
-
- if (stable_p)
- {
- if (dynamic_heap_count_data.dec_failure_count)
- {
- (dynamic_heap_count_data.dec_failure_count)++;
- }
- else
- {
- dynamic_heap_count_data.dec_failure_count = 1;
- }
-
- if (dynamic_heap_count_data.dec_failure_count <= dynamic_heap_count_data.dec_failure_recheck_threshold)
- {
- check_dec_p = false;
- dprintf (6666, ("[CHP1-1] dec was still unsuccessful, <= %d, no change", dynamic_heap_count_data.dec_failure_recheck_threshold));
- }
- }
-
- if (check_dec_p)
- {
- dynamic_heap_count_data.dec_failure_count = 0;
-
- if (below_target_tcp_slope <= 0.0)
- {
- shrink_p = true;
- }
- else
- {
- // It's trending upwards, but if takes too many samples to get to target, we do want to shrink.
- int num_samples_to_goal = (int)((target_tcp + below_target_tcp_slope - median_throughput_cost_percent) / below_target_tcp_slope);
- bool far_below_goal_p = (num_samples_to_goal > (3 * dynamic_heap_count_data_t::sample_size));
- dprintf (6666, ("[CHP1] it'll take ((%.3f + %.3f - %.3f) / %.3f = %d) samples to get to target, %s",
- target_tcp, below_target_tcp_slope, median_throughput_cost_percent, below_target_tcp_slope,
- num_samples_to_goal, (far_below_goal_p ? "shrink" : "no change")));
-
- if (far_below_goal_p)
- {
- // We could be in a situation where the slope changes directions but since we only compute one number, we take another look at
- // the samples to make a better assessment by looking at the highest tcps and if their average is close to target, we don't shrink.
- //
- // TODO - we only check this when the slope is going up but since this includes the situation where the slope changes directions
- // we should really be checking this regardless of the slope to handle that.
- float highest_avg_tcp = 0.0;
- int highest_count = dynamic_heap_count_data.highest_avg_recorded_tcp (below_target_tcp_count, avg_recorded_tcp, &highest_avg_tcp);
- float highest_count_pct = (float)highest_count / (float)below_target_tcp_count;
-
- shrink_p = (highest_count_pct < 0.3) || (highest_avg_tcp < (target_tcp * 0.8));
- dprintf (6666, ("[CHP1-2] %d samples were above avg (%.3f%%), their avg is %.3f (%s)",
- highest_count, (highest_count_pct * 100.0), highest_avg_tcp, (shrink_p ? "shrink" : "no change")));
- }
- }
- }
+ change_int = 0;
}
- if (shrink_p && step_down_int && (new_n_heaps > step_down_int))
+ if (adj_metric != dynamic_heap_count_data_t::adjust_metric::not_adjusted)
{
- if (step_down_int == 1)
- {
- if (dynamic_heap_count_data.should_dec_by_one())
- {
- dprintf (6666, ("[CHP1-3] shrink by one heap"));
- }
- else
- {
- step_down_int = 0;
- dprintf (6666, ("[CHP1-3] don't shrink just yet if it's just one heap"));
- }
- }
- else
+ if (adj_metric == dynamic_heap_count_data_t::adjust_metric::adjust_hc)
{
- dynamic_heap_count_data.reset_dec_by_one();
- dprintf (6666, ("[CHP1-3] shrink by %d heap(s), reset dec by one", step_down_int));
+ new_n_heaps = n_heaps + change_int;
}
- new_n_heaps -= step_down_int;
- dprintf (6666, ("[CHP1] shrink by %d heaps -> %d", step_down_int, new_n_heaps));
+ dynamic_heap_count_data.record_adjustment (adj_metric, distance, change_int, current_gc_index);
}
-
- // Always reinit the buffer as we want to look at the more recent history.
- dynamic_heap_count_data.init_recorded_tcp ();
- dynamic_heap_count_data.below_target_accumulation = 0;
}
- if (new_n_heaps < n_heaps)
- {
- dynamic_heap_count_data.last_changed_gc_index = current_gc_index;
- dynamic_heap_count_data.last_changed_count = (float)(new_n_heaps - n_heaps);
- dynamic_heap_count_data.last_changed_stcp = smoothed_median_throughput_cost_percent;
- dprintf (6666, ("[CHP1] setting last changed gc index to %Id, count to %.3f, stcp to %.3f",
- dynamic_heap_count_data.last_changed_gc_index, dynamic_heap_count_data.last_changed_count, dynamic_heap_count_data.last_changed_stcp));
+ // We always need to reset these since we already made decisions based on them.
+ dynamic_heap_count_data.reset_accumulation();
+ dprintf (6666, ("changing HC or budget %d -> %d at GC#%Id", n_heaps, new_n_heaps, current_gc_index));
- if (dynamic_heap_count_data.inc_failure_count)
- {
- dprintf (6666, ("[CHP1] shrink, reset inc failure count (was %d)", dynamic_heap_count_data.inc_failure_count));
- dynamic_heap_count_data.inc_failure_count = 0;
- }
- }
+ dprintf (6666, ("total max gen %.3fmb, total bcd %.3fmb, diff %% %.3f-> +%d hc (%%%.3f)",
+ mb (total_soh_stable_size), mb (total_bcd), diff_pct, change_int, (change_int * 100.0 / n_heaps)));
}
}
if ((new_n_heaps == n_heaps) && !process_eph_samples_p && process_gen2_samples_p)
{
- // The gen2 samples only serve as a backstop so this is quite crude.
- if (median_gen2_tcp_percent > target_gen2_tcp)
+ // If we have already been processing eph samples, we don't need to process gen2.
+ if ((dynamic_heap_count_data.current_samples_count / dynamic_heap_count_data.current_gen2_samples_count) < 10)
{
- float step_up_percent = log_with_base ((median_gen2_tcp_percent - target_gen2_tcp + log_base), log_base);
- float step_up_float = (float)(step_up_percent / 100.0 * actual_n_max_heaps);
- new_n_heaps += (int)step_up_float;
- new_n_heaps = min (new_n_heaps, actual_n_max_heaps);
- dprintf (6666, ("[CHP2-0] gen2 tcp: %.3f, inc by %.3f%% = %d, %d -> %d", median_gen2_tcp_percent, step_up_percent, (int)step_up_float, n_heaps, new_n_heaps));
+ int step_up = (n_heaps + 1) / 2;
+ int max_growth = max ((n_max_heaps / 4), (1 + (actual_n_max_heaps > 3)));
+ step_up = min (step_up, (actual_n_max_heaps - n_heaps));
+
+ int step_down = (n_heaps + 1) / 3;
- if ((new_n_heaps < actual_n_max_heaps) && dynamic_heap_count_data.is_close_to_max (new_n_heaps, actual_n_max_heaps))
+ // The gen2 samples only serve as a backstop so this is quite crude.
+ if (median_gen2_tcp_percent > target_gen2_tcp)
{
- dprintf (6666, ("[CHP2-1] %d is close to max heaps %d, grow to max", new_n_heaps, actual_n_max_heaps));
- new_n_heaps = actual_n_max_heaps;
+ new_n_heaps += step_up;
+ new_n_heaps = min (new_n_heaps, actual_n_max_heaps);
+ dprintf (6666, ("[CHP2-0] gen2 tcp: %.3f, inc by %d + %d = %d", median_gen2_tcp_percent, step_up, n_heaps, new_n_heaps));
+
+ if ((new_n_heaps < actual_n_max_heaps) && dynamic_heap_count_data.is_close_to_max (new_n_heaps, actual_n_max_heaps))
+ {
+ dprintf (6666, ("[CHP2-1] %d is close to max heaps %d, grow to max", new_n_heaps, actual_n_max_heaps));
+ new_n_heaps = actual_n_max_heaps;
+ }
+ }
+ else if ((median_gen2_tcp_percent < (target_gen2_tcp / 2)) &&
+ ((dynamic_heap_count_data.current_gen2_samples_count - dynamic_heap_count_data.gen2_last_changed_sample_count) > 30))
+ {
+ new_n_heaps -= step_down;
+ dprintf (6666, ("[CHP3-0] last gen2 sample count when changed: %Id, gen2 tcp: %.3f, dec by %d, %d -> %d",
+ dynamic_heap_count_data.gen2_last_changed_sample_count, median_gen2_tcp_percent, step_down, n_heaps, new_n_heaps));
+ }
+
+ if (new_n_heaps != n_heaps)
+ {
+ dynamic_heap_count_data.gen2_last_changed_sample_count = dynamic_heap_count_data.current_gen2_samples_count;
}
- }
- else if ((dynamic_heap_count_data.last_processed_stcp < 1.0) &&
- (median_gen2_tcp_percent < (target_gen2_tcp / 2)) &&
- (scp_decrease_per_step_down - tcp_increase_per_step_down >= 1.0f))
- {
- new_n_heaps -= step_down;
- dprintf (6666, ("[CHP3-0] last eph stcp: %.3f, gen2 tcp: %.3f, dec by %d, %d -> %d",
- dynamic_heap_count_data.last_processed_stcp, median_gen2_tcp_percent, step_down, n_heaps, new_n_heaps));
}
}
assert (new_n_heaps >= 1);
assert (new_n_heaps <= actual_n_max_heaps);
-
#endif //STRESS_DYNAMIC_HEAP_COUNT
- // store data used for decision to emit in ETW event
- dynamic_heap_count_data.median_throughput_cost_percent = median_throughput_cost_percent;
- dynamic_heap_count_data.smoothed_median_throughput_cost_percent = smoothed_median_throughput_cost_percent;
- dynamic_heap_count_data.percent_heap_space_cost_per_heap = percent_heap_space_cost_per_heap;
- dynamic_heap_count_data.tcp_reduction_per_step_up = tcp_reduction_per_step_up;
- dynamic_heap_count_data.tcp_increase_per_step_down = tcp_increase_per_step_down;
- dynamic_heap_count_data.scp_increase_per_step_up = scp_increase_per_step_up;
- dynamic_heap_count_data.scp_decrease_per_step_down = scp_decrease_per_step_down;
-
+ float reserved_field = (float)0.0;
GCEventFireHeapCountTuning_V1 (
(uint16_t)dynamic_heap_count_data.new_n_heaps,
(uint64_t)VolatileLoadWithoutBarrier (&settings.gc_index),
- dynamic_heap_count_data.median_throughput_cost_percent,
- dynamic_heap_count_data.smoothed_median_throughput_cost_percent,
- dynamic_heap_count_data.tcp_reduction_per_step_up,
- dynamic_heap_count_data.tcp_increase_per_step_down,
- dynamic_heap_count_data.scp_increase_per_step_up,
- dynamic_heap_count_data.scp_decrease_per_step_down
- );
+ median_throughput_cost_percent,
+ reserved_field, reserved_field, reserved_field, reserved_field, reserved_field);
if (process_eph_samples_p)
{
@@ -25787,13 +25563,7 @@ int gc_heap::calculate_new_heap_count ()
VolatileLoadWithoutBarrier (&settings.gc_index), n_heaps, new_n_heaps, ((n_heaps < new_n_heaps) ? "INC" : "DEC")));
dynamic_heap_count_data.heap_count_to_change_to = new_n_heaps;
dynamic_heap_count_data.should_change_heap_count = true;
- dynamic_heap_count_data.init_recorded_tcp ();
- dynamic_heap_count_data.below_target_accumulation = 0;
- dynamic_heap_count_data.first_below_target_gc_index = current_gc_index;
- dprintf (6666, ("CHANGING HC, resetting tcp index, below target"));
}
-
- return new_n_heaps;
}
void gc_heap::check_heap_count ()
@@ -25833,9 +25603,6 @@ void gc_heap::check_heap_count ()
if (dynamic_heap_count_data.new_n_heaps == n_heaps)
{
- dynamic_heap_count_data.last_changed_gc_index = 0;
- dynamic_heap_count_data.last_changed_count = 0.0;
-
dynamic_heap_count_data.processed_samples_count = dynamic_heap_count_data.current_samples_count;
dynamic_heap_count_data.processed_gen2_samples_count = dynamic_heap_count_data.current_gen2_samples_count;
dynamic_heap_count_data.should_change_heap_count = false;
@@ -25886,8 +25653,6 @@ void gc_heap::check_heap_count ()
GCToEEInterface::RestartEE(TRUE);
dprintf (9999, ("h0 restarted EE"));
- dynamic_heap_count_data.smoothed_median_throughput_cost_percent = 0.0;
-
dprintf (6666, ("h0 finished changing, set should change to false!\n"));
dynamic_heap_count_data.should_change_heap_count = false;
}
@@ -26364,6 +26129,7 @@ bool gc_heap::change_heap_count (int new_n_heaps)
if (heap_number == 0)
{
change_heap_count_time = GetHighPrecisionTimeStamp() - start_time;
+ dprintf (6666, ("changing HC took %I64dus", change_heap_count_time));
}
return true;
@@ -29966,7 +29732,7 @@ void gc_heap::mark_phase (int condemned_gen_number)
#endif //MULTIPLE_HEAPS
{
#ifdef FEATURE_EVENT_TRACE
- record_mark_time (gc_time_info[time_plan - 1], current_mark_time, last_mark_time);
+ record_mark_time (gc_time_info[time_mark_long_weak], current_mark_time, last_mark_time);
gc_time_info[time_plan] = last_mark_time;
#endif //FEATURE_EVENT_TRACE
@@ -33964,26 +33730,12 @@ void gc_heap::plan_phase (int condemned_gen_number)
if (gc_t_join.joined())
#endif //MULTIPLE_HEAPS
{
-#ifdef FEATURE_EVENT_TRACE
- if (informational_event_enabled_p)
- {
- uint64_t current_time = GetHighPrecisionTimeStamp();
- gc_time_info[time_compact] = current_time - gc_time_info[time_compact];
- }
-#endif //FEATURE_EVENT_TRACE
-
#ifdef MULTIPLE_HEAPS
for (int i = 0; i < n_heaps; i++)
{
-#ifdef USE_REGIONS
- g_heaps [i]->rearrange_uoh_segments();
-#endif //USE_REGIONS
g_heaps [i]->rearrange_heap_segments (TRUE);
}
#else //MULTIPLE_HEAPS
-#ifdef USE_REGIONS
- rearrange_uoh_segments();
-#endif //USE_REGIONS
rearrange_heap_segments (TRUE);
#endif //MULTIPLE_HEAPS
@@ -34018,7 +33770,7 @@ void gc_heap::plan_phase (int condemned_gen_number)
#endif //MULTIPLE_HEAPS
#ifdef FEATURE_EVENT_TRACE
- if (informational_event_enabled_p && (condemned_gen_number < (max_generation -1)))
+ if (informational_event_enabled_p)
{
uint64_t current_time = GetHighPrecisionTimeStamp();
gc_time_info[time_compact] = current_time - gc_time_info[time_compact];
@@ -40638,7 +40390,7 @@ void gc_heap::bgc_tuning::record_and_adjust_bgc_end()
calculate_tuning (max_generation, true);
- if (total_loh_a_last_bgc > 0)
+ if (total_uoh_a_last_bgc > 0)
{
calculate_tuning (loh_generation, true);
}
@@ -43639,30 +43391,35 @@ size_t gc_heap::desired_new_allocation (dynamic_data* dd,
new_allocation = linear_allocation_model (allocation_fraction, new_allocation,
dd_desired_allocation (dd), time_since_previous_collection_secs);
- if (gen_number == 0)
+#ifdef DYNAMIC_HEAP_COUNT
+ if (dynamic_adaptation_mode != dynamic_adaptation_to_application_sizes)
+#endif //DYNAMIC_HEAP_COUNT
{
- if (pass == 0)
+ if (gen_number == 0)
{
- size_t free_space = generation_free_list_space (generation_of (gen_number));
- // DTREVIEW - is min_gc_size really a good choice?
- // on 64-bit this will almost always be true.
- dprintf (GTC_LOG, ("frag: %zd, min: %zd", free_space, min_gc_size));
- if (free_space > min_gc_size)
+ if (pass == 0)
{
- settings.gen0_reduction_count = 2;
+ size_t free_space = generation_free_list_space (generation_of (gen_number));
+ // DTREVIEW - is min_gc_size really a good choice?
+ // on 64-bit this will almost always be true.
+ dprintf (GTC_LOG, ("frag: %zd, min: %zd", free_space, min_gc_size));
+ if (free_space > min_gc_size)
+ {
+ settings.gen0_reduction_count = 2;
+ }
+ else
+ {
+ if (settings.gen0_reduction_count > 0)
+ settings.gen0_reduction_count--;
+ }
}
- else
+ if (settings.gen0_reduction_count > 0)
{
- if (settings.gen0_reduction_count > 0)
- settings.gen0_reduction_count--;
+ dprintf (2, ("Reducing new allocation based on fragmentation"));
+ new_allocation = min (new_allocation,
+ max (min_gc_size, (max_size/3)));
}
}
- if (settings.gen0_reduction_count > 0)
- {
- dprintf (2, ("Reducing new allocation based on fragmentation"));
- new_allocation = min (new_allocation,
- max (min_gc_size, (max_size/3)));
- }
}
}
@@ -45835,9 +45592,6 @@ void gc_heap::background_sweep()
concurrent_print_time_delta ("Sw");
dprintf (2, ("---- (GC%zu)Background Sweep Phase ----", VolatileLoad(&settings.gc_index)));
- //block concurrent allocation for large objects
- dprintf (3, ("lh state: planning"));
-
for (int i = 0; i <= max_generation; i++)
{
generation* gen_to_reset = generation_of (i);
@@ -45886,6 +45640,9 @@ void gc_heap::background_sweep()
sweep_ro_segments();
#endif //FEATURE_BASICFREEZE
+ dprintf (3, ("lh state: planning"));
+
+ // Multiple threads may reach here. This conditional partially avoids multiple volatile writes.
if (current_c_gc_state != c_gc_state_planning)
{
current_c_gc_state = c_gc_state_planning;
@@ -45916,9 +45673,7 @@ void gc_heap::background_sweep()
if (heap_number == 0)
{
-#ifdef BGC_SERVO_TUNING
- get_and_reset_loh_alloc_info();
-#endif //BGC_SERVO_TUNING
+ get_and_reset_uoh_alloc_info();
uint64_t suspended_end_ts = GetHighPrecisionTimeStamp();
last_bgc_info[last_bgc_info_index].pause_durations[1] = (size_t)(suspended_end_ts - suspended_start_time);
total_suspended_time += last_bgc_info[last_bgc_info_index].pause_durations[1];
@@ -46247,6 +46002,7 @@ void gc_heap::background_sweep()
concurrent_print_time_delta ("Swe SOH");
FIRE_EVENT(BGC1stSweepEnd, 0);
+ //block concurrent allocation for UOH objects
enter_spin_lock (&more_space_lock_uoh);
add_saved_spinlock_info (true, me_acquire, mt_bgc_uoh_sweep, msl_entered);
@@ -46302,6 +46058,15 @@ void gc_heap::background_sweep()
// be accurate.
compute_new_dynamic_data (max_generation);
+ // We also need to adjust size_before for UOH allocations that occurred during sweeping.
+ gc_history_per_heap* current_gc_data_per_heap = get_gc_data_per_heap();
+ for (int i = uoh_start_generation; i < total_generation_count; i++)
+ {
+ assert(uoh_a_bgc_marking[i - uoh_start_generation] == 0);
+ assert(uoh_a_no_bgc[i - uoh_start_generation] == 0);
+ current_gc_data_per_heap->gen_data[i].size_before += uoh_a_bgc_planning[i - uoh_start_generation];
+ }
+
#ifdef DOUBLY_LINKED_FL
current_bgc_state = bgc_not_in_process;
@@ -48833,13 +48598,17 @@ HRESULT GCHeap::Initialize()
// This needs to be different from our initial heap count so we can make sure we wait for
// the idle threads correctly in gc_thread_function.
gc_heap::dynamic_heap_count_data.last_n_heaps = 0;
+
+ int target_tcp = (int)GCConfig::GetGCDTargetTCP();
+ if (target_tcp > 0)
+ {
+ gc_heap::dynamic_heap_count_data.target_tcp = (float)target_tcp;
+ }
// This should be adjusted based on the target tcp. See comments in gcpriv.h
- gc_heap::dynamic_heap_count_data.below_target_threshold = 10.0;
- gc_heap::dynamic_heap_count_data.inc_recheck_threshold = 5;
- gc_heap::dynamic_heap_count_data.dec_failure_recheck_threshold = 5;
+ gc_heap::dynamic_heap_count_data.around_target_threshold = 10.0;
// This should really be set as part of computing static data and should take conserve_mem_setting into consideration.
- gc_heap::dynamic_heap_count_data.max_gen0_new_allocation = min (dd_max_size (gc_heap::g_heaps[0]->dynamic_data_of (0)), (size_t)(64 * 1024 * 1024));
- gc_heap::dynamic_heap_count_data.min_gen0_new_allocation = dd_min_size (gc_heap::g_heaps[0]->dynamic_data_of (0));
+ gc_heap::dynamic_heap_count_data.max_gen0_new_allocation = Align (min (dd_max_size (gc_heap::g_heaps[0]->dynamic_data_of (0)), (size_t)(64 * 1024 * 1024)), get_alignment_constant (TRUE));
+ gc_heap::dynamic_heap_count_data.min_gen0_new_allocation = Align (dd_min_size (gc_heap::g_heaps[0]->dynamic_data_of (0)), get_alignment_constant (TRUE));
dprintf (6666, ("datas max gen0 budget %Id, min %Id",
gc_heap::dynamic_heap_count_data.max_gen0_new_allocation, gc_heap::dynamic_heap_count_data.min_gen0_new_allocation));
@@ -50271,17 +50040,16 @@ void gc_heap::check_and_adjust_bgc_tuning (int gen_number, size_t physical_size,
}
}
}
+#endif //BGC_SERVO_TUNING
-void gc_heap::get_and_reset_loh_alloc_info()
+#ifdef BACKGROUND_GC
+void gc_heap::get_and_reset_uoh_alloc_info()
{
- if (!bgc_tuning::enable_fl_tuning)
- return;
+ total_uoh_a_last_bgc = 0;
- total_loh_a_last_bgc = 0;
-
- uint64_t total_loh_a_no_bgc = 0;
- uint64_t total_loh_a_bgc_marking = 0;
- uint64_t total_loh_a_bgc_planning = 0;
+ uint64_t total_uoh_a_no_bgc = 0;
+ uint64_t total_uoh_a_bgc_marking = 0;
+ uint64_t total_uoh_a_bgc_planning = 0;
#ifdef MULTIPLE_HEAPS
for (int i = 0; i < gc_heap::n_heaps; i++)
{
@@ -50290,21 +50058,33 @@ void gc_heap::get_and_reset_loh_alloc_info()
{
gc_heap* hp = pGenGCHeap;
#endif //MULTIPLE_HEAPS
- total_loh_a_no_bgc += hp->loh_a_no_bgc;
- hp->loh_a_no_bgc = 0;
- total_loh_a_bgc_marking += hp->loh_a_bgc_marking;
- hp->loh_a_bgc_marking = 0;
- total_loh_a_bgc_planning += hp->loh_a_bgc_planning;
- hp->loh_a_bgc_planning = 0;
+
+ // We need to adjust size_before for UOH allocations that occurred during marking
+ // before we lose the values here.
+ gc_history_per_heap* current_gc_data_per_heap = hp->get_gc_data_per_heap();
+ // loh/poh_a_bgc_planning should be the same as they were when init_records set size_before.
+ for (int i = uoh_start_generation; i < total_generation_count; i++)
+ {
+ current_gc_data_per_heap->gen_data[i].size_before += hp->uoh_a_bgc_marking[i - uoh_start_generation];
+
+ total_uoh_a_no_bgc += hp->uoh_a_no_bgc[i - uoh_start_generation];
+ hp->uoh_a_no_bgc[i - uoh_start_generation] = 0;
+
+ total_uoh_a_bgc_marking += hp->uoh_a_bgc_marking[i - uoh_start_generation];
+ hp->uoh_a_bgc_marking[i - uoh_start_generation] = 0;
+
+ total_uoh_a_bgc_planning += hp->uoh_a_bgc_planning[i - uoh_start_generation];
+ hp->uoh_a_bgc_planning[i - uoh_start_generation] = 0;
+ }
}
dprintf (2, ("LOH alloc: outside bgc: %zd; bm: %zd; bp: %zd",
- total_loh_a_no_bgc,
- total_loh_a_bgc_marking,
- total_loh_a_bgc_planning));
+ total_uoh_a_no_bgc,
+ total_uoh_a_bgc_marking,
+ total_uoh_a_bgc_planning));
- total_loh_a_last_bgc = total_loh_a_no_bgc + total_loh_a_bgc_marking + total_loh_a_bgc_planning;
+ total_uoh_a_last_bgc = total_uoh_a_no_bgc + total_uoh_a_bgc_marking + total_uoh_a_bgc_planning;
}
-#endif //BGC_SERVO_TUNING
+#endif //BACKGROUND_GC
bool gc_heap::is_pm_ratio_exceeded()
{
diff --git a/src/coreclr/gc/gc.h b/src/coreclr/gc/gc.h
index a1093b5e76ce..e80853489a24 100644
--- a/src/coreclr/gc/gc.h
+++ b/src/coreclr/gc/gc.h
@@ -124,7 +124,10 @@ enum gc_generation_num
ephemeral_generation_count = max_generation,
// number of all generations
- total_generation_count = poh_generation + 1
+ total_generation_count = poh_generation + 1,
+
+ // number of uoh generations
+ uoh_generation_count = total_generation_count - uoh_start_generation
};
#ifdef GC_CONFIG_DRIVEN
diff --git a/src/coreclr/gc/gcconfig.h b/src/coreclr/gc/gcconfig.h
index f4b88d26db1e..3f38166e9014 100644
--- a/src/coreclr/gc/gcconfig.h
+++ b/src/coreclr/gc/gcconfig.h
@@ -137,9 +137,11 @@ class GCConfigStringHolder
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 (GCConserveMem, "GCConserveMemory", "System.GC.ConserveMemory", 0, "Specifies how hard GC should try to conserve memory - values 0-9") \
INT_CONFIG (GCWriteBarrier, "GCWriteBarrier", NULL, 0, "Specifies whether GC should use more precise but slower write barrier") \
- STRING_CONFIG(GCName, "GCName", "System.GC.Name", "Specifies the path of the standalone GC implementation.") \
+ STRING_CONFIG(GCName, "GCName", "System.GC.Name", "Specifies the name of the standalone GC implementation.") \
+ STRING_CONFIG(GCPath, "GCPath", "System.GC.Path", "Specifies the path of the standalone GC implementation.") \
INT_CONFIG (GCSpinCountUnit, "GCSpinCountUnit", NULL, 0, "Specifies the spin count unit used by the GC.") \
- INT_CONFIG (GCDynamicAdaptationMode, "GCDynamicAdaptationMode", "System.GC.DynamicAdaptationMode", 0, "Enable the GC to dynamically adapt to application sizes.")
+ INT_CONFIG (GCDynamicAdaptationMode, "GCDynamicAdaptationMode", "System.GC.DynamicAdaptationMode", 0, "Enable the GC to dynamically adapt to application sizes.") \
+ INT_CONFIG (GCDTargetTCP, "GCDTargetTCP", "System.GC.DTargetTCP", 0, "Specifies the target tcp for DATAS")
// This class is responsible for retreiving configuration information
// for how the GC should operate.
class GCConfig
diff --git a/src/coreclr/gc/gchandletable.cpp b/src/coreclr/gc/gchandletable.cpp
index a4b3ab8629a0..ef0bbf8c93ae 100644
--- a/src/coreclr/gc/gchandletable.cpp
+++ b/src/coreclr/gc/gchandletable.cpp
@@ -213,7 +213,7 @@ Object* GCHandleManager::InterlockedCompareExchangeObjectInHandle(OBJECTHANDLE h
HandleType GCHandleManager::HandleFetchType(OBJECTHANDLE handle)
{
uint32_t type = ::HandleFetchType(handle);
- assert(type >= HNDTYPE_WEAK_SHORT && type <= HNDTYPE_WEAK_NATIVE_COM);
+ assert(type >= HNDTYPE_WEAK_SHORT && type <= HNDTYPE_WEAK_INTERIOR_POINTER);
return static_cast(type);
}
diff --git a/src/coreclr/gc/gcinterface.h b/src/coreclr/gc/gcinterface.h
index 75b84684bb9e..f15ee691ebef 100644
--- a/src/coreclr/gc/gcinterface.h
+++ b/src/coreclr/gc/gcinterface.h
@@ -502,7 +502,17 @@ typedef enum
* but we are keeping it here for backward compatibility purposes"
*
*/
- HNDTYPE_WEAK_NATIVE_COM = 9
+ HNDTYPE_WEAK_NATIVE_COM = 9,
+
+ /*
+ * INTERIOR POINTER HANDLES
+ *
+ * Interior pointer handles allow the vm to request that the GC keep an interior pointer to
+ * a given object updated to keep pointing at the same location within an object. These handles
+ * have an extra pointer which points at an interior pointer into the first object.
+ *
+ */
+ HNDTYPE_WEAK_INTERIOR_POINTER = 10
} HandleType;
typedef enum
diff --git a/src/coreclr/gc/gcpriv.h b/src/coreclr/gc/gcpriv.h
index 6bd88798a493..85eb22d6080c 100644
--- a/src/coreclr/gc/gcpriv.h
+++ b/src/coreclr/gc/gcpriv.h
@@ -140,10 +140,10 @@ inline void FATAL_GC_ERROR()
//
// This means any empty regions can be freely used for any generation. For
// Server GC we will balance regions between heaps.
-// For now disable regions for StandAlone GC, NativeAOT and MacOS builds
+// For now disable regions for standalone GC and macOS builds
#if defined (HOST_64BIT) && !defined (BUILD_AS_STANDALONE) && !defined(__APPLE__)
#define USE_REGIONS
-#endif //HOST_64BIT && BUILD_AS_STANDALONE
+#endif //HOST_64BIT && BUILD_AS_STANDALONE && !__APPLE__
//#define SPINLOCK_HISTORY
//#define RECORD_LOH_STATE
@@ -1754,6 +1754,8 @@ class gc_heap
PER_HEAP_ISOLATED_METHOD void add_to_history();
+ PER_HEAP_ISOLATED_METHOD void get_and_reset_uoh_alloc_info();
+
#ifdef BGC_SERVO_TUNING
// Currently BGC servo tuning is an experimental feature.
class bgc_tuning
@@ -1999,7 +2001,6 @@ class gc_heap
};
PER_HEAP_ISOLATED_METHOD void check_and_adjust_bgc_tuning (int gen_number, size_t physical_size, ptrdiff_t virtual_fl_size);
- PER_HEAP_ISOLATED_METHOD void get_and_reset_loh_alloc_info();
#endif //BGC_SERVO_TUNING
#ifndef USE_REGIONS
@@ -2118,6 +2119,8 @@ class gc_heap
PER_HEAP_METHOD void gc1();
#ifdef DYNAMIC_HEAP_COUNT
+ PER_HEAP_ISOLATED_METHOD size_t get_total_soh_stable_size();
+ PER_HEAP_ISOLATED_METHOD void assign_new_budget (int gen_number, size_t desired_per_heap);
PER_HEAP_METHOD bool prepare_rethread_fl_items();
PER_HEAP_METHOD void rethread_fl_items(int gen_idx);
PER_HEAP_ISOLATED_METHOD void merge_fl_from_other_heaps (int gen_idx, int to_n_heaps, int from_n_heaps);
@@ -2232,6 +2235,8 @@ class gc_heap
PER_HEAP_METHOD BOOL bgc_loh_allocate_spin();
PER_HEAP_METHOD BOOL bgc_poh_allocate_spin();
+
+ PER_HEAP_METHOD void bgc_record_uoh_allocation(int gen_number, size_t size);
#endif //BACKGROUND_GC
PER_HEAP_METHOD void add_saved_spinlock_info (
@@ -2558,7 +2563,7 @@ class gc_heap
// re-initialize a heap in preparation to putting it back into service
PER_HEAP_METHOD void recommission_heap();
- PER_HEAP_ISOLATED_METHOD int calculate_new_heap_count();
+ PER_HEAP_ISOLATED_METHOD void calculate_new_heap_count();
// check if we should change the heap count
PER_HEAP_METHOD void check_heap_count();
@@ -3438,6 +3443,11 @@ class gc_heap
PER_HEAP_FIELD_SINGLE_GC uint8_t* next_sweep_obj;
PER_HEAP_FIELD_SINGLE_GC uint8_t* current_sweep_pos;
+
+ PER_HEAP_FIELD_SINGLE_GC size_t uoh_a_no_bgc[uoh_generation_count];
+ PER_HEAP_FIELD_SINGLE_GC size_t uoh_a_bgc_marking[uoh_generation_count];
+ PER_HEAP_FIELD_SINGLE_GC size_t uoh_a_bgc_planning[uoh_generation_count];
+
#ifdef DOUBLY_LINKED_FL
PER_HEAP_FIELD_SINGLE_GC heap_segment* current_sweep_seg;
#endif //DOUBLY_LINKED_FL
@@ -3463,9 +3473,6 @@ class gc_heap
#endif //SNOOP_STATS
#ifdef BGC_SERVO_TUNING
- PER_HEAP_FIELD_SINGLE_GC uint64_t loh_a_no_bgc;
- PER_HEAP_FIELD_SINGLE_GC uint64_t loh_a_bgc_marking;
- PER_HEAP_FIELD_SINGLE_GC uint64_t loh_a_bgc_planning;
PER_HEAP_FIELD_SINGLE_GC size_t bgc_maxgen_end_fl_size;
#endif //BGC_SERVO_TUNING
#endif //BACKGROUND_GC
@@ -4099,11 +4106,9 @@ class gc_heap
PER_HEAP_ISOLATED_FIELD_SINGLE_GC GCEvent bgc_start_event;
-#ifdef BGC_SERVO_TUNING
// Total allocated last BGC's plan + between last and this bgc +
// this bgc's mark
- PER_HEAP_ISOLATED_FIELD_SINGLE_GC uint64_t total_loh_a_last_bgc;
-#endif //BGC_SERVO_TUNING
+ PER_HEAP_ISOLATED_FIELD_SINGLE_GC uint64_t total_uoh_a_last_bgc;
#endif //BACKGROUND_GC
#ifdef USE_REGIONS
@@ -4237,6 +4242,10 @@ class gc_heap
// to smooth out the situation when we rarely pick the gen2 GCs in the first array.
struct dynamic_heap_count_data_t
{
+ float target_tcp = 5.0;
+ float target_gen2_tcp = 10.0;
+
+ static const int recorded_adjustment_size = 4;
static const int sample_size = 3;
static const int recorded_tcp_array_size = 64;
@@ -4245,15 +4254,127 @@ class gc_heap
uint64_t elapsed_between_gcs; // time between gcs in microseconds (this should really be between_pauses)
uint64_t gc_pause_time; // pause time for this GC
uint64_t msl_wait_time;
+ size_t gc_index;
size_t gc_survived_size;
+ int gen0_budget_per_heap;
};
uint32_t sample_index;
sample samples[sample_size];
+ sample& get_last_sample()
+ {
+ int last_sample_index = (sample_index + sample_size - 1) % sample_size;
+ sample& s = samples[last_sample_index];
+ return s;
+ }
+
+ enum adjust_metric
+ {
+ not_adjusted = 0,
+ adjust_budget = 1,
+ adjust_hc = 2
+ };
+
+ const char* const str_adjust_metrics[4] =
+ {
+ "no adjustment",
+ "budget",
+ "HC"
+ };
+
+ // For adjust_budget I'm keeping a counter that records how many times we've done this instead of recording
+ // a separate entry each time since we could have many in a row.
+ struct adjustment
+ {
+ adjust_metric metric;
+ int count;
+ int avg_msl_per_heap;
+ // Distance to target
+ float distance;
+ int hc_change;
+ size_t gc_index;
+
+ // This is determined by looking at the median of the next samples after change
+ // Success means it did achieve the effect we wanted to achieve, ie,
+ // if we inc-ed HC, we observed msl and pause time go down.
+ // It doesn't mean we necessarily achieved target.
+ bool successful;
+ };
+
+ adjustment adjustment_history[recorded_adjustment_size];
+ int current_adjustment_index;
+
size_t current_samples_count;
size_t processed_samples_count;
+ adjustment* get_last_nth_adjustment (int distance_to_current)
+ {
+ int adjustment_idx = (current_adjustment_index + recorded_adjustment_size + distance_to_current) % recorded_adjustment_size;
+ return &adjustment_history[adjustment_idx];
+ }
+
+ adjustment* get_last_adjustment()
+ {
+ return get_last_nth_adjustment (-1);
+ }
+
+ void record_adjustment (adjust_metric metric, float distance, int change_int, size_t current_gc_index)
+ {
+ if (metric == adjust_budget)
+ {
+ adjustment* adj = get_last_adjustment();
+ if (adj->metric == adjust_budget)
+ {
+ (adj->count)++;
+ dprintf (6666, ("last adjustment was also budget at GC#%Id, inc count to %d", adj->gc_index, adj->count));
+ return;
+ }
+ }
+
+ adjustment* adj = &adjustment_history[current_adjustment_index];
+ adj->metric = metric;
+ adj->count = 1;
+ adj->distance = distance;
+ adj->hc_change = change_int;
+ adj->gc_index = current_gc_index;
+
+ dprintf (6666, ("recording adjustment %s at #%d GC#%Id - distance to target %.3f, changed %d HC",
+ str_adjust_metrics[metric], current_adjustment_index, adj->gc_index, adj->distance, adj->hc_change));
+
+ current_adjustment_index = (current_adjustment_index + 1) % recorded_adjustment_size;
+ }
+
+ bool same_action_succeeded (adjust_metric metric, int distance_to_current, int change_int)
+ {
+ int adjustment_idx = (current_adjustment_index + recorded_adjustment_size + distance_to_current) % recorded_adjustment_size;
+ adjustment* adj = &adjustment_history[adjustment_idx];
+ dprintf (6666, ("adj->metric %d, metric %d, adj#%d: hc_change > 0 = %d, change_int > 0 = %d",
+ adjustment_idx, (adj->hc_change > 0), (change_int > 0)));
+ if ((adj->metric == metric) && ((change_int > 0) == (adj->hc_change > 0)))
+ {
+ return adj->successful;
+ }
+
+ return false;
+ }
+
+ void reset_budget_adjustment()
+ {
+ // adjust_budget is a transient state, as in, we only maintain it to detect if we should actually change HC instead. So
+ // if we were in a situation where we chose to change budget instead of HC, then we got out of that situation, we should
+ // reset this adjustment.
+ adjustment* adj = get_last_adjustment();
+ if (adj->metric == adjust_budget)
+ {
+ memset (adj, 0, sizeof (adjustment));
+ int saved_current_adjustment_index = current_adjustment_index;
+ current_adjustment_index = (current_adjustment_index + recorded_adjustment_size - 1) % recorded_adjustment_size;
+
+ dprintf (6666, ("reset last budget adj at %d, set current adj to %d", saved_current_adjustment_index, current_adjustment_index));
+ }
+ }
+
//
// We need to observe the history of tcp's so record them in a small buffer.
//
@@ -4261,6 +4382,78 @@ class gc_heap
float recorded_tcp[recorded_tcp_array_size];
int recorded_tcp_index;
int total_recorded_tcp;
+ int tcp_count_in_rearrange;
+ float tcp_slope_in_rearrange;
+
+ float get_avg_tcp_in_rearrange (int start_idx, int end_idx)
+ {
+ float total_tcp = 0.0;
+ int count = start_idx - end_idx + 1;
+ for (int idx = start_idx; idx >= end_idx ; idx--)
+ {
+ assert ((idx > 0) && (idx < tcp_count_in_rearrange));
+ total_tcp += recorded_tcp_rearranged[idx];
+ }
+
+ float avg_tcp = total_tcp / count;
+ dprintf (6666, ("getting avg for entry#%d-%d, total %.3f / %d = %.3f", end_idx, start_idx, total_tcp, count, avg_tcp));
+
+ return avg_tcp;
+ }
+
+ // If our buffer has a lot of entries, it means we've been stable for a while. We can have a situation where
+ // suddenly the tcp's change dramatically, we should treat those as temporary and not act on them.
+ //
+ // If we consider this not temporary, tcp_to_consider will be set to either the avg of the most recent entries
+ // or the most recent entry.
+ bool is_temp_change (float* tcp_to_consider)
+ {
+ assert (tcp_count_in_rearrange >= 1);
+
+ int avg_count = 3;
+ int start_idx = tcp_count_in_rearrange - 1;
+
+ // If we don't even have <= 3 entries, or have a really steep slope, it means we are far from target,
+ // We should consider to adjust.
+ if ((tcp_count_in_rearrange <= avg_count) || (fabs (tcp_slope_in_rearrange) > 3.0))
+ {
+ dprintf (6666, ("%d tcps, slope is %.3f, returning last one %.3f",
+ tcp_count_in_rearrange, tcp_slope_in_rearrange, recorded_tcp_rearranged[start_idx]));
+ *tcp_to_consider = recorded_tcp_rearranged[start_idx];
+ return false;
+ }
+
+ int end_idx = start_idx - avg_count + 1;
+ float avg = get_avg_tcp_in_rearrange (start_idx, end_idx);
+ *tcp_to_consider = avg;
+
+ if (tcp_count_in_rearrange > (avg_count * 3))
+ {
+ // We look back to see if the previous entries are within 30% of this average.
+ start_idx = end_idx - 1;
+ end_idx = start_idx - avg_count + 1;
+ float last_avg = get_avg_tcp_in_rearrange (start_idx, end_idx);
+ float diff_pct_in_avg = 0.0;
+ if (avg > last_avg)
+ {
+ diff_pct_in_avg = (avg - last_avg) / last_avg;
+ }
+ else
+ {
+ diff_pct_in_avg = (last_avg - avg) / avg;
+ }
+
+ dprintf (6666, ("avg of last %d tcps is %.3f, avg of the %d tcps before those is %.3f, diff (to min) is %.3f",
+ avg_count, *tcp_to_consider, avg_count, last_avg, diff_pct_in_avg));
+
+ return (diff_pct_in_avg > 0.3);
+ }
+ else
+ {
+ dprintf (6666, ("we have only %d entries, consider %.3f not temporary", tcp_count_in_rearrange, *tcp_to_consider));
+ return false;
+ }
+ }
int add_to_recorded_tcp (float tcp)
{
@@ -4298,142 +4491,472 @@ class gc_heap
return copied_count;
}
- int highest_avg_recorded_tcp (int count, float avg, float* highest_avg)
+ void init_recorded_tcp ()
{
- float highest_sum = 0.0;
- int highest_count = 0;
+ total_recorded_tcp = 0;
+ recorded_tcp_index = 0;
+ dprintf (6666, ("INIT tcp buffer"));
+ }
+
+ int get_recorded_tcp_count () { return total_recorded_tcp; }
- for (int i = 0; i < count; i++)
+ float around_target_accumulation;
+ float around_target_threshold;
+
+ bool is_tcp_in_range (float diff_pct, float slope)
+ {
+ return ((diff_pct <= 0.2) && (diff_pct >= -0.2) && (slope <= 0.1) && (slope >= -0.1));
+ }
+
+ bool is_close_to_max (int new_n, int max)
+ {
+ return ((max - new_n) <= (max / 10));
+ }
+
+ float slope (float* y, int n, float* avg);
+
+ // if the last attempt was successful, and we still aren't to target, we should be more aggressive.
+ int get_aggressiveness (int change_int)
+ {
+ int factor = 1;
+
+ adjust_metric metric = adjust_hc;
+
+ // Looking at the last 2 adjustments was too aggressive - so currently only look at the last one.
+ for (int i = -1; i >= -1; i--)
{
- if (recorded_tcp_rearranged[i] > avg)
+ bool last_action_succeeded = same_action_succeeded (metric, i, change_int);
+ dprintf (6666, ("current %d adjustment of %s %s, agg factor %d",
+ i, str_adjust_metrics[metric], (last_action_succeeded ? "succeeded" : "failed"),
+ (factor + last_action_succeeded)));
+ if (!last_action_succeeded)
{
- highest_count++;
- highest_sum += recorded_tcp_rearranged[i];
+ break;
}
- }
- if (highest_count)
- {
- *highest_avg = highest_sum / highest_count;
+ factor += 1;
}
- return highest_count;
+ return factor;
}
- void init_recorded_tcp ()
+ void check_success_after_adjust (size_t current_gc_index, adjustment* adj, float tcp)
{
- total_recorded_tcp = 0;
- recorded_tcp_index = 0;
- dprintf (6666, ("INIT tcp buffer"));
- }
+ // If this is right after we adjusted, we should see if we were successful with the adjustment.
+ size_t last_changed_gc_index = adj->gc_index;
+ if (!last_changed_gc_index) return;
- int get_recorded_tcp_count () { return total_recorded_tcp; }
+ bool check_p = (current_gc_index < (last_changed_gc_index + (2 * sample_size)));
- //
- // Maintain some info about last time we did change heap count.
- //
- size_t last_changed_gc_index;
- // This is intentionally kept as a float for precision.
- float last_changed_count;
- float last_changed_stcp;
+ dprintf (6666, ("last adjusted at GC#%Id, %Id GCs ago, %s",
+ last_changed_gc_index, (current_gc_index - last_changed_gc_index), (check_p ? "check success" : "already checked success")));
+ if (!check_p)
+ {
+ return;
+ }
- //
- // For tuning above/below target tcp.
- //
- // If we just increased the heap count and immediately need to grow again, that counts as a failure.
- // The higher the failure count, the more aggressive we should grow.
- int inc_failure_count;
-
- // If we are trending up and the tcp is already close enough to target, we need this many samples
- // before we adjust.
- int inc_recheck_threshold;
-
- // If we shrink and the stcp doesn't change much, that counts as a failure. For the below target case
- // it's fine to stay here for a while. Either it'll naturally change and break out of this situation
- // or we wait for a while before we re-evaluate. How long we wait is defined by dec_recheck_threshold
- // each time our calculation tells us to shrink.
- int dec_failure_count;
- int dec_failure_recheck_threshold;
-
- // If we continue to be below target for an extended period of time, ie, we've accumulated more than
- // below_target_threshold, we want to reduce the heap count.
- float below_target_accumulation;
- float below_target_threshold;
-
- // TODO: we should refactor this and the inc checks into a utility class.
- bool dec_by_one_scheduled;
- int dec_by_one_count;
-
- // Currently only used for dprintf.
- size_t first_below_target_gc_index;
-
- float get_range_upper (float t)
- {
- return (t * 1.2f);
+ adjust_metric adj_metric = adj->metric;
+
+ // We are guaranteed to have at least sample_size amount of new samples.
+ if (adj_metric == adjust_hc)
+ {
+ // For hc case, we just check if tcp has changed in the right direction.
+ bool adjusted_up = (adj->hc_change > 0);
+ // Do we want to do a percentage here instead of absolute comparison?
+ bool tcp_reduced_p = (tcp < (adj->distance + target_tcp));
+ adj->successful = (adjusted_up == tcp_reduced_p);
+ dprintf (6666, ("last adjust hc - %d -> %d heaps, tcp %.3f -> %.3f, %s",
+ (n_heaps - adj->hc_change), n_heaps, (adj->distance + target_tcp), tcp,
+ (adj->successful ? "success" : "fail")));
+ }
}
- bool is_tcp_in_range (float diff_pct, float slope)
+ void reset_accumulation()
{
- return ((diff_pct <= 0.2) && (diff_pct >= -0.2) && (slope <= 0.1) && (slope >= -0.1));
+ around_target_accumulation = 0.0;
+ init_recorded_tcp();
}
- bool is_tcp_far_below (float diff_pct)
+ bool should_change (float tcp, float* tcp_to_consider, size_t current_gc_index)
{
- return (diff_pct >= 0.4);
+ adjustment* adj = get_last_adjustment();
+ size_t last_changed_gc_index = adj->gc_index;
+
+ check_success_after_adjust (current_gc_index, adj, tcp);
+
+ float diff_to_target = tcp - target_tcp;
+ dprintf (6666, ("accumulating %.3f + %.3f -> %.3f",
+ around_target_accumulation, diff_to_target, (around_target_accumulation + diff_to_target)));
+ around_target_accumulation += diff_to_target;
+
+ size_t num_gcs_since_last_change = current_gc_index - last_changed_gc_index;
+ dprintf (6666, ("we adjusted at GC#%Id, %Id GCs ago", last_changed_gc_index, num_gcs_since_last_change));
+ if (last_changed_gc_index && (num_gcs_since_last_change < (2 * sample_size)))
+ {
+ dprintf (6666, ("we just adjusted %Id GCs ago, skipping", num_gcs_since_last_change));
+ return false;
+ }
+
+ // If we haven't accumulated enough changes.
+ if ((around_target_accumulation < around_target_threshold) && (around_target_accumulation > -around_target_threshold))
+ {
+ dprintf (6666, ("accumulated %.3f < %.3f and > %.3f, skipping",
+ around_target_accumulation, around_target_threshold, -around_target_threshold));
+ return false;
+ }
+
+ // If the slope clearly indicates it's already going the direction we want to.
+ float avg_recorded_tcp = 0.0;
+ int tcp_count = rearrange_recorded_tcp ();
+ float tcp_slope = slope (recorded_tcp_rearranged, tcp_count, &avg_recorded_tcp);
+ dprintf (6666, ("acc thres exceeded! %s slope of %d tcps is %.3f",
+ ((around_target_accumulation > 0.0) ? "above" : "below"), tcp_count, tcp_slope));
+
+ // if threshold is 2 * target, this means the avg tcp in the buffer is 40% higher/lower
+ if ((tcp_count >= 5) &&
+ (((around_target_accumulation > 0.0) && (tcp_slope < -0.2)) ||
+ ((around_target_accumulation < 0.0) && (tcp_slope > 0.2))))
+ {
+ dprintf (6666, ("already trending the right direction, skipping"));
+ reset_accumulation();
+ return false;
+ }
+
+ // If the tcp has been hovering around the target.
+ float diff_pct = diff_to_target / target_tcp;
+ if (is_tcp_in_range (diff_pct, tcp_slope))
+ {
+ dprintf (6666, ("diff %.3f, slope %.3f already in range", diff_pct, tcp_slope));
+ reset_accumulation();
+ return false;
+ }
+
+ tcp_count_in_rearrange = tcp_count;
+ tcp_slope_in_rearrange = tcp_slope;
+
+ if (is_temp_change (tcp_to_consider))
+ {
+ dprintf (6666, ("this is a temporary change, ignore"));
+ reset_accumulation();
+ return false;
+ }
+
+ return true;
}
- bool is_close_to_max (int new_n, int max)
+ /*
+ | | | max |
+ | hc | f | growth |
+ | ---- | ---- | ------ |
+ | 1 | 4.00 | 4 |
+ | 2 | 2.46 | 5 |
+ | 4 | 1.52 | 6 |
+ | 6 | 1.14 | 7 |
+ | 8 | 0.93 | 7 |
+ | 10 | 0.80 | 8 |
+ | 14 | 0.63 | 9 |
+ | 16 | 0.57 | 9 |
+ | 32 | 0.35 | 11 |
+ | 64 | 0.22 | 14 |
+ | 80 | 0.19 | 15 |
+ */
+ int get_max_growth(int current_hc)
{
- return ((max - new_n) <= (max / 10));
+ return (int)round(current_hc * (4.0 * pow (current_hc, -0.7)));
}
- bool should_dec_by_one()
+ int get_hc_change_factors (int change_int, size_t last_change_gc_index)
{
- if (!dec_by_one_scheduled)
+ int factor = 3;
+ int inc_factor = factor;
+
+ if (last_change_gc_index)
{
- dec_by_one_scheduled = true;
+ if (change_heap_count_time == 0)
+ {
+ dprintf (6666, ("WHAT!!! last HC change took 0us?!"));
+ return 0;
+ }
+
+ assert (change_heap_count_time != 0);
+
+ // If changing HC is expensive, we need to space it out.
+ uint64_t total_gc_pause_time = 0;
+ for (int i = 0; i < sample_size; i++)
+ {
+ total_gc_pause_time += samples[i].gc_pause_time;
+ }
+
+ uint64_t avg_gc_pause_time = total_gc_pause_time / sample_size;
+
+ if (change_heap_count_time > avg_gc_pause_time)
+ {
+ factor *= 2 * (int)(change_heap_count_time/ avg_gc_pause_time);
+ }
+
+ dprintf (6666, ("last HC change took %.3fms / avg gc pause %.3fms = %d , factor %d",
+ (change_heap_count_time / 1000.0), (avg_gc_pause_time / 1000.0),
+ (change_heap_count_time / avg_gc_pause_time), factor));
}
- if (dec_by_one_scheduled)
+ if (change_int < 0)
{
- dec_by_one_count++;
- dprintf (6666, ("scheduled to dec by 1 heap %d times", dec_by_one_count));
+ // Dec in general should be done less frequently than inc.
+ factor *= 2;
+
+ adjustment* adj = get_last_adjustment();
+ int last_hc_change = adj->hc_change;
+
+ dprintf (6666, ("dec: last HC change %d heaps at GC#%Id, factor %d", last_hc_change, last_change_gc_index, factor));
+
+ if (last_hc_change < 0)
+ {
+ // If it's the 2nd time in a row we want to dec, we also delay it.
+ dprintf (6666, ("last was dec, factor %d->%d", factor, (factor * 2)));
+ factor *= 2;
+ }
+ else
+ {
+ // If the last adj was inc, and there was another dec adjustment before that, we delay dec.
+ adj = get_last_nth_adjustment (-2);
+ size_t last_2nd_change_gc_index = adj->gc_index;
+
+ if (last_2nd_change_gc_index > 0)
+ {
+ int last_2nd_hc_change = adj->hc_change;
+ dprintf (6666, ("before last was %d heaps at GC#%Id (%Id GCs), factor is now %d",
+ last_2nd_hc_change, last_2nd_change_gc_index, (last_change_gc_index - last_2nd_change_gc_index), factor));
+
+ if (last_2nd_hc_change < 0)
+ {
+ bool inc_too_quick_p = ((last_change_gc_index - last_2nd_change_gc_index) < (size_t)(inc_factor * 2 * sample_size));
+
+ if (inc_too_quick_p)
+ {
+ dprintf (6666, ("We dec-ed and quickly followed with an inc, factor %d -> %d", factor, (factor * 4)));
+ factor *= 4;
+ }
+ }
+ }
+ }
}
- return (dec_by_one_count >= 5);
+ return factor;
}
- void reset_dec_by_one()
+ adjust_metric should_change_hc (int max_hc_datas, int min_hc_datas, int max_hc_growth, int& change_int, size_t current_gc_index)
{
- dec_by_one_scheduled = false;
- dec_by_one_count = 0;
+ adjust_metric adj_metric = not_adjusted;
+
+ int saved_change_int = change_int;
+
+ if (change_int > 0)
+ {
+ change_int = min (max_hc_growth, change_int);
+ }
+ else if (change_int < 0)
+ {
+ if ((change_int + n_heaps) < 1)
+ {
+ change_int = 1 - n_heaps;
+ }
+ }
+
+ if (change_int == 0)
+ {
+ dprintf (6666, ("cannot change due to upper/lower limit!"));
+ return adj_metric;
+ }
+
+ if (saved_change_int != change_int)
+ {
+ dprintf (6666, ("change %d heaps instead of %d so we don't go over upper/lower limit", change_int, saved_change_int));
+ }
+
+ // Now we need to decide whether we should change the HC or the budget.
+ //
+ // There are scenarios where we must change the HC because we cannot change budget to make tcp go the
+ // direction we want.
+ //
+ // When we are in a situation where we have the flexibility to change HC or budget, we should only change HC
+ // in the following cases -
+ //
+ // 1) if the change is large enough or we kept meaning to change it but kept getting into this same situation, or
+ //
+ // 2) if it's large enough and there have been enough GCs since we last changed
+ //
+ // Note that we only return adj_budget if we had the choice to adjust budget or HC and chose to adjust budget,
+ // because we use this to indicate if at some point we should change HC instead.
+ if ((change_int > 0) && (n_heaps == min_hc_datas))
+ {
+ dprintf (6666, ("we are already at min datas heaps %d, cannot inc budget so must inc HC", n_heaps));
+ adj_metric = adjust_hc;
+ }
+ else if ((change_int < 0) && (n_heaps == max_hc_datas))
+ {
+ dprintf (6666, ("we are already at max datas heaps %d, cannot dec budget so must dec HC", n_heaps));
+ adj_metric = adjust_hc;
+ }
+
+ float hc_change_pct = fabsf ((float)change_int / n_heaps);
+
+ adjustment* adj = get_last_adjustment();
+ size_t last_change_gc_index = adj->gc_index;
+
+ // Now we are at the point we do want to change HC but there may be some things that make us want to opt out it.
+ adj_metric = adjust_hc;
+
+ if (last_change_gc_index)
+ {
+ size_t num_gcs_since_change = current_gc_index - last_change_gc_index;
+ int hc_change_factor = get_hc_change_factors (change_int, last_change_gc_index);
+
+ dprintf (6666, ("hc would change %.3f, factor is %d", hc_change_pct, hc_change_factor));
+ if (hc_change_pct < 0.2)
+ {
+ // Should we also consider absolute time here?
+ int delayed_hc_change_factor = hc_change_factor * 3;
+ int count = 0;
+ if (adj->metric == adjust_budget)
+ {
+ count = adj->count;
+ }
+
+ dprintf (6666, ("we've changed budget instead of HC %d times from %Id GCs ago, thres %d times",
+ count, num_gcs_since_change, delayed_hc_change_factor));
+
+ if (count < delayed_hc_change_factor)
+ {
+ adj_metric = adjust_budget;
+ }
+ }
+ else
+ {
+ bool change_p = (num_gcs_since_change > (size_t)(hc_change_factor * sample_size));
+ dprintf (6666, ("It's been %Id GCs since we wanted to change HC last time, thres %d GCs, %s",
+ num_gcs_since_change, (hc_change_factor * sample_size), (change_p ? "change" : "don't change yet")));
+ if (!change_p)
+ {
+ adj_metric = not_adjusted;
+ }
+ }
+ }
+
+ dprintf (6666, ("conclusion: %s", str_adjust_metrics[adj_metric]));
+ if (adj_metric == adjust_hc)
+ {
+ reset_budget_adjustment();
+ }
+ return adj_metric;
}
+ //
+ // Budget computation. Now we have 2 budgets -
+ // BCS (Budget Computed via Survrate) and
+ // BCD (Budget Computed via DATAS)
+ //
+ // When DATAS is on, BCD is our upper bound because we want to control how much allocation to allow before
+ // the next GC happens which directly contributes to the heap size.
+ // If BCS is smaller, it means we have room to adjust budget. Currently we don't adjust it dramatically because
+ // then we risk affecting tcp too much (tcp is still calculated using both the collection time and the wait
+ // time in msl).
+ //
+
size_t max_gen0_new_allocation;
size_t min_gen0_new_allocation;
- size_t compute_gen0_new_allocation (size_t total_old_gen_size)
+ size_t compute_total_gen0_budget (size_t total_soh_stable_size)
{
- assert (total_old_gen_size > 0);
+ assert (total_soh_stable_size > 0);
- // TODO: adjust these based on conserve_mem_setting.
- double old_gen_growth_factor = 16.0 / sqrt ((double)total_old_gen_size / 1000.0 / 1000.0);
+ float factor = (float)(20 - conserve_mem_setting);
+ double old_gen_growth_factor = factor / sqrt ((double)total_soh_stable_size / 1000.0 / 1000.0);
double saved_old_gen_growth_factor = old_gen_growth_factor;
old_gen_growth_factor = min (10.0, old_gen_growth_factor);
old_gen_growth_factor = max (0.1, old_gen_growth_factor);
- size_t total_new_allocation_old_gen = (size_t)(old_gen_growth_factor * (double)total_old_gen_size);
- size_t new_allocation_old_gen = total_new_allocation_old_gen / n_heaps;
-
- dprintf (6666, ("total gen2 %Id (%.3fmb), factor %.3f=>%.3f -> total gen0 new_alloc %Id (%Id/heap, %.3fmb)",
- total_old_gen_size, ((double)total_old_gen_size / 1000.0 / 1000.0),
+ size_t total_new_allocation_old_gen = (size_t)(old_gen_growth_factor * (double)total_soh_stable_size);
+ dprintf (6666, ("stable soh %Id (%.3fmb), factor %.3f=>%.3f -> total gen0 new_alloc %Id (%.3fmb)",
+ total_soh_stable_size, ((double)total_soh_stable_size / 1000.0 / 1000.0),
saved_old_gen_growth_factor, old_gen_growth_factor, total_new_allocation_old_gen,
- new_allocation_old_gen, ((double)new_allocation_old_gen / 1000.0 / 1000.0)));
+ ((double)total_new_allocation_old_gen / 1000.0 / 1000.0)));
+ return total_new_allocation_old_gen;
+ }
- new_allocation_old_gen = min (max_gen0_new_allocation, new_allocation_old_gen);
- new_allocation_old_gen = max (min_gen0_new_allocation, new_allocation_old_gen);
+ // Called at the end of a blocking GC before that GC's sample is recorded.
+ //
+ // Usually we want to take BCS because it's good for surv rate but if BCS is < BCD, we have room
+ // to adjust to affect tcp.
+ size_t compute_gen0_budget_per_heap (size_t total_soh_stable_size, float tcp, size_t bcs_per_heap)
+ {
+ size_t total_budget_old_gen = compute_total_gen0_budget (total_soh_stable_size);
+ size_t budget_old_gen_per_heap = total_budget_old_gen / n_heaps;
+ budget_old_gen_per_heap = Align (budget_old_gen_per_heap, get_alignment_constant (TRUE));
+
+ dprintf (6666, ("-> %Id / heap (% .3fmb)",
+ budget_old_gen_per_heap, ((double)budget_old_gen_per_heap / 1000.0 / 1000.0)));
+
+ budget_old_gen_per_heap = min (max_gen0_new_allocation, budget_old_gen_per_heap);
+ budget_old_gen_per_heap = max (min_gen0_new_allocation, budget_old_gen_per_heap);
+
+ // We want to return a number between bcs and bcd
+ if (bcs_per_heap < budget_old_gen_per_heap)
+ {
+ // If tcp was above target, we can increase budget up to what DATAS allows. But we only
+ // do this when tcp is close enough.
+ sample& sample = get_last_sample();
+ size_t last_budget_per_heap = sample.gen0_budget_per_heap;
+
+ // We don't do anything if we just changed HC between this GC start and previous suspend end.
+ adjustment* adj = get_last_adjustment();
+ size_t last_changed_gc_index = adj->gc_index;
+ size_t saved_last_changed_gc_index = last_changed_gc_index;
+ size_t current_gc_index = VolatileLoadWithoutBarrier (&settings.gc_index);
+ size_t last_bgc_index = VolatileLoadWithoutBarrier (&saved_bgc_settings.gc_index);
+
+ if (last_bgc_index == (current_gc_index - 1))
+ {
+ last_changed_gc_index++;
+ }
- return new_allocation_old_gen;
+ dprintf (6666, ("last gc gen0 budget %Id, last adjustment %s was at GC#%Id, last BGC was #%Id, this GC #%Id, %s",
+ last_budget_per_heap, str_adjust_metrics[adj->metric], saved_last_changed_gc_index, last_bgc_index, current_gc_index,
+ ((last_changed_gc_index < (current_gc_index - 1)) ? "didn't just change" : "did just change")));
+
+ if ((adj->metric == adjust_budget) || (last_changed_gc_index < (current_gc_index - 1)))
+ {
+ float diff = tcp - target_tcp;
+
+ adjustment* adj = get_last_adjustment();
+ bool adjust_budget_p = (adj->metric == adjust_budget);
+ //bool adjust_budget_p = false;
+
+ dprintf (6666, ("tcp of last sample was %.3f, diff to target %.3f, pct %.3f, last adj %s budget",
+ tcp, diff, (diff / target_tcp), (adjust_budget_p ? "was" : "was not")));
+
+ if (adjust_budget_p ||
+ ((diff > 0.0) && ((diff < 2.0) || ((diff / target_tcp) < 0.4))))
+ {
+ float last_alloc_time = (float)100.0 - tcp;
+ float target_alloc_time = (float)100.0 - target_tcp;
+
+ size_t new_budget_per_heap = (size_t)(last_budget_per_heap / last_alloc_time * target_alloc_time);
+ new_budget_per_heap = Align (new_budget_per_heap, get_alignment_constant (TRUE));
+
+ dprintf (6666, ("adjust last budget %Id to %Id (%.3fmb)",
+ last_budget_per_heap, new_budget_per_heap, (new_budget_per_heap / 1000.0 / 1000.0)));
+
+ if ((new_budget_per_heap >= bcs_per_heap) && (new_budget_per_heap <= budget_old_gen_per_heap))
+ {
+ dprintf (6666, ("setting this as the new budget!"));
+ return new_budget_per_heap;
+ }
+ }
+ }
+ }
+
+ dprintf (6666, ("taking min of the two: %Id, %Id", bcs_per_heap, budget_old_gen_per_heap));
+ return min (bcs_per_heap, budget_old_gen_per_heap);
}
//
@@ -4453,17 +4976,7 @@ class gc_heap
size_t current_gen2_samples_count;
size_t processed_gen2_samples_count;
-
- // This records the stcp last time we processed ephemeral samples. We use it
- float last_processed_stcp;
-
- float median_throughput_cost_percent; // estimated overhead of allocator + gc
- float smoothed_median_throughput_cost_percent; // exponentially smoothed version
- float percent_heap_space_cost_per_heap; // percent space cost of adding a heap
- float tcp_reduction_per_step_up; // throughput cost percent effect of increasing heap count
- float tcp_increase_per_step_down; // throughput cost percent effect of decreasing heap count
- float scp_increase_per_step_up; // space cost percent effect of increasing heap count
- float scp_decrease_per_step_down; // space cost percent effect of decreasing heap count
+ size_t gen2_last_changed_sample_count;
int new_n_heaps;
// the heap count we changed from
diff --git a/src/coreclr/gc/gcscan.cpp b/src/coreclr/gc/gcscan.cpp
index 92ed7f3a8687..6f200810fed5 100644
--- a/src/coreclr/gc/gcscan.cpp
+++ b/src/coreclr/gc/gcscan.cpp
@@ -171,6 +171,7 @@ void GCScan::GcScanHandles (promote_func* fn, int condemned, int max_gen,
Ref_UpdatePointers(condemned, max_gen, sc, fn);
Ref_UpdatePinnedPointers(condemned, max_gen, sc, fn);
Ref_ScanDependentHandlesForRelocation(condemned, max_gen, sc, fn);
+ Ref_ScanWeakInteriorPointersForRelocation(condemned, max_gen, sc, fn);
}
}
diff --git a/src/coreclr/gc/handletablescan.cpp b/src/coreclr/gc/handletablescan.cpp
index 7c0692ad5b8f..e5b27da8e621 100644
--- a/src/coreclr/gc/handletablescan.cpp
+++ b/src/coreclr/gc/handletablescan.cpp
@@ -931,6 +931,15 @@ static void VerifyObjectAndAge(_UNCHECKED_OBJECTREF from, _UNCHECKED_OBJECTREF o
}
}
+size_t my_get_size (_UNCHECKED_OBJECTREF ob)
+{
+ MethodTable* mT = ob->GetGCSafeMethodTable();
+
+ return (mT->GetBaseSize() +
+ (mT->HasComponentSize() ?
+ ((size_t)reinterpret_cast(ob)->GetNumComponents() * mT->RawGetComponentSize()) : 0));
+}
+
/*
* BlockVerifyAgeMapForBlocksWorker
*
@@ -992,6 +1001,23 @@ void BlockVerifyAgeMapForBlocksWorker(uint32_t *pdwGen, uint32_t dwClumpMask, Sc
}
}
}
+ if (uType == HNDTYPE_WEAK_INTERIOR_POINTER)
+ {
+ PTR_uintptr_t pUserData = HandleQuickFetchUserDataPointer((OBJECTHANDLE)pValue);
+
+ // if we did then copy the value
+ if (pUserData)
+ {
+ uintptr_t pObjectInteriorPointer = **reinterpret_cast(pUserData);
+ _UNCHECKED_OBJECTREF pObjectPointerRef = *pValue;
+ uintptr_t pObjectPointer = reinterpret_cast(pObjectPointerRef);
+ if (pObjectInteriorPointer < pObjectPointer || pObjectInteriorPointer >= (pObjectPointer + my_get_size(pObjectPointerRef)))
+ {
+ _ASSERTE(!"Weak interior pointer has interior pointer which does not point at the object of the handle.");
+ GCToEEInterface::HandleFatalError(COR_E_EXECUTIONENGINE);
+ }
+ }
+ }
}
}
}
diff --git a/src/coreclr/gc/objecthandle.cpp b/src/coreclr/gc/objecthandle.cpp
index 1c404c6c23b1..5374229b5b06 100644
--- a/src/coreclr/gc/objecthandle.cpp
+++ b/src/coreclr/gc/objecthandle.cpp
@@ -145,6 +145,47 @@ void CALLBACK TraceDependentHandle(_UNCHECKED_OBJECTREF *pObjRef, uintptr_t *pEx
}
}
+void CALLBACK UpdateWeakInteriorHandle(_UNCHECKED_OBJECTREF *pObjRef, uintptr_t *pExtraInfo, uintptr_t lp1, uintptr_t lp2)
+{
+ LIMITED_METHOD_CONTRACT;
+ _ASSERTE(pExtraInfo);
+
+ Object **pPrimaryRef = (Object **)pObjRef;
+ uintptr_t **ppInteriorPtrRef = (uintptr_t **)pExtraInfo;
+
+ LOG((LF_GC, LL_INFO10000, LOG_HANDLE_OBJECT("Querying for new location of ",
+ pPrimaryRef, "to ", *pPrimaryRef)));
+
+ Object *pOldPrimary = *pPrimaryRef;
+
+ _ASSERTE(lp2);
+ promote_func* callback = (promote_func*) lp2;
+ callback(pPrimaryRef, (ScanContext *)lp1, 0);
+
+ Object *pNewPrimary = *pPrimaryRef;
+ if (pNewPrimary != NULL)
+ {
+ uintptr_t pOldInterior = **ppInteriorPtrRef;
+ uintptr_t delta = ((uintptr_t)pNewPrimary) - ((uintptr_t)pOldPrimary);
+ uintptr_t pNewInterior = pOldInterior + delta;
+ **ppInteriorPtrRef = pNewInterior;
+#ifdef _DEBUG
+ if (pOldPrimary != *pPrimaryRef)
+ LOG((LF_GC, LL_INFO10000, "Updating " FMT_HANDLE "from" FMT_ADDR "to " FMT_OBJECT "\n",
+ DBG_ADDR(pPrimaryRef), DBG_ADDR(pOldPrimary), DBG_ADDR(*pPrimaryRef)));
+ else
+ LOG((LF_GC, LL_INFO10000, "Updating " FMT_HANDLE "- " FMT_OBJECT "did not move\n",
+ DBG_ADDR(pPrimaryRef), DBG_ADDR(*pPrimaryRef)));
+ if (pOldInterior != pNewInterior)
+ LOG((LF_GC, LL_INFO10000, "Updating " FMT_HANDLE "from" FMT_ADDR "to " FMT_OBJECT "\n",
+ DBG_ADDR(*ppInteriorPtrRef), DBG_ADDR(pOldInterior), DBG_ADDR(pNewInterior)));
+ else
+ LOG((LF_GC, LL_INFO10000, "Updating " FMT_HANDLE "- " FMT_OBJECT "did not move\n",
+ DBG_ADDR(*ppInteriorPtrRef), DBG_ADDR(pOldInterior)));
+#endif
+ }
+}
+
void CALLBACK UpdateDependentHandle(_UNCHECKED_OBJECTREF *pObjRef, uintptr_t *pExtraInfo, uintptr_t lp1, uintptr_t lp2)
{
LIMITED_METHOD_CONTRACT;
@@ -427,6 +468,7 @@ void CALLBACK ScanPointerForProfilerAndETW(_UNCHECKED_OBJECTREF *pObjRef, uintpt
break;
case HNDTYPE_WEAK_SHORT:
case HNDTYPE_WEAK_LONG:
+ case HNDTYPE_WEAK_INTERIOR_POINTER:
#ifdef FEATURE_WEAK_NATIVE_COM_HANDLES
case HNDTYPE_WEAK_NATIVE_COM:
#endif // FEATURE_WEAK_NATIVE_COM_HANDLES
@@ -527,6 +569,7 @@ static const uint32_t s_rgTypeFlags[] =
HNDF_NORMAL, // HNDTYPE_ASYNCPINNED
HNDF_EXTRAINFO, // HNDTYPE_SIZEDREF
HNDF_EXTRAINFO, // HNDTYPE_WEAK_NATIVE_COM
+ HNDF_EXTRAINFO, // HNDTYPE_WEAK_INTERIOR_POINTER
};
int getNumberOfSlots()
@@ -1170,6 +1213,7 @@ void Ref_CheckReachable(uint32_t condemned, uint32_t maxgen, ScanContext *sc)
#ifdef FEATURE_REFCOUNTED_HANDLES
HNDTYPE_REFCOUNTED,
#endif
+ HNDTYPE_WEAK_INTERIOR_POINTER
};
// check objects pointed to by short weak handles
@@ -1339,6 +1383,40 @@ void Ref_ScanDependentHandlesForClearing(uint32_t condemned, uint32_t maxgen, Sc
}
}
+// Perform a scan of weak interior pointers for the purpose of updating handles to track relocated objects.
+void Ref_ScanWeakInteriorPointersForRelocation(uint32_t condemned, uint32_t maxgen, ScanContext* sc, Ref_promote_func* fn)
+{
+ LOG((LF_GC, LL_INFO10000, "Relocating moved dependent handles in generation %u\n", condemned));
+ uint32_t type = HNDTYPE_WEAK_INTERIOR_POINTER;
+ uint32_t flags = (sc->concurrent) ? HNDGCF_ASYNC : HNDGCF_NORMAL;
+ flags |= HNDGCF_EXTRAINFO;
+
+ HandleTableMap *walk = &g_HandleTableMap;
+ while (walk)
+ {
+ for (uint32_t i = 0; i < INITIAL_HANDLE_TABLE_ARRAY_SIZE; i ++)
+ {
+ if (walk->pBuckets[i] != NULL)
+ {
+ int uCPUindex = getSlotNumber(sc);
+ int uCPUlimit = getNumberOfSlots();
+ assert(uCPUlimit > 0);
+ int uCPUstep = getThreadCount(sc);
+ HHANDLETABLE* pTable = walk->pBuckets[i]->pTable;
+ for ( ; uCPUindex < uCPUlimit; uCPUindex += uCPUstep)
+ {
+ HHANDLETABLE hTable = pTable[uCPUindex];
+ if (hTable)
+ {
+ HndScanHandlesForGC(hTable, UpdateWeakInteriorHandle, uintptr_t(sc), uintptr_t(fn), &type, 1, condemned, maxgen, flags );
+ }
+ }
+ }
+ }
+ walk = walk->pNext;
+ }
+}
+
// Perform a scan of dependent handles for the purpose of updating handles to track relocated objects.
void Ref_ScanDependentHandlesForRelocation(uint32_t condemned, uint32_t maxgen, ScanContext* sc, Ref_promote_func* fn)
{
@@ -1590,6 +1668,7 @@ void Ref_ScanHandlesForProfilerAndETW(uint32_t maxgen, uintptr_t lp1, handle_sca
HNDTYPE_ASYNCPINNED,
#endif
HNDTYPE_SIZEDREF,
+ HNDTYPE_WEAK_INTERIOR_POINTER
};
uint32_t flags = HNDGCF_NORMAL;
@@ -1712,6 +1791,7 @@ void Ref_AgeHandles(uint32_t condemned, uint32_t maxgen, ScanContext* sc)
HNDTYPE_ASYNCPINNED,
#endif
HNDTYPE_SIZEDREF,
+ HNDTYPE_WEAK_INTERIOR_POINTER
};
// perform a multi-type scan that ages the handles
@@ -1766,6 +1846,7 @@ void Ref_RejuvenateHandles(uint32_t condemned, uint32_t maxgen, ScanContext* sc)
HNDTYPE_ASYNCPINNED,
#endif
HNDTYPE_SIZEDREF,
+ HNDTYPE_WEAK_INTERIOR_POINTER
};
// reset the ages of these handles
@@ -1819,6 +1900,7 @@ void Ref_VerifyHandleTable(uint32_t condemned, uint32_t maxgen, ScanContext* sc)
#endif
HNDTYPE_SIZEDREF,
HNDTYPE_DEPENDENT,
+ HNDTYPE_WEAK_INTERIOR_POINTER
};
// verify these handles
diff --git a/src/coreclr/gc/objecthandle.h b/src/coreclr/gc/objecthandle.h
index d579e8631d6c..634510758c32 100644
--- a/src/coreclr/gc/objecthandle.h
+++ b/src/coreclr/gc/objecthandle.h
@@ -102,6 +102,7 @@ DhContext *Ref_GetDependentHandleContext(ScanContext* sc);
bool Ref_ScanDependentHandlesForPromotion(DhContext *pDhContext);
void Ref_ScanDependentHandlesForClearing(uint32_t condemned, uint32_t maxgen, ScanContext* sc);
void Ref_ScanDependentHandlesForRelocation(uint32_t condemned, uint32_t maxgen, ScanContext* sc, Ref_promote_func* fn);
+void Ref_ScanWeakInteriorPointersForRelocation(uint32_t condemned, uint32_t maxgen, ScanContext* sc, Ref_promote_func* fn);
void Ref_ScanSizedRefHandles(uint32_t condemned, uint32_t maxgen, ScanContext* sc, Ref_promote_func* fn);
void Ref_CheckReachable (uint32_t uCondemnedGeneration, uint32_t uMaxGeneration, ScanContext* sc);
diff --git a/src/coreclr/gc/unix/gcenv.unix.cpp b/src/coreclr/gc/unix/gcenv.unix.cpp
index 192a4c1216df..6635083a20ba 100644
--- a/src/coreclr/gc/unix/gcenv.unix.cpp
+++ b/src/coreclr/gc/unix/gcenv.unix.cpp
@@ -935,34 +935,6 @@ static size_t GetLogicalProcessorCacheSizeFromOS()
}
#endif
-#if (defined(HOST_ARM64) || defined(HOST_LOONGARCH64)) && !defined(TARGET_APPLE)
- if (cacheSize == 0)
- {
- // We expect to get the L3 cache size for Arm64 but currently expected to be missing that info
- // from most of the machines.
- //
- // _SC_LEVEL*_*CACHE_SIZE is not yet present. Work is in progress to enable this for arm64
- //
- // /sys/devices/system/cpu/cpu*/cache/index*/ is also not yet present in most systems.
- // Arm64 patch is in Linux kernel tip.
- //
- // midr_el1 is available in "/sys/devices/system/cpu/cpu0/regs/identification/midr_el1",
- // but without an exhaustive list of ARM64 processors any decode of midr_el1
- // Would likely be incomplete
-
- // Published information on ARM64 architectures is limited.
- // If we use recent high core count chips as a guide for state of the art, we find
- // total L3 cache to be 1-2MB/core. As always, there are exceptions.
-
- // Estimate cache size based on CPU count
- // Assume lower core count are lighter weight parts which are likely to have smaller caches
- // Assume L3$/CPU grows linearly from 256K to 1.5M/CPU as logicalCPUs grows from 2 to 12 CPUs
- DWORD logicalCPUs = g_processAffinitySet.Count();
-
- cacheSize = logicalCPUs * std::min(1536, std::max(256, (int)logicalCPUs * 128)) * 1024;
- }
-#endif
-
#if HAVE_SYSCTLBYNAME
if (cacheSize == 0)
{
diff --git a/src/coreclr/gcdump/i386/gcdumpx86.cpp b/src/coreclr/gcdump/i386/gcdumpx86.cpp
index c5d359aac517..ba267bd3470c 100644
--- a/src/coreclr/gcdump/i386/gcdumpx86.cpp
+++ b/src/coreclr/gcdump/i386/gcdumpx86.cpp
@@ -456,10 +456,10 @@ size_t GCDump::DumpGCTable(PTR_CBYTE table,
/* non-ptr arg push */
curOffs += (val & 0x07);
-#ifndef UNIX_X86_ABI
- // For x86/Linux, non-ptr arg pushes can be reported even for EBP frames
+#ifndef FEATURE_EH_FUNCLETS
+ // For funclets, non-ptr arg pushes can be reported even for EBP frames
_ASSERTE(!header.ebpFrame);
-#endif // UNIX_X86_ABI
+#endif // FEATURE_EH_FUNCLETS
argCnt++;
DumpEncoding(bp, table-bp); bp = table;
diff --git a/src/coreclr/gcinfo/gcinfoencoder.cpp b/src/coreclr/gcinfo/gcinfoencoder.cpp
index 115f7cdcf253..0abf65047b8d 100644
--- a/src/coreclr/gcinfo/gcinfoencoder.cpp
+++ b/src/coreclr/gcinfo/gcinfoencoder.cpp
@@ -922,7 +922,11 @@ void GcInfoEncoder::FinalizeSlotIds()
#endif
}
-bool GcInfoEncoder::IsAlwaysScratch(GcSlotDesc &slotDesc)
+#ifdef PARTIALLY_INTERRUPTIBLE_GC_SUPPORTED
+
+// tells whether a slot cannot contain an object reference
+// at call instruction or right after returning
+bool GcInfoEncoder::DoNotTrackInPartiallyInterruptible(GcSlotDesc &slotDesc)
{
#if defined(TARGET_ARM)
@@ -933,7 +937,31 @@ bool GcInfoEncoder::IsAlwaysScratch(GcSlotDesc &slotDesc)
_ASSERTE(regNum >= 0 && regNum <= 14);
_ASSERTE(regNum != 13); // sp
- return ((regNum <= 3) || (regNum >= 12)); // R12 and R14/LR are both scratch registers
+ return ((regNum <= 3) || (regNum >= 12)) // R12 is volatile and SP/LR can't contain objects around calls
+ && regNum != 0 // R0 can contain return value
+ ;
+ }
+ else if (!slotDesc.IsUntracked() && (slotDesc.Slot.Stack.Base == GC_SP_REL) &&
+ ((UINT32)slotDesc.Slot.Stack.SpOffset < m_SizeOfStackOutgoingAndScratchArea))
+ {
+ return TRUE;
+ }
+ else
+ return FALSE;
+
+#elif defined(TARGET_ARM64)
+
+ _ASSERTE(m_SizeOfStackOutgoingAndScratchArea != (UINT32)-1);
+ if (slotDesc.IsRegister())
+ {
+ int regNum = (int)slotDesc.Slot.RegisterNumber;
+ _ASSERTE(regNum >= 0 && regNum <= 30);
+ _ASSERTE(regNum != 18);
+
+ return (regNum <= 17 || regNum >= 29) // X0 through X17 are scratch, FP/LR can't be used for objects around calls
+ && regNum != 0 // X0 can contain return value
+ && regNum != 1 // X1 can contain return value
+ ;
}
else if (!slotDesc.IsUntracked() && (slotDesc.Slot.Stack.Base == GC_SP_REL) &&
((UINT32)slotDesc.Slot.Stack.SpOffset < m_SizeOfStackOutgoingAndScratchArea))
@@ -953,7 +981,7 @@ bool GcInfoEncoder::IsAlwaysScratch(GcSlotDesc &slotDesc)
_ASSERTE(regNum != 4); // rsp
UINT16 PreservedRegMask =
- (1 << 3) // rbx
+ (1 << 3) // rbx
| (1 << 5) // rbp
#ifndef UNIX_AMD64_ABI
| (1 << 6) // rsi
@@ -962,7 +990,12 @@ bool GcInfoEncoder::IsAlwaysScratch(GcSlotDesc &slotDesc)
| (1 << 12) // r12
| (1 << 13) // r13
| (1 << 14) // r14
- | (1 << 15); // r15
+ | (1 << 15) // r15
+ | (1 << 0) // rax - may contain return value
+#ifdef UNIX_AMD64_ABI
+ | (1 << 2) // rdx - may contain return value
+#endif
+ ;
return !(PreservedRegMask & (1 << regNum));
}
@@ -978,6 +1011,7 @@ bool GcInfoEncoder::IsAlwaysScratch(GcSlotDesc &slotDesc)
return FALSE;
#endif
}
+#endif // PARTIALLY_INTERRUPTIBLE_GC_SUPPORTED
void GcInfoEncoder::Build()
{
@@ -1396,7 +1430,7 @@ void GcInfoEncoder::Build()
else
{
UINT32 slotIndex = pCurrent->SlotId;
- if(!IsAlwaysScratch(m_SlotTable[slotIndex]))
+ if(!DoNotTrackInPartiallyInterruptible(m_SlotTable[slotIndex]))
{
BYTE becomesLive = pCurrent->BecomesLive;
_ASSERTE((liveState.ReadBit(slotIndex) && !becomesLive)
diff --git a/src/coreclr/ilasm/README.md b/src/coreclr/ilasm/README.md
new file mode 100644
index 000000000000..35f621b6df9a
--- /dev/null
+++ b/src/coreclr/ilasm/README.md
@@ -0,0 +1,18 @@
+# Generating the Parser using Bison
+
+- Bison for Windows: https://github.com/lexxmark/winflexbison
+- Other platforms: https://www.gnu.org/software/bison
+
+To generate `asmparse.cpp`, run either of following:
+- Unix: `yacc asmparse.y -o prebuilt/asmparse.cpp`
+- Windows: `win_bison asmparse.y -o prebuilt\asmparse.cpp`
+
+## Docker
+```bash
+$ cd runtime
+
+# run a throw-away-after-exit container with --rm
+$ docker run --rm -v$(pwd):/runtime -w /runtime/src/coreclr/ilasm alpine \
+ sh -c 'apk add bison && yacc asmparse.y -o prebuilt/asmparse.cpp'
+```
+
diff --git a/src/coreclr/ilasm/asmparse.h b/src/coreclr/ilasm/asmparse.h
index 5300a092b4e2..7376bab5badf 100644
--- a/src/coreclr/ilasm/asmparse.h
+++ b/src/coreclr/ilasm/asmparse.h
@@ -313,7 +313,7 @@ class AsmParse : public ErrorReporter
friend char* skipBlanks(_In_ __nullterminated char*,unsigned*);
friend char* nextBlank(_In_ __nullterminated char*);
friend int ProcessEOF();
- friend unsigned __int8* skipType(unsigned __int8* ptr, BOOL fFixupType);
+ friend uint8_t* skipType(uint8_t* ptr, BOOL fFixupType);
friend void FixupConstraints();
Assembler* assem; // This does most of the semantic processing
diff --git a/src/coreclr/ilasm/asmparse.y b/src/coreclr/ilasm/asmparse.y
index c9861d58d797..2257ecb31af7 100644
--- a/src/coreclr/ilasm/asmparse.y
+++ b/src/coreclr/ilasm/asmparse.y
@@ -27,8 +27,8 @@
CorTypeAttr exptAttr;
CorManifestResourceFlags manresAttr;
double* float64;
- __int64* int64;
- __int32 int32;
+ int64_t* int64;
+ int32_t int32;
char* string;
BinStr* binstr;
Labels* labels;
@@ -42,13 +42,13 @@
};
/* These are returned by the LEXER and have values */
-%token ERROR_ BAD_COMMENT_ BAD_LITERAL_ /* bad strings, */
+%token BAD_COMMENT_ BAD_LITERAL_ /* bad strings, */
%token ID /* testing343 */
%token DOTTEDNAME /* System.Object */
%token QSTRING /* "Hello World\n" */
%token SQSTRING /* 'Hello World\n' */
-%token INT32 /* 3425 0x34FA 0352 */
-%token INT64 /* 342534523534534 0x34FA434644554 */
+%token INT32_V /* 3425 0x34FA 0352 */
+%token INT64_V /* 342534523534534 0x34FA434644554 */
%token FLOAT64 /* -334234 24E-34 */
%token HEXBYTE /* 05 1A FA */
%token TYPEDEF_T
@@ -96,7 +96,7 @@
%token _CLASS _NAMESPACE _METHOD _FIELD _DATA _THIS _BASE _NESTER
%token _EMITBYTE _TRY _MAXSTACK _LOCALS _ENTRYPOINT _ZEROINIT
%token _EVENT _ADDON _REMOVEON _FIRE _OTHER
-%token _PROPERTY _SET _GET DEFAULT_
+%token _PROPERTY _SET _GET
%token _PERMISSION _PERMISSIONSET
/* security actions */
@@ -259,15 +259,15 @@ dottedName : id { $$ = $1; }
| dottedName '.' dottedName { $$ = newStringWDel($1, '.', $3); }
;
-int32 : INT32 { $$ = $1; }
+int32 : INT32_V { $$ = $1; }
;
-int64 : INT64 { $$ = $1; }
- | INT32 { $$ = neg ? new __int64($1) : new __int64((unsigned)$1); }
+int64 : INT64_V { $$ = $1; }
+ | INT32_V { $$ = neg ? new int64_t($1) : new int64_t((unsigned)$1); }
;
float64 : FLOAT64 { $$ = $1; }
- | FLOAT32_ '(' int32 ')' { float f; *((__int32*) (&f)) = $3; $$ = new double(f); }
+ | FLOAT32_ '(' int32 ')' { float f; *((int32_t*) (&f)) = $3; $$ = new double(f); }
| FLOAT64_ '(' int64 ')' { $$ = (double*) $3; }
;
@@ -693,7 +693,7 @@ memberRef : methodSpec methodRef { $$ = $2;
PASM->SetMemberRefFixup($$,iOpcodeLen); }
| FIELD_ type dottedName
{ $2->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
- $$ = PASM->MakeMemberRef(NULL, $3, $2);
+ $$ = PASM->MakeMemberRef(mdTokenNil, $3, $2);
PASM->SetMemberRefFixup($$,iOpcodeLen); }
| FIELD_ TYPEDEF_F { $$ = $2->m_tkTypeSpec;
PASM->SetMemberRefFixup($$,iOpcodeLen); }
@@ -916,13 +916,13 @@ methodDecl : _EMITBYTE int32 { PASM->EmitByte($2)
| _VTENTRY int32 ':' int32 { PASM->m_pCurMethod->m_wVTEntry = (WORD)$2;
PASM->m_pCurMethod->m_wVTSlot = (WORD)$4; }
| _OVERRIDE typeSpec DCOLON methodName
- { PASM->AddMethodImpl($2,$4,NULL,NULL,NULL,NULL); }
+ { PASM->AddMethodImpl($2,$4,NULL,mdTokenNil,NULL,NULL); }
| _OVERRIDE METHOD_ callConv type typeSpec DCOLON methodName genArity '(' sigArgs0 ')'
{ PASM->AddMethodImpl($5,$7,
($8==0 ? parser->MakeSig($3,$4,$10) :
parser->MakeSig($3| IMAGE_CEE_CS_CALLCONV_GENERIC,$4,$10,$8))
- ,NULL,NULL,NULL);
+ ,mdTokenNil,NULL,NULL);
PASM->ResetArgNameList();
}
| scopeBlock
@@ -1068,55 +1068,55 @@ ddItem : CHAR_ '*' '(' compQstring ')' { PASM->EmitDataStr
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
sizeof(double)*$5); }
| INT64_ '(' int64 ')' ddItemCount
- { __int64* p = new (nothrow) __int64[$5];
+ { int64_t* p = new (nothrow) int64_t[$5];
if(p != NULL) {
for(int i=0; i<$5; i++) p[i] = *($3);
- PASM->EmitData(p, sizeof(__int64)*$5); delete $3; delete [] p;
+ PASM->EmitData(p, sizeof(int64_t)*$5); delete $3; delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(__int64)*$5); }
+ sizeof(int64_t)*$5); }
| INT32_ '(' int32 ')' ddItemCount
- { __int32* p = new (nothrow) __int32[$5];
+ { int32_t* p = new (nothrow) int32_t[$5];
if(p != NULL) {
for(int i=0; i<$5; i++) p[i] = $3;
- PASM->EmitData(p, sizeof(__int32)*$5); delete [] p;
+ PASM->EmitData(p, sizeof(int32_t)*$5); delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(__int32)*$5); }
+ sizeof(int32_t)*$5); }
| INT16_ '(' int32 ')' ddItemCount
- { __int16 i = (__int16) $3; FAIL_UNLESS(i == $3, ("Value %d too big\n", $3));
- __int16* p = new (nothrow) __int16[$5];
+ { int16_t i = (int16_t) $3; FAIL_UNLESS(i == $3, ("Value %d too big\n", $3));
+ int16_t* p = new (nothrow) int16_t[$5];
if(p != NULL) {
for(int j=0; j<$5; j++) p[j] = i;
- PASM->EmitData(p, sizeof(__int16)*$5); delete [] p;
+ PASM->EmitData(p, sizeof(int16_t)*$5); delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(__int16)*$5); }
+ sizeof(int16_t)*$5); }
| INT8_ '(' int32 ')' ddItemCount
- { __int8 i = (__int8) $3; FAIL_UNLESS(i == $3, ("Value %d too big\n", $3));
- __int8* p = new (nothrow) __int8[$5];
+ { int8_t i = (int8_t) $3; FAIL_UNLESS(i == $3, ("Value %d too big\n", $3));
+ int8_t* p = new (nothrow) int8_t[$5];
if(p != NULL) {
for(int j=0; j<$5; j++) p[j] = i;
- PASM->EmitData(p, sizeof(__int8)*$5); delete [] p;
+ PASM->EmitData(p, sizeof(int8_t)*$5); delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(__int8)*$5); }
+ sizeof(int8_t)*$5); }
| FLOAT32_ ddItemCount { PASM->EmitData(NULL, sizeof(float)*$2); }
| FLOAT64_ ddItemCount { PASM->EmitData(NULL, sizeof(double)*$2); }
- | INT64_ ddItemCount { PASM->EmitData(NULL, sizeof(__int64)*$2); }
- | INT32_ ddItemCount { PASM->EmitData(NULL, sizeof(__int32)*$2); }
- | INT16_ ddItemCount { PASM->EmitData(NULL, sizeof(__int16)*$2); }
- | INT8_ ddItemCount { PASM->EmitData(NULL, sizeof(__int8)*$2); }
+ | INT64_ ddItemCount { PASM->EmitData(NULL, sizeof(int64_t)*$2); }
+ | INT32_ ddItemCount { PASM->EmitData(NULL, sizeof(int32_t)*$2); }
+ | INT16_ ddItemCount { PASM->EmitData(NULL, sizeof(int16_t)*$2); }
+ | INT8_ ddItemCount { PASM->EmitData(NULL, sizeof(int8_t)*$2); }
;
/* Default values declaration for fields, parameters and verbal form of CA blob description */
fieldSerInit : FLOAT32_ '(' float64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R4);
float f = (float)(*$3);
- $$->appendInt32(*((__int32*)&f)); delete $3; }
+ $$->appendInt32(*((int32_t*)&f)); delete $3; }
| FLOAT64_ '(' float64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R8);
- $$->appendInt64((__int64 *)$3); delete $3; }
+ $$->appendInt64((int64_t *)$3); delete $3; }
| FLOAT32_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R4);
$$->appendInt32($3); }
| FLOAT64_ '(' int64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_R8);
- $$->appendInt64((__int64 *)$3); delete $3; }
+ $$->appendInt64((int64_t *)$3); delete $3; }
| INT64_ '(' int64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I8);
- $$->appendInt64((__int64 *)$3); delete $3; }
+ $$->appendInt64((int64_t *)$3); delete $3; }
| INT32_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I4);
$$->appendInt32($3); }
| INT16_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I2);
@@ -1124,7 +1124,7 @@ fieldSerInit : FLOAT32_ '(' float64 ')' { $$ = new BinStr()
| INT8_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_I1);
$$->appendInt8($3); }
| UNSIGNED_ INT64_ '(' int64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U8);
- $$->appendInt64((__int64 *)$4); delete $4; }
+ $$->appendInt64((int64_t *)$4); delete $4; }
| UNSIGNED_ INT32_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U4);
$$->appendInt32($4); }
| UNSIGNED_ INT16_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U2);
@@ -1132,7 +1132,7 @@ fieldSerInit : FLOAT32_ '(' float64 ')' { $$ = new BinStr()
| UNSIGNED_ INT8_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U1);
$$->appendInt8($4); }
| UINT64_ '(' int64 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U8);
- $$->appendInt64((__int64 *)$3); delete $3; }
+ $$->appendInt64((int64_t *)$3); delete $3; }
| UINT32_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U4);
$$->appendInt32($3); }
| UINT16_ '(' int32 ')' { $$ = new BinStr(); $$->appendInt8(ELEMENT_TYPE_U2);
@@ -1154,8 +1154,8 @@ bytes : /* EMPTY */ { $$ = new BinStr()
| hexbytes { $$ = $1; }
;
-hexbytes : HEXBYTE { __int8 i = (__int8) $1; $$ = new BinStr(); $$->appendInt8(i); }
- | hexbytes HEXBYTE { __int8 i = (__int8) $2; $$ = $1; $$->appendInt8(i); }
+hexbytes : HEXBYTE { int8_t i = (int8_t) $1; $$ = new BinStr(); $$->appendInt8(i); }
+ | hexbytes HEXBYTE { int8_t i = (int8_t) $2; $$ = $1; $$->appendInt8(i); }
;
/* Field/parameter initialization */
@@ -1257,21 +1257,21 @@ serInit : fieldSerInit { $$ = $1; }
f32seq : /* EMPTY */ { $$ = new BinStr(); }
| f32seq float64 { $$ = $1;
- float f = (float) (*$2); $$->appendInt32(*((__int32*)&f)); delete $2; }
+ float f = (float) (*$2); $$->appendInt32(*((int32_t*)&f)); delete $2; }
| f32seq int32 { $$ = $1;
$$->appendInt32($2); }
;
f64seq : /* EMPTY */ { $$ = new BinStr(); }
| f64seq float64 { $$ = $1;
- $$->appendInt64((__int64 *)$2); delete $2; }
+ $$->appendInt64((int64_t *)$2); delete $2; }
| f64seq int64 { $$ = $1;
- $$->appendInt64((__int64 *)$2); delete $2; }
+ $$->appendInt64((int64_t *)$2); delete $2; }
;
i64seq : /* EMPTY */ { $$ = new BinStr(); }
| i64seq int64 { $$ = $1;
- $$->appendInt64((__int64 *)$2); delete $2; }
+ $$->appendInt64((int64_t *)$2); delete $2; }
;
i32seq : /* EMPTY */ { $$ = new BinStr(); }
diff --git a/src/coreclr/ilasm/assembler.cpp b/src/coreclr/ilasm/assembler.cpp
index 1a8cef9abcaf..e105c00162c5 100644
--- a/src/coreclr/ilasm/assembler.cpp
+++ b/src/coreclr/ilasm/assembler.cpp
@@ -146,7 +146,7 @@ class TypeSpecContainer
{
private:
// Contain a BinStr
- unsigned __int8 *ptr_;
+ uint8_t *ptr_;
unsigned len_;
// Hash the BinStr, just for speed of lookup
unsigned hash_;
@@ -166,7 +166,7 @@ class TypeSpecContainer
// Constructor for a 'permanent' object
// Don't bother re-hashing, since we will always have already constructed the lookup object
TypeSpecContainer(const TypeSpecContainer &t, mdToken tk) :
- ptr_(new unsigned __int8[t.len_]),
+ ptr_(new uint8_t[t.len_]),
len_(t.len_),
hash_(t.hash_),
token_(tk)
@@ -523,7 +523,7 @@ void Assembler::AddClass()
m_pCurClass->m_Attr = attr;
m_pCurClass->m_crExtends = (m_pCurClass->m_cl == m_tkSysObject)? mdTypeRefNil : crExtends;
- if ((m_pCurClass->m_dwNumInterfaces = m_nImplList) != NULL)
+ if ((m_pCurClass->m_dwNumInterfaces = m_nImplList) != 0)
{
if(bIsEnum) report->error("Enum implementing interface(s)\n");
if((m_pCurClass->m_crImplements = new mdTypeRef[m_nImplList+1]) != NULL)
@@ -1284,7 +1284,7 @@ void Assembler::EmitDD(_In_ __nullterminated char *str)
_ASSERTE(SUCCEEDED(hr));
DWORD* ptr;
- DWORD sizeofptr = (DWORD)((m_dwCeeFileFlags & ICEE_CREATE_FILE_PE32) ? sizeof(DWORD) : sizeof(__int64));
+ DWORD sizeofptr = (DWORD)((m_dwCeeFileFlags & ICEE_CREATE_FILE_PE32) ? sizeof(DWORD) : sizeof(int64_t));
hr = m_pCeeFileGen->GetSectionBlock(m_pCurSection, sizeofptr, 1, (void**) &ptr);
if (FAILED(hr))
{
@@ -1318,7 +1318,7 @@ void Assembler::EmitDD(_In_ __nullterminated char *str)
else
{
m_dwComImageFlags &= ~COMIMAGE_FLAGS_ILONLY;
- *((__int64*)ptr) = (__int64)dwAddr;
+ *((int64_t*)ptr) = (int64_t)dwAddr;
}
}
@@ -1654,10 +1654,10 @@ void Assembler::EmitInstrI(Instr* instr, int val)
}
/**************************************************************************/
-void Assembler::EmitInstrI8(Instr* instr, __int64* val)
+void Assembler::EmitInstrI8(Instr* instr, int64_t* val)
{
EmitOpcode(instr);
- EmitBytes((BYTE *)val, sizeof(__int64));
+ EmitBytes((BYTE *)val, sizeof(int64_t));
delete val;
}
@@ -2005,7 +2005,7 @@ void Assembler::SetPropMethod(int MethodCode, mdToken tk)
void Assembler::EmitInstrStringLiteral(Instr* instr, BinStr* literal, BOOL ConvertToUnicode, BOOL Swap /*=FALSE*/)
{
DWORD DataLen = literal->length(),L;
- unsigned __int8 *pb = literal->ptr();
+ uint8_t *pb = literal->ptr();
HRESULT hr = S_OK;
mdToken tk;
WCHAR *UnicodeString;
@@ -2431,7 +2431,7 @@ HRESULT Assembler::SavePdbFile()
if (FAILED(hr = (m_pPortablePdbWriter->GetEmitter() == NULL ? E_FAIL : S_OK))) goto exit;
if (FAILED(hr = m_pCeeFileGen->GetEntryPoint(m_pCeeFile, &entryPoint))) goto exit;
if (FAILED(hr = m_pPortablePdbWriter->BuildPdbStream(m_pEmitter, entryPoint))) goto exit;
- if (FAILED(hr = m_pPortablePdbWriter->GetEmitter()->Save(m_wzPdbFileName, NULL))) goto exit;
+ if (FAILED(hr = m_pPortablePdbWriter->GetEmitter()->Save(m_wzPdbFileName, 0))) goto exit;
exit:
return hr;
diff --git a/src/coreclr/ilasm/assembler.h b/src/coreclr/ilasm/assembler.h
index b80ef9a16d3c..facdfc8c02fc 100644
--- a/src/coreclr/ilasm/assembler.h
+++ b/src/coreclr/ilasm/assembler.h
@@ -538,7 +538,7 @@ class PermissionDecl
*pBlob++ = pVal[1];
break;
case SERIALIZATION_TYPE_I4:
- *(__int32*)pBlob = *(__int32*)&pVal[1];
+ *(int32_t*)pBlob = *(int32_t*)&pVal[1];
pBlob += 4;
break;
case SERIALIZATION_TYPE_STRING:
@@ -552,15 +552,15 @@ class PermissionDecl
// We can have enums with base type of I1, I2 and I4.
switch (pVal[1 + length + 1]) {
case 1:
- *(__int8*)pBlob = *(__int8*)&pVal[1 + length + 2];
+ *(int8_t*)pBlob = *(int8_t*)&pVal[1 + length + 2];
pBlob += 1;
break;
case 2:
- *(__int16*)pBlob = *(__int16*)&pVal[1 + length + 2];
+ *(int16_t*)pBlob = *(int16_t*)&pVal[1 + length + 2];
pBlob += 2;
break;
case 4:
- *(__int32*)pBlob = *(__int32*)&pVal[1 + length + 2];
+ *(int32_t*)pBlob = *(int32_t*)&pVal[1 + length + 2];
pBlob += 4;
break;
default:
@@ -901,7 +901,7 @@ class Assembler {
void EmitInstrVar(Instr* instr, int var);
void EmitInstrVarByName(Instr* instr, _In_ __nullterminated char* label);
void EmitInstrI(Instr* instr, int val);
- void EmitInstrI8(Instr* instr, __int64* val);
+ void EmitInstrI8(Instr* instr, int64_t* val);
void EmitInstrR(Instr* instr, double* val);
void EmitInstrBrOffset(Instr* instr, int offset);
void EmitInstrBrTarget(Instr* instr, _In_ __nullterminated char* label);
diff --git a/src/coreclr/ilasm/binstr.h b/src/coreclr/ilasm/binstr.h
index f22a5e218877..013e35cb2889 100644
--- a/src/coreclr/ilasm/binstr.h
+++ b/src/coreclr/ilasm/binstr.h
@@ -24,11 +24,11 @@ class BinStr {
void appendInt8(int val) { if (len >= max) Realloc(); ptr_[len++] = (uint8_t)val; }
void appendInt16(int val) { if (len + 2 > max) Realloc(); SET_UNALIGNED_16(&ptr_[len], val); len += 2; }
void appendInt32(int val) { if (len + 4 > max) Realloc(); SET_UNALIGNED_32(&ptr_[len], val); len += 4; }
- void appendInt64(__int64 *pval) { if (len + 8 > max) Realloc(8); SET_UNALIGNED_64(&ptr_[len],(*pval)); len += 8; }
- unsigned __int8* getBuff(unsigned size) {
+ void appendInt64(int64_t *pval) { if (len + 8 > max) Realloc(8); SET_UNALIGNED_64(&ptr_[len],(*pval)); len += 8; }
+ uint8_t* getBuff(unsigned size) {
if (len + size > max) Realloc(size);
_ASSERTE(len + size <= max);
- unsigned __int8* ret = &ptr_[len];
+ uint8_t* ret = &ptr_[len];
len += size;
return(ret);
}
@@ -46,7 +46,7 @@ class BinStr {
void remove(unsigned size) { _ASSERTE(len >= size); len -= size; }
- unsigned __int8* ptr() { return(ptr_); }
+ uint8_t* ptr() { return(ptr_); }
unsigned length() { return(len); }
private:
@@ -55,7 +55,7 @@ class BinStr {
if (max < atLeast + len)
max = atLeast + len;
_ASSERTE(max >= len + atLeast);
- unsigned __int8* newPtr = new unsigned __int8[max];
+ uint8_t* newPtr = new uint8_t[max];
memcpy(newPtr, ptr_, len);
if (ptr_ != buff) delete [] ptr_;
ptr_ = newPtr;
@@ -64,8 +64,8 @@ class BinStr {
private:
unsigned len;
unsigned max;
- unsigned __int8 *ptr_;
- unsigned __int8 buff[8];
+ uint8_t *ptr_;
+ uint8_t buff[8];
};
BinStr* BinStrToUnicode(BinStr* pSource, bool Swap = false);
#ifdef _PREFAST_
diff --git a/src/coreclr/ilasm/grammar_after.cpp b/src/coreclr/ilasm/grammar_after.cpp
index 45591afc9c57..9f7f37a59ea2 100644
--- a/src/coreclr/ilasm/grammar_after.cpp
+++ b/src/coreclr/ilasm/grammar_after.cpp
@@ -339,9 +339,9 @@ void Init_str2uint64()
for(i='A'; i <= 'Z'; i++) digits[i] = i + 10 - 'A';
for(i='a'; i <= 'z'; i++) digits[i] = i + 10 - 'a';
}
-static unsigned __int64 str2uint64(const char* str, const char** endStr, unsigned radix)
+static uint64_t str2uint64(const char* str, const char** endStr, unsigned radix)
{
- unsigned __int64 ret = 0;
+ uint64_t ret = 0;
unsigned digit,ix;
_ASSERTE(radix <= 36);
for(;;str = nextchar((char*)str))
@@ -1203,19 +1203,19 @@ int yylex()
}
begNum = curPos;
{
- unsigned __int64 i64 = str2uint64(begNum, const_cast(&curPos), radix);
- unsigned __int64 mask64 = neg ? UI64(0xFFFFFFFF80000000) : UI64(0xFFFFFFFF00000000);
- unsigned __int64 largestNegVal32 = UI64(0x0000000080000000);
+ uint64_t i64 = str2uint64(begNum, const_cast(&curPos), radix);
+ uint64_t mask64 = neg ? UI64(0xFFFFFFFF80000000) : UI64(0xFFFFFFFF00000000);
+ uint64_t largestNegVal32 = UI64(0x0000000080000000);
if ((i64 & mask64) && (i64 != largestNegVal32))
{
- yylval.int64 = new __int64(i64);
- tok = INT64;
+ yylval.int64 = new int64_t(i64);
+ tok = INT64_V;
if (neg) *yylval.int64 = -*yylval.int64;
}
else
{
- yylval.int32 = (__int32)i64;
- tok = INT32;
+ yylval.int32 = (int32_t)i64;
+ tok = INT32_V;
if(neg) yylval.int32 = -yylval.int32;
}
}
@@ -1280,7 +1280,7 @@ int yylex()
}
dbprintf((" Line %d token %d (%c) val = %s\n", PENV->curLine, tok,
(tok < 128 && isprint(tok)) ? tok : ' ',
- (tok > 255 && tok != INT32 && tok != INT64 && tok!= FLOAT64) ? yylval.string : ""));
+ (tok > 255 && tok != INT32_V && tok != INT64_V && tok!= FLOAT64) ? yylval.string : ""));
PENV->curPos = curPos;
PENV->curTok = curTok;
@@ -1333,7 +1333,7 @@ static void corEmitInt(BinStr* buff, unsigned data)
/**************************************************************************/
/* move 'ptr past the exactly one type description */
-unsigned __int8* skipType(unsigned __int8* ptr, BOOL fFixupType)
+uint8_t* skipType(uint8_t* ptr, BOOL fFixupType)
{
mdToken tk;
AGAIN:
@@ -1412,7 +1412,7 @@ unsigned __int8* skipType(unsigned __int8* ptr, BOOL fFixupType)
if(fFixupType)
{
BYTE* pb = ptr-1; // ptr incremented in switch
- unsigned __int8* ptr_save = ptr;
+ uint8_t* ptr_save = ptr;
int n = CorSigUncompressData((PCCOR_SIGNATURE&) ptr); // fixup #
int compressed_size_n = (int)(ptr - ptr_save); // ptr was updated by CorSigUncompressData()
int m = -1;
@@ -1472,7 +1472,7 @@ unsigned __int8* skipType(unsigned __int8* ptr, BOOL fFixupType)
if ((compressed_size_m == 1) &&
(compressed_size_n == 2))
{
- unsigned __int8 m1 = *(pb + 1);
+ uint8_t m1 = *(pb + 1);
_ASSERTE(m1 < 0x80);
*(pb + 1) = 0x80;
*(pb + 2) = m1;
@@ -1481,7 +1481,7 @@ unsigned __int8* skipType(unsigned __int8* ptr, BOOL fFixupType)
if ((compressed_size_m == 1) &&
(compressed_size_n == 4))
{
- unsigned __int8 m1 = *(pb + 1);
+ uint8_t m1 = *(pb + 1);
_ASSERTE(m1 < 0x80);
*(pb + 1) = 0xC0;
*(pb + 2) = 0x00;
@@ -1492,8 +1492,8 @@ unsigned __int8* skipType(unsigned __int8* ptr, BOOL fFixupType)
if ((compressed_size_m == 2) &&
(compressed_size_n == 4))
{
- unsigned __int8 m1 = *(pb + 1);
- unsigned __int8 m2 = *(pb + 2);
+ uint8_t m1 = *(pb + 1);
+ uint8_t m2 = *(pb + 2);
_ASSERTE(m1 >= 0x80);
m1 &= 0x7f; // strip the bit indicating it's a 2-byte thing
*(pb + 1) = 0xC0;
@@ -1559,8 +1559,8 @@ void FixupTyPars(BinStr* pbstype)
/**************************************************************************/
static unsigned corCountArgs(BinStr* args)
{
- unsigned __int8* ptr = args->ptr();
- unsigned __int8* end = &args->ptr()[args->length()];
+ uint8_t* ptr = args->ptr();
+ uint8_t* end = &args->ptr()[args->length()];
unsigned ret = 0;
while(ptr < end)
{
diff --git a/src/coreclr/ilasm/grammar_before.cpp b/src/coreclr/ilasm/grammar_before.cpp
index b49a382f7d89..04286fa137fb 100644
--- a/src/coreclr/ilasm/grammar_before.cpp
+++ b/src/coreclr/ilasm/grammar_before.cpp
@@ -51,6 +51,10 @@ static char* newString(_In_ __nullterminated const char* str1);
static void corEmitInt(BinStr* buff, unsigned data);
static void AppendStringWithLength(BinStr* pbs, _In_ __nullterminated char* sz);
static void AppendFieldToCustomBlob(BinStr* pBlob, _In_ BinStr* pField);
+static unsigned corCountArgs(BinStr* args);
+Instr* SetupInstr(unsigned short);
+void yyerror(_In_ __nullterminated const char*);
+int yylex();
bool bParsingByteArray = FALSE;
int iOpcodeLen = 0;
int iCallConv = 0;
diff --git a/src/coreclr/ilasm/main.cpp b/src/coreclr/ilasm/main.cpp
index 0fe683838d89..ebb63e3434fe 100644
--- a/src/coreclr/ilasm/main.cpp
+++ b/src/coreclr/ilasm/main.cpp
@@ -151,11 +151,6 @@ extern "C" int _cdecl wmain(int argc, _In_ WCHAR **argv)
memset(wzOutputFilename,0,sizeof(wzOutputFilename));
memset(wzPdbFilename, 0, sizeof(wzPdbFilename));
-#ifdef _DEBUG
- DisableThrowCheck();
- //CONTRACT_VIOLATION(ThrowsViolation);
-#endif
-
if(argc < 2) goto ErrorExit;
#ifdef _PREFAST_
#pragma warning(push)
diff --git a/src/coreclr/ilasm/prebuilt/asmparse.cpp b/src/coreclr/ilasm/prebuilt/asmparse.cpp
index 08f686f29018..4a5d9b3486b8 100644
--- a/src/coreclr/ilasm/prebuilt/asmparse.cpp
+++ b/src/coreclr/ilasm/prebuilt/asmparse.cpp
@@ -1,8 +1,74 @@
-/*
- * Created by Microsoft VCBU Internal YACC from "asmparse.y"
- */
+/* A Bison parser, made by GNU Bison 3.8.2. */
+
+/* Bison implementation for Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
+ Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see . */
+
+/* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
+
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
+
+/* C LALR(1) parser skeleton written by Richard Stallman, by
+ simplifying the original so-called "semantic" parser. */
+
+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
+ especially those whose name start with YY_ or yy_. They are
+ private implementation details that can be changed or removed. */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+ infringing on user name space. This should be done even for local
+ variables, as they might otherwise be expanded by user macros.
+ There are some unavoidable exceptions within include files to
+ define necessary library symbols; they are noted "INFRINGES ON
+ USER NAME SPACE" below. */
+
+/* Identify Bison output, and Bison version. */
+#define YYBISON 30802
+
+/* Bison version string. */
+#define YYBISON_VERSION "3.8.2"
+
+/* Skeleton name. */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers. */
+#define YYPURE 0
+
+/* Push parsers. */
+#define YYPUSH 0
+
+/* Pull parsers. */
+#define YYPULL 1
+
+
+
+
+/* First part of user prologue. */
+#line 1 "asmparse.y"
-#line 2 "asmparse.y"
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
@@ -15,10 +81,343 @@
#include "grammar_before.cpp"
+#line 85 "asmparse.cpp"
+
+# ifndef YY_CAST
+# ifdef __cplusplus
+# define YY_CAST(Type, Val) static_cast (Val)
+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val)
+# else
+# define YY_CAST(Type, Val) ((Type) (Val))
+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
+# endif
+# endif
+# ifndef YY_NULLPTR
+# if defined __cplusplus
+# if 201103L <= __cplusplus
+# define YY_NULLPTR nullptr
+# else
+# define YY_NULLPTR 0
+# endif
+# else
+# define YY_NULLPTR ((void*)0)
+# endif
+# endif
+
+
+/* Debug traces. */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+#if YYDEBUG
+extern int yydebug;
+#endif
+
+/* Token kinds. */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+ enum yytokentype
+ {
+ YYEMPTY = -2,
+ YYEOF = 0, /* "end of file" */
+ YYerror = 256, /* error */
+ YYUNDEF = 257, /* "invalid token" */
+ BAD_COMMENT_ = 258, /* BAD_COMMENT_ */
+ BAD_LITERAL_ = 259, /* BAD_LITERAL_ */
+ ID = 260, /* ID */
+ DOTTEDNAME = 261, /* DOTTEDNAME */
+ QSTRING = 262, /* QSTRING */
+ SQSTRING = 263, /* SQSTRING */
+ INT32_V = 264, /* INT32_V */
+ INT64_V = 265, /* INT64_V */
+ FLOAT64 = 266, /* FLOAT64 */
+ HEXBYTE = 267, /* HEXBYTE */
+ TYPEDEF_T = 268, /* TYPEDEF_T */
+ TYPEDEF_M = 269, /* TYPEDEF_M */
+ TYPEDEF_F = 270, /* TYPEDEF_F */
+ TYPEDEF_TS = 271, /* TYPEDEF_TS */
+ TYPEDEF_MR = 272, /* TYPEDEF_MR */
+ TYPEDEF_CA = 273, /* TYPEDEF_CA */
+ DCOLON = 274, /* DCOLON */
+ ELLIPSIS = 275, /* ELLIPSIS */
+ VOID_ = 276, /* VOID_ */
+ BOOL_ = 277, /* BOOL_ */
+ CHAR_ = 278, /* CHAR_ */
+ UNSIGNED_ = 279, /* UNSIGNED_ */
+ INT_ = 280, /* INT_ */
+ INT8_ = 281, /* INT8_ */
+ INT16_ = 282, /* INT16_ */
+ INT32_ = 283, /* INT32_ */
+ INT64_ = 284, /* INT64_ */
+ FLOAT_ = 285, /* FLOAT_ */
+ FLOAT32_ = 286, /* FLOAT32_ */
+ FLOAT64_ = 287, /* FLOAT64_ */
+ BYTEARRAY_ = 288, /* BYTEARRAY_ */
+ UINT_ = 289, /* UINT_ */
+ UINT8_ = 290, /* UINT8_ */
+ UINT16_ = 291, /* UINT16_ */
+ UINT32_ = 292, /* UINT32_ */
+ UINT64_ = 293, /* UINT64_ */
+ FLAGS_ = 294, /* FLAGS_ */
+ CALLCONV_ = 295, /* CALLCONV_ */
+ MDTOKEN_ = 296, /* MDTOKEN_ */
+ OBJECT_ = 297, /* OBJECT_ */
+ STRING_ = 298, /* STRING_ */
+ NULLREF_ = 299, /* NULLREF_ */
+ DEFAULT_ = 300, /* DEFAULT_ */
+ CDECL_ = 301, /* CDECL_ */
+ VARARG_ = 302, /* VARARG_ */
+ STDCALL_ = 303, /* STDCALL_ */
+ THISCALL_ = 304, /* THISCALL_ */
+ FASTCALL_ = 305, /* FASTCALL_ */
+ CLASS_ = 306, /* CLASS_ */
+ BYREFLIKE_ = 307, /* BYREFLIKE_ */
+ TYPEDREF_ = 308, /* TYPEDREF_ */
+ UNMANAGED_ = 309, /* UNMANAGED_ */
+ FINALLY_ = 310, /* FINALLY_ */
+ HANDLER_ = 311, /* HANDLER_ */
+ CATCH_ = 312, /* CATCH_ */
+ FILTER_ = 313, /* FILTER_ */
+ FAULT_ = 314, /* FAULT_ */
+ EXTENDS_ = 315, /* EXTENDS_ */
+ IMPLEMENTS_ = 316, /* IMPLEMENTS_ */
+ TO_ = 317, /* TO_ */
+ AT_ = 318, /* AT_ */
+ TLS_ = 319, /* TLS_ */
+ TRUE_ = 320, /* TRUE_ */
+ FALSE_ = 321, /* FALSE_ */
+ _INTERFACEIMPL = 322, /* _INTERFACEIMPL */
+ VALUE_ = 323, /* VALUE_ */
+ VALUETYPE_ = 324, /* VALUETYPE_ */
+ NATIVE_ = 325, /* NATIVE_ */
+ INSTANCE_ = 326, /* INSTANCE_ */
+ SPECIALNAME_ = 327, /* SPECIALNAME_ */
+ FORWARDER_ = 328, /* FORWARDER_ */
+ STATIC_ = 329, /* STATIC_ */
+ PUBLIC_ = 330, /* PUBLIC_ */
+ PRIVATE_ = 331, /* PRIVATE_ */
+ FAMILY_ = 332, /* FAMILY_ */
+ FINAL_ = 333, /* FINAL_ */
+ SYNCHRONIZED_ = 334, /* SYNCHRONIZED_ */
+ INTERFACE_ = 335, /* INTERFACE_ */
+ SEALED_ = 336, /* SEALED_ */
+ NESTED_ = 337, /* NESTED_ */
+ ABSTRACT_ = 338, /* ABSTRACT_ */
+ AUTO_ = 339, /* AUTO_ */
+ SEQUENTIAL_ = 340, /* SEQUENTIAL_ */
+ EXPLICIT_ = 341, /* EXPLICIT_ */
+ ANSI_ = 342, /* ANSI_ */
+ UNICODE_ = 343, /* UNICODE_ */
+ AUTOCHAR_ = 344, /* AUTOCHAR_ */
+ IMPORT_ = 345, /* IMPORT_ */
+ ENUM_ = 346, /* ENUM_ */
+ VIRTUAL_ = 347, /* VIRTUAL_ */
+ NOINLINING_ = 348, /* NOINLINING_ */
+ AGGRESSIVEINLINING_ = 349, /* AGGRESSIVEINLINING_ */
+ NOOPTIMIZATION_ = 350, /* NOOPTIMIZATION_ */
+ AGGRESSIVEOPTIMIZATION_ = 351, /* AGGRESSIVEOPTIMIZATION_ */
+ UNMANAGEDEXP_ = 352, /* UNMANAGEDEXP_ */
+ BEFOREFIELDINIT_ = 353, /* BEFOREFIELDINIT_ */
+ STRICT_ = 354, /* STRICT_ */
+ RETARGETABLE_ = 355, /* RETARGETABLE_ */
+ WINDOWSRUNTIME_ = 356, /* WINDOWSRUNTIME_ */
+ NOPLATFORM_ = 357, /* NOPLATFORM_ */
+ METHOD_ = 358, /* METHOD_ */
+ FIELD_ = 359, /* FIELD_ */
+ PINNED_ = 360, /* PINNED_ */
+ MODREQ_ = 361, /* MODREQ_ */
+ MODOPT_ = 362, /* MODOPT_ */
+ SERIALIZABLE_ = 363, /* SERIALIZABLE_ */
+ PROPERTY_ = 364, /* PROPERTY_ */
+ TYPE_ = 365, /* TYPE_ */
+ ASSEMBLY_ = 366, /* ASSEMBLY_ */
+ FAMANDASSEM_ = 367, /* FAMANDASSEM_ */
+ FAMORASSEM_ = 368, /* FAMORASSEM_ */
+ PRIVATESCOPE_ = 369, /* PRIVATESCOPE_ */
+ HIDEBYSIG_ = 370, /* HIDEBYSIG_ */
+ NEWSLOT_ = 371, /* NEWSLOT_ */
+ RTSPECIALNAME_ = 372, /* RTSPECIALNAME_ */
+ PINVOKEIMPL_ = 373, /* PINVOKEIMPL_ */
+ _CTOR = 374, /* _CTOR */
+ _CCTOR = 375, /* _CCTOR */
+ LITERAL_ = 376, /* LITERAL_ */
+ NOTSERIALIZED_ = 377, /* NOTSERIALIZED_ */
+ INITONLY_ = 378, /* INITONLY_ */
+ REQSECOBJ_ = 379, /* REQSECOBJ_ */
+ CIL_ = 380, /* CIL_ */
+ OPTIL_ = 381, /* OPTIL_ */
+ MANAGED_ = 382, /* MANAGED_ */
+ FORWARDREF_ = 383, /* FORWARDREF_ */
+ PRESERVESIG_ = 384, /* PRESERVESIG_ */
+ RUNTIME_ = 385, /* RUNTIME_ */
+ INTERNALCALL_ = 386, /* INTERNALCALL_ */
+ _IMPORT = 387, /* _IMPORT */
+ NOMANGLE_ = 388, /* NOMANGLE_ */
+ LASTERR_ = 389, /* LASTERR_ */
+ WINAPI_ = 390, /* WINAPI_ */
+ AS_ = 391, /* AS_ */
+ BESTFIT_ = 392, /* BESTFIT_ */
+ ON_ = 393, /* ON_ */
+ OFF_ = 394, /* OFF_ */
+ CHARMAPERROR_ = 395, /* CHARMAPERROR_ */
+ INSTR_NONE = 396, /* INSTR_NONE */
+ INSTR_VAR = 397, /* INSTR_VAR */
+ INSTR_I = 398, /* INSTR_I */
+ INSTR_I8 = 399, /* INSTR_I8 */
+ INSTR_R = 400, /* INSTR_R */
+ INSTR_BRTARGET = 401, /* INSTR_BRTARGET */
+ INSTR_METHOD = 402, /* INSTR_METHOD */
+ INSTR_FIELD = 403, /* INSTR_FIELD */
+ INSTR_TYPE = 404, /* INSTR_TYPE */
+ INSTR_STRING = 405, /* INSTR_STRING */
+ INSTR_SIG = 406, /* INSTR_SIG */
+ INSTR_TOK = 407, /* INSTR_TOK */
+ INSTR_SWITCH = 408, /* INSTR_SWITCH */
+ _CLASS = 409, /* _CLASS */
+ _NAMESPACE = 410, /* _NAMESPACE */
+ _METHOD = 411, /* _METHOD */
+ _FIELD = 412, /* _FIELD */
+ _DATA = 413, /* _DATA */
+ _THIS = 414, /* _THIS */
+ _BASE = 415, /* _BASE */
+ _NESTER = 416, /* _NESTER */
+ _EMITBYTE = 417, /* _EMITBYTE */
+ _TRY = 418, /* _TRY */
+ _MAXSTACK = 419, /* _MAXSTACK */
+ _LOCALS = 420, /* _LOCALS */
+ _ENTRYPOINT = 421, /* _ENTRYPOINT */
+ _ZEROINIT = 422, /* _ZEROINIT */
+ _EVENT = 423, /* _EVENT */
+ _ADDON = 424, /* _ADDON */
+ _REMOVEON = 425, /* _REMOVEON */
+ _FIRE = 426, /* _FIRE */
+ _OTHER = 427, /* _OTHER */
+ _PROPERTY = 428, /* _PROPERTY */
+ _SET = 429, /* _SET */
+ _GET = 430, /* _GET */
+ _PERMISSION = 431, /* _PERMISSION */
+ _PERMISSIONSET = 432, /* _PERMISSIONSET */
+ REQUEST_ = 433, /* REQUEST_ */
+ DEMAND_ = 434, /* DEMAND_ */
+ ASSERT_ = 435, /* ASSERT_ */
+ DENY_ = 436, /* DENY_ */
+ PERMITONLY_ = 437, /* PERMITONLY_ */
+ LINKCHECK_ = 438, /* LINKCHECK_ */
+ INHERITCHECK_ = 439, /* INHERITCHECK_ */
+ REQMIN_ = 440, /* REQMIN_ */
+ REQOPT_ = 441, /* REQOPT_ */
+ REQREFUSE_ = 442, /* REQREFUSE_ */
+ PREJITGRANT_ = 443, /* PREJITGRANT_ */
+ PREJITDENY_ = 444, /* PREJITDENY_ */
+ NONCASDEMAND_ = 445, /* NONCASDEMAND_ */
+ NONCASLINKDEMAND_ = 446, /* NONCASLINKDEMAND_ */
+ NONCASINHERITANCE_ = 447, /* NONCASINHERITANCE_ */
+ _LINE = 448, /* _LINE */
+ P_LINE = 449, /* P_LINE */
+ _LANGUAGE = 450, /* _LANGUAGE */
+ _CUSTOM = 451, /* _CUSTOM */
+ INIT_ = 452, /* INIT_ */
+ _SIZE = 453, /* _SIZE */
+ _PACK = 454, /* _PACK */
+ _VTABLE = 455, /* _VTABLE */
+ _VTFIXUP = 456, /* _VTFIXUP */
+ FROMUNMANAGED_ = 457, /* FROMUNMANAGED_ */
+ CALLMOSTDERIVED_ = 458, /* CALLMOSTDERIVED_ */
+ _VTENTRY = 459, /* _VTENTRY */
+ RETAINAPPDOMAIN_ = 460, /* RETAINAPPDOMAIN_ */
+ _FILE = 461, /* _FILE */
+ NOMETADATA_ = 462, /* NOMETADATA_ */
+ _HASH = 463, /* _HASH */
+ _ASSEMBLY = 464, /* _ASSEMBLY */
+ _PUBLICKEY = 465, /* _PUBLICKEY */
+ _PUBLICKEYTOKEN = 466, /* _PUBLICKEYTOKEN */
+ ALGORITHM_ = 467, /* ALGORITHM_ */
+ _VER = 468, /* _VER */
+ _LOCALE = 469, /* _LOCALE */
+ EXTERN_ = 470, /* EXTERN_ */
+ _MRESOURCE = 471, /* _MRESOURCE */
+ _MODULE = 472, /* _MODULE */
+ _EXPORT = 473, /* _EXPORT */
+ LEGACY_ = 474, /* LEGACY_ */
+ LIBRARY_ = 475, /* LIBRARY_ */
+ X86_ = 476, /* X86_ */
+ AMD64_ = 477, /* AMD64_ */
+ ARM_ = 478, /* ARM_ */
+ ARM64_ = 479, /* ARM64_ */
+ MARSHAL_ = 480, /* MARSHAL_ */
+ CUSTOM_ = 481, /* CUSTOM_ */
+ SYSSTRING_ = 482, /* SYSSTRING_ */
+ FIXED_ = 483, /* FIXED_ */
+ VARIANT_ = 484, /* VARIANT_ */
+ CURRENCY_ = 485, /* CURRENCY_ */
+ SYSCHAR_ = 486, /* SYSCHAR_ */
+ DECIMAL_ = 487, /* DECIMAL_ */
+ DATE_ = 488, /* DATE_ */
+ BSTR_ = 489, /* BSTR_ */
+ TBSTR_ = 490, /* TBSTR_ */
+ LPSTR_ = 491, /* LPSTR_ */
+ LPWSTR_ = 492, /* LPWSTR_ */
+ LPTSTR_ = 493, /* LPTSTR_ */
+ OBJECTREF_ = 494, /* OBJECTREF_ */
+ IUNKNOWN_ = 495, /* IUNKNOWN_ */
+ IDISPATCH_ = 496, /* IDISPATCH_ */
+ STRUCT_ = 497, /* STRUCT_ */
+ SAFEARRAY_ = 498, /* SAFEARRAY_ */
+ BYVALSTR_ = 499, /* BYVALSTR_ */
+ LPVOID_ = 500, /* LPVOID_ */
+ ANY_ = 501, /* ANY_ */
+ ARRAY_ = 502, /* ARRAY_ */
+ LPSTRUCT_ = 503, /* LPSTRUCT_ */
+ IIDPARAM_ = 504, /* IIDPARAM_ */
+ IN_ = 505, /* IN_ */
+ OUT_ = 506, /* OUT_ */
+ OPT_ = 507, /* OPT_ */
+ _PARAM = 508, /* _PARAM */
+ _OVERRIDE = 509, /* _OVERRIDE */
+ WITH_ = 510, /* WITH_ */
+ NULL_ = 511, /* NULL_ */
+ ERROR_ = 512, /* ERROR_ */
+ HRESULT_ = 513, /* HRESULT_ */
+ CARRAY_ = 514, /* CARRAY_ */
+ USERDEFINED_ = 515, /* USERDEFINED_ */
+ RECORD_ = 516, /* RECORD_ */
+ FILETIME_ = 517, /* FILETIME_ */
+ BLOB_ = 518, /* BLOB_ */
+ STREAM_ = 519, /* STREAM_ */
+ STORAGE_ = 520, /* STORAGE_ */
+ STREAMED_OBJECT_ = 521, /* STREAMED_OBJECT_ */
+ STORED_OBJECT_ = 522, /* STORED_OBJECT_ */
+ BLOB_OBJECT_ = 523, /* BLOB_OBJECT_ */
+ CF_ = 524, /* CF_ */
+ CLSID_ = 525, /* CLSID_ */
+ VECTOR_ = 526, /* VECTOR_ */
+ _SUBSYSTEM = 527, /* _SUBSYSTEM */
+ _CORFLAGS = 528, /* _CORFLAGS */
+ ALIGNMENT_ = 529, /* ALIGNMENT_ */
+ _IMAGEBASE = 530, /* _IMAGEBASE */
+ _STACKRESERVE = 531, /* _STACKRESERVE */
+ _TYPEDEF = 532, /* _TYPEDEF */
+ _TEMPLATE = 533, /* _TEMPLATE */
+ _TYPELIST = 534, /* _TYPELIST */
+ _MSCORLIB = 535, /* _MSCORLIB */
+ P_DEFINE = 536, /* P_DEFINE */
+ P_UNDEF = 537, /* P_UNDEF */
+ P_IFDEF = 538, /* P_IFDEF */
+ P_IFNDEF = 539, /* P_IFNDEF */
+ P_ELSE = 540, /* P_ELSE */
+ P_ENDIF = 541, /* P_ENDIF */
+ P_INCLUDE = 542, /* P_INCLUDE */
+ CONSTRAINT_ = 543 /* CONSTRAINT_ */
+ };
+ typedef enum yytokentype yytoken_kind_t;
+#endif
+
+/* Value type. */
+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
+union YYSTYPE
+{
#line 15 "asmparse.y"
-#define UNION 1
-typedef union {
CorRegTypeAttr classAttr;
CorMethodAttr methAttr;
CorFieldAttr fieldAttr;
@@ -33,8 +432,8 @@ typedef union {
CorTypeAttr exptAttr;
CorManifestResourceFlags manresAttr;
double* float64;
- __int64* int64;
- __int32 int32;
+ int64_t* int64;
+ int32_t int32;
char* string;
BinStr* binstr;
Labels* labels;
@@ -45,4907 +444,8435 @@ typedef union {
TypeDefDescr* tdd;
CustomDescr* cad;
unsigned short opcode;
-} YYSTYPE;
-# define ERROR_ 257
-# define BAD_COMMENT_ 258
-# define BAD_LITERAL_ 259
-# define ID 260
-# define DOTTEDNAME 261
-# define QSTRING 262
-# define SQSTRING 263
-# define INT32 264
-# define INT64 265
-# define FLOAT64 266
-# define HEXBYTE 267
-# define TYPEDEF_T 268
-# define TYPEDEF_M 269
-# define TYPEDEF_F 270
-# define TYPEDEF_TS 271
-# define TYPEDEF_MR 272
-# define TYPEDEF_CA 273
-# define DCOLON 274
-# define ELLIPSIS 275
-# define VOID_ 276
-# define BOOL_ 277
-# define CHAR_ 278
-# define UNSIGNED_ 279
-# define INT_ 280
-# define INT8_ 281
-# define INT16_ 282
-# define INT32_ 283
-# define INT64_ 284
-# define FLOAT_ 285
-# define FLOAT32_ 286
-# define FLOAT64_ 287
-# define BYTEARRAY_ 288
-# define UINT_ 289
-# define UINT8_ 290
-# define UINT16_ 291
-# define UINT32_ 292
-# define UINT64_ 293
-# define FLAGS_ 294
-# define CALLCONV_ 295
-# define MDTOKEN_ 296
-# define OBJECT_ 297
-# define STRING_ 298
-# define NULLREF_ 299
-# define DEFAULT_ 300
-# define CDECL_ 301
-# define VARARG_ 302
-# define STDCALL_ 303
-# define THISCALL_ 304
-# define FASTCALL_ 305
-# define CLASS_ 306
-# define BYREFLIKE_ 307
-# define GENCONSTRAINT_ 308
-# define TYPEDREF_ 309
-# define UNMANAGED_ 310
-# define FINALLY_ 311
-# define HANDLER_ 312
-# define CATCH_ 313
-# define FILTER_ 314
-# define FAULT_ 315
-# define EXTENDS_ 316
-# define IMPLEMENTS_ 317
-# define TO_ 318
-# define AT_ 319
-# define TLS_ 320
-# define TRUE_ 321
-# define FALSE_ 322
-# define _INTERFACEIMPL 323
-# define VALUE_ 324
-# define VALUETYPE_ 325
-# define NATIVE_ 326
-# define INSTANCE_ 327
-# define SPECIALNAME_ 328
-# define FORWARDER_ 329
-# define STATIC_ 330
-# define PUBLIC_ 331
-# define PRIVATE_ 332
-# define FAMILY_ 333
-# define FINAL_ 334
-# define SYNCHRONIZED_ 335
-# define INTERFACE_ 336
-# define SEALED_ 337
-# define NESTED_ 338
-# define ABSTRACT_ 339
-# define AUTO_ 340
-# define SEQUENTIAL_ 341
-# define EXPLICIT_ 342
-# define ANSI_ 343
-# define UNICODE_ 344
-# define AUTOCHAR_ 345
-# define IMPORT_ 346
-# define ENUM_ 347
-# define VIRTUAL_ 348
-# define NOINLINING_ 349
-# define AGGRESSIVEINLINING_ 350
-# define NOOPTIMIZATION_ 351
-# define AGGRESSIVEOPTIMIZATION_ 352
-# define UNMANAGEDEXP_ 353
-# define BEFOREFIELDINIT_ 354
-# define STRICT_ 355
-# define RETARGETABLE_ 356
-# define WINDOWSRUNTIME_ 357
-# define NOPLATFORM_ 358
-# define METHOD_ 359
-# define FIELD_ 360
-# define PINNED_ 361
-# define MODREQ_ 362
-# define MODOPT_ 363
-# define SERIALIZABLE_ 364
-# define PROPERTY_ 365
-# define TYPE_ 366
-# define ASSEMBLY_ 367
-# define FAMANDASSEM_ 368
-# define FAMORASSEM_ 369
-# define PRIVATESCOPE_ 370
-# define HIDEBYSIG_ 371
-# define NEWSLOT_ 372
-# define RTSPECIALNAME_ 373
-# define PINVOKEIMPL_ 374
-# define _CTOR 375
-# define _CCTOR 376
-# define LITERAL_ 377
-# define NOTSERIALIZED_ 378
-# define INITONLY_ 379
-# define REQSECOBJ_ 380
-# define CIL_ 381
-# define OPTIL_ 382
-# define MANAGED_ 383
-# define FORWARDREF_ 384
-# define PRESERVESIG_ 385
-# define RUNTIME_ 386
-# define INTERNALCALL_ 387
-# define _IMPORT 388
-# define NOMANGLE_ 389
-# define LASTERR_ 390
-# define WINAPI_ 391
-# define AS_ 392
-# define BESTFIT_ 393
-# define ON_ 394
-# define OFF_ 395
-# define CHARMAPERROR_ 396
-# define INSTR_NONE 397
-# define INSTR_VAR 398
-# define INSTR_I 399
-# define INSTR_I8 400
-# define INSTR_R 401
-# define INSTR_BRTARGET 402
-# define INSTR_METHOD 403
-# define INSTR_FIELD 404
-# define INSTR_TYPE 405
-# define INSTR_STRING 406
-# define INSTR_SIG 407
-# define INSTR_TOK 408
-# define INSTR_SWITCH 409
-# define _CLASS 410
-# define _NAMESPACE 411
-# define _METHOD 412
-# define _FIELD 413
-# define _DATA 414
-# define _THIS 415
-# define _BASE 416
-# define _NESTER 417
-# define _EMITBYTE 418
-# define _TRY 419
-# define _MAXSTACK 420
-# define _LOCALS 421
-# define _ENTRYPOINT 422
-# define _ZEROINIT 423
-# define _EVENT 424
-# define _ADDON 425
-# define _REMOVEON 426
-# define _FIRE 427
-# define _OTHER 428
-# define _PROPERTY 429
-# define _SET 430
-# define _GET 431
-# define _PERMISSION 432
-# define _PERMISSIONSET 433
-# define REQUEST_ 434
-# define DEMAND_ 435
-# define ASSERT_ 436
-# define DENY_ 437
-# define PERMITONLY_ 438
-# define LINKCHECK_ 439
-# define INHERITCHECK_ 440
-# define REQMIN_ 441
-# define REQOPT_ 442
-# define REQREFUSE_ 443
-# define PREJITGRANT_ 444
-# define PREJITDENY_ 445
-# define NONCASDEMAND_ 446
-# define NONCASLINKDEMAND_ 447
-# define NONCASINHERITANCE_ 448
-# define _LINE 449
-# define P_LINE 450
-# define _LANGUAGE 451
-# define _CUSTOM 452
-# define INIT_ 453
-# define _SIZE 454
-# define _PACK 455
-# define _VTABLE 456
-# define _VTFIXUP 457
-# define FROMUNMANAGED_ 458
-# define CALLMOSTDERIVED_ 459
-# define _VTENTRY 460
-# define RETAINAPPDOMAIN_ 461
-# define _FILE 462
-# define NOMETADATA_ 463
-# define _HASH 464
-# define _ASSEMBLY 465
-# define _PUBLICKEY 466
-# define _PUBLICKEYTOKEN 467
-# define ALGORITHM_ 468
-# define _VER 469
-# define _LOCALE 470
-# define EXTERN_ 471
-# define _MRESOURCE 472
-# define _MODULE 473
-# define _EXPORT 474
-# define LEGACY_ 475
-# define LIBRARY_ 476
-# define X86_ 477
-# define AMD64_ 478
-# define ARM_ 479
-# define ARM64_ 480
-# define MARSHAL_ 481
-# define CUSTOM_ 482
-# define SYSSTRING_ 483
-# define FIXED_ 484
-# define VARIANT_ 485
-# define CURRENCY_ 486
-# define SYSCHAR_ 487
-# define DECIMAL_ 488
-# define DATE_ 489
-# define BSTR_ 490
-# define TBSTR_ 491
-# define LPSTR_ 492
-# define LPWSTR_ 493
-# define LPTSTR_ 494
-# define OBJECTREF_ 495
-# define IUNKNOWN_ 496
-# define IDISPATCH_ 497
-# define STRUCT_ 498
-# define SAFEARRAY_ 499
-# define BYVALSTR_ 500
-# define LPVOID_ 501
-# define ANY_ 502
-# define ARRAY_ 503
-# define LPSTRUCT_ 504
-# define IIDPARAM_ 505
-# define IN_ 506
-# define OUT_ 507
-# define OPT_ 508
-# define _PARAM 509
-# define _OVERRIDE 510
-# define WITH_ 511
-# define NULL_ 512
-# define HRESULT_ 513
-# define CARRAY_ 514
-# define USERDEFINED_ 515
-# define RECORD_ 516
-# define FILETIME_ 517
-# define BLOB_ 518
-# define STREAM_ 519
-# define STORAGE_ 520
-# define STREAMED_OBJECT_ 521
-# define STORED_OBJECT_ 522
-# define BLOB_OBJECT_ 523
-# define CF_ 524
-# define CLSID_ 525
-# define VECTOR_ 526
-# define _SUBSYSTEM 527
-# define _CORFLAGS 528
-# define ALIGNMENT_ 529
-# define _IMAGEBASE 530
-# define _STACKRESERVE 531
-# define _TYPEDEF 532
-# define _TEMPLATE 533
-# define _TYPELIST 534
-# define _MSCORLIB 535
-# define P_DEFINE 536
-# define P_UNDEF 537
-# define P_IFDEF 538
-# define P_IFNDEF 539
-# define P_ELSE 540
-# define P_ENDIF 541
-# define P_INCLUDE 542
-# define CONSTRAINT_ 543
-#define yyclearin yychar = -1
-#define yyerrok yyerrflag = 0
-#ifndef YYMAXDEPTH
-#define YYMAXDEPTH 150
-#endif
-YYSTYPE yylval, yyval;
-#ifndef YYFARDATA
-#define YYFARDATA /*nothing*/
-#endif
-#if ! defined YYSTATIC
-#define YYSTATIC /*nothing*/
-#endif
-#if ! defined YYCONST
-#define YYCONST /*nothing*/
-#endif
-#ifndef YYACT
-#define YYACT yyact
-#endif
-#ifndef YYPACT
-#define YYPACT yypact
-#endif
-#ifndef YYPGO
-#define YYPGO yypgo
-#endif
-#ifndef YYR1
-#define YYR1 yyr1
+
+#line 449 "asmparse.cpp"
+
+};
+typedef union YYSTYPE YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
+# define YYSTYPE_IS_DECLARED 1
#endif
-#ifndef YYR2
-#define YYR2 yyr2
+
+
+extern YYSTYPE yylval;
+
+
+int yyparse (void);
+
+
+
+/* Symbol kind. */
+enum yysymbol_kind_t
+{
+ YYSYMBOL_YYEMPTY = -2,
+ YYSYMBOL_YYEOF = 0, /* "end of file" */
+ YYSYMBOL_YYerror = 1, /* error */
+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
+ YYSYMBOL_BAD_COMMENT_ = 3, /* BAD_COMMENT_ */
+ YYSYMBOL_BAD_LITERAL_ = 4, /* BAD_LITERAL_ */
+ YYSYMBOL_ID = 5, /* ID */
+ YYSYMBOL_DOTTEDNAME = 6, /* DOTTEDNAME */
+ YYSYMBOL_QSTRING = 7, /* QSTRING */
+ YYSYMBOL_SQSTRING = 8, /* SQSTRING */
+ YYSYMBOL_INT32_V = 9, /* INT32_V */
+ YYSYMBOL_INT64_V = 10, /* INT64_V */
+ YYSYMBOL_FLOAT64 = 11, /* FLOAT64 */
+ YYSYMBOL_HEXBYTE = 12, /* HEXBYTE */
+ YYSYMBOL_TYPEDEF_T = 13, /* TYPEDEF_T */
+ YYSYMBOL_TYPEDEF_M = 14, /* TYPEDEF_M */
+ YYSYMBOL_TYPEDEF_F = 15, /* TYPEDEF_F */
+ YYSYMBOL_TYPEDEF_TS = 16, /* TYPEDEF_TS */
+ YYSYMBOL_TYPEDEF_MR = 17, /* TYPEDEF_MR */
+ YYSYMBOL_TYPEDEF_CA = 18, /* TYPEDEF_CA */
+ YYSYMBOL_DCOLON = 19, /* DCOLON */
+ YYSYMBOL_ELLIPSIS = 20, /* ELLIPSIS */
+ YYSYMBOL_VOID_ = 21, /* VOID_ */
+ YYSYMBOL_BOOL_ = 22, /* BOOL_ */
+ YYSYMBOL_CHAR_ = 23, /* CHAR_ */
+ YYSYMBOL_UNSIGNED_ = 24, /* UNSIGNED_ */
+ YYSYMBOL_INT_ = 25, /* INT_ */
+ YYSYMBOL_INT8_ = 26, /* INT8_ */
+ YYSYMBOL_INT16_ = 27, /* INT16_ */
+ YYSYMBOL_INT32_ = 28, /* INT32_ */
+ YYSYMBOL_INT64_ = 29, /* INT64_ */
+ YYSYMBOL_FLOAT_ = 30, /* FLOAT_ */
+ YYSYMBOL_FLOAT32_ = 31, /* FLOAT32_ */
+ YYSYMBOL_FLOAT64_ = 32, /* FLOAT64_ */
+ YYSYMBOL_BYTEARRAY_ = 33, /* BYTEARRAY_ */
+ YYSYMBOL_UINT_ = 34, /* UINT_ */
+ YYSYMBOL_UINT8_ = 35, /* UINT8_ */
+ YYSYMBOL_UINT16_ = 36, /* UINT16_ */
+ YYSYMBOL_UINT32_ = 37, /* UINT32_ */
+ YYSYMBOL_UINT64_ = 38, /* UINT64_ */
+ YYSYMBOL_FLAGS_ = 39, /* FLAGS_ */
+ YYSYMBOL_CALLCONV_ = 40, /* CALLCONV_ */
+ YYSYMBOL_MDTOKEN_ = 41, /* MDTOKEN_ */
+ YYSYMBOL_OBJECT_ = 42, /* OBJECT_ */
+ YYSYMBOL_STRING_ = 43, /* STRING_ */
+ YYSYMBOL_NULLREF_ = 44, /* NULLREF_ */
+ YYSYMBOL_DEFAULT_ = 45, /* DEFAULT_ */
+ YYSYMBOL_CDECL_ = 46, /* CDECL_ */
+ YYSYMBOL_VARARG_ = 47, /* VARARG_ */
+ YYSYMBOL_STDCALL_ = 48, /* STDCALL_ */
+ YYSYMBOL_THISCALL_ = 49, /* THISCALL_ */
+ YYSYMBOL_FASTCALL_ = 50, /* FASTCALL_ */
+ YYSYMBOL_CLASS_ = 51, /* CLASS_ */
+ YYSYMBOL_BYREFLIKE_ = 52, /* BYREFLIKE_ */
+ YYSYMBOL_TYPEDREF_ = 53, /* TYPEDREF_ */
+ YYSYMBOL_UNMANAGED_ = 54, /* UNMANAGED_ */
+ YYSYMBOL_FINALLY_ = 55, /* FINALLY_ */
+ YYSYMBOL_HANDLER_ = 56, /* HANDLER_ */
+ YYSYMBOL_CATCH_ = 57, /* CATCH_ */
+ YYSYMBOL_FILTER_ = 58, /* FILTER_ */
+ YYSYMBOL_FAULT_ = 59, /* FAULT_ */
+ YYSYMBOL_EXTENDS_ = 60, /* EXTENDS_ */
+ YYSYMBOL_IMPLEMENTS_ = 61, /* IMPLEMENTS_ */
+ YYSYMBOL_TO_ = 62, /* TO_ */
+ YYSYMBOL_AT_ = 63, /* AT_ */
+ YYSYMBOL_TLS_ = 64, /* TLS_ */
+ YYSYMBOL_TRUE_ = 65, /* TRUE_ */
+ YYSYMBOL_FALSE_ = 66, /* FALSE_ */
+ YYSYMBOL__INTERFACEIMPL = 67, /* _INTERFACEIMPL */
+ YYSYMBOL_VALUE_ = 68, /* VALUE_ */
+ YYSYMBOL_VALUETYPE_ = 69, /* VALUETYPE_ */
+ YYSYMBOL_NATIVE_ = 70, /* NATIVE_ */
+ YYSYMBOL_INSTANCE_ = 71, /* INSTANCE_ */
+ YYSYMBOL_SPECIALNAME_ = 72, /* SPECIALNAME_ */
+ YYSYMBOL_FORWARDER_ = 73, /* FORWARDER_ */
+ YYSYMBOL_STATIC_ = 74, /* STATIC_ */
+ YYSYMBOL_PUBLIC_ = 75, /* PUBLIC_ */
+ YYSYMBOL_PRIVATE_ = 76, /* PRIVATE_ */
+ YYSYMBOL_FAMILY_ = 77, /* FAMILY_ */
+ YYSYMBOL_FINAL_ = 78, /* FINAL_ */
+ YYSYMBOL_SYNCHRONIZED_ = 79, /* SYNCHRONIZED_ */
+ YYSYMBOL_INTERFACE_ = 80, /* INTERFACE_ */
+ YYSYMBOL_SEALED_ = 81, /* SEALED_ */
+ YYSYMBOL_NESTED_ = 82, /* NESTED_ */
+ YYSYMBOL_ABSTRACT_ = 83, /* ABSTRACT_ */
+ YYSYMBOL_AUTO_ = 84, /* AUTO_ */
+ YYSYMBOL_SEQUENTIAL_ = 85, /* SEQUENTIAL_ */
+ YYSYMBOL_EXPLICIT_ = 86, /* EXPLICIT_ */
+ YYSYMBOL_ANSI_ = 87, /* ANSI_ */
+ YYSYMBOL_UNICODE_ = 88, /* UNICODE_ */
+ YYSYMBOL_AUTOCHAR_ = 89, /* AUTOCHAR_ */
+ YYSYMBOL_IMPORT_ = 90, /* IMPORT_ */
+ YYSYMBOL_ENUM_ = 91, /* ENUM_ */
+ YYSYMBOL_VIRTUAL_ = 92, /* VIRTUAL_ */
+ YYSYMBOL_NOINLINING_ = 93, /* NOINLINING_ */
+ YYSYMBOL_AGGRESSIVEINLINING_ = 94, /* AGGRESSIVEINLINING_ */
+ YYSYMBOL_NOOPTIMIZATION_ = 95, /* NOOPTIMIZATION_ */
+ YYSYMBOL_AGGRESSIVEOPTIMIZATION_ = 96, /* AGGRESSIVEOPTIMIZATION_ */
+ YYSYMBOL_UNMANAGEDEXP_ = 97, /* UNMANAGEDEXP_ */
+ YYSYMBOL_BEFOREFIELDINIT_ = 98, /* BEFOREFIELDINIT_ */
+ YYSYMBOL_STRICT_ = 99, /* STRICT_ */
+ YYSYMBOL_RETARGETABLE_ = 100, /* RETARGETABLE_ */
+ YYSYMBOL_WINDOWSRUNTIME_ = 101, /* WINDOWSRUNTIME_ */
+ YYSYMBOL_NOPLATFORM_ = 102, /* NOPLATFORM_ */
+ YYSYMBOL_METHOD_ = 103, /* METHOD_ */
+ YYSYMBOL_FIELD_ = 104, /* FIELD_ */
+ YYSYMBOL_PINNED_ = 105, /* PINNED_ */
+ YYSYMBOL_MODREQ_ = 106, /* MODREQ_ */
+ YYSYMBOL_MODOPT_ = 107, /* MODOPT_ */
+ YYSYMBOL_SERIALIZABLE_ = 108, /* SERIALIZABLE_ */
+ YYSYMBOL_PROPERTY_ = 109, /* PROPERTY_ */
+ YYSYMBOL_TYPE_ = 110, /* TYPE_ */
+ YYSYMBOL_ASSEMBLY_ = 111, /* ASSEMBLY_ */
+ YYSYMBOL_FAMANDASSEM_ = 112, /* FAMANDASSEM_ */
+ YYSYMBOL_FAMORASSEM_ = 113, /* FAMORASSEM_ */
+ YYSYMBOL_PRIVATESCOPE_ = 114, /* PRIVATESCOPE_ */
+ YYSYMBOL_HIDEBYSIG_ = 115, /* HIDEBYSIG_ */
+ YYSYMBOL_NEWSLOT_ = 116, /* NEWSLOT_ */
+ YYSYMBOL_RTSPECIALNAME_ = 117, /* RTSPECIALNAME_ */
+ YYSYMBOL_PINVOKEIMPL_ = 118, /* PINVOKEIMPL_ */
+ YYSYMBOL__CTOR = 119, /* _CTOR */
+ YYSYMBOL__CCTOR = 120, /* _CCTOR */
+ YYSYMBOL_LITERAL_ = 121, /* LITERAL_ */
+ YYSYMBOL_NOTSERIALIZED_ = 122, /* NOTSERIALIZED_ */
+ YYSYMBOL_INITONLY_ = 123, /* INITONLY_ */
+ YYSYMBOL_REQSECOBJ_ = 124, /* REQSECOBJ_ */
+ YYSYMBOL_CIL_ = 125, /* CIL_ */
+ YYSYMBOL_OPTIL_ = 126, /* OPTIL_ */
+ YYSYMBOL_MANAGED_ = 127, /* MANAGED_ */
+ YYSYMBOL_FORWARDREF_ = 128, /* FORWARDREF_ */
+ YYSYMBOL_PRESERVESIG_ = 129, /* PRESERVESIG_ */
+ YYSYMBOL_RUNTIME_ = 130, /* RUNTIME_ */
+ YYSYMBOL_INTERNALCALL_ = 131, /* INTERNALCALL_ */
+ YYSYMBOL__IMPORT = 132, /* _IMPORT */
+ YYSYMBOL_NOMANGLE_ = 133, /* NOMANGLE_ */
+ YYSYMBOL_LASTERR_ = 134, /* LASTERR_ */
+ YYSYMBOL_WINAPI_ = 135, /* WINAPI_ */
+ YYSYMBOL_AS_ = 136, /* AS_ */
+ YYSYMBOL_BESTFIT_ = 137, /* BESTFIT_ */
+ YYSYMBOL_ON_ = 138, /* ON_ */
+ YYSYMBOL_OFF_ = 139, /* OFF_ */
+ YYSYMBOL_CHARMAPERROR_ = 140, /* CHARMAPERROR_ */
+ YYSYMBOL_INSTR_NONE = 141, /* INSTR_NONE */
+ YYSYMBOL_INSTR_VAR = 142, /* INSTR_VAR */
+ YYSYMBOL_INSTR_I = 143, /* INSTR_I */
+ YYSYMBOL_INSTR_I8 = 144, /* INSTR_I8 */
+ YYSYMBOL_INSTR_R = 145, /* INSTR_R */
+ YYSYMBOL_INSTR_BRTARGET = 146, /* INSTR_BRTARGET */
+ YYSYMBOL_INSTR_METHOD = 147, /* INSTR_METHOD */
+ YYSYMBOL_INSTR_FIELD = 148, /* INSTR_FIELD */
+ YYSYMBOL_INSTR_TYPE = 149, /* INSTR_TYPE */
+ YYSYMBOL_INSTR_STRING = 150, /* INSTR_STRING */
+ YYSYMBOL_INSTR_SIG = 151, /* INSTR_SIG */
+ YYSYMBOL_INSTR_TOK = 152, /* INSTR_TOK */
+ YYSYMBOL_INSTR_SWITCH = 153, /* INSTR_SWITCH */
+ YYSYMBOL__CLASS = 154, /* _CLASS */
+ YYSYMBOL__NAMESPACE = 155, /* _NAMESPACE */
+ YYSYMBOL__METHOD = 156, /* _METHOD */
+ YYSYMBOL__FIELD = 157, /* _FIELD */
+ YYSYMBOL__DATA = 158, /* _DATA */
+ YYSYMBOL__THIS = 159, /* _THIS */
+ YYSYMBOL__BASE = 160, /* _BASE */
+ YYSYMBOL__NESTER = 161, /* _NESTER */
+ YYSYMBOL__EMITBYTE = 162, /* _EMITBYTE */
+ YYSYMBOL__TRY = 163, /* _TRY */
+ YYSYMBOL__MAXSTACK = 164, /* _MAXSTACK */
+ YYSYMBOL__LOCALS = 165, /* _LOCALS */
+ YYSYMBOL__ENTRYPOINT = 166, /* _ENTRYPOINT */
+ YYSYMBOL__ZEROINIT = 167, /* _ZEROINIT */
+ YYSYMBOL__EVENT = 168, /* _EVENT */
+ YYSYMBOL__ADDON = 169, /* _ADDON */
+ YYSYMBOL__REMOVEON = 170, /* _REMOVEON */
+ YYSYMBOL__FIRE = 171, /* _FIRE */
+ YYSYMBOL__OTHER = 172, /* _OTHER */
+ YYSYMBOL__PROPERTY = 173, /* _PROPERTY */
+ YYSYMBOL__SET = 174, /* _SET */
+ YYSYMBOL__GET = 175, /* _GET */
+ YYSYMBOL__PERMISSION = 176, /* _PERMISSION */
+ YYSYMBOL__PERMISSIONSET = 177, /* _PERMISSIONSET */
+ YYSYMBOL_REQUEST_ = 178, /* REQUEST_ */
+ YYSYMBOL_DEMAND_ = 179, /* DEMAND_ */
+ YYSYMBOL_ASSERT_ = 180, /* ASSERT_ */
+ YYSYMBOL_DENY_ = 181, /* DENY_ */
+ YYSYMBOL_PERMITONLY_ = 182, /* PERMITONLY_ */
+ YYSYMBOL_LINKCHECK_ = 183, /* LINKCHECK_ */
+ YYSYMBOL_INHERITCHECK_ = 184, /* INHERITCHECK_ */
+ YYSYMBOL_REQMIN_ = 185, /* REQMIN_ */
+ YYSYMBOL_REQOPT_ = 186, /* REQOPT_ */
+ YYSYMBOL_REQREFUSE_ = 187, /* REQREFUSE_ */
+ YYSYMBOL_PREJITGRANT_ = 188, /* PREJITGRANT_ */
+ YYSYMBOL_PREJITDENY_ = 189, /* PREJITDENY_ */
+ YYSYMBOL_NONCASDEMAND_ = 190, /* NONCASDEMAND_ */
+ YYSYMBOL_NONCASLINKDEMAND_ = 191, /* NONCASLINKDEMAND_ */
+ YYSYMBOL_NONCASINHERITANCE_ = 192, /* NONCASINHERITANCE_ */
+ YYSYMBOL__LINE = 193, /* _LINE */
+ YYSYMBOL_P_LINE = 194, /* P_LINE */
+ YYSYMBOL__LANGUAGE = 195, /* _LANGUAGE */
+ YYSYMBOL__CUSTOM = 196, /* _CUSTOM */
+ YYSYMBOL_INIT_ = 197, /* INIT_ */
+ YYSYMBOL__SIZE = 198, /* _SIZE */
+ YYSYMBOL__PACK = 199, /* _PACK */
+ YYSYMBOL__VTABLE = 200, /* _VTABLE */
+ YYSYMBOL__VTFIXUP = 201, /* _VTFIXUP */
+ YYSYMBOL_FROMUNMANAGED_ = 202, /* FROMUNMANAGED_ */
+ YYSYMBOL_CALLMOSTDERIVED_ = 203, /* CALLMOSTDERIVED_ */
+ YYSYMBOL__VTENTRY = 204, /* _VTENTRY */
+ YYSYMBOL_RETAINAPPDOMAIN_ = 205, /* RETAINAPPDOMAIN_ */
+ YYSYMBOL__FILE = 206, /* _FILE */
+ YYSYMBOL_NOMETADATA_ = 207, /* NOMETADATA_ */
+ YYSYMBOL__HASH = 208, /* _HASH */
+ YYSYMBOL__ASSEMBLY = 209, /* _ASSEMBLY */
+ YYSYMBOL__PUBLICKEY = 210, /* _PUBLICKEY */
+ YYSYMBOL__PUBLICKEYTOKEN = 211, /* _PUBLICKEYTOKEN */
+ YYSYMBOL_ALGORITHM_ = 212, /* ALGORITHM_ */
+ YYSYMBOL__VER = 213, /* _VER */
+ YYSYMBOL__LOCALE = 214, /* _LOCALE */
+ YYSYMBOL_EXTERN_ = 215, /* EXTERN_ */
+ YYSYMBOL__MRESOURCE = 216, /* _MRESOURCE */
+ YYSYMBOL__MODULE = 217, /* _MODULE */
+ YYSYMBOL__EXPORT = 218, /* _EXPORT */
+ YYSYMBOL_LEGACY_ = 219, /* LEGACY_ */
+ YYSYMBOL_LIBRARY_ = 220, /* LIBRARY_ */
+ YYSYMBOL_X86_ = 221, /* X86_ */
+ YYSYMBOL_AMD64_ = 222, /* AMD64_ */
+ YYSYMBOL_ARM_ = 223, /* ARM_ */
+ YYSYMBOL_ARM64_ = 224, /* ARM64_ */
+ YYSYMBOL_MARSHAL_ = 225, /* MARSHAL_ */
+ YYSYMBOL_CUSTOM_ = 226, /* CUSTOM_ */
+ YYSYMBOL_SYSSTRING_ = 227, /* SYSSTRING_ */
+ YYSYMBOL_FIXED_ = 228, /* FIXED_ */
+ YYSYMBOL_VARIANT_ = 229, /* VARIANT_ */
+ YYSYMBOL_CURRENCY_ = 230, /* CURRENCY_ */
+ YYSYMBOL_SYSCHAR_ = 231, /* SYSCHAR_ */
+ YYSYMBOL_DECIMAL_ = 232, /* DECIMAL_ */
+ YYSYMBOL_DATE_ = 233, /* DATE_ */
+ YYSYMBOL_BSTR_ = 234, /* BSTR_ */
+ YYSYMBOL_TBSTR_ = 235, /* TBSTR_ */
+ YYSYMBOL_LPSTR_ = 236, /* LPSTR_ */
+ YYSYMBOL_LPWSTR_ = 237, /* LPWSTR_ */
+ YYSYMBOL_LPTSTR_ = 238, /* LPTSTR_ */
+ YYSYMBOL_OBJECTREF_ = 239, /* OBJECTREF_ */
+ YYSYMBOL_IUNKNOWN_ = 240, /* IUNKNOWN_ */
+ YYSYMBOL_IDISPATCH_ = 241, /* IDISPATCH_ */
+ YYSYMBOL_STRUCT_ = 242, /* STRUCT_ */
+ YYSYMBOL_SAFEARRAY_ = 243, /* SAFEARRAY_ */
+ YYSYMBOL_BYVALSTR_ = 244, /* BYVALSTR_ */
+ YYSYMBOL_LPVOID_ = 245, /* LPVOID_ */
+ YYSYMBOL_ANY_ = 246, /* ANY_ */
+ YYSYMBOL_ARRAY_ = 247, /* ARRAY_ */
+ YYSYMBOL_LPSTRUCT_ = 248, /* LPSTRUCT_ */
+ YYSYMBOL_IIDPARAM_ = 249, /* IIDPARAM_ */
+ YYSYMBOL_IN_ = 250, /* IN_ */
+ YYSYMBOL_OUT_ = 251, /* OUT_ */
+ YYSYMBOL_OPT_ = 252, /* OPT_ */
+ YYSYMBOL__PARAM = 253, /* _PARAM */
+ YYSYMBOL__OVERRIDE = 254, /* _OVERRIDE */
+ YYSYMBOL_WITH_ = 255, /* WITH_ */
+ YYSYMBOL_NULL_ = 256, /* NULL_ */
+ YYSYMBOL_ERROR_ = 257, /* ERROR_ */
+ YYSYMBOL_HRESULT_ = 258, /* HRESULT_ */
+ YYSYMBOL_CARRAY_ = 259, /* CARRAY_ */
+ YYSYMBOL_USERDEFINED_ = 260, /* USERDEFINED_ */
+ YYSYMBOL_RECORD_ = 261, /* RECORD_ */
+ YYSYMBOL_FILETIME_ = 262, /* FILETIME_ */
+ YYSYMBOL_BLOB_ = 263, /* BLOB_ */
+ YYSYMBOL_STREAM_ = 264, /* STREAM_ */
+ YYSYMBOL_STORAGE_ = 265, /* STORAGE_ */
+ YYSYMBOL_STREAMED_OBJECT_ = 266, /* STREAMED_OBJECT_ */
+ YYSYMBOL_STORED_OBJECT_ = 267, /* STORED_OBJECT_ */
+ YYSYMBOL_BLOB_OBJECT_ = 268, /* BLOB_OBJECT_ */
+ YYSYMBOL_CF_ = 269, /* CF_ */
+ YYSYMBOL_CLSID_ = 270, /* CLSID_ */
+ YYSYMBOL_VECTOR_ = 271, /* VECTOR_ */
+ YYSYMBOL__SUBSYSTEM = 272, /* _SUBSYSTEM */
+ YYSYMBOL__CORFLAGS = 273, /* _CORFLAGS */
+ YYSYMBOL_ALIGNMENT_ = 274, /* ALIGNMENT_ */
+ YYSYMBOL__IMAGEBASE = 275, /* _IMAGEBASE */
+ YYSYMBOL__STACKRESERVE = 276, /* _STACKRESERVE */
+ YYSYMBOL__TYPEDEF = 277, /* _TYPEDEF */
+ YYSYMBOL__TEMPLATE = 278, /* _TEMPLATE */
+ YYSYMBOL__TYPELIST = 279, /* _TYPELIST */
+ YYSYMBOL__MSCORLIB = 280, /* _MSCORLIB */
+ YYSYMBOL_P_DEFINE = 281, /* P_DEFINE */
+ YYSYMBOL_P_UNDEF = 282, /* P_UNDEF */
+ YYSYMBOL_P_IFDEF = 283, /* P_IFDEF */
+ YYSYMBOL_P_IFNDEF = 284, /* P_IFNDEF */
+ YYSYMBOL_P_ELSE = 285, /* P_ELSE */
+ YYSYMBOL_P_ENDIF = 286, /* P_ENDIF */
+ YYSYMBOL_P_INCLUDE = 287, /* P_INCLUDE */
+ YYSYMBOL_CONSTRAINT_ = 288, /* CONSTRAINT_ */
+ YYSYMBOL_289_ = 289, /* '{' */
+ YYSYMBOL_290_ = 290, /* '}' */
+ YYSYMBOL_291_ = 291, /* '+' */
+ YYSYMBOL_292_ = 292, /* ',' */
+ YYSYMBOL_293_ = 293, /* '.' */
+ YYSYMBOL_294_ = 294, /* '(' */
+ YYSYMBOL_295_ = 295, /* ')' */
+ YYSYMBOL_296_ = 296, /* ';' */
+ YYSYMBOL_297_ = 297, /* '=' */
+ YYSYMBOL_298_ = 298, /* '[' */
+ YYSYMBOL_299_ = 299, /* ']' */
+ YYSYMBOL_300_ = 300, /* '<' */
+ YYSYMBOL_301_ = 301, /* '>' */
+ YYSYMBOL_302_ = 302, /* '-' */
+ YYSYMBOL_303_ = 303, /* ':' */
+ YYSYMBOL_304_ = 304, /* '*' */
+ YYSYMBOL_305_ = 305, /* '&' */
+ YYSYMBOL_306_ = 306, /* '/' */
+ YYSYMBOL_307_ = 307, /* '!' */
+ YYSYMBOL_YYACCEPT = 308, /* $accept */
+ YYSYMBOL_decls = 309, /* decls */
+ YYSYMBOL_decl = 310, /* decl */
+ YYSYMBOL_classNameSeq = 311, /* classNameSeq */
+ YYSYMBOL_compQstring = 312, /* compQstring */
+ YYSYMBOL_languageDecl = 313, /* languageDecl */
+ YYSYMBOL_id = 314, /* id */
+ YYSYMBOL_dottedName = 315, /* dottedName */
+ YYSYMBOL_int32 = 316, /* int32 */
+ YYSYMBOL_int64 = 317, /* int64 */
+ YYSYMBOL_float64 = 318, /* float64 */
+ YYSYMBOL_typedefDecl = 319, /* typedefDecl */
+ YYSYMBOL_compControl = 320, /* compControl */
+ YYSYMBOL_customDescr = 321, /* customDescr */
+ YYSYMBOL_customDescrWithOwner = 322, /* customDescrWithOwner */
+ YYSYMBOL_customHead = 323, /* customHead */
+ YYSYMBOL_customHeadWithOwner = 324, /* customHeadWithOwner */
+ YYSYMBOL_customType = 325, /* customType */
+ YYSYMBOL_ownerType = 326, /* ownerType */
+ YYSYMBOL_customBlobDescr = 327, /* customBlobDescr */
+ YYSYMBOL_customBlobArgs = 328, /* customBlobArgs */
+ YYSYMBOL_customBlobNVPairs = 329, /* customBlobNVPairs */
+ YYSYMBOL_fieldOrProp = 330, /* fieldOrProp */
+ YYSYMBOL_customAttrDecl = 331, /* customAttrDecl */
+ YYSYMBOL_serializType = 332, /* serializType */
+ YYSYMBOL_moduleHead = 333, /* moduleHead */
+ YYSYMBOL_vtfixupDecl = 334, /* vtfixupDecl */
+ YYSYMBOL_vtfixupAttr = 335, /* vtfixupAttr */
+ YYSYMBOL_vtableDecl = 336, /* vtableDecl */
+ YYSYMBOL_vtableHead = 337, /* vtableHead */
+ YYSYMBOL_nameSpaceHead = 338, /* nameSpaceHead */
+ YYSYMBOL__class = 339, /* _class */
+ YYSYMBOL_classHeadBegin = 340, /* classHeadBegin */
+ YYSYMBOL_classHead = 341, /* classHead */
+ YYSYMBOL_classAttr = 342, /* classAttr */
+ YYSYMBOL_extendsClause = 343, /* extendsClause */
+ YYSYMBOL_implClause = 344, /* implClause */
+ YYSYMBOL_classDecls = 345, /* classDecls */
+ YYSYMBOL_implList = 346, /* implList */
+ YYSYMBOL_typeList = 347, /* typeList */
+ YYSYMBOL_typeListNotEmpty = 348, /* typeListNotEmpty */
+ YYSYMBOL_typarsClause = 349, /* typarsClause */
+ YYSYMBOL_typarAttrib = 350, /* typarAttrib */
+ YYSYMBOL_typarAttribs = 351, /* typarAttribs */
+ YYSYMBOL_typars = 352, /* typars */
+ YYSYMBOL_typarsRest = 353, /* typarsRest */
+ YYSYMBOL_tyBound = 354, /* tyBound */
+ YYSYMBOL_genArity = 355, /* genArity */
+ YYSYMBOL_genArityNotEmpty = 356, /* genArityNotEmpty */
+ YYSYMBOL_classDecl = 357, /* classDecl */
+ YYSYMBOL_fieldDecl = 358, /* fieldDecl */
+ YYSYMBOL_fieldAttr = 359, /* fieldAttr */
+ YYSYMBOL_atOpt = 360, /* atOpt */
+ YYSYMBOL_initOpt = 361, /* initOpt */
+ YYSYMBOL_repeatOpt = 362, /* repeatOpt */
+ YYSYMBOL_methodRef = 363, /* methodRef */
+ YYSYMBOL_callConv = 364, /* callConv */
+ YYSYMBOL_callKind = 365, /* callKind */
+ YYSYMBOL_mdtoken = 366, /* mdtoken */
+ YYSYMBOL_memberRef = 367, /* memberRef */
+ YYSYMBOL_eventHead = 368, /* eventHead */
+ YYSYMBOL_eventAttr = 369, /* eventAttr */
+ YYSYMBOL_eventDecls = 370, /* eventDecls */
+ YYSYMBOL_eventDecl = 371, /* eventDecl */
+ YYSYMBOL_propHead = 372, /* propHead */
+ YYSYMBOL_propAttr = 373, /* propAttr */
+ YYSYMBOL_propDecls = 374, /* propDecls */
+ YYSYMBOL_propDecl = 375, /* propDecl */
+ YYSYMBOL_methodHeadPart1 = 376, /* methodHeadPart1 */
+ YYSYMBOL_marshalClause = 377, /* marshalClause */
+ YYSYMBOL_marshalBlob = 378, /* marshalBlob */
+ YYSYMBOL_marshalBlobHead = 379, /* marshalBlobHead */
+ YYSYMBOL_methodHead = 380, /* methodHead */
+ YYSYMBOL_methAttr = 381, /* methAttr */
+ YYSYMBOL_pinvAttr = 382, /* pinvAttr */
+ YYSYMBOL_methodName = 383, /* methodName */
+ YYSYMBOL_paramAttr = 384, /* paramAttr */
+ YYSYMBOL_implAttr = 385, /* implAttr */
+ YYSYMBOL_localsHead = 386, /* localsHead */
+ YYSYMBOL_methodDecls = 387, /* methodDecls */
+ YYSYMBOL_methodDecl = 388, /* methodDecl */
+ YYSYMBOL_scopeBlock = 389, /* scopeBlock */
+ YYSYMBOL_scopeOpen = 390, /* scopeOpen */
+ YYSYMBOL_sehBlock = 391, /* sehBlock */
+ YYSYMBOL_sehClauses = 392, /* sehClauses */
+ YYSYMBOL_tryBlock = 393, /* tryBlock */
+ YYSYMBOL_tryHead = 394, /* tryHead */
+ YYSYMBOL_sehClause = 395, /* sehClause */
+ YYSYMBOL_filterClause = 396, /* filterClause */
+ YYSYMBOL_filterHead = 397, /* filterHead */
+ YYSYMBOL_catchClause = 398, /* catchClause */
+ YYSYMBOL_finallyClause = 399, /* finallyClause */
+ YYSYMBOL_faultClause = 400, /* faultClause */
+ YYSYMBOL_handlerBlock = 401, /* handlerBlock */
+ YYSYMBOL_dataDecl = 402, /* dataDecl */
+ YYSYMBOL_ddHead = 403, /* ddHead */
+ YYSYMBOL_tls = 404, /* tls */
+ YYSYMBOL_ddBody = 405, /* ddBody */
+ YYSYMBOL_ddItemList = 406, /* ddItemList */
+ YYSYMBOL_ddItemCount = 407, /* ddItemCount */
+ YYSYMBOL_ddItem = 408, /* ddItem */
+ YYSYMBOL_fieldSerInit = 409, /* fieldSerInit */
+ YYSYMBOL_bytearrayhead = 410, /* bytearrayhead */
+ YYSYMBOL_bytes = 411, /* bytes */
+ YYSYMBOL_hexbytes = 412, /* hexbytes */
+ YYSYMBOL_fieldInit = 413, /* fieldInit */
+ YYSYMBOL_serInit = 414, /* serInit */
+ YYSYMBOL_f32seq = 415, /* f32seq */
+ YYSYMBOL_f64seq = 416, /* f64seq */
+ YYSYMBOL_i64seq = 417, /* i64seq */
+ YYSYMBOL_i32seq = 418, /* i32seq */
+ YYSYMBOL_i16seq = 419, /* i16seq */
+ YYSYMBOL_i8seq = 420, /* i8seq */
+ YYSYMBOL_boolSeq = 421, /* boolSeq */
+ YYSYMBOL_sqstringSeq = 422, /* sqstringSeq */
+ YYSYMBOL_classSeq = 423, /* classSeq */
+ YYSYMBOL_objSeq = 424, /* objSeq */
+ YYSYMBOL_methodSpec = 425, /* methodSpec */
+ YYSYMBOL_instr_none = 426, /* instr_none */
+ YYSYMBOL_instr_var = 427, /* instr_var */
+ YYSYMBOL_instr_i = 428, /* instr_i */
+ YYSYMBOL_instr_i8 = 429, /* instr_i8 */
+ YYSYMBOL_instr_r = 430, /* instr_r */
+ YYSYMBOL_instr_brtarget = 431, /* instr_brtarget */
+ YYSYMBOL_instr_method = 432, /* instr_method */
+ YYSYMBOL_instr_field = 433, /* instr_field */
+ YYSYMBOL_instr_type = 434, /* instr_type */
+ YYSYMBOL_instr_string = 435, /* instr_string */
+ YYSYMBOL_instr_sig = 436, /* instr_sig */
+ YYSYMBOL_instr_tok = 437, /* instr_tok */
+ YYSYMBOL_instr_switch = 438, /* instr_switch */
+ YYSYMBOL_instr_r_head = 439, /* instr_r_head */
+ YYSYMBOL_instr = 440, /* instr */
+ YYSYMBOL_labels = 441, /* labels */
+ YYSYMBOL_tyArgs0 = 442, /* tyArgs0 */
+ YYSYMBOL_tyArgs1 = 443, /* tyArgs1 */
+ YYSYMBOL_tyArgs2 = 444, /* tyArgs2 */
+ YYSYMBOL_sigArgs0 = 445, /* sigArgs0 */
+ YYSYMBOL_sigArgs1 = 446, /* sigArgs1 */
+ YYSYMBOL_sigArg = 447, /* sigArg */
+ YYSYMBOL_className = 448, /* className */
+ YYSYMBOL_slashedName = 449, /* slashedName */
+ YYSYMBOL_typeSpec = 450, /* typeSpec */
+ YYSYMBOL_nativeType = 451, /* nativeType */
+ YYSYMBOL_iidParamIndex = 452, /* iidParamIndex */
+ YYSYMBOL_variantType = 453, /* variantType */
+ YYSYMBOL_type = 454, /* type */
+ YYSYMBOL_simpleType = 455, /* simpleType */
+ YYSYMBOL_bounds1 = 456, /* bounds1 */
+ YYSYMBOL_bound = 457, /* bound */
+ YYSYMBOL_secDecl = 458, /* secDecl */
+ YYSYMBOL_secAttrSetBlob = 459, /* secAttrSetBlob */
+ YYSYMBOL_secAttrBlob = 460, /* secAttrBlob */
+ YYSYMBOL_psetHead = 461, /* psetHead */
+ YYSYMBOL_nameValPairs = 462, /* nameValPairs */
+ YYSYMBOL_nameValPair = 463, /* nameValPair */
+ YYSYMBOL_truefalse = 464, /* truefalse */
+ YYSYMBOL_caValue = 465, /* caValue */
+ YYSYMBOL_secAction = 466, /* secAction */
+ YYSYMBOL_esHead = 467, /* esHead */
+ YYSYMBOL_extSourceSpec = 468, /* extSourceSpec */
+ YYSYMBOL_fileDecl = 469, /* fileDecl */
+ YYSYMBOL_fileAttr = 470, /* fileAttr */
+ YYSYMBOL_fileEntry = 471, /* fileEntry */
+ YYSYMBOL_hashHead = 472, /* hashHead */
+ YYSYMBOL_assemblyHead = 473, /* assemblyHead */
+ YYSYMBOL_asmAttr = 474, /* asmAttr */
+ YYSYMBOL_assemblyDecls = 475, /* assemblyDecls */
+ YYSYMBOL_assemblyDecl = 476, /* assemblyDecl */
+ YYSYMBOL_intOrWildcard = 477, /* intOrWildcard */
+ YYSYMBOL_asmOrRefDecl = 478, /* asmOrRefDecl */
+ YYSYMBOL_publicKeyHead = 479, /* publicKeyHead */
+ YYSYMBOL_publicKeyTokenHead = 480, /* publicKeyTokenHead */
+ YYSYMBOL_localeHead = 481, /* localeHead */
+ YYSYMBOL_assemblyRefHead = 482, /* assemblyRefHead */
+ YYSYMBOL_assemblyRefDecls = 483, /* assemblyRefDecls */
+ YYSYMBOL_assemblyRefDecl = 484, /* assemblyRefDecl */
+ YYSYMBOL_exptypeHead = 485, /* exptypeHead */
+ YYSYMBOL_exportHead = 486, /* exportHead */
+ YYSYMBOL_exptAttr = 487, /* exptAttr */
+ YYSYMBOL_exptypeDecls = 488, /* exptypeDecls */
+ YYSYMBOL_exptypeDecl = 489, /* exptypeDecl */
+ YYSYMBOL_manifestResHead = 490, /* manifestResHead */
+ YYSYMBOL_manresAttr = 491, /* manresAttr */
+ YYSYMBOL_manifestResDecls = 492, /* manifestResDecls */
+ YYSYMBOL_manifestResDecl = 493 /* manifestResDecl */
+};
+typedef enum yysymbol_kind_t yysymbol_kind_t;
+
+
+
+
+#ifdef short
+# undef short
#endif
-#ifndef YYCHK
-#define YYCHK yychk
+
+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
+ and (if available) are included
+ so that the code can choose integer types of a good width. */
+
+#ifndef __PTRDIFF_MAX__
+# include /* INFRINGES ON USER NAME SPACE */
+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include /* INFRINGES ON USER NAME SPACE */
+# define YY_STDINT_H
+# endif
#endif
-#ifndef YYDEF
-#define YYDEF yydef
+
+/* Narrow types that promote to a signed type and that can represent a
+ signed or unsigned integer of at least N bits. In tables they can
+ save space and decrease cache pressure. Promoting to a signed type
+ helps avoid bugs in integer arithmetic. */
+
+#ifdef __INT_LEAST8_MAX__
+typedef __INT_LEAST8_TYPE__ yytype_int8;
+#elif defined YY_STDINT_H
+typedef int_least8_t yytype_int8;
+#else
+typedef signed char yytype_int8;
#endif
-#ifndef YYV
-#define YYV yyv
+
+#ifdef __INT_LEAST16_MAX__
+typedef __INT_LEAST16_TYPE__ yytype_int16;
+#elif defined YY_STDINT_H
+typedef int_least16_t yytype_int16;
+#else
+typedef short yytype_int16;
#endif
-#ifndef YYS
-#define YYS yys
+
+/* Work around bug in HP-UX 11.23, which defines these macros
+ incorrectly for preprocessor constants. This workaround can likely
+ be removed in 2023, as HPE has promised support for HP-UX 11.23
+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
+ . */
+#ifdef __hpux
+# undef UINT_LEAST8_MAX
+# undef UINT_LEAST16_MAX
+# define UINT_LEAST8_MAX 255
+# define UINT_LEAST16_MAX 65535
#endif
-#ifndef YYLOCAL
-#define YYLOCAL
+
+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST8_MAX <= INT_MAX)
+typedef uint_least8_t yytype_uint8;
+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
+typedef unsigned char yytype_uint8;
+#else
+typedef short yytype_uint8;
#endif
-#ifndef YYR_T
-#define YYR_T int
+
+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
+ && UINT_LEAST16_MAX <= INT_MAX)
+typedef uint_least16_t yytype_uint16;
+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
+typedef unsigned short yytype_uint16;
+#else
+typedef int yytype_uint16;
#endif
-typedef YYR_T yyr_t;
-#ifndef YYEXIND_T
-#define YYEXIND_T unsigned int
+
+#ifndef YYPTRDIFF_T
+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
+# define YYPTRDIFF_T __PTRDIFF_TYPE__
+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
+# elif defined PTRDIFF_MAX
+# ifndef ptrdiff_t
+# include /* INFRINGES ON USER NAME SPACE */
+# endif
+# define YYPTRDIFF_T ptrdiff_t
+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
+# else
+# define YYPTRDIFF_T long
+# define YYPTRDIFF_MAXIMUM LONG_MAX
+# endif
#endif
-typedef YYEXIND_T yyexind_t;
-#ifndef YYOPTTIME
-#define YYOPTTIME 0
+
+#ifndef YYSIZE_T
+# ifdef __SIZE_TYPE__
+# define YYSIZE_T __SIZE_TYPE__
+# elif defined size_t
+# define YYSIZE_T size_t
+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
+# include /* INFRINGES ON USER NAME SPACE */
+# define YYSIZE_T size_t
+# else
+# define YYSIZE_T unsigned
+# endif
#endif
-# define YYERRCODE 256
-#line 2063 "asmparse.y"
+#define YYSIZE_MAXIMUM \
+ YY_CAST (YYPTRDIFF_T, \
+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
+ ? YYPTRDIFF_MAXIMUM \
+ : YY_CAST (YYSIZE_T, -1)))
+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
-#include "grammar_after.cpp"
-YYSTATIC YYCONST short yyexca[] = {
-#if !(YYOPTTIME)
--1, 1,
-#endif
- 0, -1,
- -2, 0,
-#if !(YYOPTTIME)
--1, 452,
-#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 622,
-#endif
- 274, 557,
- 47, 557,
- -2, 232,
-#if !(YYOPTTIME)
--1, 643,
-#endif
- 40, 312,
- 60, 312,
- -2, 557,
-#if !(YYOPTTIME)
--1, 665,
-#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 690,
-#endif
- 274, 557,
- 47, 557,
- -2, 518,
-#if !(YYOPTTIME)
--1, 811,
-#endif
- 123, 237,
- -2, 557,
-#if !(YYOPTTIME)
--1, 838,
+
+/* Stored state numbers (used for stacks). */
+typedef yytype_int16 yy_state_t;
+
+/* State numbers in computations. */
+typedef int yy_state_fast_t;
+
+#ifndef YY_
+# if defined YYENABLE_NLS && YYENABLE_NLS
+# if ENABLE_NLS
+# include /* INFRINGES ON USER NAME SPACE */
+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)
+# endif
+# endif
+# ifndef YY_
+# define YY_(Msgid) Msgid
+# endif
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 963,
+
+
+#ifndef YY_ATTRIBUTE_PURE
+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
+# else
+# define YY_ATTRIBUTE_PURE
+# endif
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 997,
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+# else
+# define YY_ATTRIBUTE_UNUSED
+# endif
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 998,
+
+/* Suppress unused-variable warnings by "using" E. */
+#if ! defined lint || defined __GNUC__
+# define YY_USE(E) ((void) (E))
+#else
+# define YY_USE(E) /* empty */
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 1328,
+
+/* Suppress an incorrect diagnostic about yylval being uninitialized. */
+#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
+# if __GNUC__ * 100 + __GNUC_MINOR__ < 407
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
+# else
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# endif
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+ _Pragma ("GCC diagnostic pop")
+#else
+# define YY_INITIAL_VALUE(Value) Value
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 1329,
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 1336,
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 1344,
+
+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
+# define YY_IGNORE_USELESS_CAST_BEGIN \
+ _Pragma ("GCC diagnostic push") \
+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
+# define YY_IGNORE_USELESS_CAST_END \
+ _Pragma ("GCC diagnostic pop")
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 1470,
+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_BEGIN
+# define YY_IGNORE_USELESS_CAST_END
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 1502,
+
+
+#define YY_ASSERT(E) ((void) (0 && (E)))
+
+#if !defined yyoverflow
+
+/* The parser invokes alloca or malloc; define the necessary symbols. */
+
+# ifdef YYSTACK_USE_ALLOCA
+# if YYSTACK_USE_ALLOCA
+# ifdef __GNUC__
+# define YYSTACK_ALLOC __builtin_alloca
+# elif defined __BUILTIN_VA_ARG_INCR
+# include /* INFRINGES ON USER NAME SPACE */
+# elif defined _AIX
+# define YYSTACK_ALLOC __alloca
+# elif defined _MSC_VER
+# include /* INFRINGES ON USER NAME SPACE */
+# define alloca _alloca
+# else
+# define YYSTACK_ALLOC alloca
+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
+# include /* INFRINGES ON USER NAME SPACE */
+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# endif
+# endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+ /* Pacify GCC's 'empty if-body' warning. */
+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# ifndef YYSTACK_ALLOC_MAXIMUM
+ /* The OS might guarantee only one guard page at the bottom of the stack,
+ and a page size can be as small as 4096 bytes. So we cannot safely
+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
+ to allow for a few compiler-allocated temporary stack slots. */
+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
+# endif
+# else
+# define YYSTACK_ALLOC YYMALLOC
+# define YYSTACK_FREE YYFREE
+# ifndef YYSTACK_ALLOC_MAXIMUM
+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
+# endif
+# if (defined __cplusplus && ! defined EXIT_SUCCESS \
+ && ! ((defined YYMALLOC || defined malloc) \
+ && (defined YYFREE || defined free)))
+# include /* INFRINGES ON USER NAME SPACE */
+# ifndef EXIT_SUCCESS
+# define EXIT_SUCCESS 0
+# endif
+# endif
+# ifndef YYMALLOC
+# define YYMALLOC malloc
+# if ! defined malloc && ! defined EXIT_SUCCESS
+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# ifndef YYFREE
+# define YYFREE free
+# if ! defined free && ! defined EXIT_SUCCESS
+void free (void *); /* INFRINGES ON USER NAME SPACE */
+# endif
+# endif
+# endif
+#endif /* !defined yyoverflow */
+
+#if (! defined yyoverflow \
+ && (! defined __cplusplus \
+ || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member. */
+union yyalloc
+{
+ yy_state_t yyss_alloc;
+ YYSTYPE yyvs_alloc;
+};
+
+/* The size of the maximum gap between one aligned stack and the next. */
+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+ N elements. */
+# define YYSTACK_BYTES(N) \
+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
+ + YYSTACK_GAP_MAXIMUM)
+
+# define YYCOPY_NEEDED 1
+
+/* Relocate STACK from its old location to the new one. The
+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
+ elements in the stack, and YYPTR gives the new location of the
+ stack. Advance YYPTR to a properly aligned location for the next
+ stack. */
+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \
+ do \
+ { \
+ YYPTRDIFF_T yynewbytes; \
+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
+ Stack = &yyptr->Stack_alloc; \
+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
+ } \
+ while (0)
+
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 1569,
+
+#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
+/* Copy COUNT objects from SRC to DST. The source and destination do
+ not overlap. */
+# ifndef YYCOPY
+# if defined __GNUC__ && 1 < __GNUC__
+# define YYCOPY(Dst, Src, Count) \
+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
+# else
+# define YYCOPY(Dst, Src, Count) \
+ do \
+ { \
+ YYPTRDIFF_T yyi; \
+ for (yyi = 0; yyi < (Count); yyi++) \
+ (Dst)[yyi] = (Src)[yyi]; \
+ } \
+ while (0)
+# endif
+# endif
+#endif /* !YYCOPY_NEEDED */
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL 2
+/* YYLAST -- Last index in YYTABLE. */
+#define YYLAST 3777
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS 308
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS 186
+/* YYNRULES -- Number of rules. */
+#define YYNRULES 846
+/* YYNSTATES -- Number of states. */
+#define YYNSTATES 1590
+
+/* YYMAXUTOK -- Last valid token kind. */
+#define YYMAXUTOK 543
+
+
+/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex, with out-of-bounds checking. */
+#define YYTRANSLATE(YYX) \
+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
+ : YYSYMBOL_YYUNDEF)
+
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+ as returned by yylex. */
+static const yytype_int16 yytranslate[] =
+{
+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 307, 2, 2, 2, 2, 305, 2,
+ 294, 295, 304, 291, 292, 302, 293, 306, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 303, 296,
+ 300, 297, 301, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 298, 2, 299, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 289, 2, 290, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
+ 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
+ 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
+ 135, 136, 137, 138, 139, 140, 141, 142, 143, 144,
+ 145, 146, 147, 148, 149, 150, 151, 152, 153, 154,
+ 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
+ 165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
+ 175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
+ 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
+ 195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
+ 205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
+ 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
+ 225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
+ 235, 236, 237, 238, 239, 240, 241, 242, 243, 244,
+ 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
+ 255, 256, 257, 258, 259, 260, 261, 262, 263, 264,
+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 286, 287, 288
+};
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
+static const yytype_int16 yyrline[] =
+{
+ 0, 189, 189, 190, 193, 194, 195, 199, 200, 201,
+ 202, 203, 204, 205, 206, 207, 208, 209, 210, 211,
+ 212, 222, 223, 226, 229, 230, 231, 232, 233, 234,
+ 237, 238, 241, 242, 245, 246, 248, 253, 254, 257,
+ 258, 259, 262, 265, 266, 269, 270, 271, 275, 276,
+ 277, 278, 279, 284, 285, 286, 287, 290, 293, 294,
+ 298, 299, 303, 304, 305, 306, 309, 310, 311, 313,
+ 316, 319, 325, 328, 329, 333, 339, 340, 342, 345,
+ 346, 352, 355, 356, 359, 363, 364, 372, 373, 374,
+ 375, 377, 379, 384, 385, 386, 393, 397, 398, 399,
+ 400, 401, 402, 405, 408, 412, 415, 418, 424, 427,
+ 428, 429, 430, 431, 432, 433, 434, 435, 436, 437,
+ 438, 439, 440, 441, 442, 443, 444, 445, 446, 447,
+ 448, 449, 450, 451, 452, 453, 456, 457, 460, 461,
+ 464, 465, 468, 469, 473, 474, 477, 478, 481, 482,
+ 485, 486, 487, 488, 489, 490, 491, 494, 495, 498,
+ 499, 502, 503, 506, 509, 510, 513, 517, 521, 522,
+ 523, 524, 525, 526, 527, 528, 529, 530, 531, 532,
+ 538, 547, 548, 549, 554, 560, 561, 562, 569, 574,
+ 575, 576, 577, 578, 579, 580, 581, 593, 595, 596,
+ 597, 598, 599, 600, 601, 604, 605, 608, 609, 612,
+ 613, 617, 634, 640, 656, 661, 662, 663, 666, 667,
+ 668, 669, 672, 673, 674, 675, 676, 677, 678, 679,
+ 682, 685, 690, 694, 698, 700, 702, 707, 708, 712,
+ 713, 714, 717, 718, 721, 722, 723, 724, 725, 726,
+ 727, 728, 732, 738, 739, 740, 743, 744, 748, 749,
+ 750, 751, 752, 753, 754, 758, 764, 765, 768, 769,
+ 772, 775, 791, 792, 793, 794, 795, 796, 797, 798,
+ 799, 800, 801, 802, 803, 804, 805, 806, 807, 808,
+ 809, 810, 811, 814, 817, 822, 823, 824, 825, 826,
+ 827, 828, 829, 830, 831, 832, 833, 834, 835, 836,
+ 837, 840, 841, 842, 845, 846, 847, 848, 849, 852,
+ 853, 854, 855, 856, 857, 858, 859, 860, 861, 862,
+ 863, 864, 865, 866, 867, 870, 874, 875, 878, 879,
+ 880, 881, 883, 886, 887, 888, 889, 890, 891, 892,
+ 893, 894, 895, 896, 906, 916, 918, 921, 928, 929,
+ 934, 940, 941, 943, 964, 967, 971, 974, 975, 978,
+ 979, 980, 984, 989, 990, 991, 992, 996, 997, 999,
+ 1003, 1007, 1012, 1016, 1020, 1021, 1022, 1027, 1030, 1031,
+ 1034, 1035, 1036, 1039, 1040, 1043, 1044, 1047, 1048, 1053,
+ 1054, 1055, 1056, 1063, 1070, 1077, 1084, 1092, 1100, 1101,
+ 1102, 1103, 1104, 1105, 1109, 1112, 1114, 1116, 1118, 1120,
+ 1122, 1124, 1126, 1128, 1130, 1132, 1134, 1136, 1138, 1140,
+ 1142, 1144, 1146, 1150, 1153, 1154, 1157, 1158, 1162, 1163,
+ 1164, 1169, 1170, 1171, 1173, 1175, 1177, 1178, 1179, 1183,
+ 1187, 1191, 1195, 1199, 1203, 1207, 1211, 1215, 1219, 1223,
+ 1227, 1231, 1235, 1239, 1243, 1247, 1251, 1258, 1259, 1261,
+ 1265, 1266, 1268, 1272, 1273, 1277, 1278, 1281, 1282, 1285,
+ 1286, 1289, 1290, 1294, 1295, 1296, 1300, 1301, 1302, 1304,
+ 1308, 1309, 1313, 1319, 1322, 1325, 1328, 1331, 1334, 1337,
+ 1345, 1348, 1351, 1354, 1357, 1360, 1363, 1367, 1368, 1369,
+ 1370, 1371, 1372, 1373, 1374, 1383, 1384, 1385, 1392, 1400,
+ 1408, 1414, 1420, 1426, 1430, 1431, 1433, 1435, 1439, 1445,
+ 1448, 1449, 1450, 1451, 1452, 1456, 1457, 1460, 1461, 1464,
+ 1465, 1469, 1470, 1473, 1474, 1477, 1478, 1479, 1483, 1484,
+ 1485, 1486, 1487, 1488, 1489, 1490, 1493, 1499, 1506, 1507,
+ 1510, 1511, 1512, 1513, 1517, 1518, 1525, 1531, 1533, 1536,
+ 1538, 1539, 1541, 1543, 1544, 1545, 1546, 1547, 1548, 1549,
+ 1550, 1551, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559,
+ 1561, 1563, 1568, 1573, 1576, 1578, 1580, 1581, 1582, 1583,
+ 1584, 1586, 1588, 1590, 1591, 1593, 1596, 1600, 1601, 1602,
+ 1603, 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1615,
+ 1616, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1626, 1627,
+ 1628, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637,
+ 1638, 1639, 1640, 1641, 1642, 1643, 1644, 1645, 1646, 1647,
+ 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 1657,
+ 1658, 1659, 1660, 1661, 1662, 1663, 1664, 1665, 1666, 1667,
+ 1671, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1684, 1685,
+ 1687, 1689, 1696, 1703, 1709, 1715, 1730, 1745, 1746, 1747,
+ 1748, 1749, 1750, 1751, 1754, 1755, 1756, 1757, 1758, 1759,
+ 1760, 1761, 1762, 1763, 1764, 1765, 1766, 1767, 1768, 1769,
+ 1770, 1771, 1774, 1775, 1778, 1779, 1780, 1781, 1784, 1788,
+ 1790, 1792, 1793, 1794, 1796, 1805, 1806, 1807, 1810, 1813,
+ 1818, 1819, 1823, 1824, 1827, 1830, 1831, 1834, 1837, 1840,
+ 1843, 1847, 1853, 1859, 1865, 1873, 1874, 1875, 1876, 1877,
+ 1878, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887,
+ 1891, 1892, 1895, 1898, 1900, 1903, 1905, 1909, 1912, 1916,
+ 1919, 1923, 1926, 1932, 1934, 1937, 1938, 1941, 1942, 1945,
+ 1948, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959,
+ 1960, 1963, 1964, 1967, 1968, 1969, 1972, 1973, 1976, 1977,
+ 1979, 1980, 1981, 1982, 1985, 1988, 1991, 1994, 1996, 2000,
+ 2001, 2004, 2005, 2006, 2007, 2010, 2013, 2016, 2017, 2018,
+ 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2028, 2029, 2032,
+ 2033, 2034, 2035, 2037, 2039, 2040, 2043, 2044, 2048, 2049,
+ 2050, 2053, 2054, 2057, 2058, 2059, 2060
+};
#endif
- 41, 540,
- -2, 313,
-#if !(YYOPTTIME)
--1, 1586,
+
+/** Accessing symbol of state STATE. */
+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
+
+#if YYDEBUG || 0
+/* The user-facing name of the symbol whose (internal) number is
+ YYSYMBOL. No bounds checking. */
+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
+
+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+ "\"end of file\"", "error", "\"invalid token\"", "BAD_COMMENT_",
+ "BAD_LITERAL_", "ID", "DOTTEDNAME", "QSTRING", "SQSTRING", "INT32_V",
+ "INT64_V", "FLOAT64", "HEXBYTE", "TYPEDEF_T", "TYPEDEF_M", "TYPEDEF_F",
+ "TYPEDEF_TS", "TYPEDEF_MR", "TYPEDEF_CA", "DCOLON", "ELLIPSIS", "VOID_",
+ "BOOL_", "CHAR_", "UNSIGNED_", "INT_", "INT8_", "INT16_", "INT32_",
+ "INT64_", "FLOAT_", "FLOAT32_", "FLOAT64_", "BYTEARRAY_", "UINT_",
+ "UINT8_", "UINT16_", "UINT32_", "UINT64_", "FLAGS_", "CALLCONV_",
+ "MDTOKEN_", "OBJECT_", "STRING_", "NULLREF_", "DEFAULT_", "CDECL_",
+ "VARARG_", "STDCALL_", "THISCALL_", "FASTCALL_", "CLASS_", "BYREFLIKE_",
+ "TYPEDREF_", "UNMANAGED_", "FINALLY_", "HANDLER_", "CATCH_", "FILTER_",
+ "FAULT_", "EXTENDS_", "IMPLEMENTS_", "TO_", "AT_", "TLS_", "TRUE_",
+ "FALSE_", "_INTERFACEIMPL", "VALUE_", "VALUETYPE_", "NATIVE_",
+ "INSTANCE_", "SPECIALNAME_", "FORWARDER_", "STATIC_", "PUBLIC_",
+ "PRIVATE_", "FAMILY_", "FINAL_", "SYNCHRONIZED_", "INTERFACE_",
+ "SEALED_", "NESTED_", "ABSTRACT_", "AUTO_", "SEQUENTIAL_", "EXPLICIT_",
+ "ANSI_", "UNICODE_", "AUTOCHAR_", "IMPORT_", "ENUM_", "VIRTUAL_",
+ "NOINLINING_", "AGGRESSIVEINLINING_", "NOOPTIMIZATION_",
+ "AGGRESSIVEOPTIMIZATION_", "UNMANAGEDEXP_", "BEFOREFIELDINIT_",
+ "STRICT_", "RETARGETABLE_", "WINDOWSRUNTIME_", "NOPLATFORM_", "METHOD_",
+ "FIELD_", "PINNED_", "MODREQ_", "MODOPT_", "SERIALIZABLE_", "PROPERTY_",
+ "TYPE_", "ASSEMBLY_", "FAMANDASSEM_", "FAMORASSEM_", "PRIVATESCOPE_",
+ "HIDEBYSIG_", "NEWSLOT_", "RTSPECIALNAME_", "PINVOKEIMPL_", "_CTOR",
+ "_CCTOR", "LITERAL_", "NOTSERIALIZED_", "INITONLY_", "REQSECOBJ_",
+ "CIL_", "OPTIL_", "MANAGED_", "FORWARDREF_", "PRESERVESIG_", "RUNTIME_",
+ "INTERNALCALL_", "_IMPORT", "NOMANGLE_", "LASTERR_", "WINAPI_", "AS_",
+ "BESTFIT_", "ON_", "OFF_", "CHARMAPERROR_", "INSTR_NONE", "INSTR_VAR",
+ "INSTR_I", "INSTR_I8", "INSTR_R", "INSTR_BRTARGET", "INSTR_METHOD",
+ "INSTR_FIELD", "INSTR_TYPE", "INSTR_STRING", "INSTR_SIG", "INSTR_TOK",
+ "INSTR_SWITCH", "_CLASS", "_NAMESPACE", "_METHOD", "_FIELD", "_DATA",
+ "_THIS", "_BASE", "_NESTER", "_EMITBYTE", "_TRY", "_MAXSTACK", "_LOCALS",
+ "_ENTRYPOINT", "_ZEROINIT", "_EVENT", "_ADDON", "_REMOVEON", "_FIRE",
+ "_OTHER", "_PROPERTY", "_SET", "_GET", "_PERMISSION", "_PERMISSIONSET",
+ "REQUEST_", "DEMAND_", "ASSERT_", "DENY_", "PERMITONLY_", "LINKCHECK_",
+ "INHERITCHECK_", "REQMIN_", "REQOPT_", "REQREFUSE_", "PREJITGRANT_",
+ "PREJITDENY_", "NONCASDEMAND_", "NONCASLINKDEMAND_",
+ "NONCASINHERITANCE_", "_LINE", "P_LINE", "_LANGUAGE", "_CUSTOM", "INIT_",
+ "_SIZE", "_PACK", "_VTABLE", "_VTFIXUP", "FROMUNMANAGED_",
+ "CALLMOSTDERIVED_", "_VTENTRY", "RETAINAPPDOMAIN_", "_FILE",
+ "NOMETADATA_", "_HASH", "_ASSEMBLY", "_PUBLICKEY", "_PUBLICKEYTOKEN",
+ "ALGORITHM_", "_VER", "_LOCALE", "EXTERN_", "_MRESOURCE", "_MODULE",
+ "_EXPORT", "LEGACY_", "LIBRARY_", "X86_", "AMD64_", "ARM_", "ARM64_",
+ "MARSHAL_", "CUSTOM_", "SYSSTRING_", "FIXED_", "VARIANT_", "CURRENCY_",
+ "SYSCHAR_", "DECIMAL_", "DATE_", "BSTR_", "TBSTR_", "LPSTR_", "LPWSTR_",
+ "LPTSTR_", "OBJECTREF_", "IUNKNOWN_", "IDISPATCH_", "STRUCT_",
+ "SAFEARRAY_", "BYVALSTR_", "LPVOID_", "ANY_", "ARRAY_", "LPSTRUCT_",
+ "IIDPARAM_", "IN_", "OUT_", "OPT_", "_PARAM", "_OVERRIDE", "WITH_",
+ "NULL_", "ERROR_", "HRESULT_", "CARRAY_", "USERDEFINED_", "RECORD_",
+ "FILETIME_", "BLOB_", "STREAM_", "STORAGE_", "STREAMED_OBJECT_",
+ "STORED_OBJECT_", "BLOB_OBJECT_", "CF_", "CLSID_", "VECTOR_",
+ "_SUBSYSTEM", "_CORFLAGS", "ALIGNMENT_", "_IMAGEBASE", "_STACKRESERVE",
+ "_TYPEDEF", "_TEMPLATE", "_TYPELIST", "_MSCORLIB", "P_DEFINE", "P_UNDEF",
+ "P_IFDEF", "P_IFNDEF", "P_ELSE", "P_ENDIF", "P_INCLUDE", "CONSTRAINT_",
+ "'{'", "'}'", "'+'", "','", "'.'", "'('", "')'", "';'", "'='", "'['",
+ "']'", "'<'", "'>'", "'-'", "':'", "'*'", "'&'", "'/'", "'!'", "$accept",
+ "decls", "decl", "classNameSeq", "compQstring", "languageDecl", "id",
+ "dottedName", "int32", "int64", "float64", "typedefDecl", "compControl",
+ "customDescr", "customDescrWithOwner", "customHead",
+ "customHeadWithOwner", "customType", "ownerType", "customBlobDescr",
+ "customBlobArgs", "customBlobNVPairs", "fieldOrProp", "customAttrDecl",
+ "serializType", "moduleHead", "vtfixupDecl", "vtfixupAttr", "vtableDecl",
+ "vtableHead", "nameSpaceHead", "_class", "classHeadBegin", "classHead",
+ "classAttr", "extendsClause", "implClause", "classDecls", "implList",
+ "typeList", "typeListNotEmpty", "typarsClause", "typarAttrib",
+ "typarAttribs", "typars", "typarsRest", "tyBound", "genArity",
+ "genArityNotEmpty", "classDecl", "fieldDecl", "fieldAttr", "atOpt",
+ "initOpt", "repeatOpt", "methodRef", "callConv", "callKind", "mdtoken",
+ "memberRef", "eventHead", "eventAttr", "eventDecls", "eventDecl",
+ "propHead", "propAttr", "propDecls", "propDecl", "methodHeadPart1",
+ "marshalClause", "marshalBlob", "marshalBlobHead", "methodHead",
+ "methAttr", "pinvAttr", "methodName", "paramAttr", "implAttr",
+ "localsHead", "methodDecls", "methodDecl", "scopeBlock", "scopeOpen",
+ "sehBlock", "sehClauses", "tryBlock", "tryHead", "sehClause",
+ "filterClause", "filterHead", "catchClause", "finallyClause",
+ "faultClause", "handlerBlock", "dataDecl", "ddHead", "tls", "ddBody",
+ "ddItemList", "ddItemCount", "ddItem", "fieldSerInit", "bytearrayhead",
+ "bytes", "hexbytes", "fieldInit", "serInit", "f32seq", "f64seq",
+ "i64seq", "i32seq", "i16seq", "i8seq", "boolSeq", "sqstringSeq",
+ "classSeq", "objSeq", "methodSpec", "instr_none", "instr_var", "instr_i",
+ "instr_i8", "instr_r", "instr_brtarget", "instr_method", "instr_field",
+ "instr_type", "instr_string", "instr_sig", "instr_tok", "instr_switch",
+ "instr_r_head", "instr", "labels", "tyArgs0", "tyArgs1", "tyArgs2",
+ "sigArgs0", "sigArgs1", "sigArg", "className", "slashedName", "typeSpec",
+ "nativeType", "iidParamIndex", "variantType", "type", "simpleType",
+ "bounds1", "bound", "secDecl", "secAttrSetBlob", "secAttrBlob",
+ "psetHead", "nameValPairs", "nameValPair", "truefalse", "caValue",
+ "secAction", "esHead", "extSourceSpec", "fileDecl", "fileAttr",
+ "fileEntry", "hashHead", "assemblyHead", "asmAttr", "assemblyDecls",
+ "assemblyDecl", "intOrWildcard", "asmOrRefDecl", "publicKeyHead",
+ "publicKeyTokenHead", "localeHead", "assemblyRefHead",
+ "assemblyRefDecls", "assemblyRefDecl", "exptypeHead", "exportHead",
+ "exptAttr", "exptypeDecls", "exptypeDecl", "manifestResHead",
+ "manresAttr", "manifestResDecls", "manifestResDecl", YY_NULLPTR
+};
+
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
+{
+ return yytname[yysymbol];
+}
#endif
- 41, 540,
- -2, 313,
+#define YYPACT_NINF (-1367)
+
+#define yypact_value_is_default(Yyn) \
+ ((Yyn) == YYPACT_NINF)
+
+#define YYTABLE_NINF (-559)
+
+#define yytable_value_is_error(Yyn) \
+ 0
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+ STATE-NUM. */
+static const yytype_int16 yypact[] =
+{
+ -1367, 2062, -1367, -1367, -51, 987, -1367, -86, 123, 2317,
+ 2317, -1367, -1367, 246, 182, -31, -19, 16, 105, -1367,
+ 133, 272, 272, 215, 215, 1641, 9, -1367, 987, 987,
+ 987, 987, -1367, -1367, 315, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, 320, 320, -1367, -1367, -1367, -1367, 320, 74,
+ -1367, 285, 103, -1367, -1367, -1367, -1367, 729, -1367, 320,
+ 272, -1367, -1367, 116, 144, 167, 169, -1367, -1367, -1367,
+ -1367, -1367, 191, 272, -1367, -1367, -1367, 368, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, 1929, 43, 58, -1367, -1367, 181, 195,
+ -1367, -1367, 824, 502, 502, 1825, 166, -1367, 2925, -1367,
+ -1367, 202, 272, 272, 238, -1367, 620, 849, 987, 191,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, 2925,
+ -1367, -1367, -1367, 894, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, 589, -1367, 418, 589,
+ 378, -1367, 2339, -1367, -1367, -1367, 67, 50, 191, 373,
+ 387, -1367, 404, 1377, 414, 254, 745, -1367, 589, 45,
+ 191, 191, 191, -1367, -1367, 282, 579, 301, 314, -1367,
+ 3481, 1929, 557, -1367, 3653, 2269, 335, 17, 93, 276,
+ 281, 291, 317, 347, 782, 358, -1367, -1367, 320, 359,
+ 61, -1367, -1367, -1367, -1367, 1130, 987, 385, 2715, 380,
+ 95, -1367, 502, -1367, 330, 926, -1367, 402, -11, 413,
+ 664, 272, 272, -1367, -1367, -1367, -1367, -1367, -1367, 432,
+ -1367, -1367, 91, 1273, -1367, 447, -1367, -1367, 69, 620,
+ -1367, -1367, -1367, -1367, 533, -1367, -1367, -1367, -1367, 191,
+ -1367, -1367, -34, 191, 926, -1367, -1367, -1367, -1367, -1367,
+ 589, -1367, 741, -1367, -1367, -1367, -1367, 1582, 987, 483,
+ 4, 523, 472, 191, -1367, 987, 987, 987, -1367, 2925,
+ 987, 987, -1367, 507, 536, 987, 68, 2925, -1367, -1367,
+ 490, 589, 413, -1367, -1367, -1367, -1367, 2862, 539, -1367,
+ -1367, -1367, -1367, -1367, -1367, 803, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -135,
+ -1367, 1929, -1367, 3003, 543, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, 562, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, 272, -1367,
+ 272, -1367, -1367, -1367, 272, 529, 11, 1999, -1367, -1367,
+ -1367, 537, -1367, -1367, -44, -1367, -1367, -1367, -1367, 546,
+ 208, -1367, -1367, 503, 272, 215, 296, 503, 1377, 985,
+ 1929, 171, 502, 1825, 582, 320, -1367, -1367, -1367, 588,
+ 272, 272, -1367, 272, -1367, 272, -1367, 215, -1367, 303,
+ -1367, 303, -1367, -1367, 559, 594, 368, 596, -1367, -1367,
+ -1367, 272, 272, 954, 3164, 1071, 581, -1367, -1367, -1367,
+ 868, 191, 191, -1367, 599, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, 607, 56,
+ -1367, 987, 44, 2925, 905, 629, -1367, 2093, -1367, 923,
+ 641, 651, 655, 1377, -1367, -1367, 413, -1367, -1367, 85,
+ 38, 654, 937, -1367, -1367, 763, -4, -1367, 987, -1367,
+ -1367, 38, 955, 107, 987, 987, 987, 191, -1367, 191,
+ 191, 191, 1433, 191, 191, 1929, 1929, 191, -1367, -1367,
+ 940, -62, -1367, 674, 690, 926, -1367, -1367, -1367, 272,
+ -1367, -1367, -1367, -1367, -1367, -1367, 222, -1367, 691, -1367,
+ 874, -1367, -1367, -1367, 272, 272, -1367, 25, 2162, -1367,
+ -1367, -1367, -1367, 702, -1367, -1367, 707, 714, -1367, -1367,
+ -1367, -1367, 715, 272, 905, 2819, -1367, -1367, 712, 272,
+ 111, 137, 272, 502, 1000, -1367, 735, 100, 2432, -1367,
+ 1929, -1367, -1367, -1367, 546, 28, 208, 28, 28, 28,
+ 968, 973, -1367, -1367, -1367, -1367, -1367, -1367, 743, 750,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, 1582,
+ -1367, 753, 413, 320, 2925, -1367, 503, 751, 905, 756,
+ 749, 757, 761, 762, 765, 766, -1367, 782, 767, -1367,
+ 755, 55, 862, 785, 21, 82, -1367, -1367, -1367, -1367,
+ -1367, -1367, 320, 320, -1367, 786, 788, -1367, 320, -1367,
+ 320, -1367, 792, 73, 987, 876, -1367, -1367, -1367, -1367,
+ 987, 877, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, 272, 3377, 8, 121, 987, 1085, 27, 798,
+ 806, -1367, 675, 802, 810, 809, -1367, 1100, -1367, -1367,
+ 825, 836, 3058, 2874, 839, 840, 575, 996, 320, 987,
+ 191, 987, 987, 254, 254, 254, 846, 848, 850, 272,
+ 146, -1367, -1367, 2925, 854, 847, -1367, -1367, -1367, -1367,
+ -1367, -1367, 222, 125, 843, 1929, 1929, 1741, 752, -1367,
+ -1367, 1130, 142, 164, 502, 1139, -1367, -1367, -1367, 2516,
+ -1367, 864, 1, 2005, 209, 426, 272, 873, 272, 191,
+ 272, 237, 878, 2925, 575, 100, -1367, 2819, 866, 881,
+ -1367, -1367, -1367, -1367, 503, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, 368, 272, 272, 215, 38, 1144, 905,
+ 883, 871, 887, 888, 893, -1367, 225, 884, -1367, 884,
+ 884, 884, 884, 884, -1367, -1367, 272, -1367, 272, 272,
+ 889, -1367, -1367, 886, 899, 413, 902, 907, 910, 913,
+ 915, 918, 272, 987, -1367, 191, 987, 15, 987, 919,
+ -1367, -1367, -1367, 791, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, 914, 976, 981, -1367,
+ 974, 925, -7, 1199, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, 914, 914, -1367, 2977, -1367, -1367,
+ -1367, -1367, 927, 320, 149, 368, 932, 987, 486, -1367,
+ 905, 933, 935, 944, -1367, 2093, -1367, 92, -1367, 355,
+ 365, 941, 375, 381, 388, 395, 403, 411, 417, 419,
+ 425, 434, 439, 441, 449, -1367, 1230, -1367, 320, -1367,
+ 272, 942, 100, 100, 191, 654, -1367, -1367, 368, -1367,
+ -1367, -1367, 939, 191, 191, 254, 100, -1367, -1367, -1367,
+ -1367, 926, -1367, 272, -1367, 1929, 374, 987, -1367, -1367,
+ 1046, -1367, -1367, 470, 987, -1367, -1367, 2925, 191, 272,
+ 191, 272, 481, 2925, 575, 3138, 870, 1533, -1367, 1129,
+ -1367, 905, 2196, 951, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, 943, 948, -1367, 956, 957, 967,
+ 969, 953, 575, -1367, 1117, 970, 971, 1929, 932, 1582,
+ -1367, 977, 426, -1367, 1251, 1211, 1212, -1367, -1367, 990,
+ 992, 987, 476, -1367, 100, 503, 503, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, 66, 1268, -1367, -1367, 21,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, 993, 254, 191,
+ 272, 191, -1367, -1367, -1367, -1367, -1367, -1367, 1033, -1367,
+ -1367, -1367, -1367, 905, 1005, 1008, -1367, -1367, -1367, -1367,
+ -1367, 879, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ 363, -1367, 31, 78, -1367, -1367, 2281, -1367, 997, -1367,
+ -1367, 413, -1367, 1004, -1367, -1367, -1367, -1367, 1001, -1367,
+ -1367, -1367, -1367, 413, 780, 272, 272, 272, 485, 500,
+ 509, 527, 272, 272, 272, 272, 272, 272, 215, 272,
+ 633, 272, 555, 272, 272, 272, 272, 272, 272, 272,
+ 215, 272, 3468, 272, 189, 272, 497, 272, -1367, -1367,
+ -1367, 3236, 1012, 1013, -1367, 1018, 1022, 1024, 1025, -1367,
+ 1154, 1026, 1028, 1032, 1036, -1367, 222, -1367, 374, 1377,
+ -1367, 191, 56, 1030, 1031, 1929, 1582, 1076, -1367, 1377,
+ 1377, 1377, 1377, -1367, -1367, -1367, -1367, -1367, -1367, 1377,
+ 1377, 1377, -1367, -1367, -1367, -1367, -1367, -1367, -1367, 413,
+ -1367, 272, 430, 722, -1367, -1367, -1367, -1367, 3377, 1037,
+ 368, -1367, 1040, -1367, -1367, 1317, -1367, 368, -1367, 368,
+ 272, -1367, -1367, 191, -1367, 1045, -1367, -1367, -1367, 272,
+ -1367, 1042, -1367, -1367, 1049, 619, 272, 272, -1367, -1367,
+ -1367, -1367, -1367, -1367, 905, 1048, -1367, -1367, 272, -1367,
+ -39, 1054, 1055, 1041, 1056, 1065, 1066, 1068, 1069, 1072,
+ 1074, 1077, 1078, 1079, -1367, 413, -1367, -1367, 272, 742,
+ -1367, 794, 1080, 1082, 1075, 1086, 1083, 272, 272, 272,
+ 272, 272, 272, 215, 272, 1089, 1088, 1101, 1096, 1103,
+ 1102, 1104, 1105, 1107, 1110, 1108, 1111, 1113, 1121, 1114,
+ 1122, 1128, 1127, 1132, 1131, 1133, 1141, 1134, 1143, 1148,
+ 1149, 1146, 1152, 1367, 1155, 1153, -1367, 531, -1367, 168,
+ -1367, -1367, 1099, -1367, -1367, 100, 100, -1367, -1367, -1367,
+ -1367, 1929, -1367, -1367, 643, -1367, 1159, -1367, 1439, 502,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, 2405, 1171, -1367,
+ -1367, -1367, -1367, 1172, 1183, -1367, 1929, 575, -1367, -1367,
+ -1367, -1367, 1470, 21, 272, 905, 1180, 1182, 413, -1367,
+ 1184, 272, -1367, 1188, 1191, 1194, 1195, 1196, 1187, 1192,
+ 1201, 1202, 1260, -1367, -1367, -1367, 1213, -1367, 1216, 1210,
+ 1207, 1223, 1220, 1228, 1225, 1232, 1226, -1367, 1234, -1367,
+ 1235, -1367, 1236, -1367, 1237, -1367, -1367, 1238, -1367, -1367,
+ 1239, -1367, 1240, -1367, 1241, -1367, 1254, -1367, 1255, -1367,
+ 1261, -1367, -1367, 1263, -1367, 1259, -1367, 1265, 1552, -1367,
+ 1262, 535, -1367, 1267, 1269, -1367, 100, 1929, 575, 2925,
+ -1367, -1367, -1367, 100, -1367, 1266, -1367, 1264, 1270, 266,
+ -1367, 3447, -1367, 1271, -1367, 272, 272, 272, -1367, -1367,
+ -1367, -1367, -1367, 1274, -1367, 1275, -1367, 1278, -1367, 1280,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, 3468, -1367, -1367, 1281,
+ -1367, 1266, 1582, 1286, 1277, 1288, -1367, 21, -1367, 905,
+ -1367, 149, -1367, 1289, 1290, 1291, 176, 57, -1367, -1367,
+ -1367, -1367, 83, 87, 101, 170, 175, 179, 106, 109,
+ 162, 173, 1881, 148, 477, -1367, 932, 1295, 1544, -1367,
+ 100, -1367, 635, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ 205, 206, 212, 193, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, 1583, -1367, -1367,
+ -1367, 100, 575, 2387, 1301, 905, -1367, -1367, -1367, -1367,
+ -1367, 1302, 1305, 1306, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ 505, 1346, 100, 272, -1367, 1504, 1320, 1321, 502, -1367,
+ -1367, 2925, 1582, 1593, 575, 1266, 1327, 100, 1331, -1367
};
-# define YYNPROD 846
-#if YYOPTTIME
-YYSTATIC YYCONST yyexind_t yyexcaind[] = {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 14, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 20, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 30, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 34, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 38, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 42, 46, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 50, 54,
- 0, 0, 0, 0, 0, 0, 58, 0, 0, 0,
- 0, 0, 0, 0, 62, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 70, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 74,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 78
+/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+ Performed when YYTABLE does not specify something else to do. Zero
+ means the default is an error. */
+static const yytype_int16 yydefact[] =
+{
+ 2, 0, 1, 86, 106, 0, 265, 209, 390, 0,
+ 0, 760, 761, 0, 222, 0, 0, 775, 781, 838,
+ 93, 0, 0, 0, 0, 0, 0, 29, 0, 0,
+ 0, 0, 58, 59, 0, 61, 3, 25, 26, 27,
+ 84, 85, 434, 434, 19, 17, 10, 9, 434, 0,
+ 109, 136, 0, 7, 272, 336, 8, 0, 18, 434,
+ 0, 11, 12, 0, 0, 0, 0, 817, 37, 40,
+ 38, 39, 105, 0, 189, 391, 392, 389, 745, 746,
+ 747, 748, 749, 750, 751, 752, 753, 754, 755, 756,
+ 757, 758, 759, 0, 0, 34, 216, 217, 0, 0,
+ 223, 224, 229, 222, 222, 0, 62, 72, 0, 220,
+ 215, 0, 0, 0, 0, 781, 0, 0, 0, 94,
+ 42, 20, 21, 44, 43, 23, 24, 554, 711, 0,
+ 688, 696, 694, 0, 697, 698, 699, 700, 701, 702,
+ 707, 708, 709, 710, 671, 695, 0, 687, 0, 0,
+ 0, 492, 0, 555, 556, 557, 0, 0, 558, 0,
+ 0, 236, 0, 222, 0, 552, 0, 692, 30, 53,
+ 55, 56, 57, 60, 436, 0, 435, 0, 0, 2,
+ 0, 0, 138, 140, 222, 0, 0, 397, 397, 397,
+ 397, 397, 397, 0, 0, 0, 387, 394, 434, 0,
+ 763, 791, 809, 827, 841, 0, 0, 0, 0, 0,
+ 0, 553, 222, 560, 721, 563, 32, 0, 0, 723,
+ 0, 0, 0, 225, 226, 227, 228, 218, 219, 0,
+ 74, 73, 0, 0, 104, 0, 22, 776, 777, 0,
+ 782, 783, 784, 786, 0, 787, 788, 789, 790, 780,
+ 839, 840, 836, 95, 693, 703, 704, 705, 706, 670,
+ 0, 673, 0, 689, 691, 234, 235, 0, 0, 0,
+ 0, 0, 0, 686, 684, 0, 0, 0, 231, 0,
+ 0, 0, 678, 0, 0, 0, 714, 537, 677, 676,
+ 0, 30, 54, 65, 437, 69, 103, 0, 0, 112,
+ 133, 110, 111, 114, 115, 0, 116, 117, 118, 119,
+ 120, 121, 122, 123, 113, 132, 125, 124, 134, 148,
+ 137, 0, 108, 0, 0, 278, 273, 274, 275, 276,
+ 277, 281, 279, 289, 280, 282, 283, 284, 285, 286,
+ 287, 288, 0, 290, 314, 493, 494, 495, 496, 497,
+ 498, 499, 500, 501, 502, 503, 504, 505, 0, 372,
+ 0, 335, 343, 344, 0, 0, 0, 0, 365, 6,
+ 350, 0, 352, 351, 0, 337, 358, 336, 339, 0,
+ 0, 345, 507, 0, 0, 0, 0, 0, 222, 0,
+ 0, 0, 222, 0, 0, 434, 346, 348, 349, 0,
+ 0, 0, 413, 0, 412, 0, 411, 0, 410, 0,
+ 408, 0, 409, 433, 0, 396, 0, 0, 722, 772,
+ 762, 0, 0, 0, 0, 0, 0, 820, 819, 818,
+ 0, 815, 41, 210, 0, 196, 190, 191, 192, 193,
+ 198, 199, 200, 201, 195, 202, 203, 194, 0, 0,
+ 388, 0, 0, 0, 0, 0, 731, 725, 730, 0,
+ 35, 0, 0, 222, 76, 70, 63, 311, 312, 714,
+ 313, 535, 0, 97, 778, 774, 807, 785, 0, 672,
+ 690, 233, 0, 0, 0, 0, 0, 685, 683, 51,
+ 52, 50, 0, 49, 559, 0, 0, 48, 715, 674,
+ 716, 0, 712, 0, 538, 539, 28, 31, 5, 0,
+ 126, 127, 128, 129, 130, 131, 157, 107, 139, 143,
+ 0, 106, 239, 253, 0, 0, 817, 0, 0, 4,
+ 181, 182, 175, 0, 141, 171, 0, 0, 336, 172,
+ 173, 174, 0, 0, 295, 0, 338, 340, 0, 0,
+ 0, 0, 0, 222, 0, 347, 0, 314, 0, 382,
+ 0, 380, 383, 366, 368, 0, 0, 0, 0, 0,
+ 0, 0, 369, 509, 508, 510, 511, 45, 0, 0,
+ 506, 513, 512, 516, 515, 517, 521, 522, 520, 0,
+ 523, 0, 524, 434, 0, 528, 530, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 393, 0, 0, 401,
+ 0, 765, 0, 0, 0, 0, 13, 803, 802, 794,
+ 792, 795, 434, 434, 814, 0, 0, 14, 434, 812,
+ 434, 810, 0, 0, 0, 0, 15, 835, 834, 828,
+ 0, 0, 16, 846, 845, 842, 821, 822, 823, 824,
+ 825, 826, 0, 564, 205, 0, 561, 0, 0, 0,
+ 732, 76, 0, 0, 0, 726, 33, 0, 221, 230,
+ 66, 0, 79, 537, 0, 0, 0, 0, 434, 0,
+ 837, 0, 0, 550, 548, 549, 677, 0, 0, 718,
+ 714, 675, 682, 0, 0, 0, 152, 154, 153, 155,
+ 150, 151, 157, 0, 0, 0, 0, 0, 222, 176,
+ 177, 0, 0, 0, 222, 0, 140, 242, 256, 0,
+ 827, 0, 295, 0, 0, 266, 0, 0, 0, 360,
+ 0, 0, 0, 0, 0, 314, 545, 0, 0, 542,
+ 543, 364, 381, 367, 0, 384, 374, 378, 379, 377,
+ 373, 375, 376, 0, 0, 0, 0, 519, 0, 0,
+ 0, 0, 533, 534, 0, 514, 0, 397, 398, 397,
+ 397, 397, 397, 397, 395, 400, 0, 764, 0, 0,
+ 0, 797, 796, 0, 0, 800, 0, 0, 0, 0,
+ 0, 0, 0, 0, 833, 829, 0, 0, 0, 0,
+ 618, 572, 573, 0, 607, 574, 575, 576, 577, 578,
+ 579, 609, 585, 586, 587, 588, 619, 0, 0, 615,
+ 0, 0, 0, 569, 570, 571, 594, 595, 596, 613,
+ 597, 598, 599, 600, 619, 619, 603, 621, 611, 617,
+ 580, 270, 0, 0, 268, 0, 207, 562, 0, 719,
+ 0, 0, 38, 0, 724, 725, 36, 0, 64, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 78, 75, 441, 434, 77,
+ 0, 0, 314, 314, 313, 535, 98, 99, 0, 100,
+ 101, 102, 0, 808, 232, 551, 314, 679, 680, 717,
+ 713, 540, 135, 0, 158, 144, 161, 0, 149, 142,
+ 0, 241, 240, 558, 0, 255, 254, 0, 816, 0,
+ 184, 0, 0, 0, 0, 0, 0, 0, 167, 0,
+ 291, 0, 0, 0, 302, 303, 304, 305, 297, 298,
+ 299, 296, 300, 301, 0, 0, 294, 0, 0, 0,
+ 0, 0, 0, 355, 353, 0, 0, 0, 207, 0,
+ 356, 0, 266, 341, 314, 0, 0, 370, 371, 0,
+ 0, 0, 0, 526, 314, 530, 530, 529, 399, 407,
+ 406, 405, 404, 402, 403, 769, 767, 793, 804, 0,
+ 806, 798, 801, 779, 805, 811, 813, 0, 830, 831,
+ 0, 844, 204, 608, 581, 582, 583, 584, 0, 604,
+ 610, 612, 616, 0, 0, 0, 614, 601, 602, 625,
+ 626, 0, 653, 627, 628, 629, 630, 631, 632, 655,
+ 637, 638, 639, 640, 623, 624, 645, 646, 647, 648,
+ 649, 650, 651, 652, 622, 656, 657, 658, 659, 660,
+ 661, 662, 663, 664, 665, 666, 667, 668, 669, 641,
+ 605, 197, 0, 0, 589, 206, 0, 188, 0, 735,
+ 736, 740, 738, 0, 737, 734, 733, 720, 0, 79,
+ 727, 76, 71, 67, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 83,
+ 81, 0, 0, 0, 536, 0, 0, 0, 0, 96,
+ 777, 0, 0, 0, 145, 146, 157, 160, 161, 222,
+ 187, 237, 0, 0, 0, 0, 0, 0, 168, 222,
+ 222, 222, 222, 169, 250, 251, 249, 243, 248, 222,
+ 222, 222, 170, 263, 264, 261, 257, 262, 178, 295,
+ 293, 0, 0, 0, 315, 316, 317, 318, 564, 148,
+ 0, 359, 0, 362, 363, 0, 342, 546, 544, 0,
+ 0, 46, 47, 518, 525, 0, 531, 532, 768, 0,
+ 766, 0, 832, 843, 0, 0, 0, 0, 654, 633,
+ 634, 635, 636, 643, 0, 0, 644, 269, 0, 590,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 440, 439, 438, 208, 0, 0,
+ 79, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 89, 0, 88, 0,
+ 87, 432, 0, 214, 213, 314, 314, 773, 681, 156,
+ 163, 0, 162, 159, 0, 183, 0, 186, 0, 222,
+ 244, 245, 246, 247, 260, 258, 259, 0, 0, 306,
+ 307, 308, 309, 0, 0, 354, 0, 0, 547, 385,
+ 386, 527, 771, 0, 0, 0, 0, 0, 606, 642,
+ 0, 0, 591, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 728, 68, 431, 0, 430, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 421, 0, 420,
+ 0, 419, 0, 418, 0, 416, 414, 0, 417, 415,
+ 0, 429, 0, 428, 0, 427, 0, 426, 0, 447,
+ 0, 443, 442, 0, 446, 0, 445, 0, 0, 91,
+ 0, 0, 166, 0, 0, 147, 314, 0, 0, 0,
+ 292, 310, 267, 314, 361, 164, 770, 0, 0, 0,
+ 567, 564, 593, 0, 739, 0, 0, 0, 744, 729,
+ 481, 477, 425, 0, 424, 0, 423, 0, 422, 0,
+ 479, 477, 475, 473, 467, 470, 479, 477, 475, 473,
+ 490, 483, 444, 486, 90, 92, 0, 212, 211, 0,
+ 185, 164, 0, 0, 0, 0, 165, 0, 620, 0,
+ 566, 568, 592, 0, 0, 0, 0, 0, 479, 477,
+ 475, 473, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 80, 207, 0, 0, 319,
+ 314, 799, 0, 741, 742, 743, 463, 482, 462, 478,
+ 0, 0, 0, 0, 453, 480, 452, 451, 476, 450,
+ 474, 448, 469, 468, 449, 472, 471, 457, 456, 455,
+ 454, 466, 491, 485, 484, 464, 487, 0, 465, 489,
+ 252, 314, 0, 0, 0, 0, 461, 460, 459, 458,
+ 488, 0, 0, 0, 324, 320, 329, 330, 331, 332,
+ 333, 321, 322, 323, 325, 326, 327, 328, 271, 357,
+ 0, 0, 314, 0, 565, 0, 0, 0, 222, 179,
+ 334, 0, 0, 0, 0, 164, 0, 314, 0, 180
};
-#endif
-# define YYLAST 3872
-
-YYSTATIC YYCONST short YYFARDATA YYACT[] = {
- 703, 1421, 1136, 640, 660, 1490, 191, 1039, 888, 974,
- 1489, 790, 1488, 702, 1487, 1149, 625, 779, 887, 729,
- 73, 75, 150, 414, 536, 977, 1422, 1526, 975, 190,
- 478, 757, 794, 176, 760, 755, 1080, 110, 106, 107,
- 694, 275, 862, 604, 662, 44, 273, 219, 780, 24,
- 78, 81, 217, 86, 17, 599, 262, 153, 204, 214,
- 301, 7, 6, 654, 85, 5, 76, 3, 188, 1574,
- 218, 1210, 10, 1257, 115, 1128, 1072, 264, 461, 74,
- 516, 133, 1261, 178, 179, 180, 181, 221, 1258, 26,
- 136, 677, 1126, 300, 139, 137, 1073, 278, 1127, 581,
- 74, 719, 716, 202, 203, 113, 112, 700, 272, 376,
- 322, 265, 520, 1028, 220, 452, 18, 994, 88, 87,
- 462, 89, 216, 338, 56, 941, 942, 277, 676, 268,
- 68, 56, 537, 1247, 1248, 1259, 352, 305, 1245, 1246,
- 353, 343, 591, 88, 87, 327, 89, 368, 339, 277,
- 342, 98, 366, 277, 1034, 361, 360, 359, 357, 358,
- 225, 940, 656, 352, 1346, 185, 345, 353, 1578, 1042,
- 348, 56, 198, 1542, 277, 365, 271, 199, 1041, 200,
- 369, 88, 87, 699, 89, 357, 374, 201, 362, 351,
- 514, 364, 698, 373, 1141, 1142, 105, 1437, 277, 258,
- 84, 379, 417, 418, 195, 816, 748, 749, 750, 450,
- 387, 451, 98, 363, 480, 615, 351, 388, 782, 196,
- 783, 1510, 664, 1284, 456, 470, 186, 468, 472, 471,
- 376, 473, 475, 416, 481, 482, 484, 502, 410, 1074,
- 655, 663, 751, 752, 753, 501, 767, 495, 457, 1583,
- 815, 493, 441, 24, 1501, 376, 346, 434, 17, 1283,
- 476, 479, 491, 597, 433, 7, 486, 432, 269, 74,
- 428, 492, 429, 483, 1334, 435, 10, 1218, 307, 487,
- 600, 597, 835, 544, 474, 1342, 1341, 1340, 1339, 485,
- 803, 793, 442, 26, 777, 541, 641, 642, 500, 668,
- 943, 944, 420, 945, 421, 422, 423, 714, 542, 572,
- 108, 545, 321, 505, 575, 268, 576, 154, 577, 436,
- 18, 864, 865, 866, 1568, 579, 580, 88, 87, 116,
- 89, 1567, 192, 80, 79, 480, 499, 571, 46, 574,
- 573, 549, 74, 1253, 88, 87, 266, 89, 512, 512,
- 529, 535, 601, 459, 1564, 481, 482, 494, 569, 1440,
- 627, 628, 629, 177, 88, 87, 267, 89, 613, 80,
- 79, 582, 583, 477, 498, 511, 511, 528, 534, 310,
- 312, 314, 316, 318, 596, 46, 88, 624, 678, 89,
- 371, 370, 607, 608, 609, 610, 630, 631, 632, 606,
- 372, 614, 1373, 621, 1357, 519, 1566, 74, 612, 480,
- 611, 619, 620, 622, 192, 340, 341, 884, 1131, 352,
- 644, 375, 957, 353, 878, 704, 879, 880, 881, 481,
- 482, 706, 1157, 586, 74, 585, 584, 1158, 649, 650,
- 639, 357, 587, 1512, 635, 600, 1541, 886, 88, 87,
- 643, 89, 74, 1141, 1142, 1536, 666, 348, 154, 354,
- 355, 356, 674, 600, 652, 669, 873, 874, 875, 788,
- 685, 857, 351, 88, 87, 1535, 89, 595, 277, 1511,
- 1565, 784, 786, 347, 177, 321, 354, 355, 356, 1522,
- 135, 869, 682, 671, 673, 747, 1534, 348, 696, 588,
- 785, 546, 1533, 537, 759, 192, 488, 1525, 182, 177,
- 154, 689, 872, 876, 877, 1252, 882, 63, 1413, 883,
- 506, 690, 1143, 684, 973, 953, 715, 56, 453, 520,
- 460, 513, 521, 692, 508, 509, 1133, 693, 1196, 1271,
- 543, 705, 566, 375, 41, 43, 701, 74, 727, 707,
- 787, 695, 216, 538, 74, 709, 413, 710, 713, 645,
- 1531, 683, 999, 1529, 63, 1250, 718, 1527, 745, 88,
- 1260, 659, 89, 74, 56, 97, 504, 723, 513, 863,
- 728, 508, 509, 730, 675, 1145, 724, 758, 725, 1473,
- 225, 1256, 651, 1021, 679, 680, 681, 80, 79, 480,
- 734, 49, 50, 51, 52, 53, 54, 55, 49, 50,
- 51, 52, 53, 54, 55, 1416, 762, 720, 648, 481,
- 482, 1195, 754, 152, 601, 258, 768, 769, 733, 74,
- 56, 647, 348, 646, 789, 539, 639, 352, 593, 838,
- 1012, 353, 1188, 1187, 1186, 1185, 643, 74, 49, 50,
- 51, 52, 53, 54, 55, 88, 87, 542, 89, 357,
- 804, 543, 82, 72, 71, 814, 70, 795, 823, 74,
- 821, 827, 824, 828, 773, 774, 775, 198, 74, 832,
- 809, 810, 199, 69, 200, 98, 377, 833, 806, 808,
- 351, 811, 201, 817, 348, 367, 1363, 67, 74, 216,
- 843, 844, 825, 80, 79, 799, 820, 792, 802, 195,
- 66, 826, 80, 79, 480, 834, 352, 1462, 856, 74,
- 353, 592, 1460, 836, 196, 80, 79, 867, 1519, 1349,
- 80, 79, 831, 932, 481, 482, 74, 225, 357, 1367,
- 325, 46, 354, 355, 356, 860, 946, 947, 870, 277,
- 855, 1458, 842, 858, 324, 1132, 969, 56, 193, 859,
- 348, 194, 88, 1456, 527, 89, 74, 601, 959, 351,
- 952, 111, 854, 350, 1266, 1262, 1263, 1264, 1265, 1348,
- 773, 948, 517, 74, 198, 177, 74, 744, 46, 199,
- 74, 200, 88, 87, 637, 956, 861, 996, 496, 201,
- 155, 1079, 1075, 1076, 1077, 1078, 1024, 1022, 1025, 1255,
- 362, 965, 807, 962, 968, 96, 195, 1439, 104, 103,
- 102, 101, 958, 99, 100, 105, 1430, 825, 177, 1429,
- 970, 196, 88, 87, 964, 89, 74, 825, 606, 1427,
- 1000, 696, 696, 1047, 1029, 1412, 1023, 441, 1010, 1019,
- 1035, 277, 434, 1038, 1410, 1027, 1030, 1400, 1052, 433,
- 1050, 766, 432, 1032, 1031, 428, 1054, 429, 1398, 1045,
- 435, 1008, 1018, 382, 383, 384, 385, 636, 525, 976,
- 1396, 1048, 1049, 1394, 337, 1392, 74, 442, 1011, 1020,
- 529, 1390, 375, 1065, 695, 695, 825, 277, 776, 56,
- 1388, 1060, 352, 1359, 1360, 1361, 772, 192, 88, 87,
- 765, 89, 805, 1386, 436, 1009, 1017, 528, 1384, 964,
- 63, 56, 88, 87, 357, 89, 74, 672, 277, 1070,
- 524, 1157, 670, 526, 308, 1381, 1158, 1378, 88, 87,
- 1066, 89, 1376, 1016, 722, 1014, 1015, 156, 157, 158,
- 1372, 74, 1137, 480, 1082, 351, 1083, 455, 326, 323,
- 354, 355, 356, 1356, 61, 62, 47, 63, 1147, 1332,
- 1213, 1212, 1154, 481, 482, 616, 88, 87, 762, 89,
- 1059, 88, 87, 1139, 89, 1058, 1134, 522, 1057, 1144,
- 1056, 1037, 1036, 1153, 1130, 830, 822, 737, 1140, 618,
- 1201, 1148, 1199, 1200, 49, 50, 51, 52, 53, 54,
- 55, 617, 578, 565, 109, 934, 348, 935, 936, 937,
- 938, 939, 92, 1198, 276, 1320, 1068, 1194, 1318, 1197,
- 1202, 966, 1316, 1193, 1203, 1204, 1205, 1206, 1314, 354,
- 355, 356, 591, 1238, 1207, 1208, 1209, 1211, 1, 1191,
- 1214, 49, 50, 51, 52, 53, 54, 55, 1157, 770,
- 951, 1040, 1156, 1158, 1215, 1249, 1221, 1354, 1146, 1189,
- 1251, 1242, 1222, 145, 1243, 1069, 1321, 995, 1241, 1319,
- 1244, 88, 87, 1317, 89, 1183, 1216, 955, 1217, 1315,
- 88, 87, 1181, 89, 589, 1237, 88, 87, 1179, 89,
- 1192, 88, 87, 1254, 89, 1177, 1175, 49, 50, 51,
- 52, 53, 54, 55, 277, 590, 205, 993, 992, 991,
- 1190, 986, 985, 984, 983, 712, 981, 982, 105, 1438,
- 990, 989, 988, 987, 1267, 46, 1184, 980, 978, 711,
- 708, 634, 412, 1182, 187, 97, 277, 1423, 1173, 1180,
- 626, 1171, 56, 1169, 796, 1270, 1178, 1176, 527, 1167,
- 626, 1285, 1165, 1289, 1273, 1291, 1293, 1294, 1274, 1297,
- 1163, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1279, 1307,
- 1308, 1309, 1310, 1311, 1312, 1313, 328, 329, 330, 1435,
- 1322, 1323, 1290, 1325, 1324, 1296, 1292, 1298, 1295, 1174,
- 1161, 56, 1172, 1434, 1170, 1306, 979, 1327, 1287, 1159,
- 1168, 332, 317, 1166, 145, 1433, 1424, 1333, 1002, 1240,
- 315, 1164, 1337, 1063, 1062, 354, 355, 356, 313, 311,
- 94, 309, 846, 746, 49, 50, 51, 52, 53, 54,
- 55, 152, 306, 1338, 667, 454, 45, 415, 1150, 1336,
- 277, 1162, 825, 1350, 1343, 277, 1352, 1353, 378, 1026,
- 1160, 277, 829, 308, 277, 277, 145, 530, 1335, 1358,
- 1362, 308, 525, 192, 192, 192, 192, 591, 1563, 308,
- 308, 1364, 308, 192, 192, 192, 1475, 1276, 591, 1474,
- 1355, 591, 1351, 308, 1219, 140, 138, 192, 56, 1576,
- 1365, 591, 1046, 954, 591, 331, 950, 333, 334, 335,
- 336, 933, 1366, 591, 63, 841, 1402, 1403, 1404, 1405,
- 1406, 1407, 1408, 840, 524, 819, 771, 526, 764, 1369,
- 721, 567, 349, 1414, 1415, 591, 303, 1588, 1418, 1579,
- 1577, 1420, 1401, 117, 1570, 1546, 1509, 1508, 1507, 1425,
- 1426, 1477, 1472, 1469, 1466, 1431, 1465, 1461, 1156, 1419,
- 1459, 1457, 258, 1455, 798, 1442, 46, 1436, 825, 1432,
- 1411, 1409, 1399, 1397, 1586, 1417, 49, 50, 51, 52,
- 53, 54, 55, 1428, 152, 96, 1395, 134, 104, 103,
- 102, 101, 56, 99, 100, 105, 1393, 1391, 49, 50,
- 51, 52, 53, 54, 55, 1389, 1387, 1385, 1383, 1382,
- 88, 87, 348, 89, 74, 46, 1380, 1379, 155, 1377,
- 1468, 1375, 1374, 1371, 1370, 1347, 1345, 1331, 1330, 1326,
- 1277, 1275, 1272, 1138, 1478, 1479, 1480, 1239, 1471, 1476,
- 1129, 1467, 1067, 1053, 1051, 1571, 177, 1513, 1044, 1043,
- 1033, 972, 1156, 961, 960, 949, 258, 868, 697, 851,
- 1494, 850, 848, 56, 1493, 1492, 1491, 1481, 845, 839,
- 837, 1141, 1142, 1569, 1499, 1504, 818, 1503, 797, 778,
- 742, 741, 740, 739, 738, 736, 1521, 735, 688, 1528,
- 1530, 1532, 638, 1528, 1530, 1532, 570, 152, 425, 88,
- 1530, 424, 89, 1543, 1540, 1544, 1506, 1545, 1539, 1538,
- 1537, 344, 46, 1518, 1524, 320, 1520, 1523, 1004, 1005,
- 1006, 1007, 1502, 152, 1498, 1497, 1496, 1495, 1470, 1001,
- 1516, 1464, 1463, 1454, 1453, 825, 1452, 1451, 531, 1528,
- 1530, 1532, 61, 62, 47, 63, 1450, 1449, 1448, 1447,
- 1446, 1445, 1444, 88, 87, 1443, 89, 56, 1441, 1320,
- 1318, 155, 1316, 1314, 523, 156, 157, 158, 1344, 1191,
- 1189, 1183, 1575, 1181, 1573, 1179, 1177, 1175, 1173, 1171,
- 1169, 1167, 1165, 56, 1329, 1580, 1585, 1584, 1328, 177,
- 1269, 1587, 1288, 88, 63, 1572, 89, 1268, 1081, 1286,
- 1071, 1064, 1055, 998, 532, 1582, 46, 533, 997, 971,
- 963, 853, 852, 849, 847, 732, 731, 825, 717, 691,
- 687, 258, 1581, 206, 686, 665, 633, 603, 602, 49,
- 50, 51, 52, 53, 54, 55, 245, 246, 247, 248,
- 249, 250, 251, 252, 253, 254, 255, 256, 257, 449,
- 594, 568, 548, 59, 547, 497, 419, 208, 259, 210,
- 228, 212, 213, 411, 386, 319, 88, 87, 304, 89,
- 302, 41, 43, 515, 155, 518, 510, 46, 49, 50,
- 51, 52, 53, 54, 55, 507, 503, 36, 61, 62,
- 47, 63, 88, 87, 56, 89, 184, 93, 33, 223,
- 155, 469, 177, 467, 95, 1514, 466, 465, 156, 157,
- 158, 464, 1515, 222, 244, 463, 227, 243, 215, 209,
- 207, 211, 889, 31, 1013, 1003, 439, 444, 177, 801,
- 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
- 255, 256, 257, 431, 800, 430, 427, 59, 226, 224,
- 540, 208, 259, 210, 228, 212, 213, 270, 88, 83,
- 29, 89, 57, 56, 34, 41, 43, 25, 16, 263,
- 15, 46, 14, 261, 13, 49, 50, 51, 52, 53,
- 54, 55, 61, 62, 47, 63, 260, 12, 11, 9,
- 8, 4, 2, 223, 234, 242, 241, 46, 240, 239,
- 238, 237, 236, 235, 233, 232, 231, 222, 230, 229,
- 114, 77, 42, 756, 448, 152, 58, 32, 59, 658,
- 657, 156, 157, 158, 1505, 299, 90, 183, 445, 426,
- 1155, 761, 791, 446, 1278, 967, 41, 43, 1152, 1151,
- 605, 1484, 226, 224, 1483, 1482, 1500, 156, 157, 158,
- 1486, 1485, 1220, 61, 62, 47, 63, 1135, 437, 438,
- 598, 661, 781, 91, 1084, 743, 65, 64, 197, 49,
- 50, 51, 52, 53, 54, 55, 885, 0, 447, 118,
- 119, 120, 121, 122, 123, 124, 125, 126, 127, 128,
- 129, 130, 131, 132, 0, 245, 246, 247, 248, 249,
- 250, 251, 252, 253, 254, 255, 256, 257, 46, 0,
- 0, 0, 59, 443, 440, 0, 208, 259, 210, 228,
- 212, 213, 1547, 0, 0, 0, 0, 0, 0, 0,
- 41, 43, 0, 0, 38, 30, 58, 32, 59, 0,
- 49, 50, 51, 52, 53, 54, 55, 61, 62, 47,
- 63, 0, 0, 1101, 0, 0, 41, 43, 223, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 222, 61, 62, 47, 63, 46, 0, 0,
- 60, 35, 0, 0, 88, 87, 21, 89, 0, 37,
- 0, 0, 155, 0, 0, 0, 39, 40, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 226, 224, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 177, 0, 0, 0, 0, 0, 0, 444, 0, 0,
- 1368, 0, 0, 0, 49, 50, 51, 52, 53, 54,
- 55, 0, 0, 0, 0, 38, 30, 58, 32, 59,
- 0, 19, 20, 0, 22, 23, 48, 0, 27, 28,
- 49, 50, 51, 52, 53, 54, 55, 41, 43, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 61, 62, 47, 63, 0, 0,
- 1061, 60, 35, 1562, 0, 0, 0, 21, 0, 931,
- 37, 0, 0, 0, 0, 0, 0, 39, 40, 1552,
- 0, 0, 0, 0, 448, 0, 58, 32, 59, 0,
- 0, 0, 0, 0, 1517, 1548, 0, 0, 445, 0,
- 0, 0, 0, 446, 1557, 0, 41, 43, 0, 156,
- 157, 158, 0, 0, 0, 0, 0, 0, 1558, 1559,
- 1560, 1561, 0, 61, 62, 47, 63, 0, 437, 438,
- 0, 0, 19, 20, 0, 22, 23, 48, 1112, 27,
- 28, 49, 50, 51, 52, 53, 54, 55, 447, 0,
- 1549, 1550, 1551, 1553, 1554, 1555, 1556, 1088, 1089, 0,
- 1096, 1110, 1090, 1091, 1092, 1093, 0, 1094, 1095, 0,
- 1111, 1097, 1098, 1099, 1100, 0, 0, 0, 0, 0,
- 0, 0, 0, 443, 440, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 903, 0, 0, 0, 0, 0, 0,
- 49, 50, 51, 52, 53, 54, 55, 930, 0, 0,
- 0, 0, 895, 896, 0, 904, 921, 897, 898, 899,
- 900, 0, 901, 902, 0, 922, 905, 906, 907, 908,
- 903, 0, 0, 0, 0, 0, 146, 0, 0, 0,
- 0, 0, 0, 0, 930, 0, 0, 0, 0, 895,
- 896, 0, 904, 921, 897, 898, 899, 900, 0, 901,
- 902, 348, 922, 905, 906, 907, 908, 0, 0, 0,
- 0, 0, 919, 0, 923, 0, 1236, 1235, 1230, 925,
- 1229, 1228, 1227, 1226, 0, 1224, 1225, 105, 189, 1234,
- 1233, 1232, 1231, 0, 0, 927, 0, 0, 1223, 0,
- 0, 871, 0, 884, 0, 0, 0, 0, 0, 919,
- 878, 923, 879, 880, 881, 0, 925, 0, 0, 0,
- 993, 992, 991, 0, 986, 985, 984, 983, 928, 981,
- 982, 105, 927, 990, 989, 988, 987, 0, 0, 0,
- 980, 978, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 873, 874, 875, 0, 1086, 1087, 0, 1102,
- 1103, 1104, 0, 1105, 1106, 928, 0, 1107, 1108, 0,
- 1109, 0, 0, 0, 0, 0, 0, 0, 0, 146,
- 0, 0, 0, 1085, 1113, 1114, 1115, 1116, 1117, 1118,
- 1119, 1120, 1121, 1122, 1123, 1124, 1125, 0, 872, 876,
- 877, 0, 882, 0, 0, 883, 0, 0, 0, 979,
- 0, 0, 0, 0, 0, 0, 0, 0, 890, 0,
- 891, 892, 893, 894, 909, 910, 911, 926, 912, 913,
- 914, 915, 916, 917, 918, 920, 924, 152, 0, 0,
- 929, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 890, 0, 891, 892, 893,
- 894, 909, 910, 911, 926, 912, 913, 914, 915, 916,
- 917, 918, 920, 924, 175, 0, 0, 929, 151, 148,
- 163, 161, 170, 146, 164, 165, 166, 167, 352, 168,
- 169, 0, 772, 171, 172, 173, 174, 564, 0, 0,
- 142, 162, 0, 0, 0, 0, 0, 0, 0, 141,
- 357, 0, 147, 0, 0, 0, 0, 193, 0, 0,
- 194, 0, 0, 0, 0, 0, 0, 143, 144, 149,
- 0, 556, 0, 550, 551, 552, 553, 0, 0, 0,
- 0, 623, 146, 198, 177, 0, 0, 352, 199, 0,
- 200, 353, 0, 0, 884, 0, 0, 0, 201, 0,
- 0, 878, 160, 879, 880, 881, 0, 0, 0, 357,
- 558, 559, 560, 561, 0, 195, 555, 0, 0, 0,
- 562, 563, 554, 0, 0, 0, 0, 0, 0, 0,
- 196, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 623, 0, 0, 873, 874, 875, 88, 87, 0, 89,
- 0, 0, 0, 0, 155, 0, 0, 175, 0, 0,
- 0, 151, 148, 163, 161, 170, 0, 164, 165, 166,
- 167, 0, 168, 169, 0, 0, 171, 172, 173, 174,
- 0, 0, 177, 142, 162, 0, 0, 0, 0, 872,
- 876, 877, 141, 882, 0, 147, 883, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 143, 144, 149, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 557, 0, 0, 0, 0, 0,
- 0, 0, 146, 0, 0, 0, 0, 352, 0, 0,
- 0, 353, 0, 0, 0, 160, 159, 0, 0, 0,
- 88, 87, 0, 89, 0, 0, 0, 0, 155, 357,
- 0, 175, 0, 0, 0, 151, 148, 163, 161, 170,
- 0, 164, 165, 166, 167, 0, 168, 169, 0, 0,
- 171, 172, 173, 174, 0, 0, 177, 142, 162, 0,
- 623, 0, 146, 0, 0, 0, 141, 0, 0, 147,
- 0, 156, 157, 158, 0, 0, 0, 0, 0, 88,
- 87, 0, 89, 0, 143, 144, 149, 155, 0, 0,
- 175, 0, 0, 0, 151, 148, 163, 161, 170, 0,
- 164, 165, 166, 167, 0, 168, 169, 0, 63, 171,
- 172, 173, 174, 0, 0, 177, 142, 162, 0, 160,
- 274, 354, 355, 356, 0, 141, 0, 0, 147, 88,
- 87, 0, 89, 0, 0, 641, 642, 0, 0, 0,
- 0, 0, 0, 143, 144, 149, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 146, 409, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 156, 157, 158, 160, 0,
- 354, 355, 356, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 391, 641, 642, 0, 407, 0, 0,
- 389, 390, 0, 0, 0, 393, 394, 405, 395, 396,
- 397, 398, 399, 400, 401, 402, 392, 0, 0, 0,
- 274, 146, 0, 406, 0, 0, 404, 0, 0, 88,
- 87, 0, 89, 403, 156, 157, 158, 155, 0, 0,
- 175, 0, 408, 0, 151, 148, 163, 161, 170, 0,
- 164, 165, 166, 167, 0, 168, 169, 0, 0, 171,
- 172, 173, 174, 0, 0, 177, 142, 162, 0, 0,
- 0, 0, 0, 0, 0, 141, 0, 0, 147, 274,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,
- 87, 0, 89, 143, 144, 149, 0, 155, 0, 0,
- 175, 0, 0, 0, 151, 148, 163, 161, 170, 0,
- 164, 165, 166, 167, 0, 168, 169, 0, 0, 171,
- 172, 173, 174, 146, 0, 177, 142, 162, 160, 0,
- 354, 355, 356, 0, 0, 141, 0, 0, 147, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 175, 143, 144, 149, 0, 813, 163, 161,
- 170, 0, 164, 165, 166, 167, 0, 168, 169, 0,
- 0, 171, 172, 173, 174, 0, 0, 0, 1281, 162,
- 0, 274, 146, 0, 156, 157, 158, 0, 160, 88,
- 87, 0, 89, 0, 0, 0, 0, 155, 0, 0,
- 175, 0, 812, 0, 151, 148, 163, 161, 170, 0,
- 164, 165, 166, 167, 0, 168, 169, 0, 0, 171,
- 172, 173, 174, 0, 0, 177, 142, 162, 1282, 0,
- 0, 0, 0, 0, 0, 141, 0, 0, 147, 0,
- 274, 0, 0, 0, 156, 157, 158, 1280, 88, 87,
- 0, 89, 0, 143, 144, 149, 155, 0, 0, 175,
- 0, 0, 0, 151, 148, 163, 161, 170, 0, 164,
- 165, 166, 167, 0, 168, 169, 0, 0, 171, 172,
- 173, 174, 146, 0, 177, 142, 162, 0, 160, 159,
- 0, 0, 0, 0, 141, 0, 0, 147, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 143, 144, 149, 0, 0, 993, 992, 991,
- 0, 986, 985, 984, 983, 0, 981, 982, 105, 0,
- 990, 989, 988, 987, 0, 0, 0, 980, 978, 0,
- 274, 0, 0, 0, 156, 157, 158, 160, 0, 0,
- 88, 87, 0, 89, 0, 0, 0, 0, 155, 0,
- 0, 175, 0, 0, 0, 151, 148, 163, 161, 170,
- 0, 164, 165, 166, 167, 0, 168, 169, 0, 0,
- 171, 172, 173, 174, 0, 0, 177, 142, 162, 0,
- 0, 0, 0, 0, 0, 0, 763, 146, 0, 147,
- 0, 0, 0, 156, 157, 158, 979, 0, 0, 88,
- 87, 0, 89, 0, 143, 144, 149, 155, 0, 0,
- 175, 0, 0, 0, 151, 148, 163, 161, 170, 0,
- 164, 165, 166, 167, 0, 168, 169, 0, 0, 171,
- 172, 173, 174, 0, 0, 177, 142, 162, 0, 160,
- 0, 0, 0, 0, 146, 141, 0, 0, 147, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 143, 144, 149, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 156, 157, 158, 653, 88,
- 87, 146, 89, 0, 0, 0, 0, 155, 0, 0,
- 175, 0, 0, 0, 151, 148, 163, 161, 170, 0,
- 164, 165, 166, 167, 0, 168, 169, 0, 0, 171,
- 172, 173, 174, 0, 0, 177, 142, 162, 0, 0,
- 0, 297, 198, 0, 0, 141, 0, 199, 147, 200,
- 0, 0, 0, 146, 156, 157, 158, 201, 0, 999,
- 0, 0, 0, 143, 144, 149, 0, 0, 0, 0,
- 0, 0, 0, 0, 195, 284, 0, 279, 280, 281,
- 282, 283, 0, 0, 0, 0, 287, 0, 0, 196,
- 0, 0, 0, 0, 0, 285, 0, 0, 458, 0,
- 295, 0, 286, 0, 0, 146, 0, 0, 0, 0,
- 0, 726, 0, 0, 288, 289, 290, 291, 292, 293,
- 294, 298, 0, 0, 489, 175, 490, 296, 0, 151,
- 148, 163, 161, 170, 0, 164, 165, 166, 167, 0,
- 168, 169, 0, 0, 171, 172, 173, 174, 0, 0,
- 177, 142, 162, 0, 156, 157, 158, 0, 0, 0,
- 141, 0, 0, 147, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 143, 144,
- 149, 380, 175, 381, 0, 0, 151, 148, 163, 161,
- 170, 0, 164, 165, 166, 167, 0, 168, 169, 0,
- 0, 171, 172, 173, 174, 0, 0, 0, 142, 162,
- 0, 0, 0, 160, 0, 0, 0, 141, 0, 0,
- 147, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 143, 144, 149, 0, 175,
- 0, 0, 0, 151, 148, 163, 161, 170, 0, 164,
- 165, 166, 167, 0, 168, 169, 0, 0, 171, 172,
- 173, 174, 0, 0, 0, 142, 162, 0, 0, 0,
- 160, 0, 0, 0, 141, 0, 0, 147, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 175, 143, 144, 149, 151, 148, 163, 161, 170,
- 0, 164, 165, 166, 167, 0, 168, 169, 0, 0,
- 171, 172, 173, 174, 0, 0, 0, 142, 162, 0,
- 0, 0, 0, 0, 0, 0, 141, 160, 0, 147,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 175, 143, 144, 149, 151, 148, 163,
- 161, 170, 0, 164, 165, 166, 167, 0, 168, 169,
- 0, 0, 171, 172, 173, 174, 0, 0, 0, 142,
- 162, 0, 0, 0, 0, 0, 0, 0, 141, 160,
- 0, 147, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 143, 144, 149, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 160
+
+/* YYPGOTO[NTERM-NUM]. */
+static const yytype_int16 yypgoto[] =
+{
+ -1367, 1443, -1367, 1336, -72, 32, -41, -5, 10, 22,
+ -358, -1367, 13, -18, 1603, -1367, -1367, 1166, 1243, -640,
+ -1367, -975, -1367, 26, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -313, -1367, -1367, -1367, 916, -1367, -1367,
+ -1367, 451, -1367, 929, 498, 499, -1367, -1366, -437, -1367,
+ -312, -1367, -1367, -942, -1367, -162, -98, -1367, 35, 1613,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, 677,
+ 462, -1367, -311, -1367, -702, -667, 1297, -1367, -1367, -243,
+ -1367, -141, -1367, -1367, 1081, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, 328, 7, -1367, -1367, -1367, 1035, -150,
+ 1586, 578, -40, -30, 805, -1367, -1058, -1367, -1367, -1324,
+ -1299, -1192, -1269, -1367, -1367, -1367, -1367, 23, -1367, -1367,
+ -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367,
+ -1367, -1367, -1367, -27, 768, 982, -1367, -688, -1367, 692,
+ -22, -405, -74, 239, 130, -1367, -23, 538, -1367, 984,
+ 3, 811, -1367, -1367, 808, -1367, -1049, -1367, 1661, -1367,
+ 36, -1367, -1367, 545, 1205, -1367, 1566, -1367, -1367, -961,
+ 1272, -1367, -1367, -1367, -1367, -1367, -1367, -1367, -1367, 1160,
+ 975, -1367, -1367, -1367, -1367, -1367
};
-YYSTATIC YYCONST short YYFARDATA YYPACT[] = {
--1000, 1635,-1000, 587, 574,-1000,-1000,-1000,-1000,-1000,
--1000,-1000, 560, 543, 541, 540,-1000,-1000,-1000, 78,
- 78, -463, 105, 105,-1000,-1000,-1000, 539,-1000, -116,
- 395,-1000, 931, 1107, 43, 923, 78, -365, -366,-1000,
- -142, 1445, 43, 1445,-1000,-1000,-1000, 227, 2386, 395,
- 395, 395, 395,-1000,-1000, 246,-1000,-1000,-1000, -155,
- 1083,-1000,-1000, 2288, 43, 43,-1000,-1000, 1498,-1000,
--1000,-1000,-1000,-1000,-1000,-1000, 78, -117,-1000,-1000,
--1000,-1000, 1432, -141, 2918, 1219,-1000,-1000,-1000,-1000,
- 3187,-1000, 78,-1000, 537,-1000, 1294, 1628, 43, 1202,
- 1191, 1189, 1188, 1180, 1172, 1625, 1474, 45,-1000, 78,
- 696, 830,-1000,-1000, 84, 1219, 395, 2918,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000, 1470, 195, 1288, 381, -233, -235, -236,
- -237, 1432,-1000, -93, 1432, 489, 662,-1000,-1000, 111,
--1000, 3512, 213, 1211,-1000,-1000,-1000,-1000,-1000, 3351,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
- 592,-1000,-1000,-1000,-1000,-1000, 1219, 1624, 432, 1219,
- 1219, 1219,-1000, 2599, 126,-1000,-1000, 1623, 1081, 2859,
--1000, 3512,-1000,-1000,-1000, 382, 382,-1000, 1616,-1000,
--1000, 1, 1460, 1457, 1704, 1524,-1000,-1000, 78,-1000,
- 78, 75,-1000,-1000,-1000,-1000, 1187,-1000,-1000,-1000,
--1000,-1000, 866, 78, 3179,-1000, -13, -86,-1000,-1000,
- 309, 78, 105, 333, 43, 309, 489, 3294, 2918, -92,
- 382, 2859, 1615,-1000, 502,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
- 112, 65, 862, 1142,-1000, 81,-1000, 428, 1432,-1000,
--1000, 2918,-1000,-1000, 67, 125, 382, 395,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000, 1614, 1612, 2243,
- 920, 417, 1287, 1611, 126, 1455, -52,-1000, 78, -52,
--1000, 105,-1000, 78,-1000, 78,-1000, 78,-1000,-1000,
--1000,-1000, 919,-1000, 78, 78,-1000, 1219,-1000,-1000,
--1000, -377,-1000,-1000,-1000,-1000,-1000, 830, 104, 107,
--1000,-1000, 1219, 1054,-1000, 1292, 598, 1610,-1000, 214,
- 395, 170,-1000,-1000,-1000, 1588, 1587, 3512, 395, 395,
- 395, 395,-1000, 1432,-1000,-1000, 3512, 572,-1000, 1219,
--1000, -65,-1000, 125, 882, 918, 906, 395, 395, 2699,
--1000,-1000,-1000,-1000,-1000,-1000, 78, 1292, 1100,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000, 29,-1000,-1000,-1000, 1586,
- 1080,-1000, 754, 1451,-1000,-1000, 2549,-1000,-1000, 78,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, 510,
- 508, 495,-1000,-1000,-1000,-1000,-1000, 78, 78, 469,
- 3079,-1000,-1000, -303, -204,-1000,-1000,-1000,-1000,-1000,
--1000,-1000, -34, 1585,-1000, 78, 1186, 25, 382, 841,
- 836, 78,-1000, -86, 76, 76, 76, 76, 2918, 502,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000, 1584, 1580, 1447,-1000,-1000,-1000, 2699,-1000,-1000,
--1000,-1000, 1292, 1579, 43, 3512,-1000, 309, 1333,-1000,
- -126, -135,-1000,-1000, -361,-1000,-1000, 43, 383, 370,
- 43,-1000,-1000, 1079,-1000,-1000, 43,-1000, 43,-1000,
- 1078, 1064,-1000,-1000, 395, -164, -369, 1578,-1000,-1000,
--1000,-1000, 395, -370,-1000,-1000, -352,-1000,-1000,-1000,
- 1286,-1000, 851, 395, 3512, 1219, 3460, 78, 235, 678,
--1000,-1000,-1000,-1000,-1000,-1000,-1000, 1576,-1000,-1000,
--1000,-1000,-1000,-1000, 1575,-1000,-1000, 537, 235, 1446,
--1000, 1444, 904, 1443, 1442, 1441, 1440, 1439,-1000, 524,
- 1175,-1000, 103, 1219,-1000,-1000,-1000, -125, 395, 235,
- 464, 242, 3020,-1000,-1000, 1284, 1219,-1000, 817,-1000,
--1000, -29, 2918, 2918, 997, 1282, 125, 1219, 1219, 1219,
- 1219,-1000, 2490,-1000, 1219,-1000, 395, 395, 395, 805,
- 1219, 20, 1219, 188, 1438,-1000, 175,-1000,-1000,-1000,
--1000,-1000,-1000, 78,-1000, 1292,-1000,-1000, 489, 17,
- 1094,-1000,-1000, 1219, 1437, 1239,-1000,-1000,-1000,-1000,
--1000,-1000, 16, 382, 821, 721, 2918, 2759, -123, 104,
- 1435, 1281,-1000,-1000, 3460, -34, 903, 78, -79, 3512,
- 78, 1219, 78, 1218, 902,-1000,-1000,-1000, 309,-1000,
--1000,-1000,-1000,-1000,-1000,-1000, 78, 105,-1000, 8,
- 1219, 235, 1429, 599, 1428, 1279, 1271,-1000, 126, 78,
- 78, 1427, 1174,-1000,-1000, 1292, 1574, 1421, 1573, 1420,
- 1418, 1572, 1571, 1219, 395,-1000, 395, 78, 152, 395,
- 43, 2918, 395, 703, 864, 98, -185, 1416, 99, 2300,
- 128, 1976, 78,-1000, 1270,-1000, 843,-1000, 843, 843,
- 843, 843, 843, -158,-1000, 78, 78, 395,-1000,-1000,
--1000,-1000,-1000,-1000, 1219, 1414, 1262, 999,-1000,-1000,
- 400, 1259, 1026, 532, 159,-1000, 5, 78, 1413, 1412,
--1000, 3512, 1570, 1211, 1211, 1211, 395, 395,-1000, 969,
- 716, 175,-1000,-1000,-1000,-1000,-1000,-1000, 1569, 1410,
- 399, 840, 1016, -79, 1568, 1563, 3408,-1000,-1000, 1404,
- 1093, 515, 468, -79, 3512, 78, 1219, 78, 1215, -339,
- 395, 1219,-1000,-1000, 3512,-1000,-1000, 1219,-1000, -34,
- 98, 1409, -238,-1000,-1000, 1219, 2699, 899, 898, 2918,
- 1000, -140, -149, 1408, 1407, 395, 1261,-1000, -34,-1000,
- 309, 309,-1000,-1000,-1000,-1000, 383,-1000,-1000,-1000,
--1000,-1000,-1000,-1000, 1211, 1219, 1403, 78, 1219, 1402,
--1000, 395, -79, 1562, 897, 895, 892, 887,-1000, 235,
- 2049,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000, 1166, 1165, 1561, 1000, 126, 1401, 984, 43,
- 1560, -407, -38,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000, 521,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000, 1558, 1558,-1000, 1558,
- 1911,-1000,-1000, -406,-1000, -392,-1000,-1000, -427,-1000,
--1000,-1000, 1399,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
- 126,-1000,-1000,-1000,-1000,-1000, 155, 492, 1219,-1000,
- 235, 1150, 397,-1000, 3020, 462, 1007,-1000,-1000,-1000,
--1000,-1000, 125, -34, 1211, 1219,-1000, 395, 1204, 2918,
--1000, 78,-1000,-1000, 698,-1000,-1000,-1000, 1169, 1160,
- 1130, 1122, 1119, 1113, 1111, 1108, 1066, 1065, 1058, 1052,
- 1045, 361, 1029, 1009, 43, 498, 1094, -34, -34, 78,
- 968,-1000,-1000,-1000, 489, 489, 489, 489,-1000,-1000,
--1000,-1000,-1000,-1000, 489, 489, 489,-1000,-1000,-1000,
--1000,-1000, -440, 2699, 878, 877, 2918,-1000, 489, 1219,
- 678,-1000, 126,-1000, 126, 3,-1000, 1250,-1000,-1000,
- 2039, 126, 78,-1000,-1000, 1219,-1000, 1396,-1000,-1000,
- 1161,-1000,-1000, -290, 1090, 1976,-1000,-1000,-1000,-1000,
- 1292,-1000, -256, -261, 78,-1000,-1000,-1000,-1000, 472,
- 218, 235, 718, 500,-1000,-1000,-1000,-1000,-1000,-1000,
--1000, -432,-1000,-1000, 44,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000, 494,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000, 78,-1000,-1000,-1000,-1000, 1557, 1292,
- 1550,-1000,-1000,-1000,-1000,-1000, 416, 1391, 1204,-1000,
- 175, 1390, 1243,-1000, 1389, 2811,-1000,-1000,-1000, -40,
- 78, 1293, 78, 2970, 78, 143, 78, 69, 78, 105,
- 78, 78, 78, 78, 78, 78, 78, 105, 78, 78,
- 78, 78, 78, 78, 78, 998, 992, 988, 985, 78,
- 78, -127, 78, 1388, 1292,-1000,-1000, 1548, 1544, 1387,
- 1386, 876,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
- 382, 0,-1000, 1224,-1000, 1209,-1000,-1000, -79, 2918,
--1000,-1000, 1292,-1000, 1542, 1541, 1540, 1539, 1538, 1537,
- 4, 1536, 1535, 1533, 1531, 1530, 1529,-1000,-1000,-1000,
- 383,-1000, 1528, 1385, 123,-1000,-1000,-1000,-1000, 1384,
--1000, 686, 78,-1000, 1248, 78, 78, 1006, 235, 870,
--1000,-1000,-1000,-1000,-1000,-1000,-1000, 141, 78, 622,
- 571,-1000,-1000,-1000,-1000,-1000, 2918,-1000, 648,-1000,
--1000,-1000, 1724, 1383, 1382, 857, 139, 1381, 1380, 849,
- 1378, 844, 1376, 1375, 842, 1368, 1367, 825, 1366, 820,
- 1365, 807, 1364, 798, 1356, 792, 1355, 790, 1345, 787,
- 1332, 775, 1331, 764, 105, 78, 78, 78, 78, 78,
- 78, 78, 1330, 761, 1329, 752,-1000, 393, -34, -34,
--1000,-1000, 553, 3512, -79, 2918, -34, 1087,-1000, 1523,
- 1522, 1520, 1519, 1158, -34,-1000,-1000,-1000,-1000, 78,
- 746, 235, 736, 733, 78, 1292,-1000,-1000, 1328, 1157,
- 1145, 1131, 1326,-1000, 72,-1000, 1068, 724, 96,-1000,
--1000,-1000, 1518, 1324,-1000,-1000, 1515,-1000, 1512,-1000,
--1000, 1511,-1000,-1000, 1510,-1000, 1509,-1000, 1508,-1000,
- 1507,-1000, 1506,-1000, 1497,-1000, 1496,-1000, 1494,-1000,
- 1493, 1322, 670, 1320, 658, 1319, 629, 1316, 624,-1000,
- 1492,-1000, 1491,-1000, 1315, 1313,-1000, 2699, 1087,-1000,
- 1312, 1488,-1000, 471, 383, 1311, 496,-1000, 1245,-1000,
- 2013, 1310,-1000, 78, 78, 78,-1000,-1000, 2970,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000, 1487,-1000, 1486,-1000,
- 1485,-1000, 1484,-1000,-1000,-1000,-1000, -20, 1482, 1000,
- -34,-1000,-1000,-1000, 235,-1000, 984,-1000, 1307, 1306,
- 1305,-1000, 180, 1406, 2083, 687, 448, 466, 526, 522,
- 519, 461, 455, 434, 414,-1000,-1000,-1000,-1000, 405,
- 132, -79, -34,-1000, 1304, 1799, 1234,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000, 91,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000, 439, 365, 290,
- 283,-1000,-1000,-1000, 1433, 1303,-1000,-1000,-1000,-1000,
--1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
--1000,-1000, 1405, 235,-1000,-1000,-1000,-1000,-1000, -34,
- -442, 78, 1258, 1299, -191, 1298,-1000,-1000, 382,-1000,
- 3512, 2699, -25, -79, 1087, 1334, -34, 1296,-1000
+/* YYDEFGOTO[NTERM-NUM]. */
+static const yytype_int16 yydefgoto[] =
+{
+ 0, 1, 36, 290, 658, 370, 71, 158, 782, 1520,
+ 582, 38, 372, 40, 41, 42, 43, 106, 229, 671,
+ 672, 876, 1121, 373, 1289, 45, 46, 677, 47, 48,
+ 49, 50, 51, 52, 180, 182, 322, 323, 518, 1133,
+ 1134, 517, 702, 703, 704, 1137, 907, 1465, 1466, 534,
+ 53, 208, 846, 1067, 74, 107, 108, 109, 211, 230,
+ 536, 707, 926, 1157, 537, 708, 927, 1166, 54, 952,
+ 842, 843, 55, 184, 723, 471, 737, 1543, 374, 185,
+ 375, 745, 377, 378, 563, 379, 380, 564, 565, 566,
+ 567, 568, 569, 746, 381, 57, 77, 196, 414, 402,
+ 415, 877, 878, 175, 176, 1237, 879, 1486, 1487, 1485,
+ 1484, 1477, 1482, 1476, 1493, 1494, 1492, 212, 382, 383,
+ 384, 385, 386, 387, 388, 389, 390, 391, 392, 393,
+ 394, 395, 396, 764, 675, 503, 504, 738, 739, 740,
+ 213, 165, 231, 844, 1009, 1060, 215, 167, 501, 502,
+ 397, 664, 665, 59, 659, 660, 1074, 1075, 93, 60,
+ 398, 62, 114, 475, 628, 63, 116, 423, 620, 783,
+ 621, 622, 630, 623, 64, 424, 631, 65, 542, 205,
+ 425, 639, 66, 117, 426, 645
};
-YYSTATIC YYCONST short YYFARDATA YYPGO[] = {
- 0, 33, 53, 3, 1876, 57, 40, 6, 1868, 0,
- 1867, 1866, 1865, 222, 278, 1864, 1863, 2, 1862, 48,
- 36, 1, 26, 30, 27, 4, 1861, 44, 41, 55,
- 1860, 38, 39, 8, 18, 7, 31, 1857, 42, 1852,
- 28, 25, 1851, 1850, 5, 10, 12, 14, 1846, 1845,
- 1844, 1841, 22, 32, 43, 1840, 1839, 1838, 1835, 11,
- 1834, 1832, 9, 1831, 34, 1830, 13, 15, 17, 16,
- 46, 23, 556, 68, 1247, 29, 268, 1827, 1826, 1825,
- 1824, 1820, 1819, 19, 35, 1813, 1343, 1812, 1811, 24,
- 771, 123, 1810, 45, 1246, 1809, 1808, 1806, 1805, 1804,
- 1803, 1802, 1801, 1800, 1799, 1798, 1796, 1795, 1794, 1048,
- 1792, 67, 58, 1791, 65, 130, 62, 59, 1790, 1789,
- 70, 1788, 1787, 1786, 1774, 1773, 1772, 56, 1770, 1769,
- 1768, 52, 114, 47, 1767, 87, 366, 1764, 1762, 1760,
- 1759, 1757, 1750, 1746, 1745, 1744, 1743, 1729, 1726, 1024,
- 1725, 1724, 1723, 1722, 1721, 1720, 1719, 1718, 91, 1717,
- 1716, 120, 1715, 1714, 1711, 128, 1707, 1706, 1703, 1701,
- 1698, 1697, 1696, 60, 1670, 117, 1687, 80, 1686, 520,
- 1685, 1676, 1675, 1673, 1564, 1538
+/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
+ positive, shift that token. If negative, reduce the rule whose
+ number is the opposite. If YYTABLE_NINF, syntax error. */
+static const yytype_int16 yytable[] =
+{
+ 72, 278, 166, 164, 58, 227, 228, 159, 56, 885,
+ 533, 535, 538, 177, 39, 119, 1184, 198, 178, 214,
+ 932, 851, 219, 169, 170, 171, 172, 44, 1201, 199,
+ 120, 121, 122, 37, 674, 1243, 209, 61, 404, 406,
+ 408, 410, 412, 294, 376, 125, 126, 961, 163, 110,
+ 216, 604, 216, 605, 1277, 68, 69, -558, 70, 120,
+ 161, 68, 69, 777, 70, 279, 120, 960, 419, 420,
+ 200, 845, 68, 69, 1198, 70, 217, 120, 1000, 683,
+ 684, 685, 120, 207, 744, 233, 344, 120, 498, 216,
+ 68, 69, 120, 70, 120, 1497, 120, 292, 216, 216,
+ 68, 69, 478, 70, 1241, 498, 254, 320, 99, 238,
+ 120, 249, 252, 253, 453, 120, 68, 69, 120, 70,
+ 736, 550, 235, 236, 259, 1491, 99, 261, 163, 267,
+ 68, 69, 679, 70, 558, 712, 99, 931, 68, 69,
+ 161, 70, 68, 69, 371, 70, 291, 68, 69, 1490,
+ 70, 270, 273, 556, 198, 120, 1533, 1513, 206, 472,
+ 466, 282, 283, 284, 67, 516, 498, 274, 417, 68,
+ 69, 120, 70, 68, 69, 319, 70, 1488, 216, 123,
+ 124, 1512, 123, 124, 120, 449, 577, 75, 123, 124,
+ 577, 271, 1534, 482, 1125, 1126, 96, 1279, 110, 97,
+ 431, 432, 123, 124, 193, 452, 578, 579, 1131, 1510,
+ 578, 579, 73, 68, 120, 120, 70, 120, 120, 1586,
+ 1014, 120, 98, 99, 123, 124, 585, 100, 470, 101,
+ 690, 461, 462, 1280, 476, 474, 102, 691, 479, 572,
+ 1015, 1069, 1070, 68, 69, 271, 70, 519, 76, 1483,
+ 557, 684, 1341, 103, 95, 1489, 492, 1147, 591, 206,
+ 1342, 695, 481, 483, 505, 1352, 111, 487, 104, 291,
+ 489, 490, 491, 696, 697, 493, 494, 895, 457, 112,
+ 497, 120, 488, 458, 268, 1179, 1195, 1511, 793, 206,
+ 113, 698, 459, 554, 594, 719, 500, 206, 168, 551,
+ 58, 206, 451, 485, 56, 123, 124, 577, 206, 552,
+ 39, 400, 451, 713, 577, 401, 590, 368, 459, 592,
+ 115, 1217, 173, 44, 848, 781, 540, 578, 579, 37,
+ 539, 206, 174, 61, 578, 579, 531, 206, 206, 570,
+ 218, 699, 573, 656, -558, 181, 583, 778, 118, 532,
+ 220, 593, 1508, 421, 286, 530, 287, 272, 1199, 541,
+ 288, 289, 206, 179, 422, 597, 589, 499, 546, 1218,
+ 547, 269, 1417, 68, 548, 608, 70, 1219, 1514, 784,
+ 464, 1081, 1516, 663, 499, 465, 1082, 403, 998, 269,
+ 571, 401, 183, 574, 575, -541, 1517, 584, 1495, 269,
+ 206, 1527, 262, 263, 1528, 201, 682, 576, 581, 728,
+ 599, 600, 264, 601, 206, 602, 163, 376, 472, 905,
+ 847, 687, 688, 110, 588, 749, 619, 1507, 161, 603,
+ 657, 610, 611, 202, 1532, 730, 617, 617, 637, 643,
+ 919, 1242, 895, 1535, 654, 237, 655, 1063, 1127, 618,
+ 618, 638, 644, 1064, 715, 733, 203, 1529, 204, 947,
+ 948, 949, 921, 232, 452, 1519, 1400, 1317, 1530, 260,
+ 1521, 1506, 722, 680, 1524, 221, 105, 68, 69, 500,
+ 70, 120, 68, 69, 206, 70, 742, 470, 1549, 222,
+ 127, 68, 69, 216, 70, 120, 234, 368, 110, 127,
+ 1546, 1547, 68, 69, 271, 70, 1501, 1548, 68, 275,
+ 127, 70, 120, 700, 1068, 758, 459, 371, 99, 694,
+ 978, 1536, 725, 276, 701, 747, 766, 99, 1537, 957,
+ 206, 282, 283, 284, 709, 710, 68, 69, 99, 70,
+ 277, 1282, 98, 785, 127, 729, 731, 100, 1283, 101,
+ 280, 1069, 1070, 721, 1540, 762, 102, 459, 1469, 727,
+ 281, 1470, 732, 760, 123, 124, 577, 198, 1319, 1320,
+ 405, 761, 99, 103, 401, 407, 748, 293, 376, 401,
+ 68, 69, 1398, 70, 757, 409, 578, 579, 104, 401,
+ 580, 294, 786, 787, 68, 69, 295, 70, 790, 3,
+ 791, 559, 127, 560, 561, 562, 763, 1403, 1404, 296,
+ 917, 411, 533, 535, 538, 401, 923, 979, 321, 980,
+ 981, 982, 983, 984, 454, 68, 69, 455, 70, 795,
+ 99, 909, 910, 914, 1213, 797, 153, 154, 155, 399,
+ 259, 413, 120, 794, 577, 153, 154, 155, 892, 1084,
+ 505, 951, 416, 1085, 418, 1214, 153, 154, 155, 1086,
+ 1415, 1215, 799, 1087, 578, 579, 1136, 206, 1216, 1092,
+ 901, 884, 460, 1093, 893, 1094, 894, 450, 371, 1095,
+ 68, 69, 1096, 852, 433, 875, 1097, 972, 127, 1098,
+ 153, 154, 155, 1099, 467, 468, 456, 1100, 906, 899,
+ 500, 1101, 913, 965, 459, 1102, 918, 920, 922, 1103,
+ 959, 1104, 967, 1106, 962, 1105, 99, 1107, 1459, 1108,
+ 240, 241, 242, 1109, 286, 1463, 287, 463, 1110, 884,
+ 288, 289, 1111, 1112, 950, 1114, 953, 1113, 955, 1115,
+ 956, 1461, 1264, 1116, 1267, 243, 473, 1117, 153, 154,
+ 155, 120, 186, 477, 966, 187, 188, 189, 190, -238,
+ 191, 192, 193, 206, 968, 969, 480, 459, 1348, 1349,
+ 1350, 1194, 1538, 1145, 206, 156, 1071, 14, 970, 1247,
+ 506, 663, 484, 1248, 156, 1083, 985, 640, 986, 987,
+ 641, 999, 98, 1001, 1249, 156, 459, 100, 1250, 101,
+ 1574, 495, 997, 1251, 1065, 186, 102, 1252, 187, 188,
+ 189, 190, 1544, 191, 192, 193, 1003, 1004, 1005, 1006,
+ 1007, 1253, 486, 103, 915, 1254, 1073, 549, 206, 156,
+ 496, 1135, 1456, 509, 153, 154, 155, 543, 104, 244,
+ 555, 245, 246, 247, 248, 1069, 1070, 1129, 1122, 606,
+ 282, 283, 284, 1551, 68, 69, 544, 70, 1072, 1169,
+ 1321, 1322, 28, 29, 30, 31, 32, 33, 34, 916,
+ 223, 642, 224, 225, 226, 1552, 596, 35, 510, 511,
+ 512, 285, 598, 1183, 1576, 1185, 607, 156, 3, 1120,
+ 1123, 609, 1140, 652, 1142, 750, 751, 752, 1118, 1588,
+ 1146, 653, 1138, 1119, 1208, 1209, 1210, 1211, 1212, 1141,
+ 459, 1335, 216, 1132, 513, 514, 515, 1585, 661, 884,
+ 255, 256, 257, 258, 250, 251, 459, 1545, 540, 1143,
+ 666, 1144, 539, 667, 762, 762, 206, 1406, 531, 1155,
+ 1164, 1205, 637, 646, 647, 648, 668, 884, 1196, 1197,
+ 669, 532, 1156, 1165, 673, 638, 676, 530, 1154, 1163,
+ 689, 541, 1158, 1167, 1017, 1018, 1193, 1088, 1089, 1090,
+ 1091, 625, 3, 156, 681, 692, 282, 283, 284, 649,
+ 650, 651, 693, 705, 706, 763, 763, 1310, 1311, 1312,
+ 1313, 716, 68, 69, 1235, 70, 717, 1314, 1315, 1316,
+ 586, 128, 587, 718, 720, 129, 130, 131, 132, 133,
+ 1203, 134, 135, 136, 137, 726, 138, 139, 194, 734,
+ 140, 141, 142, 143, 886, 887, 99, 144, 145, 735,
+ 753, 282, 283, 284, 195, 754, 146, 755, 147, 1149,
+ 1150, 1151, 1152, 286, 756, 287, 765, 759, 768, 288,
+ 289, 767, 769, 148, 149, 150, 770, 771, 776, 888,
+ 772, 773, 775, 11, 12, 13, 14, 1343, 1344, 1345,
+ 1346, 1307, 1308, 1220, 779, 28, 29, 30, 31, 32,
+ 33, 34, 780, 788, 1353, 789, 792, 195, 151, 3,
+ 35, 796, 798, 849, 1284, 1244, 1245, 1246, 850, 853,
+ 854, 855, 1255, 1256, 1257, 1258, 1259, 1260, 856, 1262,
+ 1263, 1265, 632, 1268, 1269, 1270, 1271, 1272, 1273, 1274,
+ 1261, 1276, 857, 1278, 1266, 1281, 858, 1285, 1523, 1526,
+ 9, 10, 1275, 882, 883, 68, 69, 1304, 70, 1325,
+ 896, 903, 1338, 897, 908, 898, 1328, 3, 1329, 902,
+ 14, 28, 29, 30, 31, 32, 33, 34, 924, 930,
+ 1153, 963, 612, 971, 613, 974, 35, 614, 615, 286,
+ 632, 287, 954, 964, 110, 288, 289, 958, 973, 975,
+ 976, 1318, 401, 988, 110, 110, 110, 110, 977, 989,
+ 282, 283, 284, 990, 110, 110, 110, 991, 889, 890,
+ 1330, 891, 992, 427, 993, 428, 429, 994, 1008, 1332,
+ 995, 1409, 430, 996, 1002, 1011, 1336, 1337, 1010, 1013,
+ 1012, 1016, 1061, 1077, 286, 633, 287, 1405, 1340, 1066,
+ 288, 289, 1078, 1079, 1130, 28, 29, 30, 31, 32,
+ 33, 34, 1139, 1124, 616, 1171, 1172, 1178, 1347, 1351,
+ 35, 1173, 1414, 1180, 1120, 1174, 1175, 1359, 1360, 1361,
+ 1362, 1363, 1364, 1419, 1366, 1399, 1176, 14, 1177, 1181,
+ 1182, 736, 1186, 1189, 1190, 1365, 1200, 634, 68, 69,
+ 635, 70, 1204, 633, 1401, 1191, 127, 1192, 1202, 128,
+ 1240, 1238, 157, 129, 130, 131, 132, 133, 1239, 134,
+ 135, 136, 137, 1206, 138, 139, 1207, 1291, 140, 141,
+ 142, 143, 1292, 1293, 99, 144, 145, 1294, 1295, 1296,
+ 474, 1298, 884, 1299, 146, 14, 147, 1300, 1301, 1305,
+ 1306, 1309, 1326, 1460, 1118, 634, 1327, 516, 635, 1119,
+ 1331, 148, 149, 150, 1418, 1333, 1334, 1339, 1084, 1086,
+ 1092, 1423, 28, 29, 30, 31, 32, 33, 34, 1094,
+ 1096, 636, 1098, 1100, 1118, 1120, 1102, 35, 1104, 1119,
+ 1354, 1106, 1108, 1110, 1356, 1395, 151, 1355, 282, 283,
+ 284, 1357, 1358, 286, 1367, 287, 1462, 1368, 1498, 686,
+ 289, 96, 467, 468, 97, 1370, 1369, 1502, 1371, 1373,
+ 1402, 1372, 1375, 884, 1374, 1376, 1378, 1377, 1379, 1381,
+ 28, 29, 30, 31, 32, 33, 34, 98, 99, 1168,
+ 1380, 1382, 100, 1383, 101, 35, 1384, 1385, 1387, 1389,
+ 1386, 102, 153, 154, 155, 1473, 1474, 1475, 68, 69,
+ 1388, 70, 1390, 1391, 1392, 1393, 127, 1394, 103, 128,
+ 1396, 1407, 1397, 129, 130, 131, 132, 133, 1408, 134,
+ 135, 136, 137, 104, 138, 139, 1411, 1412, 140, 141,
+ 142, 143, 1539, 1570, 99, 144, 145, 1413, 1416, 1420,
+ 1581, 1421, 1247, 1422, 146, 1249, 147, 1509, 1251, 1253,
+ 1425, 1424, 1515, 1509, 1518, 1426, 1522, 1428, 1515, 1509,
+ 1518, 148, 149, 150, 1427, 1432, 1433, 1430, 1583, 1525,
+ 1431, 28, 29, 30, 31, 32, 33, 34, 1434, 1435,
+ 1515, 1509, 1518, 1436, 1437, 1439, 35, 1438, 1440, 1441,
+ 1442, 1443, 1444, 1445, 1446, 1447, 151, 884, 282, 283,
+ 284, 28, 29, 30, 31, 32, 33, 34, 1448, 1449,
+ 1429, 3, 467, 468, 1452, 1450, 35, 1451, 1582, 1453,
+ 1454, 1455, 1457, 1542, 1458, 1468, 1464, 1467, 1478, 1479,
+ 1472, 469, 1480, 287, 1481, 880, 1496, 288, 289, 884,
+ 157, 1499, 1500, 1577, 1503, 1504, 1505, 68, 69, 1541,
+ 70, 1550, 153, 154, 155, 127, 1569, 1571, 128, 1572,
+ 1573, 1575, 129, 130, 131, 132, 133, 1578, 134, 135,
+ 136, 137, 1584, 138, 139, 1579, 1580, 140, 141, 142,
+ 143, 1587, 297, 99, 144, 145, 1589, 507, 160, 670,
+ 1324, 904, 925, 146, 1302, 147, 595, 1303, 162, 1187,
+ 1323, 545, 774, 197, 1236, 743, 68, 69, 1062, 70,
+ 148, 149, 150, 1128, 127, 881, 1188, 128, 1076, 1290,
+ 1471, 129, 130, 131, 132, 133, 1080, 134, 135, 136,
+ 137, 94, 138, 139, 900, 1297, 140, 141, 142, 143,
+ 678, 239, 99, 144, 145, 151, 711, 282, 283, 284,
+ 0, 0, 146, 0, 147, 929, 629, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1159, 0, 1160, 1161, 148,
+ 149, 150, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 11, 12, 13, 14,
+ 0, 469, 0, 287, 0, 0, 0, 686, 289, 0,
+ 157, 153, 154, 155, 151, 152, 68, 69, 0, 70,
+ 0, 0, 0, 0, 127, 0, 0, 128, 0, 0,
+ 0, 129, 130, 131, 132, 133, 0, 134, 135, 136,
+ 137, 0, 138, 139, 0, 0, 140, 141, 142, 143,
+ 0, 0, 99, 144, 145, 0, 0, 0, 0, 0,
+ 0, 0, 146, 0, 147, 0, 0, 0, 0, 0,
+ 153, 154, 155, 0, 0, 0, 0, 0, 0, 148,
+ 149, 150, 0, 911, 28, 29, 30, 31, 32, 33,
+ 34, 0, 0, 1162, 0, 0, 0, 0, 0, 35,
+ 68, 69, 0, 70, 0, 0, 0, 14, 127, 0,
+ 0, 128, 0, 0, 151, 129, 130, 131, 132, 133,
+ 0, 134, 135, 136, 137, 0, 138, 139, 912, 0,
+ 140, 141, 142, 143, 0, 0, 99, 144, 145, 0,
+ 0, 0, 0, 0, 0, 0, 146, 0, 147, 0,
+ 469, 0, 287, 0, 0, 0, 288, 289, 0, 157,
+ 0, 0, 0, 148, 149, 150, 0, 0, 0, 0,
+ 153, 154, 155, 859, 860, 861, 0, 862, 863, 864,
+ 865, 0, 866, 867, 193, 0, 868, 869, 870, 871,
+ 0, 0, 0, 872, 873, 0, 0, 0, 151, 152,
+ 0, 0, 0, 0, 68, 69, 0, 70, 0, 156,
+ 0, 0, 127, 0, 0, 128, 0, 0, 157, 129,
+ 130, 131, 132, 133, 0, 134, 135, 136, 137, 0,
+ 138, 139, 0, 0, 140, 141, 142, 143, 0, 0,
+ 99, 144, 145, 0, 0, 0, 0, 0, 0, 0,
+ 146, 0, 147, 0, 153, 154, 155, 0, 0, 0,
+ 0, 874, 0, 0, 0, 0, 0, 148, 149, 150,
+ 0, 0, 0, 0, 68, 69, 0, 70, 0, 0,
+ 0, 0, 127, 0, 0, 128, 0, 0, 0, 129,
+ 130, 131, 132, 133, 0, 134, 135, 136, 137, 0,
+ 138, 139, 151, 0, 140, 141, 142, 143, 0, 210,
+ 99, 144, 145, 0, 933, 0, 0, 0, 157, 0,
+ 146, 934, 147, 935, 936, 937, 0, 0, 0, 0,
+ 0, 0, 2, 0, 0, 0, 0, 148, 149, 150,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 153, 154,
+ 155, 0, 938, 939, 940, 0, 0, 0, 68, 69,
+ 0, 70, 553, 0, 0, 0, 127, 0, 0, 128,
+ 0, 0, 0, 129, 130, 131, 132, 133, 0, 134,
+ 135, 136, 137, 210, 138, 139, 0, 0, 140, 141,
+ 142, 143, 157, 0, 99, 144, 145, 0, 941, 942,
+ 943, 0, 944, 0, 662, 945, 147, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 153, 154,
+ 155, 148, 149, 150, 0, 0, 0, 68, 69, 0,
+ 70, 0, 0, 0, 0, 127, 1531, 0, 128, 0,
+ 0, 0, 129, 130, 131, 132, 133, 0, 134, 135,
+ 136, 137, 0, 138, 139, 0, 151, 140, 141, 142,
+ 143, 0, 0, 99, 144, 145, 0, 0, 0, 0,
+ 0, 0, 0, 146, 0, 147, 4, 5, 6, 7,
+ 8, 0, 0, 0, 0, 0, 0, 210, 0, 0,
+ 148, 149, 150, 0, 0, 933, 157, 0, 9, 10,
+ 0, 0, 934, 0, 935, 936, 937, 0, 0, 0,
+ 0, 0, 153, 154, 155, 11, 12, 13, 14, 0,
+ 0, 0, 15, 16, 0, 714, 0, 0, 17, 0,
+ 0, 18, 0, 0, 68, 0, 0, 70, 19, 20,
+ 0, 0, 0, 938, 939, 940, 0, 3, 216, 0,
+ 0, 0, 0, 0, 0, 0, 0, 210, 0, 0,
+ 946, 0, 0, 1221, 1222, 1223, 157, 1224, 1225, 1226,
+ 1227, 0, 1228, 1229, 193, 0, 1230, 1231, 1232, 1233,
+ 0, 153, 154, 155, 0, 1234, 0, 0, 0, 941,
+ 942, 943, 0, 944, 21, 22, 945, 23, 24, 25,
+ 0, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 0, 0, 0, 0, 265, 128, 266, 0, 35, 129,
+ 130, 131, 132, 133, 0, 134, 135, 136, 137, 0,
+ 138, 139, 0, 0, 140, 141, 142, 143, 0, 0,
+ 0, 144, 145, 0, 0, 0, 0, 0, 0, 0,
+ 146, 210, 147, 0, 0, 0, 0, 0, 0, 0,
+ 157, 0, 0, 0, 0, 0, 0, 148, 149, 150,
+ 345, 346, 347, 348, 349, 350, 351, 352, 353, 354,
+ 355, 356, 357, 0, 0, 0, 1553, 8, 0, 0,
+ 0, 358, 359, 360, 361, 362, 363, 68, 0, 0,
+ 70, 1554, 151, 0, 933, 9, 10, 0, 0, 0,
+ 3, 934, 0, 935, 936, 937, 0, 1555, 0, 0,
+ 210, 0, 11, 12, 13, 14, 1556, 0, 0, 157,
+ 0, 0, 0, 364, 0, 0, 0, 0, 0, 0,
+ 1557, 1558, 1559, 1560, 0, 0, 0, 365, 0, 0,
+ 0, 1170, 938, 939, 940, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
+ 0, 0, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 0,
+ 0, 68, 366, 367, 70, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 941, 942,
+ 943, 0, 944, 0, 0, 945, 0, 0, 0, 0,
+ 28, 29, 30, 31, 32, 33, 34, 0, 368, 369,
+ 0, 0, 0, 0, 0, 35, 0, 0, 0, 0,
+ 0, 0, 0, 345, 346, 347, 348, 349, 350, 351,
+ 352, 353, 354, 355, 356, 357, 0, 0, 0, 0,
+ 8, 0, 0, 0, 358, 359, 360, 361, 362, 363,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 11, 12, 13, 14, 0,
+ 0, 0, 0, 0, 0, 0, 364, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 157, 0, 0, 0,
+ 365, 0, 0, 0, 0, 0, 0, 345, 346, 347,
+ 348, 349, 350, 351, 352, 353, 354, 355, 356, 357,
+ 0, 0, 0, 0, 8, 0, 1568, 0, 358, 359,
+ 360, 361, 362, 363, 0, 366, 367, 0, 0, 0,
+ 0, 0, 9, 10, 0, 0, 0, 0, 0, 0,
+ 1410, 0, 0, 0, 0, 0, 0, 0, 0, 11,
+ 12, 13, 14, 28, 29, 30, 31, 32, 33, 34,
+ 364, 368, 741, 0, 0, 0, 0, 0, 35, 0,
+ 0, 128, 0, 0, 365, 129, 130, 131, 132, 133,
+ 0, 134, 135, 136, 137, 0, 138, 139, 0, 0,
+ 140, 141, 142, 143, 434, 0, 0, 144, 145, 0,
+ 0, 0, 0, 0, 0, 0, 146, 0, 147, 366,
+ 367, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 148, 149, 150, 0, 435, 0, 436,
+ 437, 438, 439, 0, 0, 0, 0, 28, 29, 30,
+ 31, 32, 33, 34, 0, 368, 928, 0, 0, 0,
+ 0, 0, 35, 0, 0, 0, 0, 0, 151, 0,
+ 0, 0, 0, 0, 0, 0, 440, 441, 442, 443,
+ 0, 0, 444, 0, 0, 128, 445, 446, 447, 129,
+ 130, 131, 132, 133, 0, 134, 135, 136, 137, 0,
+ 138, 139, 0, 0, 140, 141, 142, 143, 0, 0,
+ 0, 144, 145, 0, 0, 0, 0, 0, 0, 0,
+ 146, 0, 147, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 148, 149, 150,
+ 128, 0, 0, 0, 129, 130, 131, 132, 133, 0,
+ 134, 135, 136, 137, 0, 138, 139, 0, 0, 140,
+ 141, 142, 143, 0, 0, 0, 144, 145, 0, 0,
+ 0, 0, 151, 0, 0, 146, 0, 147, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 448, 128, 148, 149, 150, 129, 130, 131, 132, 133,
+ 0, 134, 135, 136, 137, 0, 138, 139, 0, 0,
+ 140, 141, 142, 143, 0, 0, 0, 144, 145, 0,
+ 0, 0, 0, 0, 0, 0, 146, 151, 147, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 148, 149, 150, 0, 0, 1019, 1020,
+ 0, 1021, 1022, 1023, 1024, 1025, 1026, 0, 1027, 1028,
+ 0, 1029, 1030, 1031, 1032, 1033, 4, 5, 6, 7,
+ 8, 3, 157, 0, 0, 0, 0, 0, 151, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 9, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 11, 12, 13, 14, 0,
+ 0, 0, 15, 16, 0, 0, 0, 0, 17, 0,
+ 520, 18, 0, 0, 0, 0, 0, 0, 19, 20,
+ 859, 860, 861, 0, 862, 863, 864, 865, 0, 866,
+ 867, 193, 0, 868, 869, 870, 871, 0, 0, 0,
+ 872, 873, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 724, 0, 0,
+ 0, 0, 0, 0, 0, 0, 157, 0, 0, 0,
+ 0, 0, 0, 0, 21, 22, 0, 23, 24, 25,
+ 0, 26, 27, 28, 29, 30, 31, 32, 33, 34,
+ 0, 0, 508, 0, 0, 0, 3, 521, 35, 6,
+ 7, 8, 0, 0, 0, 0, 0, 0, 874, 0,
+ 0, 522, 880, 0, 0, 0, 523, 0, 0, 9,
+ 10, 157, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 11, 12, 13, 14,
+ 0, 524, 525, 0, 0, 520, 1034, 1035, 0, 1036,
+ 1037, 1038, 0, 1039, 1040, 0, 0, 1041, 1042, 0,
+ 1043, 526, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 157, 1044, 1045, 1046, 1047, 1048, 1049, 1050,
+ 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 624, 0,
+ 0, 0, 128, 0, 0, 0, 527, 528, 131, 132,
+ 133, 0, 134, 135, 136, 137, 0, 138, 139, 0,
+ 0, 140, 141, 142, 143, 0, 0, 0, 1286, 145,
+ 0, 1059, 0, 0, 28, 29, 30, 31, 32, 33,
+ 34, 0, 521, 529, 6, 7, 8, 0, 0, 35,
+ 0, 0, 0, 0, 0, 0, 522, 0, 0, 0,
+ 0, 523, 0, 0, 9, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1287, 0, 0,
+ 0, 11, 12, 13, 14, 0, 524, 525, 0, 28,
+ 29, 30, 31, 32, 33, 34, 1288, 0, 0, 0,
+ 0, 0, 0, 0, 35, 0, 526, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 625, 0, 613, 626, 0, 614, 615, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 527, 528, 800, 0, 0, 0, 0, 801, 802,
+ 0, 803, 804, 805, 806, 807, 808, 0, 809, 810,
+ 0, 811, 812, 813, 814, 815, 0, 0, 0, 28,
+ 29, 30, 31, 32, 33, 34, 0, 0, 1148, 0,
+ 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 28, 29, 30, 31, 32,
+ 33, 34, 0, 0, 627, 0, 0, 816, 0, 817,
+ 35, 0, 0, 800, 818, 0, 0, 0, 801, 802,
+ 0, 803, 804, 805, 806, 807, 808, 0, 809, 810,
+ 819, 811, 812, 813, 814, 815, 68, 69, 0, 70,
+ 859, 860, 861, 0, 862, 863, 864, 865, 0, 866,
+ 867, 193, 0, 868, 869, 870, 871, 0, 0, 0,
+ 872, 873, 0, 820, 0, 0, 0, 0, 0, 0,
+ 298, 0, 0, 0, 0, 0, 0, 816, 0, 817,
+ 0, 0, 0, 0, 818, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 299,
+ 819, 0, 0, 300, 0, 0, 301, 302, 0, 0,
+ 0, 303, 304, 305, 306, 307, 308, 309, 310, 311,
+ 312, 313, 314, 0, 0, 0, 0, 0, 874, 315,
+ 0, 0, 316, 820, 0, 0, 0, 0, 0, 317,
+ 0, 0, 0, 0, 0, 0, 0, 0, 318, 0,
+ 0, 0, 0, 821, 0, 822, 823, 824, 825, 826,
+ 827, 828, 829, 830, 831, 832, 833, 834, 835, 836,
+ 837, 838, 0, 0, 0, 839, 0, 0, 0, 0,
+ 0, 0, 0, 0, 840, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 841, 0, 0, 0,
+ 0, 0, 0, 821, 0, 822, 823, 824, 825, 826,
+ 827, 828, 829, 830, 831, 832, 833, 834, 835, 836,
+ 837, 838, 324, 98, 0, 839, 0, 0, 100, 0,
+ 101, 0, 0, 0, 840, 0, 0, 102, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 103, 325, 0, 326, 327, 328,
+ 329, 330, 0, 0, 0, 0, 331, 0, 0, 104,
+ 0, 0, 0, 0, 0, 332, 0, 0, 0, 0,
+ 333, 0, 334, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 335, 336, 337, 338, 339, 340,
+ 341, 342, 0, 0, 0, 0, 0, 343
};
-YYSTATIC YYCONST yyr_t YYFARDATA YYR1[]={
-
- 0, 109, 109, 110, 110, 110, 110, 110, 110, 110,
- 110, 110, 110, 110, 110, 110, 110, 110, 110, 110,
- 110, 110, 110, 110, 110, 110, 110, 110, 110, 136,
- 136, 36, 36, 133, 133, 133, 2, 2, 1, 1,
- 1, 9, 24, 24, 23, 23, 23, 134, 134, 134,
- 134, 134, 135, 135, 135, 135, 135, 135, 135, 135,
- 135, 93, 93, 93, 93, 94, 94, 94, 94, 10,
- 11, 73, 72, 72, 59, 61, 61, 61, 62, 62,
- 62, 65, 65, 132, 132, 132, 60, 60, 60, 60,
- 60, 60, 130, 130, 130, 119, 12, 12, 12, 12,
- 12, 12, 118, 137, 113, 138, 139, 111, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 140, 140, 141, 141, 112,
- 112, 142, 142, 56, 56, 57, 57, 69, 69, 18,
- 18, 18, 18, 18, 18, 18, 19, 19, 68, 68,
- 67, 67, 58, 21, 21, 22, 143, 143, 143, 143,
- 143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
- 143, 143, 143, 143, 143, 143, 143, 116, 79, 79,
- 79, 79, 79, 79, 79, 79, 79, 79, 79, 79,
- 79, 79, 79, 79, 4, 4, 35, 35, 16, 16,
- 75, 75, 75, 75, 75, 75, 75, 7, 7, 7,
- 7, 8, 8, 8, 8, 8, 8, 8, 8, 76,
- 74, 74, 74, 74, 74, 74, 144, 144, 81, 81,
- 81, 145, 145, 150, 150, 150, 150, 150, 150, 150,
- 150, 146, 82, 82, 82, 147, 147, 151, 151, 151,
- 151, 151, 151, 151, 152, 38, 38, 34, 34, 153,
- 114, 78, 78, 78, 78, 78, 78, 78, 78, 78,
- 78, 78, 78, 78, 78, 78, 78, 78, 78, 78,
- 78, 78, 78, 78, 83, 83, 83, 83, 83, 83,
- 83, 83, 83, 83, 83, 83, 83, 83, 83, 83,
- 3, 3, 3, 13, 13, 13, 13, 13, 80, 80,
- 80, 80, 80, 80, 80, 80, 80, 80, 80, 80,
- 80, 80, 80, 80, 154, 115, 115, 155, 155, 155,
- 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
- 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
- 155, 155, 155, 158, 159, 156, 161, 161, 160, 160,
- 160, 163, 162, 162, 162, 162, 166, 166, 166, 169,
- 164, 167, 168, 165, 165, 165, 117, 170, 170, 172,
- 172, 172, 171, 171, 173, 173, 14, 14, 174, 174,
- 174, 174, 174, 174, 174, 174, 174, 174, 174, 174,
- 174, 174, 174, 41, 41, 41, 41, 41, 41, 41,
- 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
- 41, 41, 175, 31, 31, 32, 32, 39, 39, 39,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 40, 42, 42, 42, 43,
- 43, 43, 47, 47, 46, 46, 45, 45, 44, 44,
- 48, 48, 49, 49, 49, 50, 50, 50, 50, 51,
- 51, 149, 95, 96, 97, 98, 99, 100, 101, 102,
- 103, 104, 105, 106, 107, 108, 157, 157, 157, 157,
- 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,
- 157, 157, 157, 157, 157, 157, 157, 157, 157, 6,
- 6, 6, 6, 6, 53, 53, 54, 54, 55, 55,
- 25, 25, 26, 26, 27, 27, 27, 70, 70, 70,
- 70, 70, 70, 70, 70, 70, 70, 5, 5, 71,
- 71, 71, 71, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 33, 33, 20, 20,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 30, 30, 29, 29, 29, 29, 29, 131, 131,
- 131, 131, 131, 131, 64, 64, 64, 63, 63, 87,
- 87, 84, 84, 85, 17, 17, 37, 37, 37, 37,
- 37, 37, 37, 37, 86, 86, 86, 86, 86, 86,
- 86, 86, 86, 86, 86, 86, 86, 86, 86, 176,
- 176, 120, 120, 120, 120, 120, 120, 120, 120, 120,
- 120, 120, 121, 121, 88, 88, 89, 89, 177, 122,
- 90, 90, 90, 90, 90, 90, 90, 90, 90, 90,
- 123, 123, 178, 178, 178, 66, 66, 179, 179, 179,
- 179, 179, 179, 180, 182, 181, 124, 124, 125, 125,
- 183, 183, 183, 183, 126, 148, 91, 91, 91, 91,
- 91, 91, 91, 91, 91, 91, 127, 127, 184, 184,
- 184, 184, 184, 184, 184, 128, 128, 92, 92, 92,
- 129, 129, 185, 185, 185, 185 };
-YYSTATIC YYCONST yyr_t YYFARDATA YYR2[]={
-
- 0, 0, 2, 4, 4, 3, 1, 1, 1, 1,
- 1, 1, 4, 4, 4, 4, 1, 1, 1, 2,
- 2, 3, 2, 2, 1, 1, 1, 4, 1, 0,
- 2, 1, 3, 2, 4, 6, 1, 1, 1, 1,
- 3, 1, 1, 1, 1, 4, 4, 4, 4, 4,
- 4, 4, 2, 3, 2, 2, 2, 1, 1, 2,
- 1, 2, 4, 6, 3, 5, 7, 9, 3, 4,
- 7, 1, 1, 1, 2, 0, 2, 2, 0, 6,
- 2, 1, 1, 1, 1, 1, 1, 1, 1, 3,
- 2, 3, 1, 2, 3, 7, 0, 2, 2, 2,
- 2, 2, 3, 3, 2, 1, 4, 3, 0, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
- 3, 2, 2, 2, 5, 0, 2, 0, 2, 0,
- 2, 3, 1, 0, 1, 1, 3, 0, 3, 1,
- 1, 1, 1, 1, 1, 4, 0, 2, 4, 3,
- 0, 2, 3, 0, 1, 5, 3, 4, 4, 4,
- 1, 1, 1, 1, 1, 2, 2, 4, 13, 22,
- 1, 1, 5, 3, 7, 5, 4, 7, 0, 2,
- 2, 2, 2, 2, 2, 2, 5, 2, 2, 2,
- 2, 2, 2, 5, 0, 2, 0, 2, 0, 3,
- 9, 9, 7, 7, 1, 1, 1, 2, 2, 1,
- 4, 0, 1, 1, 2, 2, 2, 2, 1, 4,
- 2, 5, 3, 2, 2, 1, 4, 3, 0, 2,
- 2, 0, 2, 2, 2, 2, 2, 1, 1, 1,
- 1, 9, 0, 2, 2, 0, 2, 2, 2, 2,
- 1, 1, 1, 1, 1, 0, 4, 1, 3, 1,
- 13, 0, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 5, 8, 6, 5, 0, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 4, 4, 4, 4, 5,
- 1, 1, 1, 0, 4, 4, 4, 4, 0, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 5, 1, 0, 2, 2, 1, 2,
- 4, 5, 1, 1, 1, 1, 2, 1, 1, 1,
- 1, 1, 4, 6, 4, 4, 11, 1, 5, 3,
- 7, 5, 5, 3, 1, 2, 2, 1, 2, 4,
- 4, 1, 2, 2, 2, 2, 2, 2, 2, 1,
- 2, 1, 1, 1, 4, 4, 2, 4, 2, 0,
- 1, 1, 3, 1, 3, 1, 0, 3, 5, 4,
- 3, 5, 5, 5, 5, 5, 5, 2, 2, 2,
- 2, 2, 2, 4, 4, 4, 4, 4, 4, 4,
- 4, 5, 5, 5, 5, 4, 4, 4, 4, 4,
- 4, 3, 2, 0, 1, 1, 2, 1, 1, 1,
- 1, 4, 4, 5, 4, 4, 4, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 8, 8, 8,
- 8, 7, 7, 7, 7, 7, 0, 2, 2, 0,
- 2, 2, 0, 2, 0, 2, 0, 2, 0, 2,
- 0, 2, 0, 2, 2, 0, 2, 3, 2, 0,
- 2, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 2, 1, 2, 2, 2,
- 2, 2, 2, 3, 2, 2, 2, 5, 3, 2,
- 2, 2, 2, 2, 5, 4, 6, 2, 4, 0,
- 3, 3, 1, 1, 0, 3, 0, 1, 1, 3,
- 0, 1, 1, 3, 1, 3, 4, 4, 4, 4,
- 5, 1, 1, 1, 1, 1, 1, 1, 3, 1,
- 3, 4, 1, 0, 10, 6, 5, 6, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 1, 1, 1, 1, 2, 3,
- 4, 6, 5, 1, 1, 1, 1, 1, 1, 1,
- 2, 2, 1, 2, 2, 4, 1, 2, 1, 2,
- 1, 2, 1, 2, 1, 2, 1, 1, 0, 5,
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
- 1, 3, 2, 2, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 2, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 2,
- 1, 3, 2, 3, 4, 2, 2, 2, 5, 5,
- 7, 4, 3, 2, 3, 2, 1, 1, 2, 3,
- 2, 1, 2, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 2, 2, 2, 2, 1, 1, 1, 1,
- 1, 1, 3, 0, 1, 1, 3, 2, 6, 7,
- 3, 3, 3, 6, 0, 1, 3, 5, 6, 4,
- 4, 1, 3, 3, 1, 1, 1, 1, 4, 1,
- 6, 6, 6, 4, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 3, 2, 5, 4, 7, 6, 7, 6, 9,
- 8, 3, 8, 4, 0, 2, 0, 1, 3, 3,
- 0, 2, 2, 2, 3, 2, 2, 2, 2, 2,
- 0, 2, 3, 1, 1, 1, 1, 3, 8, 2,
- 3, 1, 1, 3, 3, 3, 4, 6, 0, 2,
- 3, 1, 3, 1, 4, 3, 0, 2, 2, 2,
- 3, 3, 3, 3, 3, 3, 0, 2, 2, 3,
- 3, 4, 2, 1, 1, 3, 5, 0, 2, 2,
- 0, 2, 4, 3, 1, 1 };
-YYSTATIC YYCONST short YYFARDATA YYCHK[]={
-
--1000,-109,-110,-111,-113,-114,-116,-117,-118,-119,
--120,-121,-122,-124,-126,-128,-130,-131,-132, 527,
- 528, 462, 530, 531,-133,-134,-135, 534, 535,-139,
- 411,-152, 413,-170,-137, 457,-176, 465, 410, 472,
- 473, 432, -87, 433, -93, -94, 273, 451, 532, 536,
- 537, 538, 539, 540, 541, 542, 59,-138, 412, 414,
- 456, 449, 450, 452, -10, -11, 123, 123,-115, 123,
- 123, 123, 123, -9, 264, -9, 529, -88, -24, 265,
- 264, -24, 123,-140, 316, -1, -2, 261, 260, 263,
- -78, -16, 91,-171, 123,-174, 278, 38,-175, 286,
- 287, 284, 283, 282, 281, 288, -31, -32, 267, 91,
- -9, -90, 471, 471, -92, -1, 471, -86, 434, 435,
- 436, 437, 438, 439, 440, 441, 442, 443, 444, 445,
- 446, 447, 448, -31, -86, 263, -28, -70, -74, -93,
- -94, 306, 297, 324, 325,-149, 33, 309, 276, 326,
- -52, 275, 91, -5, -76, 268, 415, 416, 417, 360,
- 359, 278, 298, 277, 281, 282, 283, 284, 286, 287,
- 279, 290, 291, 292, 293, 271, -1, 296, -1, -1,
- -1, -1, 262, -77,-172, 320, 381, 61, -73, 40,
- -75, -7, -76, 269, 272, 327, 342, -8, 295, 300,
- 302, 310, -31, -31,-112,-109, 125,-155, 418,-156,
- 420,-154, 422, 423,-117,-157, -2,-131,-120,-133,
--132,-135, 474, 460, 510,-158, 509,-160, 421, -95,
- -96, -97, -98, -99,-108,-100,-101,-102,-103,-104,
--105,-106,-107,-159,-163, 397, 398, 399, 400, 401,
- 402, 403, 404, 405, 406, 407, 408, 409, 123, 419,
--123,-125,-127,-129, -9, -1, 463,-136, -70, -76,
--141, 317, -71, -70, 91, -28,-149, 46, -7, 330,
- 331, 332, 333, 334, 328, 348, 355, 339, 367, 368,
- 369, 370, 371, 372, 373, 353, 380, 294, 374, -79,
- -9,-173,-174, 42, 40, -31, 40, -14, 91, 40,
- -14, 40, -14, 40, -14, 40, -14, 40, -14, 40,
- 41, 267, -9, 263, 58, 44, 262, -1, 356, 357,
- 358, 475, 381, 477, 478, 479, 480, -90, -91, -1,
- 331, 332, -1, -71, 41, -36, 61, 288, 262, 44,
- 392, 91, 38, 42, 361, 362, 363, 60, 392, 392,
- 392, 392, -70, 306, -70, -75, -7, 33, -9, -1,
- 280, 279, 289, -28, -1, -76, 42, 473, 47, -28,
- 270, 272, 281, 282, 283, 284, 40, -36, -1, 331,
- 332, 324, 347, 336, 337, 339, 340, 341, 342, 343,
- 344, 345, 346, 364, 357, 338, 354, 328, 373, 294,
- -2, 40, 61, -72, -71, -74, -28, -7, -7, 40,
- 301, 303, 304, 305, 41, 41, 125,-143,-114,-111,
--144,-146,-116,-117,-131,-120,-132, 454, 455,-148,
- 510,-133,-135, 509, 323, 424, 429, 474, 410, 125,
- -9, -9, 40, 453, 58, 91, -9, -71, 359, 366,
- 543, 91,-161,-162,-164,-166,-167,-168, 313,-169,
- 311, 315, 314, -9, -2, -9, -24, 40, -23, -24,
- 266, 286, 287, -31, -9, -2, -75, -28, -76, 270,
- 272, -71, -36, 343,-175, -7, -72, 40,-115,-158,
- -2, -9, 125,-178, 464,-131,-179,-180, 469, 470,
--181,-132,-135, 466, 125,-183,-177,-179,-182, 340,
- 464, 467, 125,-184, 462, 410, 465, 296,-132,-135,
- 125,-185, 462, 465,-132,-135, -89, 422, 125,-136,
--142, -71, -1, 473, -7, -1, -13, 40, 40, -28,
- 330, 331, 332, 333, 379, 373, 328, 481, 367, 368,
- 369, 370, 377, 378, 294, 93, 125, 44, 40, -2,
- 41, -23, -9, -23, -24, -9, -9, -9, 93, -9,
- -9, 476, -1, -1, 332, 331, 329, 338, 392, 40,
- 61, 43, 123, 40, 40, 263, -1, 93, -30, -29,
- 275, -9, 40, 40, -54, -55, -28, -1, -1, -1,
- -1, -70, -28, -9, -1, 280, 93, 93, 93, -1,
- -1, -71, -1, 91, -9, -69, 60, 331, 332, 333,
- 367, 368, 369, 40, 61, -36, 123, 40, 41, -71,
- -3, 375, 376, -1, -9,-115, 123, 123, 123, -9,
- -9, 123, -71, 359, 366, 543, 366, -81, -82, -91,
- -25, -26, -27, 275, -13, 40, -9, 58, 274, -7,
- 91, -1, 91, -1, -9,-161,-165,-158, 312,-165,
--165,-165, -71,-158, -2, -9, 40, 40, 41, -71,
- -1, 40, -31, -28, -6, -2, -9, 125, 318, 318,
- 468, -31, -66, -9, 42, -36, 61, -31, 61, -31,
- -31, 61, 61, -1, 471, -9, 471, 40, -1, 471,
--177, 44, 93, -1, -28, -28, 91, -9, -36, -83,
- -1, 40, 40,-173, -36, 41, 41, 93, 41, 41,
- 41, 41, 41, -12, 263, 44, 58, 392, 331, 332,
- 333, 367, 368, 369, -1, -84, -85, -36, 123, 262,
- -64, -63, -71, 306, 44, 93, 44, 275, -71, -71,
- 62, 44, 42, -5, -5, -5, 93, 274, 41, -68,
- -19, -18, 43, 45, 306, 325, 307, 375, 294, -9,
- -59, -61, -73, 274, -53, -22, 60, 41, 125,-112,
--145,-147,-127, 274, -7, 91, -1, 91, -1, -71,
- -71, -1, 373, 328, -7, 373, 328, -1, 41, 44,
- -28, -25, 93, -9, -3, -1, -28, -9, -9, 44,
- 93, -2, -9, -9, -24, 274, -36, 41, 40, 41,
- 44, 44, -2, -9, -9, 41, 58, 40, 41, 40,
- 41, 41, 40, 40, -5, -1, -9, 319, -1, -31,
- -71, 93, -38, 481, 506, 507, 508, -9, 41, 392,
- -83, 41, 389, 343, 344, 345, 390, 391, 301, 303,
- 304, 305, 393, 396, 294, -4, 319, -34, -33,-153,
- 482, 484, 485, 486, 487, 276, 277, 281, 282, 283,
- 284, 286, 287, 257, 279, 290, 291, 292, 293, 488,
- 489, 490, 492, 493, 494, 495, 496, 497, 498, 336,
- 499, 280, 289, 338, 500, 343, 491, 359, 392, 504,
- 271, 123, -9, 41, -14, -14, -14, -14, -14, -14,
- 319, 283, 284, 458, 459, 461, -9, -9, -1, 41,
- 44, 61, -59, 125, 44, 61, 263, 263, -29, -9,
- 41, 41, -28, 40, -5, -1, 62, -58, -1, 40,
- -19, 40, 41, 125, -62, -40,-135, -41, 298, 366,
- 297, 286, 287, 284, 283, 282, 281, 293, 292, 291,
- 290, 279, 278, 277,-175, 61, -3, 40, 40, 91,
- -54, 125, 125,-150, 425, 426, 427, 428,-120,-132,
--133,-135, 125,-151, 430, 431, 428,-132,-120,-133,
--135, 125, -3, -28, -9, -9, 44, -93, 452, -1,
- -28, -27, -38, 41, 392, -71, 93, 93, -71, -35,
- 61, 318, 318, 41, 41, -1, 41, -25, -6, -6,
- -66, 41, -9, 41, -3, 40, 93, 93, 93, 93,
- -36, 41, 58, 58, 40, -35, -2, 41, 42, 91,
- -32, 40, 483, 503, 277, 281, 282, 283, 284, 280,
- -20, 40, -20, -20, -15, 512, 485, 486, 276, 277,
- 281, 282, 283, 284, 286, 287, 279, 290, 291, 292,
- 293, 42, 488, 489, 490, 492, 493, 496, 497, 499,
- 280, 289, 257, 513, 514, 515, 516, 517, 518, 519,
- 520, 521, 522, 523, 524, 525, 498, 490, 502, 41,
- -2, 263, 263, 44, -84, -37, -17, -9, 283, -36,
- -70, 321, 322, 125, -64, 123, 61, -25, -1, -67,
- 44, -56, -57, -71, -9, -65,-135, 360, 365, 40,
- 91, 40, 91, 40, 91, 40, 91, 40, 91, 40,
- 91, 40, 91, 40, 91, 40, 91, 40, 91, 40,
- 91, 40, 91, 40, 91, 284, 283, 282, 281, 40,
- 91, 40, 91, -31, -36, 123, 40, -53, -22, -25,
- -25, -9, 62, -75, -75, -75, -75, -75, -75, -75,
- 511, -71, 93, 93, -71, -1, -2, -2, 274, 44,
- -39, -41, -36, 299, 286, 287, 284, 283, 282, 281,
- 279, 293, 292, 291, 290, 278, 277, -2, -9, 41,
- 58, -89, -69, -34, -83, 394, 395, 394, 395, -9,
- 93, -9, 43, 125, -36, 91, 91, 505, 44, 91,
- 526, 38, 281, 282, 283, 284, 280, -9, 40, 40,
- -62, 123, 41, -67, -68, 41, 44, 41, -60, -52,
- 366, 297, 347, 299, 263, -9, 306, -70, 299, -9,
- -40, -9, -23, -9, -9, -23, -24, -9, -24, -9,
- -9, -9, -9, -9, -9, -9, -24, -9, -9, -9,
- -9, -9, -9, -9, 40, 91, 40, 91, 40, 91,
- 40, 91, -9, -9, -17, -9, 41, -59, 40, 40,
- 41, 41, 93, -7, 274, 44, 40, -3, -71, 284,
- 283, 282, 281, -66, 40, 41, 41, 41, 93, 43,
- -9, 44, -9, -9, 61, -36, 93, 263, -9, 281,
- 282, 283, -9, 125, -62, -71, -1, 91, 306, -70,
- 41, 41, 93, 263, 41, 41, 93, 41, 93, 41,
- 41, 93, 41, 41, 93, 41, 93, 41, 93, 41,
- 93, 41, 93, 41, 93, 41, 93, 41, 93, 41,
- 93, -24, -9, -9, -9, -9, -9, -9, -9, 41,
- 93, 41, 93, 125, -25, -25, 62, -28, -3, -71,
- -25, -21, -22, 60, 58, -25, -9, 93, -36, 93,
- 93, -9, 41, 58, 58, 58, 41, 125, 61, 93,
- 263, 40, 41, 40, 40, 40, 40, 40, 40, 40,
- 40, 40, 40, 40, 40, 41, 93, 41, 93, 41,
- 93, 41, 93, 40, 40, 41, 41, -71, -21, 41,
- 40, -66, 41, 93, 44, 41, -33, 41, -9, -9,
- -9, -40, -49, -50, -51, -42, -43, -47, -46, -45,
- -44, -47, -46, -45, -44, 40, 40, 40, 40, -45,
- -48, 274, 40, -35, -25, -80, -36, 41, 41, 41,
- 41, 299, 263, 41, 299, 306, -70, 41, -40, 41,
- -23, -9, 41, -23, -24, 41, -24, 41, -9, 41,
- -9, 41, -9, 41, 41, 41, 41, -47, -46, -45,
- -44, 41, 41, -17, -3, -25, 41, 123, 326, 381,
- 382, 383, 310, 384, 385, 386, 387, 335, 349, 350,
- 351, 352, 294, 44, 263, 41, 41, 41, 41, 40,
- 41, 40, -36, -25, 511, -9, 41, 41, 359, 41,
- -7, -28, -71, 274, -3, -21, 40, -25, 41 };
-YYSTATIC YYCONST short YYFARDATA YYDEF[]={
-
- 1, -2, 2, 0, 0, 335, 6, 7, 8, 9,
- 10, 11, 0, 0, 0, 0, 16, 17, 18, 0,
- 0, 774, 0, 0, 24, 25, 26, 0, 28, 135,
- 0, 271, 208, 0, 433, 0, 0, 780, 105, 837,
- 92, 0, 433, 0, 83, 84, 85, 0, 0, 0,
- 0, 0, 0, 57, 58, 0, 60, 108, 264, 389,
- 0, 759, 760, 221, 433, 433, 139, 1, 0, 790,
- 808, 826, 840, 19, 41, 20, 0, 0, 22, 42,
- 43, 23, 29, 137, 0, 104, 38, 39, 36, 37,
- 221, 188, 0, 386, 0, 393, 0, 0, 433, 396,
- 396, 396, 396, 396, 396, 0, 0, 434, 435, 0,
- 762, 0, 780, 816, 0, 93, 0, 0, 744, 745,
- 746, 747, 748, 749, 750, 751, 752, 753, 754, 755,
- 756, 757, 758, 0, 0, 33, 0, 0, 0, 0,
- 0, 0, 670, 0, 0, 221, 0, 686, 687, 0,
- 691, 0, 0, 551, 235, 553, 554, 555, 556, 0,
- 491, 693, 694, 695, 696, 697, 698, 699, 700, 701,
- 0, 706, 707, 708, 709, 710, 557, 0, 52, 54,
- 55, 56, 59, 0, 388, 390, 391, 0, 61, 0,
- 71, 0, 214, 215, 216, 221, 221, 219, 0, 222,
- 223, 228, 0, 0, 0, 0, 5, 336, 0, 338,
- 0, 0, 342, 343, 344, 345, 0, 347, 348, 349,
- 350, 351, 0, 0, 0, 357, 0, 0, 334, 506,
- 0, 0, 0, 0, 433, 0, 221, 0, 0, 0,
- 221, 0, 0, 335, 0, 492, 493, 494, 495, 496,
- 497, 498, 499, 500, 501, 502, 503, 504, 364, 371,
- 0, 0, 0, 0, 21, 776, 775, 0, 29, 552,
- 107, 0, 136, 559, 0, 562, 221, 0, 313, 272,
- 273, 274, 275, 276, 277, 278, 279, 280, 281, 282,
- 283, 284, 285, 286, 287, 288, 289, 0, 0, 0,
- 0, 0, 395, 0, 0, 0, 0, 407, 0, 0,
- 408, 0, 409, 0, 410, 0, 411, 0, 412, 432,
- 102, 436, 0, 761, 0, 0, 771, 779, 781, 782,
- 783, 0, 785, 786, 787, 788, 789, 0, 0, 835,
- 838, 839, 94, 720, 721, 722, 0, 0, 31, 0,
- 0, 713, 675, 676, 677, 0, 0, 536, 0, 0,
- 0, 0, 669, 0, 672, 230, 0, 0, 683, 685,
- 688, 0, 690, 692, 0, 0, 0, 0, 0, 0,
- 233, 234, 702, 703, 704, 705, 0, 53, 147, 109,
- 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
- 120, 121, 122, 123, 124, 0, 131, 132, 133, 0,
- 0, 103, 0, 0, 72, 73, 0, 217, 218, 0,
- 224, 225, 226, 227, 64, 68, 3, 140, 335, 0,
- 0, 0, 170, 171, 172, 173, 174, 0, 0, 0,
- 0, 180, 181, 0, 0, 238, 252, 816, 105, 4,
- 337, 339, -2, 0, 346, 0, 0, 0, 221, 0,
- 0, 0, 365, 367, 0, 0, 0, 0, 0, 0,
- 381, 382, 379, 507, 508, 509, 510, 505, 511, 512,
- 44, 0, 0, 0, 514, 515, 516, 0, 519, 520,
- 521, 522, 523, 0, 433, 0, 527, 529, 0, 368,
- 0, 0, 12, 791, 0, 793, 794, 433, 0, 0,
- 433, 801, 802, 0, 13, 809, 433, 811, 433, 813,
- 0, 0, 14, 827, 0, 0, 0, 0, 833, 834,
- 15, 841, 0, 0, 844, 845, 773, 777, 27, 30,
- 138, 142, 0, 0, 0, 40, 0, 0, 294, 0,
- 189, 190, 191, 192, 193, 194, 195, 0, 197, 198,
- 199, 200, 201, 202, 0, 209, 392, 0, 0, 0,
- 400, 0, 0, 0, 0, 0, 0, 0, 96, 764,
- 0, 784, 806, 814, 817, 818, 819, 0, 0, 0,
- 0, 0, 724, 729, 730, 34, 47, 673, 0, 711,
- 714, 715, 0, 0, 0, 537, 538, 48, 49, 50,
- 51, 671, 0, 682, 684, 689, 0, 0, 0, 0,
- 558, 0, -2, 713, 0, 106, 156, 125, 126, 127,
- 128, 129, 130, 0, 387, 62, 75, 69, 221, 0,
- 534, 310, 311, -2, 0, 0, 139, 241, 255, 175,
- 176, 826, 0, 221, 0, 0, 0, 0, 221, 0,
- 0, 541, 542, 544, 0, -2, 0, 0, 0, 0,
- 0, 359, 0, 0, 0, 366, 372, 383, 0, 373,
- 374, 375, 380, 376, 377, 378, 0, 0, 513, 0,
- -2, 0, 0, 0, 0, 532, 533, 363, 0, 0,
- 0, 0, 0, 795, 796, 799, 0, 0, 0, 0,
- 0, 0, 0, 828, 0, 832, 0, 0, 0, 0,
- 433, 0, 560, 0, 0, 265, 0, 0, 294, 0,
- 204, 563, 0, 394, 0, 399, 396, 397, 396, 396,
- 396, 396, 396, 0, 763, 0, 0, 0, 820, 821,
- 822, 823, 824, 825, 836, 0, 731, 0, 75, 32,
- 0, 725, 0, 0, 0, 674, 713, 717, 0, 0,
- 681, 0, 676, 547, 548, 549, 0, 0, 229, 0,
- 0, 156, 149, 150, 151, 152, 153, 154, 0, 0,
- 0, 78, 65, 0, 0, 0, 536, 220, 166, 0,
- 0, 0, 0, 0, 0, 0, 183, 0, 0, 0,
- 0, -2, 239, 240, 0, 253, 254, 815, 340, 313,
- 265, 0, 352, 354, 355, 312, 0, 0, 0, 0,
- 206, 0, 0, 0, 0, 0, 0, 525, -2, 528,
- 529, 529, 369, 370, 792, 797, 0, 805, 800, 803,
- 810, 812, 778, 804, 829, 830, 0, 0, 843, 0,
- 141, 561, 0, 0, 0, 0, 0, 0, 290, 0,
- 0, 293, 295, 296, 297, 298, 299, 300, 301, 302,
- 303, 304, 0, 0, 0, 206, 0, 0, 267, 0,
- 0, 0, 568, 569, 570, 571, 572, 573, 574, 575,
- 576, 577, 578, 579, 0, 584, 585, 586, 587, 593,
- 594, 595, 596, 597, 598, 599, 618, 618, 602, 618,
- 620, 606, 608, 0, 610, 0, 612, 614, 0, 616,
- 617, 269, 0, 398, 401, 402, 403, 404, 405, 406,
- 0, 97, 98, 99, 100, 101, 766, 768, 807, 718,
- 0, 0, 0, 723, 724, 0, 37, 35, 712, 716,
- 678, 679, 539, -2, 550, 231, 148, 0, 160, 143,
- 157, 0, 134, 63, 74, 76, 77, 440, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 433, 0, 534, -2, -2, 0,
- 0, 167, 168, 242, 221, 221, 221, 221, 247, 248,
- 249, 250, 169, 256, 221, 221, 221, 260, 261, 262,
- 263, 177, 0, 0, 0, 0, 0, 186, 221, 236,
- 0, 543, 545, 341, 0, 0, 358, 0, 361, 362,
- 0, 0, 0, 45, 46, 517, 524, 0, 530, 531,
- 0, 831, 842, 776, 147, 563, 314, 315, 316, 317,
- 294, 292, 0, 0, 0, 187, 205, 196, 588, 0,
- 0, 0, 0, 0, 613, 580, 581, 582, 583, 607,
- 600, 0, 601, 603, 604, 621, 622, 623, 624, 625,
- 626, 627, 628, 629, 630, 631, 0, 636, 637, 638,
- 639, 640, 644, 645, 646, 647, 648, 649, 650, 651,
- 652, 654, 655, 656, 657, 658, 659, 660, 661, 662,
- 663, 664, 665, 666, 667, 668, 609, 611, 615, 203,
- 95, 765, 767, 0, 732, 733, 736, 737, 0, 739,
- 0, 734, 735, 719, 726, 78, 0, 0, 160, 159,
- 156, 0, 144, 145, 0, 0, 80, 81, 82, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 66, 75, 70, 0, 0, 0,
- 0, 0, 535, 243, 244, 245, 246, 257, 258, 259,
- 221, 0, 182, 0, 185, 0, 546, 353, 0, 0,
- 207, 437, 438, 439, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 384, 385, 526,
- 0, 772, 0, 0, 0, 305, 306, 307, 308, 0,
- 589, 0, 0, 268, 0, 0, 0, 0, 0, 0,
- 642, 643, 632, 633, 634, 635, 653, 770, 0, 0,
- 0, 78, 680, 158, 161, 162, 0, 155, 0, 86,
- 87, 88, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 431, 0, -2, -2,
- 212, 213, 0, 0, 0, 0, -2, 163, 360, 0,
- 0, 0, 0, 0, -2, 266, 291, 309, 590, 0,
- 0, 0, 0, 0, 0, 605, 641, 769, 0, 0,
- 0, 0, 0, 727, 0, 146, 0, 0, 0, 90,
- 441, 442, 0, 0, 444, 445, 0, 446, 0, 413,
- 415, 0, 414, 416, 0, 417, 0, 418, 0, 419,
- 0, 420, 0, 425, 0, 426, 0, 427, 0, 428,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 429,
- 0, 430, 0, 67, 0, 0, 165, 0, 163, 184,
- 0, 0, 164, 0, 0, 0, 0, 592, 0, 566,
- 563, 0, 738, 0, 0, 0, 743, 728, 0, 91,
- 89, 482, 443, 485, 489, 466, 469, 472, 474, 476,
- 478, 472, 474, 476, 478, 421, 0, 422, 0, 423,
- 0, 424, 0, 476, 480, 210, 211, 0, 0, 206,
- -2, 798, 318, 591, 0, 565, 567, 619, 0, 0,
- 0, 79, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 472, 474, 476, 478, 0,
- 0, 0, -2, 251, 0, 0, 0, 740, 741, 742,
- 463, 483, 484, 464, 486, 0, 488, 465, 490, 447,
- 467, 468, 448, 470, 471, 449, 473, 450, 475, 451,
- 477, 452, 479, 453, 454, 455, 456, 0, 0, 0,
- 0, 461, 462, 481, 0, 0, 356, 270, 319, 320,
- 321, 322, 323, 324, 325, 326, 327, 328, 329, 330,
- 331, 332, 0, 0, 487, 457, 458, 459, 460, -2,
- 0, 0, 0, 0, 0, 0, 564, 178, 221, 333,
- 0, 0, 0, 0, 163, 0, -2, 0, 179 };
-#ifdef YYRECOVER
-YYSTATIC YYCONST short yyrecover[] = {
--1000
+
+static const yytype_int16 yycheck[] =
+{
+ 5, 163, 25, 25, 1, 103, 104, 25, 1, 676,
+ 323, 323, 323, 43, 1, 20, 958, 57, 48, 93,
+ 722, 661, 94, 28, 29, 30, 31, 1, 989, 59,
+ 9, 21, 22, 1, 471, 1084, 77, 1, 188, 189,
+ 190, 191, 192, 12, 185, 23, 24, 735, 25, 14,
+ 7, 409, 7, 411, 1112, 5, 6, 19, 8, 9,
+ 25, 5, 6, 8, 8, 163, 9, 734, 7, 8,
+ 60, 63, 5, 6, 8, 8, 33, 9, 63, 484,
+ 485, 486, 9, 73, 56, 108, 184, 9, 20, 7,
+ 5, 6, 9, 8, 9, 1461, 9, 169, 7, 7,
+ 5, 6, 136, 8, 1079, 20, 129, 181, 41, 114,
+ 9, 116, 117, 118, 212, 9, 5, 6, 9, 8,
+ 20, 110, 112, 113, 146, 1449, 41, 149, 105, 152,
+ 5, 6, 136, 8, 377, 110, 41, 136, 5, 6,
+ 105, 8, 5, 6, 185, 8, 168, 5, 6, 1448,
+ 8, 156, 157, 197, 194, 9, 8, 1481, 293, 233,
+ 232, 105, 106, 107, 215, 300, 20, 157, 198, 5,
+ 6, 9, 8, 5, 6, 180, 8, 1446, 7, 9,
+ 10, 1480, 9, 10, 9, 208, 11, 64, 9, 10,
+ 11, 156, 44, 267, 882, 883, 14, 8, 163, 17,
+ 205, 206, 9, 10, 33, 210, 31, 32, 896, 1478,
+ 31, 32, 298, 5, 9, 9, 8, 9, 9, 1585,
+ 227, 9, 40, 41, 9, 10, 388, 45, 233, 47,
+ 292, 221, 222, 44, 239, 166, 54, 299, 260, 380,
+ 247, 65, 66, 5, 6, 210, 8, 321, 125, 1441,
+ 294, 656, 291, 71, 8, 1447, 279, 924, 87, 293,
+ 299, 39, 267, 268, 287, 1240, 297, 272, 86, 291,
+ 275, 276, 277, 51, 52, 280, 281, 682, 289, 298,
+ 285, 9, 272, 294, 217, 952, 974, 1479, 215, 293,
+ 274, 69, 291, 367, 392, 538, 286, 293, 289, 288,
+ 297, 293, 217, 299, 297, 9, 10, 11, 293, 298,
+ 297, 294, 217, 288, 11, 298, 390, 289, 291, 391,
+ 215, 290, 7, 297, 297, 304, 323, 31, 32, 297,
+ 323, 293, 12, 297, 31, 32, 323, 293, 293, 380,
+ 297, 119, 383, 299, 306, 60, 387, 292, 215, 323,
+ 292, 391, 295, 292, 298, 323, 300, 307, 292, 323,
+ 304, 305, 293, 289, 303, 395, 389, 299, 358, 291,
+ 360, 304, 1333, 5, 364, 416, 8, 299, 295, 297,
+ 289, 289, 295, 457, 299, 294, 294, 294, 793, 304,
+ 380, 298, 289, 383, 384, 295, 295, 387, 1456, 304,
+ 293, 295, 24, 25, 295, 289, 299, 385, 386, 298,
+ 400, 401, 34, 403, 293, 405, 393, 558, 492, 294,
+ 299, 495, 496, 388, 389, 566, 423, 1476, 393, 407,
+ 453, 421, 422, 289, 1492, 298, 423, 424, 425, 426,
+ 298, 1081, 847, 295, 449, 207, 451, 298, 885, 423,
+ 424, 425, 426, 304, 528, 553, 289, 295, 289, 250,
+ 251, 252, 298, 297, 469, 295, 298, 1169, 295, 51,
+ 295, 295, 544, 478, 295, 294, 294, 5, 6, 469,
+ 8, 9, 5, 6, 293, 8, 560, 492, 295, 294,
+ 13, 5, 6, 7, 8, 9, 294, 289, 463, 13,
+ 295, 295, 5, 6, 469, 8, 1467, 295, 5, 136,
+ 13, 8, 9, 291, 28, 589, 291, 558, 41, 509,
+ 295, 44, 545, 136, 302, 566, 598, 41, 51, 292,
+ 293, 105, 106, 107, 524, 525, 5, 6, 41, 8,
+ 136, 44, 40, 615, 13, 550, 551, 45, 51, 47,
+ 136, 65, 66, 543, 1496, 596, 54, 291, 292, 549,
+ 306, 295, 552, 593, 9, 10, 11, 607, 138, 139,
+ 294, 594, 41, 71, 298, 294, 566, 295, 719, 298,
+ 5, 6, 51, 8, 589, 294, 31, 32, 86, 298,
+ 294, 12, 622, 623, 5, 6, 295, 8, 628, 18,
+ 630, 55, 13, 57, 58, 59, 596, 1295, 1296, 295,
+ 708, 294, 925, 925, 925, 298, 714, 767, 61, 769,
+ 770, 771, 772, 773, 294, 5, 6, 297, 8, 634,
+ 41, 705, 706, 707, 271, 640, 159, 160, 161, 304,
+ 662, 294, 9, 633, 11, 159, 160, 161, 678, 294,
+ 673, 225, 294, 298, 295, 292, 159, 160, 161, 294,
+ 1327, 298, 652, 298, 31, 32, 292, 293, 305, 294,
+ 693, 676, 8, 298, 679, 294, 681, 297, 719, 298,
+ 5, 6, 294, 8, 299, 672, 298, 759, 13, 294,
+ 159, 160, 161, 298, 119, 120, 294, 294, 703, 689,
+ 690, 298, 707, 744, 291, 294, 711, 712, 713, 298,
+ 733, 294, 753, 294, 737, 298, 41, 298, 1406, 294,
+ 100, 101, 102, 298, 298, 1413, 300, 295, 294, 734,
+ 304, 305, 298, 294, 724, 294, 726, 298, 728, 298,
+ 730, 1408, 1100, 294, 1102, 125, 299, 298, 159, 160,
+ 161, 9, 23, 220, 744, 26, 27, 28, 29, 289,
+ 31, 32, 33, 293, 754, 755, 25, 291, 26, 27,
+ 28, 295, 295, 292, 293, 298, 848, 196, 756, 294,
+ 290, 855, 299, 298, 298, 857, 776, 206, 778, 779,
+ 209, 796, 40, 798, 294, 298, 291, 45, 298, 47,
+ 295, 294, 792, 294, 845, 23, 54, 298, 26, 27,
+ 28, 29, 1500, 31, 32, 33, 25, 26, 27, 28,
+ 29, 294, 299, 71, 72, 298, 848, 298, 293, 298,
+ 294, 905, 297, 294, 159, 160, 161, 294, 86, 219,
+ 303, 221, 222, 223, 224, 65, 66, 888, 878, 290,
+ 105, 106, 107, 1541, 5, 6, 294, 8, 848, 931,
+ 138, 139, 281, 282, 283, 284, 285, 286, 287, 117,
+ 46, 290, 48, 49, 50, 1542, 294, 296, 75, 76,
+ 77, 136, 294, 957, 1572, 959, 292, 298, 18, 876,
+ 880, 295, 910, 294, 917, 567, 568, 569, 104, 1587,
+ 923, 294, 907, 109, 25, 26, 27, 28, 29, 914,
+ 291, 292, 7, 903, 111, 112, 113, 1584, 289, 924,
+ 26, 27, 28, 29, 75, 76, 291, 292, 925, 919,
+ 7, 921, 925, 292, 975, 976, 293, 294, 925, 926,
+ 927, 1013, 929, 75, 76, 77, 295, 952, 975, 976,
+ 295, 925, 926, 927, 300, 929, 19, 925, 926, 927,
+ 20, 925, 926, 927, 834, 835, 971, 26, 27, 28,
+ 29, 208, 18, 298, 19, 301, 105, 106, 107, 111,
+ 112, 113, 292, 292, 110, 975, 976, 1149, 1150, 1151,
+ 1152, 289, 5, 6, 1066, 8, 289, 1159, 1160, 1161,
+ 15, 16, 17, 289, 289, 20, 21, 22, 23, 24,
+ 1000, 26, 27, 28, 29, 303, 31, 32, 289, 19,
+ 35, 36, 37, 38, 28, 29, 41, 42, 43, 294,
+ 62, 105, 106, 107, 305, 62, 51, 294, 53, 169,
+ 170, 171, 172, 298, 294, 300, 295, 294, 299, 304,
+ 305, 295, 295, 68, 69, 70, 295, 295, 303, 63,
+ 295, 295, 295, 193, 194, 195, 196, 26, 27, 28,
+ 29, 1145, 1146, 1063, 212, 281, 282, 283, 284, 285,
+ 286, 287, 297, 297, 290, 297, 294, 305, 103, 18,
+ 296, 215, 215, 295, 1116, 1085, 1086, 1087, 292, 297,
+ 290, 292, 1092, 1093, 1094, 1095, 1096, 1097, 8, 1099,
+ 1100, 1101, 41, 1103, 1104, 1105, 1106, 1107, 1108, 1109,
+ 1098, 1111, 297, 1113, 1102, 1115, 290, 1117, 1486, 1487,
+ 176, 177, 1110, 294, 294, 5, 6, 1142, 8, 1180,
+ 294, 294, 1214, 295, 301, 295, 1187, 18, 1189, 295,
+ 196, 281, 282, 283, 284, 285, 286, 287, 19, 295,
+ 290, 295, 208, 19, 210, 294, 296, 213, 214, 298,
+ 41, 300, 299, 292, 1139, 304, 305, 299, 295, 292,
+ 292, 1171, 298, 294, 1149, 1150, 1151, 1152, 295, 303,
+ 105, 106, 107, 294, 1159, 1160, 1161, 295, 202, 203,
+ 1190, 205, 295, 73, 294, 75, 76, 294, 294, 1199,
+ 295, 1309, 82, 295, 295, 234, 1206, 1207, 242, 294,
+ 246, 22, 295, 290, 298, 154, 300, 1301, 1218, 297,
+ 304, 305, 297, 289, 295, 281, 282, 283, 284, 285,
+ 286, 287, 196, 301, 290, 294, 303, 294, 1238, 1239,
+ 296, 303, 1326, 136, 1241, 299, 299, 1247, 1248, 1249,
+ 1250, 1251, 1252, 1335, 1254, 1287, 299, 196, 299, 299,
+ 299, 20, 295, 62, 62, 1253, 8, 206, 5, 6,
+ 209, 8, 249, 154, 1289, 295, 13, 295, 295, 16,
+ 289, 294, 307, 20, 21, 22, 23, 24, 294, 26,
+ 27, 28, 29, 298, 31, 32, 298, 295, 35, 36,
+ 37, 38, 299, 295, 41, 42, 43, 295, 294, 294,
+ 166, 295, 1327, 295, 51, 196, 53, 295, 292, 299,
+ 299, 255, 292, 1407, 104, 206, 19, 300, 209, 109,
+ 295, 68, 69, 70, 1334, 303, 297, 299, 294, 294,
+ 294, 1341, 281, 282, 283, 284, 285, 286, 287, 294,
+ 294, 290, 294, 294, 104, 1352, 294, 296, 294, 109,
+ 290, 294, 294, 294, 299, 8, 103, 295, 105, 106,
+ 107, 295, 299, 298, 295, 300, 1409, 299, 1462, 304,
+ 305, 14, 119, 120, 17, 299, 295, 1469, 295, 295,
+ 301, 299, 295, 1408, 299, 295, 295, 299, 295, 295,
+ 281, 282, 283, 284, 285, 286, 287, 40, 41, 290,
+ 299, 299, 45, 295, 47, 296, 299, 295, 295, 295,
+ 299, 54, 159, 160, 161, 1425, 1426, 1427, 5, 6,
+ 299, 8, 299, 295, 295, 299, 13, 295, 71, 16,
+ 295, 292, 299, 20, 21, 22, 23, 24, 19, 26,
+ 27, 28, 29, 86, 31, 32, 295, 295, 35, 36,
+ 37, 38, 1494, 1545, 41, 42, 43, 294, 8, 299,
+ 1578, 299, 294, 299, 51, 294, 53, 1477, 294, 294,
+ 303, 295, 1482, 1483, 1484, 303, 1486, 295, 1488, 1489,
+ 1490, 68, 69, 70, 303, 295, 299, 294, 1582, 1487,
+ 294, 281, 282, 283, 284, 285, 286, 287, 295, 299,
+ 1510, 1511, 1512, 295, 299, 299, 296, 295, 294, 294,
+ 294, 294, 294, 294, 294, 294, 103, 1542, 105, 106,
+ 107, 281, 282, 283, 284, 285, 286, 287, 294, 294,
+ 290, 18, 119, 120, 295, 294, 296, 294, 1581, 294,
+ 8, 299, 295, 19, 295, 295, 300, 303, 294, 294,
+ 299, 298, 294, 300, 294, 298, 295, 304, 305, 1584,
+ 307, 295, 294, 1573, 295, 295, 295, 5, 6, 294,
+ 8, 8, 159, 160, 161, 13, 295, 295, 16, 294,
+ 294, 255, 20, 21, 22, 23, 24, 103, 26, 27,
+ 28, 29, 19, 31, 32, 295, 295, 35, 36, 37,
+ 38, 294, 179, 41, 42, 43, 295, 291, 25, 463,
+ 1179, 702, 716, 51, 1136, 53, 393, 1138, 25, 962,
+ 1178, 344, 607, 57, 1066, 564, 5, 6, 843, 8,
+ 68, 69, 70, 885, 13, 673, 964, 16, 850, 1121,
+ 1421, 20, 21, 22, 23, 24, 855, 26, 27, 28,
+ 29, 10, 31, 32, 690, 1130, 35, 36, 37, 38,
+ 475, 115, 41, 42, 43, 103, 526, 105, 106, 107,
+ -1, -1, 51, -1, 53, 720, 424, -1, -1, -1,
+ -1, -1, -1, -1, -1, 172, -1, 174, 175, 68,
+ 69, 70, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 193, 194, 195, 196,
+ -1, 298, -1, 300, -1, -1, -1, 304, 305, -1,
+ 307, 159, 160, 161, 103, 104, 5, 6, -1, 8,
+ -1, -1, -1, -1, 13, -1, -1, 16, -1, -1,
+ -1, 20, 21, 22, 23, 24, -1, 26, 27, 28,
+ 29, -1, 31, 32, -1, -1, 35, 36, 37, 38,
+ -1, -1, 41, 42, 43, -1, -1, -1, -1, -1,
+ -1, -1, 51, -1, 53, -1, -1, -1, -1, -1,
+ 159, 160, 161, -1, -1, -1, -1, -1, -1, 68,
+ 69, 70, -1, 72, 281, 282, 283, 284, 285, 286,
+ 287, -1, -1, 290, -1, -1, -1, -1, -1, 296,
+ 5, 6, -1, 8, -1, -1, -1, 196, 13, -1,
+ -1, 16, -1, -1, 103, 20, 21, 22, 23, 24,
+ -1, 26, 27, 28, 29, -1, 31, 32, 117, -1,
+ 35, 36, 37, 38, -1, -1, 41, 42, 43, -1,
+ -1, -1, -1, -1, -1, -1, 51, -1, 53, -1,
+ 298, -1, 300, -1, -1, -1, 304, 305, -1, 307,
+ -1, -1, -1, 68, 69, 70, -1, -1, -1, -1,
+ 159, 160, 161, 22, 23, 24, -1, 26, 27, 28,
+ 29, -1, 31, 32, 33, -1, 35, 36, 37, 38,
+ -1, -1, -1, 42, 43, -1, -1, -1, 103, 104,
+ -1, -1, -1, -1, 5, 6, -1, 8, -1, 298,
+ -1, -1, 13, -1, -1, 16, -1, -1, 307, 20,
+ 21, 22, 23, 24, -1, 26, 27, 28, 29, -1,
+ 31, 32, -1, -1, 35, 36, 37, 38, -1, -1,
+ 41, 42, 43, -1, -1, -1, -1, -1, -1, -1,
+ 51, -1, 53, -1, 159, 160, 161, -1, -1, -1,
+ -1, 110, -1, -1, -1, -1, -1, 68, 69, 70,
+ -1, -1, -1, -1, 5, 6, -1, 8, -1, -1,
+ -1, -1, 13, -1, -1, 16, -1, -1, -1, 20,
+ 21, 22, 23, 24, -1, 26, 27, 28, 29, -1,
+ 31, 32, 103, -1, 35, 36, 37, 38, -1, 298,
+ 41, 42, 43, -1, 39, -1, -1, -1, 307, -1,
+ 51, 46, 53, 48, 49, 50, -1, -1, -1, -1,
+ -1, -1, 0, -1, -1, -1, -1, 68, 69, 70,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 18, -1, -1, -1, -1, -1, -1, -1, 159, 160,
+ 161, -1, 87, 88, 89, -1, -1, -1, 5, 6,
+ -1, 8, 103, -1, -1, -1, 13, -1, -1, 16,
+ -1, -1, -1, 20, 21, 22, 23, 24, -1, 26,
+ 27, 28, 29, 298, 31, 32, -1, -1, 35, 36,
+ 37, 38, 307, -1, 41, 42, 43, -1, 133, 134,
+ 135, -1, 137, -1, 51, 140, 53, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 159, 160,
+ 161, 68, 69, 70, -1, -1, -1, 5, 6, -1,
+ 8, -1, -1, -1, -1, 13, 295, -1, 16, -1,
+ -1, -1, 20, 21, 22, 23, 24, -1, 26, 27,
+ 28, 29, -1, 31, 32, -1, 103, 35, 36, 37,
+ 38, -1, -1, 41, 42, 43, -1, -1, -1, -1,
+ -1, -1, -1, 51, -1, 53, 154, 155, 156, 157,
+ 158, -1, -1, -1, -1, -1, -1, 298, -1, -1,
+ 68, 69, 70, -1, -1, 39, 307, -1, 176, 177,
+ -1, -1, 46, -1, 48, 49, 50, -1, -1, -1,
+ -1, -1, 159, 160, 161, 193, 194, 195, 196, -1,
+ -1, -1, 200, 201, -1, 103, -1, -1, 206, -1,
+ -1, 209, -1, -1, 5, -1, -1, 8, 216, 217,
+ -1, -1, -1, 87, 88, 89, -1, 18, 7, -1,
+ -1, -1, -1, -1, -1, -1, -1, 298, -1, -1,
+ 295, -1, -1, 22, 23, 24, 307, 26, 27, 28,
+ 29, -1, 31, 32, 33, -1, 35, 36, 37, 38,
+ -1, 159, 160, 161, -1, 44, -1, -1, -1, 133,
+ 134, 135, -1, 137, 272, 273, 140, 275, 276, 277,
+ -1, 279, 280, 281, 282, 283, 284, 285, 286, 287,
+ -1, -1, -1, -1, 15, 16, 17, -1, 296, 20,
+ 21, 22, 23, 24, -1, 26, 27, 28, 29, -1,
+ 31, 32, -1, -1, 35, 36, 37, 38, -1, -1,
+ -1, 42, 43, -1, -1, -1, -1, -1, -1, -1,
+ 51, 298, 53, -1, -1, -1, -1, -1, -1, -1,
+ 307, -1, -1, -1, -1, -1, -1, 68, 69, 70,
+ 141, 142, 143, 144, 145, 146, 147, 148, 149, 150,
+ 151, 152, 153, -1, -1, -1, 39, 158, -1, -1,
+ -1, 162, 163, 164, 165, 166, 167, 5, -1, -1,
+ 8, 54, 103, -1, 39, 176, 177, -1, -1, -1,
+ 18, 46, -1, 48, 49, 50, -1, 70, -1, -1,
+ 298, -1, 193, 194, 195, 196, 79, -1, -1, 307,
+ -1, -1, -1, 204, -1, -1, -1, -1, -1, -1,
+ 93, 94, 95, 96, -1, -1, -1, 218, -1, -1,
+ -1, 295, 87, 88, 89, 178, 179, 180, 181, 182,
+ 183, 184, 185, 186, 187, 188, 189, 190, 191, 192,
+ -1, -1, 125, 126, 127, 128, 129, 130, 131, -1,
+ -1, 5, 253, 254, 8, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 18, -1, -1, -1, 133, 134,
+ 135, -1, 137, -1, -1, 140, -1, -1, -1, -1,
+ 281, 282, 283, 284, 285, 286, 287, -1, 289, 290,
+ -1, -1, -1, -1, -1, 296, -1, -1, -1, -1,
+ -1, -1, -1, 141, 142, 143, 144, 145, 146, 147,
+ 148, 149, 150, 151, 152, 153, -1, -1, -1, -1,
+ 158, -1, -1, -1, 162, 163, 164, 165, 166, 167,
+ -1, -1, -1, -1, -1, -1, -1, -1, 176, 177,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 193, 194, 195, 196, -1,
+ -1, -1, -1, -1, -1, -1, 204, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 307, -1, -1, -1,
+ 218, -1, -1, -1, -1, -1, -1, 141, 142, 143,
+ 144, 145, 146, 147, 148, 149, 150, 151, 152, 153,
+ -1, -1, -1, -1, 158, -1, 289, -1, 162, 163,
+ 164, 165, 166, 167, -1, 253, 254, -1, -1, -1,
+ -1, -1, 176, 177, -1, -1, -1, -1, -1, -1,
+ 295, -1, -1, -1, -1, -1, -1, -1, -1, 193,
+ 194, 195, 196, 281, 282, 283, 284, 285, 286, 287,
+ 204, 289, 290, -1, -1, -1, -1, -1, 296, -1,
+ -1, 16, -1, -1, 218, 20, 21, 22, 23, 24,
+ -1, 26, 27, 28, 29, -1, 31, 32, -1, -1,
+ 35, 36, 37, 38, 39, -1, -1, 42, 43, -1,
+ -1, -1, -1, -1, -1, -1, 51, -1, 53, 253,
+ 254, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 68, 69, 70, -1, 72, -1, 74,
+ 75, 76, 77, -1, -1, -1, -1, 281, 282, 283,
+ 284, 285, 286, 287, -1, 289, 290, -1, -1, -1,
+ -1, -1, 296, -1, -1, -1, -1, -1, 103, -1,
+ -1, -1, -1, -1, -1, -1, 111, 112, 113, 114,
+ -1, -1, 117, -1, -1, 16, 121, 122, 123, 20,
+ 21, 22, 23, 24, -1, 26, 27, 28, 29, -1,
+ 31, 32, -1, -1, 35, 36, 37, 38, -1, -1,
+ -1, 42, 43, -1, -1, -1, -1, -1, -1, -1,
+ 51, -1, 53, -1, -1, -1, -1, -1, -1, -1,
+ 18, -1, -1, -1, -1, -1, -1, 68, 69, 70,
+ 16, -1, -1, -1, 20, 21, 22, 23, 24, -1,
+ 26, 27, 28, 29, -1, 31, 32, -1, -1, 35,
+ 36, 37, 38, -1, -1, -1, 42, 43, -1, -1,
+ -1, -1, 103, -1, -1, 51, -1, 53, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 225, 16, 68, 69, 70, 20, 21, 22, 23, 24,
+ -1, 26, 27, 28, 29, -1, 31, 32, -1, -1,
+ 35, 36, 37, 38, -1, -1, -1, 42, 43, -1,
+ -1, -1, -1, -1, -1, -1, 51, 103, 53, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 68, 69, 70, -1, -1, 21, 22,
+ -1, 24, 25, 26, 27, 28, 29, -1, 31, 32,
+ -1, 34, 35, 36, 37, 38, 154, 155, 156, 157,
+ 158, 18, 307, -1, -1, -1, -1, -1, 103, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 176, 177,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 193, 194, 195, 196, -1,
+ -1, -1, 200, 201, -1, -1, -1, -1, 206, -1,
+ 67, 209, -1, -1, -1, -1, -1, -1, 216, 217,
+ 22, 23, 24, -1, 26, 27, 28, 29, -1, 31,
+ 32, 33, -1, 35, 36, 37, 38, -1, -1, -1,
+ 42, 43, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 298, -1, -1,
+ -1, -1, -1, -1, -1, -1, 307, -1, -1, -1,
+ -1, -1, -1, -1, 272, 273, -1, 275, 276, 277,
+ -1, 279, 280, 281, 282, 283, 284, 285, 286, 287,
+ -1, -1, 290, -1, -1, -1, 18, 154, 296, 156,
+ 157, 158, -1, -1, -1, -1, -1, -1, 110, -1,
+ -1, 168, 298, -1, -1, -1, 173, -1, -1, 176,
+ 177, 307, 18, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 193, 194, 195, 196,
+ -1, 198, 199, -1, -1, 67, 229, 230, -1, 232,
+ 233, 234, -1, 236, 237, -1, -1, 240, 241, -1,
+ 243, 218, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 307, 256, 257, 258, 259, 260, 261, 262,
+ 263, 264, 265, 266, 267, 268, 269, 270, 84, -1,
+ -1, -1, 16, -1, -1, -1, 253, 254, 22, 23,
+ 24, -1, 26, 27, 28, 29, -1, 31, 32, -1,
+ -1, 35, 36, 37, 38, -1, -1, -1, 42, 43,
+ -1, 304, -1, -1, 281, 282, 283, 284, 285, 286,
+ 287, -1, 154, 290, 156, 157, 158, -1, -1, 296,
+ -1, -1, -1, -1, -1, -1, 168, -1, -1, -1,
+ -1, 173, -1, -1, 176, 177, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 91, -1, -1,
+ -1, 193, 194, 195, 196, -1, 198, 199, -1, 281,
+ 282, 283, 284, 285, 286, 287, 110, -1, -1, -1,
+ -1, -1, -1, -1, 296, -1, 218, -1, -1, -1,
+ 196, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 208, -1, 210, 211, -1, 213, 214, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 253, 254, 16, -1, -1, -1, -1, 21, 22,
+ -1, 24, 25, 26, 27, 28, 29, -1, 31, 32,
+ -1, 34, 35, 36, 37, 38, -1, -1, -1, 281,
+ 282, 283, 284, 285, 286, 287, -1, -1, 290, -1,
+ -1, -1, -1, -1, 296, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 281, 282, 283, 284, 285,
+ 286, 287, -1, -1, 290, -1, -1, 80, -1, 82,
+ 296, -1, -1, 16, 87, -1, -1, -1, 21, 22,
+ -1, 24, 25, 26, 27, 28, 29, -1, 31, 32,
+ 103, 34, 35, 36, 37, 38, 5, 6, -1, 8,
+ 22, 23, 24, -1, 26, 27, 28, 29, -1, 31,
+ 32, 33, -1, 35, 36, 37, 38, -1, -1, -1,
+ 42, 43, -1, 136, -1, -1, -1, -1, -1, -1,
+ 39, -1, -1, -1, -1, -1, -1, 80, -1, 82,
+ -1, -1, -1, -1, 87, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 68,
+ 103, -1, -1, 72, -1, -1, 75, 76, -1, -1,
+ -1, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, -1, -1, -1, -1, -1, 110, 98,
+ -1, -1, 101, 136, -1, -1, -1, -1, -1, 108,
+ -1, -1, -1, -1, -1, -1, -1, -1, 117, -1,
+ -1, -1, -1, 226, -1, 228, 229, 230, 231, 232,
+ 233, 234, 235, 236, 237, 238, 239, 240, 241, 242,
+ 243, 244, -1, -1, -1, 248, -1, -1, -1, -1,
+ -1, -1, -1, -1, 257, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 289, -1, -1, -1,
+ -1, -1, -1, 226, -1, 228, 229, 230, 231, 232,
+ 233, 234, 235, 236, 237, 238, 239, 240, 241, 242,
+ 243, 244, 39, 40, -1, 248, -1, -1, 45, -1,
+ 47, -1, -1, -1, 257, -1, -1, 54, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 71, 72, -1, 74, 75, 76,
+ 77, 78, -1, -1, -1, -1, 83, -1, -1, 86,
+ -1, -1, -1, -1, -1, 92, -1, -1, -1, -1,
+ 97, -1, 99, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 111, 112, 113, 114, 115, 116,
+ 117, 118, -1, -1, -1, -1, -1, 124
+};
+
+/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
+ state STATE-NUM. */
+static const yytype_int16 yystos[] =
+{
+ 0, 309, 0, 18, 154, 155, 156, 157, 158, 176,
+ 177, 193, 194, 195, 196, 200, 201, 206, 209, 216,
+ 217, 272, 273, 275, 276, 277, 279, 280, 281, 282,
+ 283, 284, 285, 286, 287, 296, 310, 313, 319, 320,
+ 321, 322, 323, 324, 331, 333, 334, 336, 337, 338,
+ 339, 340, 341, 358, 376, 380, 402, 403, 458, 461,
+ 467, 468, 469, 473, 482, 485, 490, 215, 5, 6,
+ 8, 314, 315, 298, 362, 64, 125, 404, 178, 179,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+ 190, 191, 192, 466, 466, 8, 14, 17, 40, 41,
+ 45, 47, 54, 71, 86, 294, 325, 363, 364, 365,
+ 366, 297, 298, 274, 470, 215, 474, 491, 215, 315,
+ 9, 316, 316, 9, 10, 317, 317, 13, 16, 20,
+ 21, 22, 23, 24, 26, 27, 28, 29, 31, 32,
+ 35, 36, 37, 38, 42, 43, 51, 53, 68, 69,
+ 70, 103, 104, 159, 160, 161, 298, 307, 315, 321,
+ 322, 366, 367, 425, 448, 449, 454, 455, 289, 315,
+ 315, 315, 315, 7, 12, 411, 412, 411, 411, 289,
+ 342, 60, 343, 289, 381, 387, 23, 26, 27, 28,
+ 29, 31, 32, 33, 289, 305, 405, 408, 410, 411,
+ 316, 289, 289, 289, 289, 487, 293, 316, 359, 314,
+ 298, 366, 425, 448, 450, 454, 7, 33, 297, 312,
+ 292, 294, 294, 46, 48, 49, 50, 364, 364, 326,
+ 367, 450, 297, 454, 294, 316, 316, 207, 315, 474,
+ 100, 101, 102, 125, 219, 221, 222, 223, 224, 315,
+ 75, 76, 315, 315, 454, 26, 27, 28, 29, 448,
+ 51, 448, 24, 25, 34, 15, 17, 454, 217, 304,
+ 315, 366, 307, 315, 316, 136, 136, 136, 363, 364,
+ 136, 306, 105, 106, 107, 136, 298, 300, 304, 305,
+ 311, 448, 312, 295, 12, 295, 295, 309, 39, 68,
+ 72, 75, 76, 80, 81, 82, 83, 84, 85, 86,
+ 87, 88, 89, 90, 91, 98, 101, 108, 117, 315,
+ 450, 61, 344, 345, 39, 72, 74, 75, 76, 77,
+ 78, 83, 92, 97, 99, 111, 112, 113, 114, 115,
+ 116, 117, 118, 124, 364, 141, 142, 143, 144, 145,
+ 146, 147, 148, 149, 150, 151, 152, 153, 162, 163,
+ 164, 165, 166, 167, 204, 218, 253, 254, 289, 290,
+ 313, 314, 320, 331, 386, 388, 389, 390, 391, 393,
+ 394, 402, 426, 427, 428, 429, 430, 431, 432, 433,
+ 434, 435, 436, 437, 438, 439, 440, 458, 468, 304,
+ 294, 298, 407, 294, 407, 294, 407, 294, 407, 294,
+ 407, 294, 407, 294, 406, 408, 294, 411, 295, 7,
+ 8, 292, 303, 475, 483, 488, 492, 73, 75, 76,
+ 82, 315, 315, 299, 39, 72, 74, 75, 76, 77,
+ 111, 112, 113, 114, 117, 121, 122, 123, 225, 454,
+ 297, 217, 315, 364, 294, 297, 294, 289, 294, 291,
+ 8, 316, 316, 295, 289, 294, 312, 119, 120, 298,
+ 315, 383, 450, 299, 166, 471, 315, 220, 136, 448,
+ 25, 315, 450, 315, 299, 299, 299, 315, 316, 315,
+ 315, 315, 454, 315, 315, 294, 294, 315, 20, 299,
+ 316, 456, 457, 443, 444, 454, 290, 311, 290, 294,
+ 75, 76, 77, 111, 112, 113, 300, 349, 346, 450,
+ 67, 154, 168, 173, 198, 199, 218, 253, 254, 290,
+ 313, 320, 331, 341, 357, 358, 368, 372, 380, 402,
+ 458, 468, 486, 294, 294, 384, 316, 316, 316, 298,
+ 110, 288, 298, 103, 450, 303, 197, 294, 387, 55,
+ 57, 58, 59, 392, 395, 396, 397, 398, 399, 400,
+ 314, 316, 389, 314, 316, 316, 317, 11, 31, 32,
+ 294, 317, 318, 314, 316, 363, 15, 17, 366, 454,
+ 450, 87, 312, 410, 364, 326, 294, 411, 294, 316,
+ 316, 316, 316, 317, 318, 318, 290, 292, 314, 295,
+ 316, 316, 208, 210, 213, 214, 290, 320, 331, 458,
+ 476, 478, 479, 481, 84, 208, 211, 290, 472, 478,
+ 480, 484, 41, 154, 206, 209, 290, 320, 331, 489,
+ 206, 209, 290, 320, 331, 493, 75, 76, 77, 111,
+ 112, 113, 294, 294, 315, 315, 299, 454, 312, 462,
+ 463, 289, 51, 450, 459, 460, 7, 292, 295, 295,
+ 325, 327, 328, 300, 356, 442, 19, 335, 472, 136,
+ 315, 19, 299, 449, 449, 449, 304, 450, 450, 20,
+ 292, 299, 301, 292, 316, 39, 51, 52, 69, 119,
+ 291, 302, 350, 351, 352, 292, 110, 369, 373, 316,
+ 316, 487, 110, 288, 103, 450, 289, 289, 289, 387,
+ 289, 316, 312, 382, 298, 454, 303, 316, 298, 315,
+ 298, 315, 316, 364, 19, 294, 20, 384, 445, 446,
+ 447, 290, 450, 392, 56, 389, 401, 314, 316, 389,
+ 401, 401, 401, 62, 62, 294, 294, 315, 450, 294,
+ 411, 454, 314, 316, 441, 295, 312, 295, 299, 295,
+ 295, 295, 295, 295, 406, 295, 303, 8, 292, 212,
+ 297, 304, 316, 477, 297, 312, 411, 411, 297, 297,
+ 411, 411, 294, 215, 316, 315, 215, 315, 215, 316,
+ 16, 21, 22, 24, 25, 26, 27, 28, 29, 31,
+ 32, 34, 35, 36, 37, 38, 80, 82, 87, 103,
+ 136, 226, 228, 229, 230, 231, 232, 233, 234, 235,
+ 236, 237, 238, 239, 240, 241, 242, 243, 244, 248,
+ 257, 289, 378, 379, 451, 63, 360, 299, 297, 295,
+ 292, 327, 8, 297, 290, 292, 8, 297, 290, 22,
+ 23, 24, 26, 27, 28, 29, 31, 32, 35, 36,
+ 37, 38, 42, 43, 110, 320, 329, 409, 410, 414,
+ 298, 443, 294, 294, 315, 383, 28, 29, 63, 202,
+ 203, 205, 411, 315, 315, 449, 294, 295, 295, 316,
+ 457, 454, 295, 294, 351, 294, 315, 354, 301, 450,
+ 450, 72, 117, 315, 450, 72, 117, 364, 315, 298,
+ 315, 298, 315, 364, 19, 345, 370, 374, 290, 488,
+ 295, 136, 382, 39, 46, 48, 49, 50, 87, 88,
+ 89, 133, 134, 135, 137, 140, 295, 250, 251, 252,
+ 316, 225, 377, 316, 299, 316, 316, 292, 299, 454,
+ 383, 445, 454, 295, 292, 314, 316, 314, 316, 316,
+ 317, 19, 312, 295, 294, 292, 292, 295, 295, 407,
+ 407, 407, 407, 407, 407, 316, 316, 316, 294, 303,
+ 294, 295, 295, 294, 294, 295, 295, 316, 449, 315,
+ 63, 315, 295, 25, 26, 27, 28, 29, 294, 452,
+ 242, 234, 246, 294, 227, 247, 22, 452, 452, 21,
+ 22, 24, 25, 26, 27, 28, 29, 31, 32, 34,
+ 35, 36, 37, 38, 229, 230, 232, 233, 234, 236,
+ 237, 240, 241, 243, 256, 257, 258, 259, 260, 261,
+ 262, 263, 264, 265, 266, 267, 268, 269, 270, 304,
+ 453, 295, 412, 298, 304, 314, 297, 361, 28, 65,
+ 66, 312, 316, 448, 464, 465, 462, 290, 297, 289,
+ 459, 289, 294, 312, 294, 298, 294, 298, 26, 27,
+ 28, 29, 294, 298, 294, 298, 294, 298, 294, 298,
+ 294, 298, 294, 298, 294, 298, 294, 298, 294, 298,
+ 294, 298, 294, 298, 294, 298, 294, 298, 104, 109,
+ 320, 330, 411, 316, 301, 445, 445, 356, 442, 314,
+ 295, 445, 316, 347, 348, 450, 292, 353, 315, 196,
+ 321, 315, 454, 316, 316, 292, 454, 383, 290, 169,
+ 170, 171, 172, 290, 313, 320, 331, 371, 468, 172,
+ 174, 175, 290, 313, 320, 331, 375, 468, 290, 312,
+ 295, 294, 303, 303, 299, 299, 299, 299, 294, 383,
+ 136, 299, 299, 450, 361, 450, 295, 377, 447, 62,
+ 62, 295, 295, 315, 295, 445, 441, 441, 8, 292,
+ 8, 477, 295, 316, 249, 312, 298, 298, 25, 26,
+ 27, 28, 29, 271, 292, 298, 305, 290, 291, 299,
+ 316, 22, 23, 24, 26, 27, 28, 29, 31, 32,
+ 35, 36, 37, 38, 44, 312, 409, 413, 294, 294,
+ 289, 329, 327, 464, 316, 316, 316, 294, 298, 294,
+ 298, 294, 298, 294, 298, 316, 316, 316, 316, 316,
+ 316, 317, 316, 316, 318, 316, 317, 318, 316, 316,
+ 316, 316, 316, 316, 316, 317, 316, 414, 316, 8,
+ 44, 316, 44, 51, 448, 316, 42, 91, 110, 332,
+ 455, 295, 299, 295, 295, 294, 294, 471, 295, 295,
+ 295, 292, 352, 353, 315, 299, 299, 450, 450, 255,
+ 363, 363, 363, 363, 363, 363, 363, 382, 316, 138,
+ 139, 138, 139, 378, 349, 314, 292, 19, 314, 314,
+ 316, 295, 316, 303, 297, 292, 316, 316, 312, 299,
+ 316, 291, 299, 26, 27, 28, 29, 316, 26, 27,
+ 28, 316, 329, 290, 290, 295, 299, 295, 299, 316,
+ 316, 316, 316, 316, 316, 317, 316, 295, 299, 295,
+ 299, 295, 299, 295, 299, 295, 295, 299, 295, 295,
+ 299, 295, 299, 295, 299, 295, 299, 295, 299, 295,
+ 299, 295, 295, 299, 295, 8, 295, 299, 51, 448,
+ 298, 315, 301, 445, 445, 450, 294, 292, 19, 364,
+ 295, 295, 295, 294, 450, 383, 8, 477, 316, 312,
+ 299, 299, 299, 316, 295, 303, 303, 303, 295, 290,
+ 294, 294, 295, 299, 295, 299, 295, 299, 295, 299,
+ 294, 294, 294, 294, 294, 294, 294, 294, 294, 294,
+ 294, 294, 295, 294, 8, 299, 297, 295, 295, 445,
+ 450, 383, 454, 445, 300, 355, 356, 303, 295, 292,
+ 295, 451, 299, 316, 316, 316, 421, 419, 294, 294,
+ 294, 294, 420, 419, 418, 417, 415, 416, 420, 419,
+ 418, 417, 424, 422, 423, 414, 295, 355, 450, 295,
+ 294, 477, 312, 295, 295, 295, 295, 464, 295, 316,
+ 420, 419, 418, 417, 295, 316, 295, 295, 316, 295,
+ 317, 295, 316, 318, 295, 317, 318, 295, 295, 295,
+ 295, 295, 414, 8, 44, 295, 44, 51, 295, 448,
+ 361, 294, 19, 385, 445, 292, 295, 295, 295, 295,
+ 8, 445, 383, 39, 54, 70, 79, 93, 94, 95,
+ 96, 125, 126, 127, 128, 129, 130, 131, 289, 295,
+ 312, 295, 294, 294, 295, 255, 445, 316, 103, 295,
+ 295, 364, 454, 450, 19, 383, 355, 294, 445, 295
+};
+
+/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */
+static const yytype_int16 yyr1[] =
+{
+ 0, 308, 309, 309, 310, 310, 310, 310, 310, 310,
+ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310,
+ 310, 310, 310, 310, 310, 310, 310, 310, 310, 310,
+ 311, 311, 312, 312, 313, 313, 313, 314, 314, 315,
+ 315, 315, 316, 317, 317, 318, 318, 318, 319, 319,
+ 319, 319, 319, 320, 320, 320, 320, 320, 320, 320,
+ 320, 320, 321, 321, 321, 321, 322, 322, 322, 322,
+ 323, 324, 325, 326, 326, 327, 328, 328, 328, 329,
+ 329, 329, 330, 330, 331, 331, 331, 332, 332, 332,
+ 332, 332, 332, 333, 333, 333, 334, 335, 335, 335,
+ 335, 335, 335, 336, 337, 338, 339, 340, 341, 342,
+ 342, 342, 342, 342, 342, 342, 342, 342, 342, 342,
+ 342, 342, 342, 342, 342, 342, 342, 342, 342, 342,
+ 342, 342, 342, 342, 342, 342, 343, 343, 344, 344,
+ 345, 345, 346, 346, 347, 347, 348, 348, 349, 349,
+ 350, 350, 350, 350, 350, 350, 350, 351, 351, 352,
+ 352, 353, 353, 354, 355, 355, 356, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357, 357, 357,
+ 357, 357, 357, 357, 357, 357, 357, 357, 358, 359,
+ 359, 359, 359, 359, 359, 359, 359, 359, 359, 359,
+ 359, 359, 359, 359, 359, 360, 360, 361, 361, 362,
+ 362, 363, 363, 363, 363, 363, 363, 363, 364, 364,
+ 364, 364, 365, 365, 365, 365, 365, 365, 365, 365,
+ 366, 367, 367, 367, 367, 367, 367, 368, 368, 369,
+ 369, 369, 370, 370, 371, 371, 371, 371, 371, 371,
+ 371, 371, 372, 373, 373, 373, 374, 374, 375, 375,
+ 375, 375, 375, 375, 375, 376, 377, 377, 378, 378,
+ 379, 380, 381, 381, 381, 381, 381, 381, 381, 381,
+ 381, 381, 381, 381, 381, 381, 381, 381, 381, 381,
+ 381, 381, 381, 381, 381, 382, 382, 382, 382, 382,
+ 382, 382, 382, 382, 382, 382, 382, 382, 382, 382,
+ 382, 383, 383, 383, 384, 384, 384, 384, 384, 385,
+ 385, 385, 385, 385, 385, 385, 385, 385, 385, 385,
+ 385, 385, 385, 385, 385, 386, 387, 387, 388, 388,
+ 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
+ 388, 388, 388, 388, 388, 388, 388, 388, 388, 388,
+ 388, 388, 388, 388, 389, 390, 391, 392, 392, 393,
+ 393, 393, 394, 395, 395, 395, 395, 396, 396, 396,
+ 397, 398, 399, 400, 401, 401, 401, 402, 403, 403,
+ 404, 404, 404, 405, 405, 406, 406, 407, 407, 408,
+ 408, 408, 408, 408, 408, 408, 408, 408, 408, 408,
+ 408, 408, 408, 408, 409, 409, 409, 409, 409, 409,
+ 409, 409, 409, 409, 409, 409, 409, 409, 409, 409,
+ 409, 409, 409, 410, 411, 411, 412, 412, 413, 413,
+ 413, 414, 414, 414, 414, 414, 414, 414, 414, 414,
+ 414, 414, 414, 414, 414, 414, 414, 414, 414, 414,
+ 414, 414, 414, 414, 414, 414, 414, 415, 415, 415,
+ 416, 416, 416, 417, 417, 418, 418, 419, 419, 420,
+ 420, 421, 421, 422, 422, 422, 423, 423, 423, 423,
+ 424, 424, 425, 426, 427, 428, 429, 430, 431, 432,
+ 433, 434, 435, 436, 437, 438, 439, 440, 440, 440,
+ 440, 440, 440, 440, 440, 440, 440, 440, 440, 440,
+ 440, 440, 440, 440, 440, 440, 440, 440, 440, 440,
+ 441, 441, 441, 441, 441, 442, 442, 443, 443, 444,
+ 444, 445, 445, 446, 446, 447, 447, 447, 448, 448,
+ 448, 448, 448, 448, 448, 448, 448, 448, 449, 449,
+ 450, 450, 450, 450, 451, 451, 451, 451, 451, 451,
+ 451, 451, 451, 451, 451, 451, 451, 451, 451, 451,
+ 451, 451, 451, 451, 451, 451, 451, 451, 451, 451,
+ 451, 451, 451, 451, 451, 451, 451, 451, 451, 451,
+ 451, 451, 451, 451, 451, 451, 451, 451, 451, 451,
+ 451, 451, 451, 451, 451, 451, 451, 451, 451, 452,
+ 452, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 453, 453, 453, 453, 453, 453, 453, 453, 453, 453,
+ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454,
+ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454,
+ 454, 454, 454, 454, 455, 455, 455, 455, 455, 455,
+ 455, 455, 455, 455, 455, 455, 455, 455, 455, 455,
+ 455, 455, 456, 456, 457, 457, 457, 457, 457, 458,
+ 458, 458, 458, 458, 458, 459, 459, 459, 460, 460,
+ 461, 461, 462, 462, 463, 464, 464, 465, 465, 465,
+ 465, 465, 465, 465, 465, 466, 466, 466, 466, 466,
+ 466, 466, 466, 466, 466, 466, 466, 466, 466, 466,
+ 467, 467, 468, 468, 468, 468, 468, 468, 468, 468,
+ 468, 468, 468, 469, 469, 470, 470, 471, 471, 472,
+ 473, 474, 474, 474, 474, 474, 474, 474, 474, 474,
+ 474, 475, 475, 476, 476, 476, 477, 477, 478, 478,
+ 478, 478, 478, 478, 479, 480, 481, 482, 482, 483,
+ 483, 484, 484, 484, 484, 485, 486, 487, 487, 487,
+ 487, 487, 487, 487, 487, 487, 487, 488, 488, 489,
+ 489, 489, 489, 489, 489, 489, 490, 490, 491, 491,
+ 491, 492, 492, 493, 493, 493, 493
+};
+
+/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */
+static const yytype_int8 yyr2[] =
+{
+ 0, 2, 0, 2, 4, 4, 3, 1, 1, 1,
+ 1, 1, 1, 4, 4, 4, 4, 1, 1, 1,
+ 2, 2, 3, 2, 2, 1, 1, 1, 4, 1,
+ 0, 2, 1, 3, 2, 4, 6, 1, 1, 1,
+ 1, 3, 1, 1, 1, 1, 4, 4, 4, 4,
+ 4, 4, 4, 2, 3, 2, 2, 2, 1, 1,
+ 2, 1, 2, 4, 6, 3, 5, 7, 9, 3,
+ 4, 7, 1, 1, 1, 2, 0, 2, 2, 0,
+ 6, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+ 3, 2, 3, 1, 2, 3, 7, 0, 2, 2,
+ 2, 2, 2, 3, 3, 2, 1, 4, 3, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 3, 3, 3, 3,
+ 3, 3, 2, 2, 2, 5, 0, 2, 0, 2,
+ 0, 2, 3, 1, 0, 1, 1, 3, 0, 3,
+ 1, 1, 1, 1, 1, 1, 4, 0, 2, 4,
+ 3, 0, 2, 3, 0, 1, 5, 3, 4, 4,
+ 4, 1, 1, 1, 1, 1, 2, 2, 4, 13,
+ 22, 1, 1, 5, 3, 7, 5, 4, 7, 0,
+ 2, 2, 2, 2, 2, 2, 2, 5, 2, 2,
+ 2, 2, 2, 2, 5, 0, 2, 0, 2, 0,
+ 3, 9, 9, 7, 7, 1, 1, 1, 2, 2,
+ 1, 4, 0, 1, 1, 2, 2, 2, 2, 1,
+ 4, 2, 5, 3, 2, 2, 1, 4, 3, 0,
+ 2, 2, 0, 2, 2, 2, 2, 2, 1, 1,
+ 1, 1, 9, 0, 2, 2, 0, 2, 2, 2,
+ 2, 1, 1, 1, 1, 1, 0, 4, 1, 3,
+ 1, 13, 0, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 5, 8, 6, 5, 0, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 4, 4, 4, 4,
+ 5, 1, 1, 1, 0, 4, 4, 4, 4, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 5, 1, 0, 2, 2, 1,
+ 2, 4, 5, 1, 1, 1, 1, 2, 1, 1,
+ 1, 1, 1, 4, 6, 4, 4, 11, 1, 5,
+ 3, 7, 5, 5, 3, 1, 2, 2, 1, 2,
+ 4, 4, 1, 2, 2, 2, 2, 2, 2, 2,
+ 1, 2, 1, 1, 1, 4, 4, 2, 4, 2,
+ 0, 1, 1, 3, 1, 3, 1, 0, 3, 5,
+ 4, 3, 5, 5, 5, 5, 5, 5, 2, 2,
+ 2, 2, 2, 2, 4, 4, 4, 4, 4, 4,
+ 4, 4, 5, 5, 5, 5, 4, 4, 4, 4,
+ 4, 4, 3, 2, 0, 1, 1, 2, 1, 1,
+ 1, 1, 4, 4, 5, 4, 4, 4, 7, 7,
+ 7, 7, 7, 7, 7, 7, 7, 7, 8, 8,
+ 8, 8, 7, 7, 7, 7, 7, 0, 2, 2,
+ 0, 2, 2, 0, 2, 0, 2, 0, 2, 0,
+ 2, 0, 2, 0, 2, 2, 0, 2, 3, 2,
+ 0, 2, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2, 1, 2, 2,
+ 2, 2, 2, 2, 3, 2, 2, 2, 5, 3,
+ 2, 2, 2, 2, 2, 5, 4, 6, 2, 4,
+ 0, 3, 3, 1, 1, 0, 3, 0, 1, 1,
+ 3, 0, 1, 1, 3, 1, 3, 4, 4, 4,
+ 4, 5, 1, 1, 1, 1, 1, 1, 1, 3,
+ 1, 3, 4, 1, 0, 10, 6, 5, 6, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 2, 2, 2, 2, 1, 1, 1, 1, 2,
+ 3, 4, 6, 5, 1, 1, 1, 1, 1, 1,
+ 1, 2, 2, 1, 2, 2, 4, 1, 2, 1,
+ 2, 1, 2, 1, 2, 1, 2, 1, 1, 0,
+ 5, 0, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2, 2, 2, 2, 1, 1, 1,
+ 1, 1, 3, 2, 2, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 2, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 1, 3, 2, 3, 4, 2, 2, 2, 5,
+ 5, 7, 4, 3, 2, 3, 2, 1, 1, 2,
+ 3, 2, 1, 2, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 2, 2, 2, 2, 1, 1, 1,
+ 1, 1, 1, 3, 0, 1, 1, 3, 2, 6,
+ 7, 3, 3, 3, 6, 0, 1, 3, 5, 6,
+ 4, 4, 1, 3, 3, 1, 1, 1, 1, 4,
+ 1, 6, 6, 6, 4, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 3, 2, 5, 4, 7, 6, 7, 6,
+ 9, 8, 3, 8, 4, 0, 2, 0, 1, 3,
+ 3, 0, 2, 2, 2, 3, 2, 2, 2, 2,
+ 2, 0, 2, 3, 1, 1, 1, 1, 3, 8,
+ 2, 3, 1, 1, 3, 3, 3, 4, 6, 0,
+ 2, 3, 1, 3, 1, 4, 3, 0, 2, 2,
+ 2, 3, 3, 3, 3, 3, 3, 0, 2, 2,
+ 3, 3, 4, 2, 1, 1, 3, 5, 0, 2,
+ 2, 0, 2, 4, 3, 1, 1
};
-#endif
-/* SCCSWHAT( "@(#)yypars.c 3.1 88/11/16 22:00:49 " ) */
-#line 3 "F:\\NetFXDev1\\src\\tools\\devdiv\\amd64\\yypars.c"
-#if ! defined(YYAPI_PACKAGE)
-/*
-** YYAPI_TOKENNAME : name used for return value of yylex
-** YYAPI_TOKENTYPE : type of the token
-** YYAPI_TOKENEME(t) : the value of the token that the parser should see
-** YYAPI_TOKENNONE : the representation when there is no token
-** YYAPI_VALUENAME : the name of the value of the token
-** YYAPI_VALUETYPE : the type of the value of the token (if null, then the value is derivable from the token itself)
-** YYAPI_VALUEOF(v) : how to get the value of the token.
-*/
-#define YYAPI_TOKENNAME yychar
-#define YYAPI_TOKENTYPE int
-#define YYAPI_TOKENEME(t) (t)
-#define YYAPI_TOKENNONE -1
-#define YYAPI_TOKENSTR(t) (sprintf_s(yytokbuf, ARRAY_SIZE(yytokbuf), "%d", t), yytokbuf)
-#define YYAPI_VALUENAME yylval
-#define YYAPI_VALUETYPE YYSTYPE
-#define YYAPI_VALUEOF(v) (v)
-#endif
-#if ! defined(YYAPI_CALLAFTERYYLEX)
-#define YYAPI_CALLAFTERYYLEX
-#endif
-# define YYFLAG -1000
-# define YYERROR goto yyerrlab
-# define YYACCEPT return(0)
-# define YYABORT return(1)
+enum { YYENOMEM = -2 };
-#ifdef YYDEBUG /* RRR - 10/9/85 */
-char yytokbuf[20];
-# ifndef YYDBFLG
-# define YYDBFLG (yydebug)
+#define yyerrok (yyerrstatus = 0)
+#define yyclearin (yychar = YYEMPTY)
+
+#define YYACCEPT goto yyacceptlab
+#define YYABORT goto yyabortlab
+#define YYERROR goto yyerrorlab
+#define YYNOMEM goto yyexhaustedlab
+
+
+#define YYRECOVERING() (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value) \
+ do \
+ if (yychar == YYEMPTY) \
+ { \
+ yychar = (Token); \
+ yylval = (Value); \
+ YYPOPSTACK (yylen); \
+ yystate = *yyssp; \
+ goto yybackup; \
+ } \
+ else \
+ { \
+ yyerror (YY_("syntax error: cannot back up")); \
+ YYERROR; \
+ } \
+ while (0)
+
+/* Backward compatibility with an undocumented macro.
+ Use YYerror or YYUNDEF. */
+#define YYERRCODE YYUNDEF
+
+
+/* Enable debugging if requested. */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+# include /* INFRINGES ON USER NAME SPACE */
+# define YYFPRINTF fprintf
# endif
-# define yyprintf(a, b, c, d) if (YYDBFLG) YYPRINT(a, b, c, d)
-#else
-# define yyprintf(a, b, c, d)
-#endif
-#ifndef YYPRINT
-#define YYPRINT printf
-#endif
+# define YYDPRINTF(Args) \
+do { \
+ if (yydebug) \
+ YYFPRINTF Args; \
+} while (0)
-/* parser for yacc output */
-#ifdef YYDUMP
-int yydump = 1; /* 1 for dumping */
-void yydumpinfo(void);
-#endif
-#ifdef YYDEBUG
-YYSTATIC int yydebug = 0; /* 1 for debugging */
-#endif
-YYSTATIC YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
-YYSTATIC short yys[YYMAXDEPTH]; /* the parse stack */
-#if ! defined(YYRECURSIVE)
-YYSTATIC YYAPI_TOKENTYPE YYAPI_TOKENNAME = YYAPI_TOKENNONE;
-#if defined(YYAPI_VALUETYPE)
-// YYSTATIC YYAPI_VALUETYPE YYAPI_VALUENAME; FIX
-#endif
-YYSTATIC int yynerrs = 0; /* number of errors */
-YYSTATIC short yyerrflag = 0; /* error recovery flag */
-#endif
-#ifdef YYRECOVER
-/*
-** yyscpy : copy f onto t and return a ptr to the null terminator at the
-** end of t.
-*/
-YYSTATIC char *yyscpy(register char*t, register char*f)
- {
- while(*t = *f++)
- t++;
- return(t); /* ptr to the null char */
- }
-#endif
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
+do { \
+ if (yydebug) \
+ { \
+ YYFPRINTF (stderr, "%s ", Title); \
+ yy_symbol_print (stderr, \
+ Kind, Value); \
+ YYFPRINTF (stderr, "\n"); \
+ } \
+} while (0)
-#ifndef YYNEAR
-#define YYNEAR
-#endif
-#ifndef YYPASCAL
-#define YYPASCAL
-#endif
-#ifndef YYLOCAL
-#define YYLOCAL
-#endif
-#if ! defined YYPARSER
-#define YYPARSER yyparse
-#endif
-#if ! defined YYLEX
-#define YYLEX yylex
-#endif
-#if defined(YYRECURSIVE)
+/*-----------------------------------.
+| Print this symbol's value on YYO. |
+`-----------------------------------*/
- YYSTATIC YYAPI_TOKENTYPE YYAPI_TOKENNAME = YYAPI_TOKENNONE;
- #if defined(YYAPI_VALUETYPE)
- YYSTATIC YYAPI_VALUETYPE YYAPI_VALUENAME;
- #endif
- YYSTATIC int yynerrs = 0; /* number of errors */
- YYSTATIC short yyerrflag = 0; /* error recovery flag */
+static void
+yy_symbol_value_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
+{
+ FILE *yyoutput = yyo;
+ YY_USE (yyoutput);
+ if (!yyvaluep)
+ return;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
- YYSTATIC short yyn;
- YYSTATIC short yystate = 0;
- YYSTATIC short *yyps= &yys[-1];
- YYSTATIC YYSTYPE *yypv= &yyv[-1];
- YYSTATIC short yyj;
- YYSTATIC short yym;
-#endif
+/*---------------------------.
+| Print this symbol on YYO. |
+`---------------------------*/
-#pragma warning(disable:102)
-YYLOCAL YYNEAR YYPASCAL YYPARSER()
+static void
+yy_symbol_print (FILE *yyo,
+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep)
{
-#if ! defined(YYRECURSIVE)
+ YYFPRINTF (yyo, "%s %s (",
+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
- register short yyn;
- short yystate, *yyps;
- YYSTYPE *yypv;
- short yyj, yym;
+ yy_symbol_value_print (yyo, yykind, yyvaluep);
+ YYFPRINTF (yyo, ")");
+}
- YYAPI_TOKENNAME = YYAPI_TOKENNONE;
- yystate = 0;
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included). |
+`------------------------------------------------------------------*/
-#ifdef _PREFAST_
-#pragma warning(push)
-#pragma warning(disable:6200) // Index '-1' is out of valid index range...for non-stack buffer...
-#endif
- yyps= &yys[-1];
- yypv= &yyv[-1];
-#ifdef _PREFAST_
-#pragma warning(pop)
-#endif
+static void
+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
+{
+ YYFPRINTF (stderr, "Stack now");
+ for (; yybottom <= yytop; yybottom++)
+ {
+ int yybot = *yybottom;
+ YYFPRINTF (stderr, " %d", yybot);
+ }
+ YYFPRINTF (stderr, "\n");
+}
-#endif
+# define YY_STACK_PRINT(Bottom, Top) \
+do { \
+ if (yydebug) \
+ yy_stack_print ((Bottom), (Top)); \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced. |
+`------------------------------------------------*/
+
+static void
+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
+ int yyrule)
+{
+ int yylno = yyrline[yyrule];
+ int yynrhs = yyr2[yyrule];
+ int yyi;
+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
+ yyrule - 1, yylno);
+ /* The symbols being reduced. */
+ for (yyi = 0; yyi < yynrhs; yyi++)
+ {
+ YYFPRINTF (stderr, " $%d = ", yyi + 1);
+ yy_symbol_print (stderr,
+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
+ &yyvsp[(yyi + 1) - (yynrhs)]);
+ YYFPRINTF (stderr, "\n");
+ }
+}
+
+# define YY_REDUCE_PRINT(Rule) \
+do { \
+ if (yydebug) \
+ yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
+
+/* Nonzero means print parse trace. It is left uninitialized so that
+ multiple parsers can coexist. */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args) ((void) 0)
+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
-#ifdef YYDUMP
- yydumpinfo();
+
+/* YYINITDEPTH -- initial size of the parser's stacks. */
+#ifndef YYINITDEPTH
+# define YYINITDEPTH 200
#endif
- yystack: /* put a state and value onto the stack */
-
-#ifdef YYDEBUG
- if(YYAPI_TOKENNAME == YYAPI_TOKENNONE) {
- yyprintf( "state %d, token # '%d'\n", yystate, -1, 0 );
- }
- else {
- yyprintf( "state %d, token # '%s'\n", yystate, YYAPI_TOKENSTR(YYAPI_TOKENNAME), 0 );
- }
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+ if the built-in stack extension method is used).
+
+ Do not make this value too large; the results are undefined if
+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
+ evaluated with infinite-precision integer arithmetic. */
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
#endif
- if( ++yyps > &yys[YYMAXDEPTH] ) {
- yyerror( "yacc stack overflow" );
- return(1);
- }
- *yyps = yystate;
- ++yypv;
- *yypv = yyval;
+
+
+
+
+/*-----------------------------------------------.
+| Release the memory associated to this symbol. |
+`-----------------------------------------------*/
+
+static void
+yydestruct (const char *yymsg,
+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep)
+{
+ YY_USE (yyvaluep);
+ if (!yymsg)
+ yymsg = "Deleting";
+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ YY_USE (yykind);
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+}
+
+
+/* Lookahead token kind. */
+int yychar;
+
+/* The semantic value of the lookahead symbol. */
+YYSTYPE yylval;
+/* Number of syntax errors so far. */
+int yynerrs;
+
+
+
+
+/*----------.
+| yyparse. |
+`----------*/
+
+int
+yyparse (void)
+{
+ yy_state_fast_t yystate = 0;
+ /* Number of tokens to shift before error messages enabled. */
+ int yyerrstatus = 0;
+
+ /* Refer to the stacks through separate pointers, to allow yyoverflow
+ to reallocate them elsewhere. */
+
+ /* Their size. */
+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
+
+ /* The state stack: array, bottom, top. */
+ yy_state_t yyssa[YYINITDEPTH];
+ yy_state_t *yyss = yyssa;
+ yy_state_t *yyssp = yyss;
+
+ /* The semantic value stack: array, bottom, top. */
+ YYSTYPE yyvsa[YYINITDEPTH];
+ YYSTYPE *yyvs = yyvsa;
+ YYSTYPE *yyvsp = yyvs;
+
+ int yyn;
+ /* The return value of yyparse. */
+ int yyresult;
+ /* Lookahead symbol kind. */
+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
+ /* The variables used to return semantic value and location from the
+ action routines. */
+ YYSTYPE yyval;
+
+
+
+#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
+
+ /* The number of symbols on the RHS of the reduced rule.
+ Keep to zero when no symbol should be popped. */
+ int yylen = 0;
+
+ YYDPRINTF ((stderr, "Starting parse\n"));
+
+ yychar = YYEMPTY; /* Cause a token to be read. */
+
+ goto yysetstate;
+
+
+/*------------------------------------------------------------.
+| yynewstate -- push a new state, which is found in yystate. |
+`------------------------------------------------------------*/
yynewstate:
+ /* In all cases, when you get here, the value and location stacks
+ have just been pushed. So pushing a state here evens the stacks. */
+ yyssp++;
+
+
+/*--------------------------------------------------------------------.
+| yysetstate -- set current state (the top of the stack) to yystate. |
+`--------------------------------------------------------------------*/
+yysetstate:
+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
+ YY_IGNORE_USELESS_CAST_BEGIN
+ *yyssp = YY_CAST (yy_state_t, yystate);
+ YY_IGNORE_USELESS_CAST_END
+ YY_STACK_PRINT (yyss, yyssp);
- yyn = YYPACT[yystate];
-
- if( yyn <= YYFLAG ) { /* simple state, no lookahead */
- goto yydefault;
- }
- if( YYAPI_TOKENNAME == YYAPI_TOKENNONE ) { /* need a lookahead */
- YYAPI_TOKENNAME = YYLEX();
- YYAPI_CALLAFTERYYLEX(YYAPI_TOKENNAME);
- }
- if( ((yyn += (short)YYAPI_TOKENEME(YYAPI_TOKENNAME)) < 0) || (yyn >= YYLAST) ) {
- goto yydefault;
- }
- if( YYCHK[ yyn = YYACT[ yyn ] ] == YYAPI_TOKENEME(YYAPI_TOKENNAME) ) { /* valid shift */
- yyval = YYAPI_VALUEOF(YYAPI_VALUENAME);
- yystate = yyn;
- yyprintf( "SHIFT: saw token '%s', now in state %4d\n", YYAPI_TOKENSTR(YYAPI_TOKENNAME), yystate, 0 );
- YYAPI_TOKENNAME = YYAPI_TOKENNONE;
- if( yyerrflag > 0 ) {
- --yyerrflag;
- }
- goto yystack;
- }
-
- yydefault:
- /* default state action */
-
- if( (yyn = YYDEF[yystate]) == -2 ) {
- register YYCONST short *yyxi;
-
- if( YYAPI_TOKENNAME == YYAPI_TOKENNONE ) {
- YYAPI_TOKENNAME = YYLEX();
- YYAPI_CALLAFTERYYLEX(YYAPI_TOKENNAME);
- yyprintf("LOOKAHEAD: token '%s'\n", YYAPI_TOKENSTR(YYAPI_TOKENNAME), 0, 0);
- }
-/*
-** search exception table, we find a -1 followed by the current state.
-** if we find one, we'll look through terminal,state pairs. if we find
-** a terminal which matches the current one, we have a match.
-** the exception table is when we have a reduce on a terminal.
-*/
-
-#if YYOPTTIME
- yyxi = yyexca + yyexcaind[yystate];
- while(( *yyxi != YYAPI_TOKENEME(YYAPI_TOKENNAME) ) && ( *yyxi >= 0 )){
- yyxi += 2;
- }
+ if (yyss + yystacksize - 1 <= yyssp)
+#if !defined yyoverflow && !defined YYSTACK_RELOCATE
+ YYNOMEM;
#else
- for(yyxi = yyexca;
- (*yyxi != (-1)) || (yyxi[1] != yystate);
- yyxi += 2
- ) {
- ; /* VOID */
- }
-
- while( *(yyxi += 2) >= 0 ){
- if( *yyxi == YYAPI_TOKENEME(YYAPI_TOKENNAME) ) {
- break;
- }
- }
-#endif
- if( (yyn = yyxi[1]) < 0 ) {
- return(0); /* accept */
- }
- }
-
- if( yyn == 0 ){ /* error */
- /* error ... attempt to resume parsing */
-
- switch( yyerrflag ){
-
- case 0: /* brand new error */
-#ifdef YYRECOVER
- {
- register int i,j;
-
- for(i = 0;
- (yyrecover[i] != -1000) && (yystate > yyrecover[i]);
- i += 3
- ) {
- ;
- }
- if(yystate == yyrecover[i]) {
- yyprintf("recovered, from state %d to state %d on token # %d\n",
- yystate,yyrecover[i+2],yyrecover[i+1]
- );
- j = yyrecover[i + 1];
- if(j < 0) {
- /*
- ** here we have one of the injection set, so we're not quite
- ** sure that the next valid thing will be a shift. so we'll
- ** count it as an error and continue.
- ** actually we're not absolutely sure that the next token
- ** we were supposed to get is the one when j > 0. for example,
- ** for(+) {;} error recovery with yyerrflag always set, stops
- ** after inserting one ; before the +. at the point of the +,
- ** we're pretty sure the guy wants a 'for' loop. without
- ** setting the flag, when we're almost absolutely sure, we'll
- ** give him one, since the only thing we can shift on this
- ** error is after finding an expression followed by a +
- */
- yyerrflag++;
- j = -j;
- }
- if(yyerrflag <= 1) { /* only on first insertion */
- yyrecerr(YYAPI_TOKENNAME, j); /* what was, what should be first */
- }
- yyval = yyeval(j);
- yystate = yyrecover[i + 2];
- goto yystack;
- }
- }
-#endif
- yyerror("syntax error");
+ {
+ /* Get the current used size of the three stacks, in elements. */
+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
+
+# if defined yyoverflow
+ {
+ /* Give user a chance to reallocate the stack. Use copies of
+ these so that the &'s don't force the real ones into
+ memory. */
+ yy_state_t *yyss1 = yyss;
+ YYSTYPE *yyvs1 = yyvs;
+
+ /* Each stack pointer address is followed by the size of the
+ data in use in that stack, in bytes. This used to be a
+ conditional around just the two extra args, but that might
+ be undefined if yyoverflow is a macro. */
+ yyoverflow (YY_("memory exhausted"),
+ &yyss1, yysize * YYSIZEOF (*yyssp),
+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
+ &yystacksize);
+ yyss = yyss1;
+ yyvs = yyvs1;
+ }
+# else /* defined YYSTACK_RELOCATE */
+ /* Extend the stack our own way. */
+ if (YYMAXDEPTH <= yystacksize)
+ YYNOMEM;
+ yystacksize *= 2;
+ if (YYMAXDEPTH < yystacksize)
+ yystacksize = YYMAXDEPTH;
+
+ {
+ yy_state_t *yyss1 = yyss;
+ union yyalloc *yyptr =
+ YY_CAST (union yyalloc *,
+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
+ if (! yyptr)
+ YYNOMEM;
+ YYSTACK_RELOCATE (yyss_alloc, yyss);
+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+# undef YYSTACK_RELOCATE
+ if (yyss1 != yyssa)
+ YYSTACK_FREE (yyss1);
+ }
+# endif
+
+ yyssp = yyss + yysize - 1;
+ yyvsp = yyvs + yysize - 1;
+
+ YY_IGNORE_USELESS_CAST_BEGIN
+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
+ YY_CAST (long, yystacksize)));
+ YY_IGNORE_USELESS_CAST_END
+
+ if (yyss + yystacksize - 1 <= yyssp)
+ YYABORT;
+ }
+#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
- yyerrlab:
- ++yynerrs;
- FALLTHROUGH;
- case 1:
- case 2: /* incompletely recovered error ... try again */
- yyerrflag = 3;
+ if (yystate == YYFINAL)
+ YYACCEPT;
- /* find a state where "error" is a legal shift action */
+ goto yybackup;
- while ( yyps >= yys ) {
- yyn = YYPACT[*yyps] + YYERRCODE;
- if( yyn>= 0 && yyn < YYLAST && YYCHK[YYACT[yyn]] == YYERRCODE ){
- yystate = YYACT[yyn]; /* simulate a shift of "error" */
- yyprintf( "SHIFT 'error': now in state %4d\n", yystate, 0, 0 );
- goto yystack;
- }
- yyn = YYPACT[*yyps];
- /* the current yyps has no shift onn "error", pop stack */
+/*-----------.
+| yybackup. |
+`-----------*/
+yybackup:
+ /* Do appropriate processing given the current state. Read a
+ lookahead token if we need one and don't already have one. */
- yyprintf( "error recovery pops state %4d, uncovers %4d\n", *yyps, yyps[-1], 0 );
- --yyps;
- --yypv;
- }
+ /* First try to decide what to do without reference to lookahead token. */
+ yyn = yypact[yystate];
+ if (yypact_value_is_default (yyn))
+ goto yydefault;
- /* there is no state on the stack with an error shift ... abort */
+ /* Not known => get a lookahead token if don't already have one. */
- yyabort:
- return(1);
+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
+ if (yychar == YYEMPTY)
+ {
+ YYDPRINTF ((stderr, "Reading a token\n"));
+ yychar = yylex ();
+ }
+ if (yychar <= YYEOF)
+ {
+ yychar = YYEOF;
+ yytoken = YYSYMBOL_YYEOF;
+ YYDPRINTF ((stderr, "Now at end of input.\n"));
+ }
+ else if (yychar == YYerror)
+ {
+ /* The scanner already issued an error message, process directly
+ to error recovery. But do not keep the error token as
+ lookahead, it is too special and may lead us to an endless
+ loop in error recovery. */
+ yychar = YYUNDEF;
+ yytoken = YYSYMBOL_YYerror;
+ goto yyerrlab1;
+ }
+ else
+ {
+ yytoken = YYTRANSLATE (yychar);
+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
+ }
- case 3: /* no shift yet; clobber input char */
+ /* If the proper action on seeing token YYTOKEN is to reduce or to
+ detect an error, take that action. */
+ yyn += yytoken;
+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+ goto yydefault;
+ yyn = yytable[yyn];
+ if (yyn <= 0)
+ {
+ if (yytable_value_is_error (yyn))
+ goto yyerrlab;
+ yyn = -yyn;
+ goto yyreduce;
+ }
- yyprintf( "error recovery discards token '%s'\n", YYAPI_TOKENSTR(YYAPI_TOKENNAME), 0, 0 );
+ /* Count tokens shifted since error; after three, turn off error
+ status. */
+ if (yyerrstatus)
+ yyerrstatus--;
- if( YYAPI_TOKENEME(YYAPI_TOKENNAME) == 0 ) goto yyabort; /* don't discard EOF, quit */
- YYAPI_TOKENNAME = YYAPI_TOKENNONE;
- goto yynewstate; /* try again in the same state */
- }
- }
+ /* Shift the lookahead token. */
+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
+ yystate = yyn;
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
- /* reduction by production yyn */
+ /* Discard the shifted token. */
+ yychar = YYEMPTY;
+ goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state. |
+`-----------------------------------------------------------*/
+yydefault:
+ yyn = yydefact[yystate];
+ if (yyn == 0)
+ goto yyerrlab;
+ goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- do a reduction. |
+`-----------------------------*/
yyreduce:
- {
- register YYSTYPE *yypvt;
- yypvt = yypv;
- yyps -= YYR2[yyn];
- yypv -= YYR2[yyn];
- yyval = yypv[1];
- yyprintf("REDUCE: rule %4d, popped %2d tokens, uncovered state %4d, ",yyn, YYR2[yyn], *yyps);
- yym = yyn;
- yyn = (short)YYR1[yyn]; /* consult goto table to find next state */
- yyj = YYPGO[yyn] + *yyps + 1;
- if( (yyj >= YYLAST) || (YYCHK[ yystate = YYACT[yyj] ] != -yyn) ) {
- yystate = YYACT[YYPGO[yyn]];
- }
- yyprintf("goto state %4d\n", yystate, 0, 0);
-#ifdef YYDUMP
- yydumpinfo();
-#endif
- switch(yym){
+ /* yyn is the number of a rule to reduce with. */
+ yylen = yyr2[yyn];
-case 3:
+ /* If YYLEN is nonzero, implement the default value of the action:
+ '$$ = $1'.
+
+ Otherwise, the following line sets YYVAL to garbage.
+ This behavior is undocumented and Bison
+ users should not rely upon it. Assigning to YYVAL
+ unconditionally makes the parser a bit smaller, and it avoids a
+ GCC warning that YYVAL may be used uninitialized. */
+ yyval = yyvsp[1-yylen];
+
+
+ YY_REDUCE_PRINT (yyn);
+ switch (yyn)
+ {
+ case 4: /* decl: classHead '{' classDecls '}' */
#line 193 "asmparse.y"
-{ PASM->EndClass(); } break;
-case 4:
+ { PASM->EndClass(); }
+#line 3542 "asmparse.cpp"
+ break;
+
+ case 5: /* decl: nameSpaceHead '{' decls '}' */
#line 194 "asmparse.y"
-{ PASM->EndNameSpace(); } break;
-case 5:
+ { PASM->EndNameSpace(); }
+#line 3548 "asmparse.cpp"
+ break;
+
+ case 6: /* decl: methodHead methodDecls '}' */
#line 195 "asmparse.y"
-{ if(PASM->m_pCurMethod->m_ulLines[1] ==0)
+ { if(PASM->m_pCurMethod->m_ulLines[1] ==0)
{ PASM->m_pCurMethod->m_ulLines[1] = PASM->m_ulCurLine;
PASM->m_pCurMethod->m_ulColumns[1]=PASM->m_ulCurColumn;}
- PASM->EndMethod(); } break;
-case 12:
+ PASM->EndMethod(); }
+#line 3557 "asmparse.cpp"
+ break;
+
+ case 13: /* decl: assemblyHead '{' assemblyDecls '}' */
#line 205 "asmparse.y"
-{ PASMM->EndAssembly(); } break;
-case 13:
+ { PASMM->EndAssembly(); }
+#line 3563 "asmparse.cpp"
+ break;
+
+ case 14: /* decl: assemblyRefHead '{' assemblyRefDecls '}' */
#line 206 "asmparse.y"
-{ PASMM->EndAssembly(); } break;
-case 14:
+ { PASMM->EndAssembly(); }
+#line 3569 "asmparse.cpp"
+ break;
+
+ case 15: /* decl: exptypeHead '{' exptypeDecls '}' */
#line 207 "asmparse.y"
-{ PASMM->EndComType(); } break;
-case 15:
+ { PASMM->EndComType(); }
+#line 3575 "asmparse.cpp"
+ break;
+
+ case 16: /* decl: manifestResHead '{' manifestResDecls '}' */
#line 208 "asmparse.y"
-{ PASMM->EndManifestRes(); } break;
-case 19:
+ { PASMM->EndManifestRes(); }
+#line 3581 "asmparse.cpp"
+ break;
+
+ case 20: /* decl: _SUBSYSTEM int32 */
#line 212 "asmparse.y"
-{
+ {
#ifdef _PREFAST_
#pragma warning(push)
#pragma warning(disable:22011) // Suppress PREFast warning about integer overflow/underflow
#endif
- PASM->m_dwSubsystem = yypvt[-0].int32;
+ PASM->m_dwSubsystem = (yyvsp[0].int32);
#ifdef _PREFAST_
#pragma warning(pop)
#endif
- } break;
-case 20:
+ }
+#line 3596 "asmparse.cpp"
+ break;
+
+ case 21: /* decl: _CORFLAGS int32 */
#line 222 "asmparse.y"
-{ PASM->m_dwComImageFlags = yypvt[-0].int32; } break;
-case 21:
+ { PASM->m_dwComImageFlags = (yyvsp[0].int32); }
+#line 3602 "asmparse.cpp"
+ break;
+
+ case 22: /* decl: _FILE ALIGNMENT_ int32 */
#line 223 "asmparse.y"
-{ PASM->m_dwFileAlignment = yypvt[-0].int32;
- if((yypvt[-0].int32 & (yypvt[-0].int32 - 1))||(yypvt[-0].int32 < 0x200)||(yypvt[-0].int32 > 0x10000))
- PASM->report->error("Invalid file alignment, must be power of 2 from 0x200 to 0x10000\n");} break;
-case 22:
+ { PASM->m_dwFileAlignment = (yyvsp[0].int32);
+ if(((yyvsp[0].int32) & ((yyvsp[0].int32) - 1))||((yyvsp[0].int32) < 0x200)||((yyvsp[0].int32) > 0x10000))
+ PASM->report->error("Invalid file alignment, must be power of 2 from 0x200 to 0x10000\n");}
+#line 3610 "asmparse.cpp"
+ break;
+
+ case 23: /* decl: _IMAGEBASE int64 */
#line 226 "asmparse.y"
-{ PASM->m_stBaseAddress = (ULONGLONG)(*(yypvt[-0].int64)); delete yypvt[-0].int64;
+ { PASM->m_stBaseAddress = (ULONGLONG)(*((yyvsp[0].int64))); delete (yyvsp[0].int64);
if(PASM->m_stBaseAddress & 0xFFFF)
- PASM->report->error("Invalid image base, must be 0x10000-aligned\n");} break;
-case 23:
+ PASM->report->error("Invalid image base, must be 0x10000-aligned\n");}
+#line 3618 "asmparse.cpp"
+ break;
+
+ case 24: /* decl: _STACKRESERVE int64 */
#line 229 "asmparse.y"
-{ PASM->m_stSizeOfStackReserve = (size_t)(*(yypvt[-0].int64)); delete yypvt[-0].int64; } break;
-case 28:
+ { PASM->m_stSizeOfStackReserve = (size_t)(*((yyvsp[0].int64))); delete (yyvsp[0].int64); }
+#line 3624 "asmparse.cpp"
+ break;
+
+ case 29: /* decl: _MSCORLIB */
#line 234 "asmparse.y"
-{ PASM->m_fIsMscorlib = TRUE; } break;
-case 31:
+ { PASM->m_fIsMscorlib = TRUE; }
+#line 3630 "asmparse.cpp"
+ break;
+
+ case 32: /* compQstring: QSTRING */
#line 241 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 32:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 3636 "asmparse.cpp"
+ break;
+
+ case 33: /* compQstring: compQstring '+' QSTRING */
#line 242 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
-case 33:
+ { (yyval.binstr) = (yyvsp[-2].binstr); (yyval.binstr)->append((yyvsp[0].binstr)); delete (yyvsp[0].binstr); }
+#line 3642 "asmparse.cpp"
+ break;
+
+ case 34: /* languageDecl: _LANGUAGE SQSTRING */
#line 245 "asmparse.y"
-{ LPCSTRToGuid(yypvt[-0].string,&(PASM->m_guidLang)); } break;
-case 34:
+ { LPCSTRToGuid((yyvsp[0].string),&(PASM->m_guidLang)); }
+#line 3648 "asmparse.cpp"
+ break;
+
+ case 35: /* languageDecl: _LANGUAGE SQSTRING ',' SQSTRING */
#line 246 "asmparse.y"
-{ LPCSTRToGuid(yypvt[-2].string,&(PASM->m_guidLang));
- LPCSTRToGuid(yypvt[-0].string,&(PASM->m_guidLangVendor));} break;
-case 35:
+ { LPCSTRToGuid((yyvsp[-2].string),&(PASM->m_guidLang));
+ LPCSTRToGuid((yyvsp[0].string),&(PASM->m_guidLangVendor));}
+#line 3655 "asmparse.cpp"
+ break;
+
+ case 36: /* languageDecl: _LANGUAGE SQSTRING ',' SQSTRING ',' SQSTRING */
#line 248 "asmparse.y"
-{ LPCSTRToGuid(yypvt[-4].string,&(PASM->m_guidLang));
- LPCSTRToGuid(yypvt[-2].string,&(PASM->m_guidLangVendor));
- LPCSTRToGuid(yypvt[-2].string,&(PASM->m_guidDoc));} break;
-case 36:
+ { LPCSTRToGuid((yyvsp[-4].string),&(PASM->m_guidLang));
+ LPCSTRToGuid((yyvsp[-2].string),&(PASM->m_guidLangVendor));
+ LPCSTRToGuid((yyvsp[-2].string),&(PASM->m_guidDoc));}
+#line 3663 "asmparse.cpp"
+ break;
+
+ case 37: /* id: ID */
#line 253 "asmparse.y"
-{ yyval.string = yypvt[-0].string; } break;
-case 37:
+ { (yyval.string) = (yyvsp[0].string); }
+#line 3669 "asmparse.cpp"
+ break;
+
+ case 38: /* id: SQSTRING */
#line 254 "asmparse.y"
-{ yyval.string = yypvt[-0].string; } break;
-case 38:
+ { (yyval.string) = (yyvsp[0].string); }
+#line 3675 "asmparse.cpp"
+ break;
+
+ case 39: /* dottedName: id */
#line 257 "asmparse.y"
-{ yyval.string = yypvt[-0].string; } break;
-case 39:
+ { (yyval.string) = (yyvsp[0].string); }
+#line 3681 "asmparse.cpp"
+ break;
+
+ case 40: /* dottedName: DOTTEDNAME */
#line 258 "asmparse.y"
-{ yyval.string = yypvt[-0].string; } break;
-case 40:
+ { (yyval.string) = (yyvsp[0].string); }
+#line 3687 "asmparse.cpp"
+ break;
+
+ case 41: /* dottedName: dottedName '.' dottedName */
#line 259 "asmparse.y"
-{ yyval.string = newStringWDel(yypvt[-2].string, '.', yypvt[-0].string); } break;
-case 41:
+ { (yyval.string) = newStringWDel((yyvsp[-2].string), '.', (yyvsp[0].string)); }
+#line 3693 "asmparse.cpp"
+ break;
+
+ case 42: /* int32: INT32_V */
#line 262 "asmparse.y"
-{ yyval.int32 = yypvt[-0].int32; } break;
-case 42:
+ { (yyval.int32) = (yyvsp[0].int32); }
+#line 3699 "asmparse.cpp"
+ break;
+
+ case 43: /* int64: INT64_V */
#line 265 "asmparse.y"
-{ yyval.int64 = yypvt[-0].int64; } break;
-case 43:
+ { (yyval.int64) = (yyvsp[0].int64); }
+#line 3705 "asmparse.cpp"
+ break;
+
+ case 44: /* int64: INT32_V */
#line 266 "asmparse.y"
-{ yyval.int64 = neg ? new __int64(yypvt[-0].int32) : new __int64((unsigned)yypvt[-0].int32); } break;
-case 44:
+ { (yyval.int64) = neg ? new int64_t((yyvsp[0].int32)) : new int64_t((unsigned)(yyvsp[0].int32)); }
+#line 3711 "asmparse.cpp"
+ break;
+
+ case 45: /* float64: FLOAT64 */
#line 269 "asmparse.y"
-{ yyval.float64 = yypvt[-0].float64; } break;
-case 45:
+ { (yyval.float64) = (yyvsp[0].float64); }
+#line 3717 "asmparse.cpp"
+ break;
+
+ case 46: /* float64: FLOAT32_ '(' int32 ')' */
#line 270 "asmparse.y"
-{ float f; *((__int32*) (&f)) = yypvt[-1].int32; yyval.float64 = new double(f); } break;
-case 46:
+ { float f; *((int32_t*) (&f)) = (yyvsp[-1].int32); (yyval.float64) = new double(f); }
+#line 3723 "asmparse.cpp"
+ break;
+
+ case 47: /* float64: FLOAT64_ '(' int64 ')' */
#line 271 "asmparse.y"
-{ yyval.float64 = (double*) yypvt[-1].int64; } break;
-case 47:
+ { (yyval.float64) = (double*) (yyvsp[-1].int64); }
+#line 3729 "asmparse.cpp"
+ break;
+
+ case 48: /* typedefDecl: _TYPEDEF type AS_ dottedName */
#line 275 "asmparse.y"
-{ PASM->AddTypeDef(yypvt[-2].binstr,yypvt[-0].string); } break;
-case 48:
+ { PASM->AddTypeDef((yyvsp[-2].binstr),(yyvsp[0].string)); }
+#line 3735 "asmparse.cpp"
+ break;
+
+ case 49: /* typedefDecl: _TYPEDEF className AS_ dottedName */
#line 276 "asmparse.y"
-{ PASM->AddTypeDef(yypvt[-2].token,yypvt[-0].string); } break;
-case 49:
+ { PASM->AddTypeDef((yyvsp[-2].token),(yyvsp[0].string)); }
+#line 3741 "asmparse.cpp"
+ break;
+
+ case 50: /* typedefDecl: _TYPEDEF memberRef AS_ dottedName */
#line 277 "asmparse.y"
-{ PASM->AddTypeDef(yypvt[-2].token,yypvt[-0].string); } break;
-case 50:
+ { PASM->AddTypeDef((yyvsp[-2].token),(yyvsp[0].string)); }
+#line 3747 "asmparse.cpp"
+ break;
+
+ case 51: /* typedefDecl: _TYPEDEF customDescr AS_ dottedName */
#line 278 "asmparse.y"
-{ yypvt[-2].cad->tkOwner = 0; PASM->AddTypeDef(yypvt[-2].cad,yypvt[-0].string); } break;
-case 51:
+ { (yyvsp[-2].cad)->tkOwner = 0; PASM->AddTypeDef((yyvsp[-2].cad),(yyvsp[0].string)); }
+#line 3753 "asmparse.cpp"
+ break;
+
+ case 52: /* typedefDecl: _TYPEDEF customDescrWithOwner AS_ dottedName */
#line 279 "asmparse.y"
-{ PASM->AddTypeDef(yypvt[-2].cad,yypvt[-0].string); } break;
-case 52:
+ { PASM->AddTypeDef((yyvsp[-2].cad),(yyvsp[0].string)); }
+#line 3759 "asmparse.cpp"
+ break;
+
+ case 53: /* compControl: P_DEFINE dottedName */
#line 284 "asmparse.y"
-{ DefineVar(yypvt[-0].string, NULL); } break;
-case 53:
+ { DefineVar((yyvsp[0].string), NULL); }
+#line 3765 "asmparse.cpp"
+ break;
+
+ case 54: /* compControl: P_DEFINE dottedName compQstring */
#line 285 "asmparse.y"
-{ DefineVar(yypvt[-1].string, yypvt[-0].binstr); } break;
-case 54:
+ { DefineVar((yyvsp[-1].string), (yyvsp[0].binstr)); }
+#line 3771 "asmparse.cpp"
+ break;
+
+ case 55: /* compControl: P_UNDEF dottedName */
#line 286 "asmparse.y"
-{ UndefVar(yypvt[-0].string); } break;
-case 55:
+ { UndefVar((yyvsp[0].string)); }
+#line 3777 "asmparse.cpp"
+ break;
+
+ case 56: /* compControl: P_IFDEF dottedName */
#line 287 "asmparse.y"
-{ SkipToken = !IsVarDefined(yypvt[-0].string);
+ { SkipToken = !IsVarDefined((yyvsp[0].string));
IfEndif++;
- } break;
-case 56:
+ }
+#line 3785 "asmparse.cpp"
+ break;
+
+ case 57: /* compControl: P_IFNDEF dottedName */
#line 290 "asmparse.y"
-{ SkipToken = IsVarDefined(yypvt[-0].string);
+ { SkipToken = IsVarDefined((yyvsp[0].string));
IfEndif++;
- } break;
-case 57:
+ }
+#line 3793 "asmparse.cpp"
+ break;
+
+ case 58: /* compControl: P_ELSE */
#line 293 "asmparse.y"
-{ if(IfEndif == 1) SkipToken = !SkipToken;} break;
-case 58:
+ { if(IfEndif == 1) SkipToken = !SkipToken;}
+#line 3799 "asmparse.cpp"
+ break;
+
+ case 59: /* compControl: P_ENDIF */
#line 294 "asmparse.y"
-{ if(IfEndif == 0)
+ { if(IfEndif == 0)
PASM->report->error("Unmatched #endif\n");
else IfEndif--;
- } break;
-case 59:
+ }
+#line 3808 "asmparse.cpp"
+ break;
+
+ case 60: /* compControl: P_INCLUDE QSTRING */
#line 298 "asmparse.y"
-{ _ASSERTE(!"yylex should have dealt with this"); } break;
-case 60:
+ { _ASSERTE(!"yylex should have dealt with this"); }
+#line 3814 "asmparse.cpp"
+ break;
+
+ case 61: /* compControl: ';' */
#line 299 "asmparse.y"
-{ } break;
-case 61:
+ { }
+#line 3820 "asmparse.cpp"
+ break;
+
+ case 62: /* customDescr: _CUSTOM customType */
#line 303 "asmparse.y"
-{ yyval.cad = new CustomDescr(PASM->m_tkCurrentCVOwner, yypvt[-0].token, NULL); } break;
-case 62:
+ { (yyval.cad) = new CustomDescr(PASM->m_tkCurrentCVOwner, (yyvsp[0].token), NULL); }
+#line 3826 "asmparse.cpp"
+ break;
+
+ case 63: /* customDescr: _CUSTOM customType '=' compQstring */
#line 304 "asmparse.y"
-{ yyval.cad = new CustomDescr(PASM->m_tkCurrentCVOwner, yypvt[-2].token, yypvt[-0].binstr); } break;
-case 63:
+ { (yyval.cad) = new CustomDescr(PASM->m_tkCurrentCVOwner, (yyvsp[-2].token), (yyvsp[0].binstr)); }
+#line 3832 "asmparse.cpp"
+ break;
+
+ case 64: /* customDescr: _CUSTOM customType '=' '{' customBlobDescr '}' */
#line 305 "asmparse.y"
-{ yyval.cad = new CustomDescr(PASM->m_tkCurrentCVOwner, yypvt[-4].token, yypvt[-1].binstr); } break;
-case 64:
+ { (yyval.cad) = new CustomDescr(PASM->m_tkCurrentCVOwner, (yyvsp[-4].token), (yyvsp[-1].binstr)); }
+#line 3838 "asmparse.cpp"
+ break;
+
+ case 65: /* customDescr: customHead bytes ')' */
#line 306 "asmparse.y"
-{ yyval.cad = new CustomDescr(PASM->m_tkCurrentCVOwner, yypvt[-2].int32, yypvt[-1].binstr); } break;
-case 65:
+ { (yyval.cad) = new CustomDescr(PASM->m_tkCurrentCVOwner, (yyvsp[-2].int32), (yyvsp[-1].binstr)); }
+#line 3844 "asmparse.cpp"
+ break;
+
+ case 66: /* customDescrWithOwner: _CUSTOM '(' ownerType ')' customType */
#line 309 "asmparse.y"
-{ yyval.cad = new CustomDescr(yypvt[-2].token, yypvt[-0].token, NULL); } break;
-case 66:
+ { (yyval.cad) = new CustomDescr((yyvsp[-2].token), (yyvsp[0].token), NULL); }
+#line 3850 "asmparse.cpp"
+ break;
+
+ case 67: /* customDescrWithOwner: _CUSTOM '(' ownerType ')' customType '=' compQstring */
#line 310 "asmparse.y"
-{ yyval.cad = new CustomDescr(yypvt[-4].token, yypvt[-2].token, yypvt[-0].binstr); } break;
-case 67:
+ { (yyval.cad) = new CustomDescr((yyvsp[-4].token), (yyvsp[-2].token), (yyvsp[0].binstr)); }
+#line 3856 "asmparse.cpp"
+ break;
+
+ case 68: /* customDescrWithOwner: _CUSTOM '(' ownerType ')' customType '=' '{' customBlobDescr '}' */
#line 312 "asmparse.y"
-{ yyval.cad = new CustomDescr(yypvt[-6].token, yypvt[-4].token, yypvt[-1].binstr); } break;
-case 68:
+ { (yyval.cad) = new CustomDescr((yyvsp[-6].token), (yyvsp[-4].token), (yyvsp[-1].binstr)); }
+#line 3862 "asmparse.cpp"
+ break;
+
+ case 69: /* customDescrWithOwner: customHeadWithOwner bytes ')' */
#line 313 "asmparse.y"
-{ yyval.cad = new CustomDescr(PASM->m_tkCurrentCVOwner, yypvt[-2].int32, yypvt[-1].binstr); } break;
-case 69:
+ { (yyval.cad) = new CustomDescr(PASM->m_tkCurrentCVOwner, (yyvsp[-2].int32), (yyvsp[-1].binstr)); }
+#line 3868 "asmparse.cpp"
+ break;
+
+ case 70: /* customHead: _CUSTOM customType '=' '(' */
#line 316 "asmparse.y"
-{ yyval.int32 = yypvt[-2].token; bParsingByteArray = TRUE; } break;
-case 70:
+ { (yyval.int32) = (yyvsp[-2].token); bParsingByteArray = TRUE; }
+#line 3874 "asmparse.cpp"
+ break;
+
+ case 71: /* customHeadWithOwner: _CUSTOM '(' ownerType ')' customType '=' '(' */
#line 320 "asmparse.y"
-{ PASM->m_pCustomDescrList = NULL;
- PASM->m_tkCurrentCVOwner = yypvt[-4].token;
- yyval.int32 = yypvt[-2].token; bParsingByteArray = TRUE; } break;
-case 71:
+ { PASM->m_pCustomDescrList = NULL;
+ PASM->m_tkCurrentCVOwner = (yyvsp[-4].token);
+ (yyval.int32) = (yyvsp[-2].token); bParsingByteArray = TRUE; }
+#line 3882 "asmparse.cpp"
+ break;
+
+ case 72: /* customType: methodRef */
#line 325 "asmparse.y"
-{ yyval.token = yypvt[-0].token; } break;
-case 72:
+ { (yyval.token) = (yyvsp[0].token); }
+#line 3888 "asmparse.cpp"
+ break;
+
+ case 73: /* ownerType: typeSpec */
#line 328 "asmparse.y"
-{ yyval.token = yypvt[-0].token; } break;
-case 73:
+ { (yyval.token) = (yyvsp[0].token); }
+#line 3894 "asmparse.cpp"
+ break;
+
+ case 74: /* ownerType: memberRef */
#line 329 "asmparse.y"
-{ yyval.token = yypvt[-0].token; } break;
-case 74:
+ { (yyval.token) = (yyvsp[0].token); }
+#line 3900 "asmparse.cpp"
+ break;
+
+ case 75: /* customBlobDescr: customBlobArgs customBlobNVPairs */
#line 333 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- yyval.binstr->appendInt16(VAL16(nCustomBlobNVPairs));
- yyval.binstr->append(yypvt[-0].binstr);
- nCustomBlobNVPairs = 0; } break;
-case 75:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ (yyval.binstr)->appendInt16(VAL16(nCustomBlobNVPairs));
+ (yyval.binstr)->append((yyvsp[0].binstr));
+ nCustomBlobNVPairs = 0; }
+#line 3909 "asmparse.cpp"
+ break;
+
+ case 76: /* customBlobArgs: %empty */
#line 339 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt16(VAL16(0x0001)); } break;
-case 76:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt16(VAL16(0x0001)); }
+#line 3915 "asmparse.cpp"
+ break;
+
+ case 77: /* customBlobArgs: customBlobArgs serInit */
#line 340 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- AppendFieldToCustomBlob(yyval.binstr,yypvt[-0].binstr); } break;
-case 77:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ AppendFieldToCustomBlob((yyval.binstr),(yyvsp[0].binstr)); }
+#line 3922 "asmparse.cpp"
+ break;
+
+ case 78: /* customBlobArgs: customBlobArgs compControl */
#line 342 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; } break;
-case 78:
+ { (yyval.binstr) = (yyvsp[-1].binstr); }
+#line 3928 "asmparse.cpp"
+ break;
+
+ case 79: /* customBlobNVPairs: %empty */
#line 345 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 79:
+ { (yyval.binstr) = new BinStr(); }
+#line 3934 "asmparse.cpp"
+ break;
+
+ case 80: /* customBlobNVPairs: customBlobNVPairs fieldOrProp serializType dottedName '=' serInit */
#line 347 "asmparse.y"
-{ yyval.binstr = yypvt[-5].binstr; yyval.binstr->appendInt8(yypvt[-4].int32);
- yyval.binstr->append(yypvt[-3].binstr);
- AppendStringWithLength(yyval.binstr,yypvt[-2].string);
- AppendFieldToCustomBlob(yyval.binstr,yypvt[-0].binstr);
- nCustomBlobNVPairs++; } break;
-case 80:
+ { (yyval.binstr) = (yyvsp[-5].binstr); (yyval.binstr)->appendInt8((yyvsp[-4].int32));
+ (yyval.binstr)->append((yyvsp[-3].binstr));
+ AppendStringWithLength((yyval.binstr),(yyvsp[-2].string));
+ AppendFieldToCustomBlob((yyval.binstr),(yyvsp[0].binstr));
+ nCustomBlobNVPairs++; }
+#line 3944 "asmparse.cpp"
+ break;
+
+ case 81: /* customBlobNVPairs: customBlobNVPairs compControl */
#line 352 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; } break;
-case 81:
+ { (yyval.binstr) = (yyvsp[-1].binstr); }
+#line 3950 "asmparse.cpp"
+ break;
+
+ case 82: /* fieldOrProp: FIELD_ */
#line 355 "asmparse.y"
-{ yyval.int32 = SERIALIZATION_TYPE_FIELD; } break;
-case 82:
+ { (yyval.int32) = SERIALIZATION_TYPE_FIELD; }
+#line 3956 "asmparse.cpp"
+ break;
+
+ case 83: /* fieldOrProp: PROPERTY_ */
#line 356 "asmparse.y"
-{ yyval.int32 = SERIALIZATION_TYPE_PROPERTY; } break;
-case 83:
+ { (yyval.int32) = SERIALIZATION_TYPE_PROPERTY; }
+#line 3962 "asmparse.cpp"
+ break;
+
+ case 84: /* customAttrDecl: customDescr */
#line 359 "asmparse.y"
-{ if(yypvt[-0].cad->tkOwner && !yypvt[-0].cad->tkInterfacePair)
- PASM->DefineCV(yypvt[-0].cad);
+ { if((yyvsp[0].cad)->tkOwner && !(yyvsp[0].cad)->tkInterfacePair)
+ PASM->DefineCV((yyvsp[0].cad));
else if(PASM->m_pCustomDescrList)
- PASM->m_pCustomDescrList->PUSH(yypvt[-0].cad); } break;
-case 84:
+ PASM->m_pCustomDescrList->PUSH((yyvsp[0].cad)); }
+#line 3971 "asmparse.cpp"
+ break;
+
+ case 85: /* customAttrDecl: customDescrWithOwner */
#line 363 "asmparse.y"
-{ PASM->DefineCV(yypvt[-0].cad); } break;
-case 85:
+ { PASM->DefineCV((yyvsp[0].cad)); }
+#line 3977 "asmparse.cpp"
+ break;
+
+ case 86: /* customAttrDecl: TYPEDEF_CA */
#line 364 "asmparse.y"
-{ CustomDescr* pNew = new CustomDescr(yypvt[-0].tdd->m_pCA);
+ { CustomDescr* pNew = new CustomDescr((yyvsp[0].tdd)->m_pCA);
if(pNew->tkOwner == 0) pNew->tkOwner = PASM->m_tkCurrentCVOwner;
if(pNew->tkOwner)
PASM->DefineCV(pNew);
else if(PASM->m_pCustomDescrList)
- PASM->m_pCustomDescrList->PUSH(pNew); } break;
-case 86:
+ PASM->m_pCustomDescrList->PUSH(pNew); }
+#line 3988 "asmparse.cpp"
+ break;
+
+ case 87: /* serializType: simpleType */
#line 372 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 87:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 3994 "asmparse.cpp"
+ break;
+
+ case 88: /* serializType: TYPE_ */
#line 373 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); } break;
-case 88:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_TYPE); }
+#line 4000 "asmparse.cpp"
+ break;
+
+ case 89: /* serializType: OBJECT_ */
#line 374 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TAGGED_OBJECT); } break;
-case 89:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_TAGGED_OBJECT); }
+#line 4006 "asmparse.cpp"
+ break;
+
+ case 90: /* serializType: ENUM_ CLASS_ SQSTRING */
#line 375 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
- AppendStringWithLength(yyval.binstr,yypvt[-0].string); } break;
-case 90:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_ENUM);
+ AppendStringWithLength((yyval.binstr),(yyvsp[0].string)); }
+#line 4013 "asmparse.cpp"
+ break;
+
+ case 91: /* serializType: ENUM_ className */
#line 377 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
- AppendStringWithLength(yyval.binstr,PASM->ReflectionNotation(yypvt[-0].token)); } break;
-case 91:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_ENUM);
+ AppendStringWithLength((yyval.binstr),PASM->ReflectionNotation((yyvsp[0].token))); }
+#line 4020 "asmparse.cpp"
+ break;
+
+ case 92: /* serializType: serializType '[' ']' */
#line 379 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 92:
+ { (yyval.binstr) = (yyvsp[-2].binstr); (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 4026 "asmparse.cpp"
+ break;
+
+ case 93: /* moduleHead: _MODULE */
#line 384 "asmparse.y"
-{ PASMM->SetModuleName(NULL); PASM->m_tkCurrentCVOwner=1; } break;
-case 93:
+ { PASMM->SetModuleName(NULL); PASM->m_tkCurrentCVOwner=1; }
+#line 4032 "asmparse.cpp"
+ break;
+
+ case 94: /* moduleHead: _MODULE dottedName */
#line 385 "asmparse.y"
-{ PASMM->SetModuleName(yypvt[-0].string); PASM->m_tkCurrentCVOwner=1; } break;
-case 94:
+ { PASMM->SetModuleName((yyvsp[0].string)); PASM->m_tkCurrentCVOwner=1; }
+#line 4038 "asmparse.cpp"
+ break;
+
+ case 95: /* moduleHead: _MODULE EXTERN_ dottedName */
#line 386 "asmparse.y"
-{ BinStr* pbs = new BinStr();
- unsigned L = (unsigned)strlen(yypvt[-0].string);
- memcpy((char*)(pbs->getBuff(L)),yypvt[-0].string,L);
- PASM->EmitImport(pbs); delete pbs;} break;
-case 95:
+ { BinStr* pbs = new BinStr();
+ unsigned L = (unsigned)strlen((yyvsp[0].string));
+ memcpy((char*)(pbs->getBuff(L)),(yyvsp[0].string),L);
+ PASM->EmitImport(pbs); delete pbs;}
+#line 4047 "asmparse.cpp"
+ break;
+
+ case 96: /* vtfixupDecl: _VTFIXUP '[' int32 ']' vtfixupAttr AT_ id */
#line 393 "asmparse.y"
-{ /*PASM->SetDataSection(); PASM->EmitDataLabel($7);*/
- PASM->m_VTFList.PUSH(new VTFEntry((USHORT)yypvt[-4].int32, (USHORT)yypvt[-2].int32, yypvt[-0].string)); } break;
-case 96:
+ { /*PASM->SetDataSection(); PASM->EmitDataLabel($7);*/
+ PASM->m_VTFList.PUSH(new VTFEntry((USHORT)(yyvsp[-4].int32), (USHORT)(yyvsp[-2].int32), (yyvsp[0].string))); }
+#line 4054 "asmparse.cpp"
+ break;
+
+ case 97: /* vtfixupAttr: %empty */
#line 397 "asmparse.y"
-{ yyval.int32 = 0; } break;
-case 97:
+ { (yyval.int32) = 0; }
+#line 4060 "asmparse.cpp"
+ break;
+
+ case 98: /* vtfixupAttr: vtfixupAttr INT32_ */
#line 398 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | COR_VTABLE_32BIT; } break;
-case 98:
+ { (yyval.int32) = (yyvsp[-1].int32) | COR_VTABLE_32BIT; }
+#line 4066 "asmparse.cpp"
+ break;
+
+ case 99: /* vtfixupAttr: vtfixupAttr INT64_ */
#line 399 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | COR_VTABLE_64BIT; } break;
-case 99:
+ { (yyval.int32) = (yyvsp[-1].int32) | COR_VTABLE_64BIT; }
+#line 4072 "asmparse.cpp"
+ break;
+
+ case 100: /* vtfixupAttr: vtfixupAttr FROMUNMANAGED_ */
#line 400 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | COR_VTABLE_FROM_UNMANAGED; } break;
-case 100:
+ { (yyval.int32) = (yyvsp[-1].int32) | COR_VTABLE_FROM_UNMANAGED; }
+#line 4078 "asmparse.cpp"
+ break;
+
+ case 101: /* vtfixupAttr: vtfixupAttr CALLMOSTDERIVED_ */
#line 401 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | COR_VTABLE_CALL_MOST_DERIVED; } break;
-case 101:
+ { (yyval.int32) = (yyvsp[-1].int32) | COR_VTABLE_CALL_MOST_DERIVED; }
+#line 4084 "asmparse.cpp"
+ break;
+
+ case 102: /* vtfixupAttr: vtfixupAttr RETAINAPPDOMAIN_ */
#line 402 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN; } break;
-case 102:
+ { (yyval.int32) = (yyvsp[-1].int32) | COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN; }
+#line 4090 "asmparse.cpp"
+ break;
+
+ case 103: /* vtableDecl: vtableHead bytes ')' */
#line 405 "asmparse.y"
-{ PASM->m_pVTable = yypvt[-1].binstr; } break;
-case 103:
+ { PASM->m_pVTable = (yyvsp[-1].binstr); }
+#line 4096 "asmparse.cpp"
+ break;
+
+ case 104: /* vtableHead: _VTABLE '=' '(' */
#line 408 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
-case 104:
+ { bParsingByteArray = TRUE; }
+#line 4102 "asmparse.cpp"
+ break;
+
+ case 105: /* nameSpaceHead: _NAMESPACE dottedName */
#line 412 "asmparse.y"
-{ PASM->StartNameSpace(yypvt[-0].string); } break;
-case 105:
+ { PASM->StartNameSpace((yyvsp[0].string)); }
+#line 4108 "asmparse.cpp"
+ break;
+
+ case 106: /* _class: _CLASS */
#line 415 "asmparse.y"
-{ newclass = TRUE; } break;
-case 106:
+ { newclass = TRUE; }
+#line 4114 "asmparse.cpp"
+ break;
+
+ case 107: /* classHeadBegin: _class classAttr dottedName typarsClause */
#line 418 "asmparse.y"
-{ if(yypvt[-0].typarlist) FixupConstraints();
- PASM->StartClass(yypvt[-1].string, yypvt[-2].classAttr, yypvt[-0].typarlist);
+ { if((yyvsp[0].typarlist)) FixupConstraints();
+ PASM->StartClass((yyvsp[-1].string), (yyvsp[-2].classAttr), (yyvsp[0].typarlist));
TyParFixupList.RESET(false);
newclass = FALSE;
- } break;
-case 107:
+ }
+#line 4124 "asmparse.cpp"
+ break;
+
+ case 108: /* classHead: classHeadBegin extendsClause implClause */
#line 424 "asmparse.y"
-{ PASM->AddClass(); } break;
-case 108:
+ { PASM->AddClass(); }
+#line 4130 "asmparse.cpp"
+ break;
+
+ case 109: /* classAttr: %empty */
#line 427 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) 0; } break;
-case 109:
+ { (yyval.classAttr) = (CorRegTypeAttr) 0; }
+#line 4136 "asmparse.cpp"
+ break;
+
+ case 110: /* classAttr: classAttr PUBLIC_ */
#line 428 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-1].classAttr & ~tdVisibilityMask) | tdPublic); } break;
-case 110:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-1].classAttr) & ~tdVisibilityMask) | tdPublic); }
+#line 4142 "asmparse.cpp"
+ break;
+
+ case 111: /* classAttr: classAttr PRIVATE_ */
#line 429 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-1].classAttr & ~tdVisibilityMask) | tdNotPublic); } break;
-case 111:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-1].classAttr) & ~tdVisibilityMask) | tdNotPublic); }
+#line 4148 "asmparse.cpp"
+ break;
+
+ case 112: /* classAttr: classAttr VALUE_ */
#line 430 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | 0x80000000 | tdSealed); } break;
-case 112:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | 0x80000000 | tdSealed); }
+#line 4154 "asmparse.cpp"
+ break;
+
+ case 113: /* classAttr: classAttr ENUM_ */
#line 431 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | 0x40000000); } break;
-case 113:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | 0x40000000); }
+#line 4160 "asmparse.cpp"
+ break;
+
+ case 114: /* classAttr: classAttr INTERFACE_ */
#line 432 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | tdInterface | tdAbstract); } break;
-case 114:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | tdInterface | tdAbstract); }
+#line 4166 "asmparse.cpp"
+ break;
+
+ case 115: /* classAttr: classAttr SEALED_ */
#line 433 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | tdSealed); } break;
-case 115:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | tdSealed); }
+#line 4172 "asmparse.cpp"
+ break;
+
+ case 116: /* classAttr: classAttr ABSTRACT_ */
#line 434 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | tdAbstract); } break;
-case 116:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | tdAbstract); }
+#line 4178 "asmparse.cpp"
+ break;
+
+ case 117: /* classAttr: classAttr AUTO_ */
#line 435 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-1].classAttr & ~tdLayoutMask) | tdAutoLayout); } break;
-case 117:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-1].classAttr) & ~tdLayoutMask) | tdAutoLayout); }
+#line 4184 "asmparse.cpp"
+ break;
+
+ case 118: /* classAttr: classAttr SEQUENTIAL_ */
#line 436 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-1].classAttr & ~tdLayoutMask) | tdSequentialLayout); } break;
-case 118:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-1].classAttr) & ~tdLayoutMask) | tdSequentialLayout); }
+#line 4190 "asmparse.cpp"
+ break;
+
+ case 119: /* classAttr: classAttr EXPLICIT_ */
#line 437 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-1].classAttr & ~tdLayoutMask) | tdExplicitLayout); } break;
-case 119:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-1].classAttr) & ~tdLayoutMask) | tdExplicitLayout); }
+#line 4196 "asmparse.cpp"
+ break;
+
+ case 120: /* classAttr: classAttr ANSI_ */
#line 438 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-1].classAttr & ~tdStringFormatMask) | tdAnsiClass); } break;
-case 120:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-1].classAttr) & ~tdStringFormatMask) | tdAnsiClass); }
+#line 4202 "asmparse.cpp"
+ break;
+
+ case 121: /* classAttr: classAttr UNICODE_ */
#line 439 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-1].classAttr & ~tdStringFormatMask) | tdUnicodeClass); } break;
-case 121:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-1].classAttr) & ~tdStringFormatMask) | tdUnicodeClass); }
+#line 4208 "asmparse.cpp"
+ break;
+
+ case 122: /* classAttr: classAttr AUTOCHAR_ */
#line 440 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-1].classAttr & ~tdStringFormatMask) | tdAutoClass); } break;
-case 122:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-1].classAttr) & ~tdStringFormatMask) | tdAutoClass); }
+#line 4214 "asmparse.cpp"
+ break;
+
+ case 123: /* classAttr: classAttr IMPORT_ */
#line 441 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | tdImport); } break;
-case 123:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | tdImport); }
+#line 4220 "asmparse.cpp"
+ break;
+
+ case 124: /* classAttr: classAttr SERIALIZABLE_ */
#line 442 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | tdSerializable); } break;
-case 124:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | tdSerializable); }
+#line 4226 "asmparse.cpp"
+ break;
+
+ case 125: /* classAttr: classAttr WINDOWSRUNTIME_ */
#line 443 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | tdWindowsRuntime); } break;
-case 125:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | tdWindowsRuntime); }
+#line 4232 "asmparse.cpp"
+ break;
+
+ case 126: /* classAttr: classAttr NESTED_ PUBLIC_ */
#line 444 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-2].classAttr & ~tdVisibilityMask) | tdNestedPublic); } break;
-case 126:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-2].classAttr) & ~tdVisibilityMask) | tdNestedPublic); }
+#line 4238 "asmparse.cpp"
+ break;
+
+ case 127: /* classAttr: classAttr NESTED_ PRIVATE_ */
#line 445 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-2].classAttr & ~tdVisibilityMask) | tdNestedPrivate); } break;
-case 127:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-2].classAttr) & ~tdVisibilityMask) | tdNestedPrivate); }
+#line 4244 "asmparse.cpp"
+ break;
+
+ case 128: /* classAttr: classAttr NESTED_ FAMILY_ */
#line 446 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-2].classAttr & ~tdVisibilityMask) | tdNestedFamily); } break;
-case 128:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-2].classAttr) & ~tdVisibilityMask) | tdNestedFamily); }
+#line 4250 "asmparse.cpp"
+ break;
+
+ case 129: /* classAttr: classAttr NESTED_ ASSEMBLY_ */
#line 447 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-2].classAttr & ~tdVisibilityMask) | tdNestedAssembly); } break;
-case 129:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-2].classAttr) & ~tdVisibilityMask) | tdNestedAssembly); }
+#line 4256 "asmparse.cpp"
+ break;
+
+ case 130: /* classAttr: classAttr NESTED_ FAMANDASSEM_ */
#line 448 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-2].classAttr & ~tdVisibilityMask) | tdNestedFamANDAssem); } break;
-case 130:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-2].classAttr) & ~tdVisibilityMask) | tdNestedFamANDAssem); }
+#line 4262 "asmparse.cpp"
+ break;
+
+ case 131: /* classAttr: classAttr NESTED_ FAMORASSEM_ */
#line 449 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) ((yypvt[-2].classAttr & ~tdVisibilityMask) | tdNestedFamORAssem); } break;
-case 131:
+ { (yyval.classAttr) = (CorRegTypeAttr) (((yyvsp[-2].classAttr) & ~tdVisibilityMask) | tdNestedFamORAssem); }
+#line 4268 "asmparse.cpp"
+ break;
+
+ case 132: /* classAttr: classAttr BEFOREFIELDINIT_ */
#line 450 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | tdBeforeFieldInit); } break;
-case 132:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | tdBeforeFieldInit); }
+#line 4274 "asmparse.cpp"
+ break;
+
+ case 133: /* classAttr: classAttr SPECIALNAME_ */
#line 451 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr | tdSpecialName); } break;
-case 133:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr) | tdSpecialName); }
+#line 4280 "asmparse.cpp"
+ break;
+
+ case 134: /* classAttr: classAttr RTSPECIALNAME_ */
#line 452 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].classAttr); } break;
-case 134:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].classAttr)); }
+#line 4286 "asmparse.cpp"
+ break;
+
+ case 135: /* classAttr: classAttr FLAGS_ '(' int32 ')' */
#line 453 "asmparse.y"
-{ yyval.classAttr = (CorRegTypeAttr) (yypvt[-1].int32); } break;
-case 136:
+ { (yyval.classAttr) = (CorRegTypeAttr) ((yyvsp[-1].int32)); }
+#line 4292 "asmparse.cpp"
+ break;
+
+ case 137: /* extendsClause: EXTENDS_ typeSpec */
#line 457 "asmparse.y"
-{ PASM->m_crExtends = yypvt[-0].token; } break;
-case 141:
+ { PASM->m_crExtends = (yyvsp[0].token); }
+#line 4298 "asmparse.cpp"
+ break;
+
+ case 142: /* implList: implList ',' typeSpec */
#line 468 "asmparse.y"
-{ PASM->AddToImplList(yypvt[-0].token); } break;
-case 142:
+ { PASM->AddToImplList((yyvsp[0].token)); }
+#line 4304 "asmparse.cpp"
+ break;
+
+ case 143: /* implList: typeSpec */
#line 469 "asmparse.y"
-{ PASM->AddToImplList(yypvt[-0].token); } break;
-case 143:
+ { PASM->AddToImplList((yyvsp[0].token)); }
+#line 4310 "asmparse.cpp"
+ break;
+
+ case 144: /* typeList: %empty */
#line 473 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 144:
+ { (yyval.binstr) = new BinStr(); }
+#line 4316 "asmparse.cpp"
+ break;
+
+ case 145: /* typeList: typeListNotEmpty */
#line 474 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 145:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 4322 "asmparse.cpp"
+ break;
+
+ case 146: /* typeListNotEmpty: typeSpec */
#line 477 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(yypvt[-0].token); } break;
-case 146:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt32((yyvsp[0].token)); }
+#line 4328 "asmparse.cpp"
+ break;
+
+ case 147: /* typeListNotEmpty: typeListNotEmpty ',' typeSpec */
#line 478 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->appendInt32(yypvt[-0].token); } break;
-case 147:
+ { (yyval.binstr) = (yyvsp[-2].binstr); (yyval.binstr)->appendInt32((yyvsp[0].token)); }
+#line 4334 "asmparse.cpp"
+ break;
+
+ case 148: /* typarsClause: %empty */
#line 481 "asmparse.y"
-{ yyval.typarlist = NULL; PASM->m_TyParList = NULL;} break;
-case 148:
+ { (yyval.typarlist) = NULL; PASM->m_TyParList = NULL;}
+#line 4340 "asmparse.cpp"
+ break;
+
+ case 149: /* typarsClause: '<' typars '>' */
#line 482 "asmparse.y"
-{ yyval.typarlist = yypvt[-1].typarlist; PASM->m_TyParList = yypvt[-1].typarlist;} break;
-case 149:
+ { (yyval.typarlist) = (yyvsp[-1].typarlist); PASM->m_TyParList = (yyvsp[-1].typarlist);}
+#line 4346 "asmparse.cpp"
+ break;
+
+ case 150: /* typarAttrib: '+' */
#line 485 "asmparse.y"
-{ yyval.int32 = gpCovariant; } break;
-case 150:
+ { (yyval.int32) = gpCovariant; }
+#line 4352 "asmparse.cpp"
+ break;
+
+ case 151: /* typarAttrib: '-' */
#line 486 "asmparse.y"
-{ yyval.int32 = gpContravariant; } break;
-case 151:
+ { (yyval.int32) = gpContravariant; }
+#line 4358 "asmparse.cpp"
+ break;
+
+ case 152: /* typarAttrib: CLASS_ */
#line 487 "asmparse.y"
-{ yyval.int32 = gpReferenceTypeConstraint; } break;
-case 152:
+ { (yyval.int32) = gpReferenceTypeConstraint; }
+#line 4364 "asmparse.cpp"
+ break;
+
+ case 153: /* typarAttrib: VALUETYPE_ */
#line 488 "asmparse.y"
-{ yyval.int32 = gpNotNullableValueTypeConstraint; } break;
-case 153:
+ { (yyval.int32) = gpNotNullableValueTypeConstraint; }
+#line 4370 "asmparse.cpp"
+ break;
+
+ case 154: /* typarAttrib: BYREFLIKE_ */
#line 489 "asmparse.y"
-{ yyval.int32 = gpAllowByRefLike; } break;
-case 154:
+ { (yyval.int32) = gpAllowByRefLike; }
+#line 4376 "asmparse.cpp"
+ break;
+
+ case 155: /* typarAttrib: _CTOR */
#line 490 "asmparse.y"
-{ yyval.int32 = gpDefaultConstructorConstraint; } break;
-case 155:
+ { (yyval.int32) = gpDefaultConstructorConstraint; }
+#line 4382 "asmparse.cpp"
+ break;
+
+ case 156: /* typarAttrib: FLAGS_ '(' int32 ')' */
#line 491 "asmparse.y"
-{ yyval.int32 = (CorGenericParamAttr)yypvt[-1].int32; } break;
-case 156:
+ { (yyval.int32) = (CorGenericParamAttr)(yyvsp[-1].int32); }
+#line 4388 "asmparse.cpp"
+ break;
+
+ case 157: /* typarAttribs: %empty */
#line 494 "asmparse.y"
-{ yyval.int32 = 0; } break;
-case 157:
+ { (yyval.int32) = 0; }
+#line 4394 "asmparse.cpp"
+ break;
+
+ case 158: /* typarAttribs: typarAttrib typarAttribs */
#line 495 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | yypvt[-0].int32; } break;
-case 158:
+ { (yyval.int32) = (yyvsp[-1].int32) | (yyvsp[0].int32); }
+#line 4400 "asmparse.cpp"
+ break;
+
+ case 159: /* typars: typarAttribs tyBound dottedName typarsRest */
#line 498 "asmparse.y"
-{yyval.typarlist = new TyParList(yypvt[-3].int32, yypvt[-2].binstr, yypvt[-1].string, yypvt[-0].typarlist);} break;
-case 159:
+ {(yyval.typarlist) = new TyParList((yyvsp[-3].int32), (yyvsp[-2].binstr), (yyvsp[-1].string), (yyvsp[0].typarlist));}
+#line 4406 "asmparse.cpp"
+ break;
+
+ case 160: /* typars: typarAttribs dottedName typarsRest */
#line 499 "asmparse.y"
-{yyval.typarlist = new TyParList(yypvt[-2].int32, NULL, yypvt[-1].string, yypvt[-0].typarlist);} break;
-case 160:
+ {(yyval.typarlist) = new TyParList((yyvsp[-2].int32), NULL, (yyvsp[-1].string), (yyvsp[0].typarlist));}
+#line 4412 "asmparse.cpp"
+ break;
+
+ case 161: /* typarsRest: %empty */
#line 502 "asmparse.y"
-{ yyval.typarlist = NULL; } break;
-case 161:
+ { (yyval.typarlist) = NULL; }
+#line 4418 "asmparse.cpp"
+ break;
+
+ case 162: /* typarsRest: ',' typars */
#line 503 "asmparse.y"
-{ yyval.typarlist = yypvt[-0].typarlist; } break;
-case 162:
+ { (yyval.typarlist) = (yyvsp[0].typarlist); }
+#line 4424 "asmparse.cpp"
+ break;
+
+ case 163: /* tyBound: '(' typeList ')' */
#line 506 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; } break;
-case 163:
+ { (yyval.binstr) = (yyvsp[-1].binstr); }
+#line 4430 "asmparse.cpp"
+ break;
+
+ case 164: /* genArity: %empty */
#line 509 "asmparse.y"
-{ yyval.int32= 0; } break;
-case 164:
+ { (yyval.int32)= 0; }
+#line 4436 "asmparse.cpp"
+ break;
+
+ case 165: /* genArity: genArityNotEmpty */
#line 510 "asmparse.y"
-{ yyval.int32 = yypvt[-0].int32; } break;
-case 165:
+ { (yyval.int32) = (yyvsp[0].int32); }
+#line 4442 "asmparse.cpp"
+ break;
+
+ case 166: /* genArityNotEmpty: '<' '[' int32 ']' '>' */
#line 513 "asmparse.y"
-{ yyval.int32 = yypvt[-2].int32; } break;
-case 166:
+ { (yyval.int32) = (yyvsp[-2].int32); }
+#line 4448 "asmparse.cpp"
+ break;
+
+ case 167: /* classDecl: methodHead methodDecls '}' */
#line 517 "asmparse.y"
-{ if(PASM->m_pCurMethod->m_ulLines[1] ==0)
+ { if(PASM->m_pCurMethod->m_ulLines[1] ==0)
{ PASM->m_pCurMethod->m_ulLines[1] = PASM->m_ulCurLine;
PASM->m_pCurMethod->m_ulColumns[1]=PASM->m_ulCurColumn;}
- PASM->EndMethod(); } break;
-case 167:
+ PASM->EndMethod(); }
+#line 4457 "asmparse.cpp"
+ break;
+
+ case 168: /* classDecl: classHead '{' classDecls '}' */
#line 521 "asmparse.y"
-{ PASM->EndClass(); } break;
-case 168:
+ { PASM->EndClass(); }
+#line 4463 "asmparse.cpp"
+ break;
+
+ case 169: /* classDecl: eventHead '{' eventDecls '}' */
#line 522 "asmparse.y"
-{ PASM->EndEvent(); } break;
-case 169:
+ { PASM->EndEvent(); }
+#line 4469 "asmparse.cpp"
+ break;
+
+ case 170: /* classDecl: propHead '{' propDecls '}' */
#line 523 "asmparse.y"
-{ PASM->EndProp(); } break;
-case 175:
+ { PASM->EndProp(); }
+#line 4475 "asmparse.cpp"
+ break;
+
+ case 176: /* classDecl: _SIZE int32 */
#line 529 "asmparse.y"
-{ PASM->m_pCurClass->m_ulSize = yypvt[-0].int32; } break;
-case 176:
+ { PASM->m_pCurClass->m_ulSize = (yyvsp[0].int32); }
+#line 4481 "asmparse.cpp"
+ break;
+
+ case 177: /* classDecl: _PACK int32 */
#line 530 "asmparse.y"
-{ PASM->m_pCurClass->m_ulPack = yypvt[-0].int32; } break;
-case 177:
+ { PASM->m_pCurClass->m_ulPack = (yyvsp[0].int32); }
+#line 4487 "asmparse.cpp"
+ break;
+
+ case 178: /* classDecl: exportHead '{' exptypeDecls '}' */
#line 531 "asmparse.y"
-{ PASMM->EndComType(); } break;
-case 178:
+ { PASMM->EndComType(); }
+#line 4493 "asmparse.cpp"
+ break;
+
+ case 179: /* classDecl: _OVERRIDE typeSpec DCOLON methodName WITH_ callConv type typeSpec DCOLON methodName '(' sigArgs0 ')' */
#line 533 "asmparse.y"
-{ BinStr *sig1 = parser->MakeSig(yypvt[-7].int32, yypvt[-6].binstr, yypvt[-1].binstr);
+ { BinStr *sig1 = parser->MakeSig((yyvsp[-7].int32), (yyvsp[-6].binstr), (yyvsp[-1].binstr));
BinStr *sig2 = new BinStr(); sig2->append(sig1);
- PASM->AddMethodImpl(yypvt[-11].token,yypvt[-9].string,sig1,yypvt[-5].token,yypvt[-3].string,sig2);
+ PASM->AddMethodImpl((yyvsp[-11].token),(yyvsp[-9].string),sig1,(yyvsp[-5].token),(yyvsp[-3].string),sig2);
PASM->ResetArgNameList();
- } break;
-case 179:
+ }
+#line 4503 "asmparse.cpp"
+ break;
+
+ case 180: /* classDecl: _OVERRIDE METHOD_ callConv type typeSpec DCOLON methodName genArity '(' sigArgs0 ')' WITH_ METHOD_ callConv type typeSpec DCOLON methodName genArity '(' sigArgs0 ')' */
#line 539 "asmparse.y"
-{ PASM->AddMethodImpl(yypvt[-17].token,yypvt[-15].string,
- (yypvt[-14].int32==0 ? parser->MakeSig(yypvt[-19].int32,yypvt[-18].binstr,yypvt[-12].binstr) :
- parser->MakeSig(yypvt[-19].int32| IMAGE_CEE_CS_CALLCONV_GENERIC,yypvt[-18].binstr,yypvt[-12].binstr,yypvt[-14].int32)),
- yypvt[-6].token,yypvt[-4].string,
- (yypvt[-3].int32==0 ? parser->MakeSig(yypvt[-8].int32,yypvt[-7].binstr,yypvt[-1].binstr) :
- parser->MakeSig(yypvt[-8].int32| IMAGE_CEE_CS_CALLCONV_GENERIC,yypvt[-7].binstr,yypvt[-1].binstr,yypvt[-3].int32)));
+ { PASM->AddMethodImpl((yyvsp[-17].token),(yyvsp[-15].string),
+ ((yyvsp[-14].int32)==0 ? parser->MakeSig((yyvsp[-19].int32),(yyvsp[-18].binstr),(yyvsp[-12].binstr)) :
+ parser->MakeSig((yyvsp[-19].int32)| IMAGE_CEE_CS_CALLCONV_GENERIC,(yyvsp[-18].binstr),(yyvsp[-12].binstr),(yyvsp[-14].int32))),
+ (yyvsp[-6].token),(yyvsp[-4].string),
+ ((yyvsp[-3].int32)==0 ? parser->MakeSig((yyvsp[-8].int32),(yyvsp[-7].binstr),(yyvsp[-1].binstr)) :
+ parser->MakeSig((yyvsp[-8].int32)| IMAGE_CEE_CS_CALLCONV_GENERIC,(yyvsp[-7].binstr),(yyvsp[-1].binstr),(yyvsp[-3].int32))));
PASM->ResetArgNameList();
- } break;
-case 182:
+ }
+#line 4516 "asmparse.cpp"
+ break;
+
+ case 183: /* classDecl: _PARAM TYPE_ '[' int32 ']' */
#line 549 "asmparse.y"
-{ if((yypvt[-1].int32 > 0) && (yypvt[-1].int32 <= (int)PASM->m_pCurClass->m_NumTyPars))
- PASM->m_pCustomDescrList = PASM->m_pCurClass->m_TyPars[yypvt[-1].int32-1].CAList();
+ { if(((yyvsp[-1].int32) > 0) && ((yyvsp[-1].int32) <= (int)PASM->m_pCurClass->m_NumTyPars))
+ PASM->m_pCustomDescrList = PASM->m_pCurClass->m_TyPars[(yyvsp[-1].int32)-1].CAList();
else
PASM->report->error("Type parameter index out of range\n");
- } break;
-case 183:
+ }
+#line 4526 "asmparse.cpp"
+ break;
+
+ case 184: /* classDecl: _PARAM TYPE_ dottedName */
#line 554 "asmparse.y"
-{ int n = PASM->m_pCurClass->FindTyPar(yypvt[-0].string);
+ { int n = PASM->m_pCurClass->FindTyPar((yyvsp[0].string));
if(n >= 0)
PASM->m_pCustomDescrList = PASM->m_pCurClass->m_TyPars[n].CAList();
else
- PASM->report->error("Type parameter '%s' undefined\n",yypvt[-0].string);
- } break;
-case 184:
+ PASM->report->error("Type parameter '%s' undefined\n",(yyvsp[0].string));
+ }
+#line 4537 "asmparse.cpp"
+ break;
+
+ case 185: /* classDecl: _PARAM CONSTRAINT_ '[' int32 ']' ',' typeSpec */
#line 560 "asmparse.y"
-{ PASM->AddGenericParamConstraint(yypvt[-3].int32, 0, yypvt[-0].token); } break;
-case 185:
+ { PASM->AddGenericParamConstraint((yyvsp[-3].int32), 0, (yyvsp[0].token)); }
+#line 4543 "asmparse.cpp"
+ break;
+
+ case 186: /* classDecl: _PARAM CONSTRAINT_ dottedName ',' typeSpec */
#line 561 "asmparse.y"
-{ PASM->AddGenericParamConstraint(0, yypvt[-2].string, yypvt[-0].token); } break;
-case 186:
+ { PASM->AddGenericParamConstraint(0, (yyvsp[-2].string), (yyvsp[0].token)); }
+#line 4549 "asmparse.cpp"
+ break;
+
+ case 187: /* classDecl: _INTERFACEIMPL TYPE_ typeSpec customDescr */
#line 562 "asmparse.y"
-{ yypvt[-0].cad->tkInterfacePair = yypvt[-1].token;
+ { (yyvsp[0].cad)->tkInterfacePair = (yyvsp[-1].token);
if(PASM->m_pCustomDescrList)
- PASM->m_pCustomDescrList->PUSH(yypvt[-0].cad);
- } break;
-case 187:
+ PASM->m_pCustomDescrList->PUSH((yyvsp[0].cad));
+ }
+#line 4558 "asmparse.cpp"
+ break;
+
+ case 188: /* fieldDecl: _FIELD repeatOpt fieldAttr type dottedName atOpt initOpt */
#line 570 "asmparse.y"
-{ yypvt[-3].binstr->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
- PASM->AddField(yypvt[-2].string, yypvt[-3].binstr, yypvt[-4].fieldAttr, yypvt[-1].string, yypvt[-0].binstr, yypvt[-5].int32); } break;
-case 188:
+ { (yyvsp[-3].binstr)->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
+ PASM->AddField((yyvsp[-2].string), (yyvsp[-3].binstr), (yyvsp[-4].fieldAttr), (yyvsp[-1].string), (yyvsp[0].binstr), (yyvsp[-5].int32)); }
+#line 4565 "asmparse.cpp"
+ break;
+
+ case 189: /* fieldAttr: %empty */
#line 574 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) 0; } break;
-case 189:
+ { (yyval.fieldAttr) = (CorFieldAttr) 0; }
+#line 4571 "asmparse.cpp"
+ break;
+
+ case 190: /* fieldAttr: fieldAttr STATIC_ */
#line 575 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) (yypvt[-1].fieldAttr | fdStatic); } break;
-case 190:
+ { (yyval.fieldAttr) = (CorFieldAttr) ((yyvsp[-1].fieldAttr) | fdStatic); }
+#line 4577 "asmparse.cpp"
+ break;
+
+ case 191: /* fieldAttr: fieldAttr PUBLIC_ */
#line 576 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) ((yypvt[-1].fieldAttr & ~mdMemberAccessMask) | fdPublic); } break;
-case 191:
+ { (yyval.fieldAttr) = (CorFieldAttr) (((yyvsp[-1].fieldAttr) & ~mdMemberAccessMask) | fdPublic); }
+#line 4583 "asmparse.cpp"
+ break;
+
+ case 192: /* fieldAttr: fieldAttr PRIVATE_ */
#line 577 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) ((yypvt[-1].fieldAttr & ~mdMemberAccessMask) | fdPrivate); } break;
-case 192:
+ { (yyval.fieldAttr) = (CorFieldAttr) (((yyvsp[-1].fieldAttr) & ~mdMemberAccessMask) | fdPrivate); }
+#line 4589 "asmparse.cpp"
+ break;
+
+ case 193: /* fieldAttr: fieldAttr FAMILY_ */
#line 578 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) ((yypvt[-1].fieldAttr & ~mdMemberAccessMask) | fdFamily); } break;
-case 193:
+ { (yyval.fieldAttr) = (CorFieldAttr) (((yyvsp[-1].fieldAttr) & ~mdMemberAccessMask) | fdFamily); }
+#line 4595 "asmparse.cpp"
+ break;
+
+ case 194: /* fieldAttr: fieldAttr INITONLY_ */
#line 579 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) (yypvt[-1].fieldAttr | fdInitOnly); } break;
-case 194:
+ { (yyval.fieldAttr) = (CorFieldAttr) ((yyvsp[-1].fieldAttr) | fdInitOnly); }
+#line 4601 "asmparse.cpp"
+ break;
+
+ case 195: /* fieldAttr: fieldAttr RTSPECIALNAME_ */
#line 580 "asmparse.y"
-{ yyval.fieldAttr = yypvt[-1].fieldAttr; } break;
-case 195:
+ { (yyval.fieldAttr) = (yyvsp[-1].fieldAttr); }
+#line 4607 "asmparse.cpp"
+ break;
+
+ case 196: /* fieldAttr: fieldAttr SPECIALNAME_ */
#line 581 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) (yypvt[-1].fieldAttr | fdSpecialName); } break;
-case 196:
+ { (yyval.fieldAttr) = (CorFieldAttr) ((yyvsp[-1].fieldAttr) | fdSpecialName); }
+#line 4613 "asmparse.cpp"
+ break;
+
+ case 197: /* fieldAttr: fieldAttr MARSHAL_ '(' marshalBlob ')' */
#line 594 "asmparse.y"
-{ PASM->m_pMarshal = yypvt[-1].binstr; } break;
-case 197:
+ { PASM->m_pMarshal = (yyvsp[-1].binstr); }
+#line 4619 "asmparse.cpp"
+ break;
+
+ case 198: /* fieldAttr: fieldAttr ASSEMBLY_ */
#line 595 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) ((yypvt[-1].fieldAttr & ~mdMemberAccessMask) | fdAssembly); } break;
-case 198:
+ { (yyval.fieldAttr) = (CorFieldAttr) (((yyvsp[-1].fieldAttr) & ~mdMemberAccessMask) | fdAssembly); }
+#line 4625 "asmparse.cpp"
+ break;
+
+ case 199: /* fieldAttr: fieldAttr FAMANDASSEM_ */
#line 596 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) ((yypvt[-1].fieldAttr & ~mdMemberAccessMask) | fdFamANDAssem); } break;
-case 199:
+ { (yyval.fieldAttr) = (CorFieldAttr) (((yyvsp[-1].fieldAttr) & ~mdMemberAccessMask) | fdFamANDAssem); }
+#line 4631 "asmparse.cpp"
+ break;
+
+ case 200: /* fieldAttr: fieldAttr FAMORASSEM_ */
#line 597 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) ((yypvt[-1].fieldAttr & ~mdMemberAccessMask) | fdFamORAssem); } break;
-case 200:
+ { (yyval.fieldAttr) = (CorFieldAttr) (((yyvsp[-1].fieldAttr) & ~mdMemberAccessMask) | fdFamORAssem); }
+#line 4637 "asmparse.cpp"
+ break;
+
+ case 201: /* fieldAttr: fieldAttr PRIVATESCOPE_ */
#line 598 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) ((yypvt[-1].fieldAttr & ~mdMemberAccessMask) | fdPrivateScope); } break;
-case 201:
+ { (yyval.fieldAttr) = (CorFieldAttr) (((yyvsp[-1].fieldAttr) & ~mdMemberAccessMask) | fdPrivateScope); }
+#line 4643 "asmparse.cpp"
+ break;
+
+ case 202: /* fieldAttr: fieldAttr LITERAL_ */
#line 599 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) (yypvt[-1].fieldAttr | fdLiteral); } break;
-case 202:
+ { (yyval.fieldAttr) = (CorFieldAttr) ((yyvsp[-1].fieldAttr) | fdLiteral); }
+#line 4649 "asmparse.cpp"
+ break;
+
+ case 203: /* fieldAttr: fieldAttr NOTSERIALIZED_ */
#line 600 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) (yypvt[-1].fieldAttr | fdNotSerialized); } break;
-case 203:
+ { (yyval.fieldAttr) = (CorFieldAttr) ((yyvsp[-1].fieldAttr) | fdNotSerialized); }
+#line 4655 "asmparse.cpp"
+ break;
+
+ case 204: /* fieldAttr: fieldAttr FLAGS_ '(' int32 ')' */
#line 601 "asmparse.y"
-{ yyval.fieldAttr = (CorFieldAttr) (yypvt[-1].int32); } break;
-case 204:
+ { (yyval.fieldAttr) = (CorFieldAttr) ((yyvsp[-1].int32)); }
+#line 4661 "asmparse.cpp"
+ break;
+
+ case 205: /* atOpt: %empty */
#line 604 "asmparse.y"
-{ yyval.string = 0; } break;
-case 205:
+ { (yyval.string) = 0; }
+#line 4667 "asmparse.cpp"
+ break;
+
+ case 206: /* atOpt: AT_ id */
#line 605 "asmparse.y"
-{ yyval.string = yypvt[-0].string; } break;
-case 206:
+ { (yyval.string) = (yyvsp[0].string); }
+#line 4673 "asmparse.cpp"
+ break;
+
+ case 207: /* initOpt: %empty */
#line 608 "asmparse.y"
-{ yyval.binstr = NULL; } break;
-case 207:
+ { (yyval.binstr) = NULL; }
+#line 4679 "asmparse.cpp"
+ break;
+
+ case 208: /* initOpt: '=' fieldInit */
#line 609 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 208:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 4685 "asmparse.cpp"
+ break;
+
+ case 209: /* repeatOpt: %empty */
#line 612 "asmparse.y"
-{ yyval.int32 = 0xFFFFFFFF; } break;
-case 209:
+ { (yyval.int32) = 0xFFFFFFFF; }
+#line 4691 "asmparse.cpp"
+ break;
+
+ case 210: /* repeatOpt: '[' int32 ']' */
#line 613 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32; } break;
-case 210:
+ { (yyval.int32) = (yyvsp[-1].int32); }
+#line 4697 "asmparse.cpp"
+ break;
+
+ case 211: /* methodRef: callConv type typeSpec DCOLON methodName tyArgs0 '(' sigArgs0 ')' */
#line 618 "asmparse.y"
-{ PASM->ResetArgNameList();
- if (yypvt[-3].binstr == NULL)
+ { PASM->ResetArgNameList();
+ if ((yyvsp[-3].binstr) == NULL)
{
- if((iCallConv)&&((yypvt[-8].int32 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
- yyval.token = PASM->MakeMemberRef(yypvt[-6].token, yypvt[-4].string, parser->MakeSig(yypvt[-8].int32|iCallConv, yypvt[-7].binstr, yypvt[-1].binstr));
+ if((iCallConv)&&(((yyvsp[-8].int32) & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
+ (yyval.token) = PASM->MakeMemberRef((yyvsp[-6].token), (yyvsp[-4].string), parser->MakeSig((yyvsp[-8].int32)|iCallConv, (yyvsp[-7].binstr), (yyvsp[-1].binstr)));
}
else
{
mdToken mr;
- if((iCallConv)&&((yypvt[-8].int32 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
- mr = PASM->MakeMemberRef(yypvt[-6].token, yypvt[-4].string,
- parser->MakeSig(yypvt[-8].int32 | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, yypvt[-7].binstr, yypvt[-1].binstr, corCountArgs(yypvt[-3].binstr)));
- yyval.token = PASM->MakeMethodSpec(mr,
- parser->MakeSig(IMAGE_CEE_CS_CALLCONV_INSTANTIATION, 0, yypvt[-3].binstr));
+ if((iCallConv)&&(((yyvsp[-8].int32) & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
+ mr = PASM->MakeMemberRef((yyvsp[-6].token), (yyvsp[-4].string),
+ parser->MakeSig((yyvsp[-8].int32) | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, (yyvsp[-7].binstr), (yyvsp[-1].binstr), corCountArgs((yyvsp[-3].binstr))));
+ (yyval.token) = PASM->MakeMethodSpec(mr,
+ parser->MakeSig(IMAGE_CEE_CS_CALLCONV_INSTANTIATION, 0, (yyvsp[-3].binstr)));
}
- } break;
-case 211:
+ }
+#line 4718 "asmparse.cpp"
+ break;
+
+ case 212: /* methodRef: callConv type typeSpec DCOLON methodName genArityNotEmpty '(' sigArgs0 ')' */
#line 635 "asmparse.y"
-{ PASM->ResetArgNameList();
- if((iCallConv)&&((yypvt[-8].int32 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
- yyval.token = PASM->MakeMemberRef(yypvt[-6].token, yypvt[-4].string,
- parser->MakeSig(yypvt[-8].int32 | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, yypvt[-7].binstr, yypvt[-1].binstr, yypvt[-3].int32));
- } break;
-case 212:
+ { PASM->ResetArgNameList();
+ if((iCallConv)&&(((yyvsp[-8].int32) & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
+ (yyval.token) = PASM->MakeMemberRef((yyvsp[-6].token), (yyvsp[-4].string),
+ parser->MakeSig((yyvsp[-8].int32) | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, (yyvsp[-7].binstr), (yyvsp[-1].binstr), (yyvsp[-3].int32)));
+ }
+#line 4728 "asmparse.cpp"
+ break;
+
+ case 213: /* methodRef: callConv type methodName tyArgs0 '(' sigArgs0 ')' */
#line 641 "asmparse.y"
-{ PASM->ResetArgNameList();
- if (yypvt[-3].binstr == NULL)
+ { PASM->ResetArgNameList();
+ if ((yyvsp[-3].binstr) == NULL)
{
- if((iCallConv)&&((yypvt[-6].int32 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
- yyval.token = PASM->MakeMemberRef(mdTokenNil, yypvt[-4].string, parser->MakeSig(yypvt[-6].int32|iCallConv, yypvt[-5].binstr, yypvt[-1].binstr));
+ if((iCallConv)&&(((yyvsp[-6].int32) & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
+ (yyval.token) = PASM->MakeMemberRef(mdTokenNil, (yyvsp[-4].string), parser->MakeSig((yyvsp[-6].int32)|iCallConv, (yyvsp[-5].binstr), (yyvsp[-1].binstr)));
}
else
{
mdToken mr;
- if((iCallConv)&&((yypvt[-6].int32 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
- mr = PASM->MakeMemberRef(mdTokenNil, yypvt[-4].string, parser->MakeSig(yypvt[-6].int32 | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, yypvt[-5].binstr, yypvt[-1].binstr, corCountArgs(yypvt[-3].binstr)));
- yyval.token = PASM->MakeMethodSpec(mr,
- parser->MakeSig(IMAGE_CEE_CS_CALLCONV_INSTANTIATION, 0, yypvt[-3].binstr));
+ if((iCallConv)&&(((yyvsp[-6].int32) & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
+ mr = PASM->MakeMemberRef(mdTokenNil, (yyvsp[-4].string), parser->MakeSig((yyvsp[-6].int32) | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, (yyvsp[-5].binstr), (yyvsp[-1].binstr), corCountArgs((yyvsp[-3].binstr))));
+ (yyval.token) = PASM->MakeMethodSpec(mr,
+ parser->MakeSig(IMAGE_CEE_CS_CALLCONV_INSTANTIATION, 0, (yyvsp[-3].binstr)));
}
- } break;
-case 213:
+ }
+#line 4748 "asmparse.cpp"
+ break;
+
+ case 214: /* methodRef: callConv type methodName genArityNotEmpty '(' sigArgs0 ')' */
#line 657 "asmparse.y"
-{ PASM->ResetArgNameList();
- if((iCallConv)&&((yypvt[-6].int32 & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
- yyval.token = PASM->MakeMemberRef(mdTokenNil, yypvt[-4].string, parser->MakeSig(yypvt[-6].int32 | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, yypvt[-5].binstr, yypvt[-1].binstr, yypvt[-3].int32));
- } break;
-case 214:
+ { PASM->ResetArgNameList();
+ if((iCallConv)&&(((yyvsp[-6].int32) & iCallConv) != iCallConv)) parser->warn("'instance' added to method's calling convention\n");
+ (yyval.token) = PASM->MakeMemberRef(mdTokenNil, (yyvsp[-4].string), parser->MakeSig((yyvsp[-6].int32) | IMAGE_CEE_CS_CALLCONV_GENERIC|iCallConv, (yyvsp[-5].binstr), (yyvsp[-1].binstr), (yyvsp[-3].int32)));
+ }
+#line 4757 "asmparse.cpp"
+ break;
+
+ case 215: /* methodRef: mdtoken */
#line 661 "asmparse.y"
-{ yyval.token = yypvt[-0].token; } break;
-case 215:
+ { (yyval.token) = (yyvsp[0].token); }
+#line 4763 "asmparse.cpp"
+ break;
+
+ case 216: /* methodRef: TYPEDEF_M */
#line 662 "asmparse.y"
-{ yyval.token = yypvt[-0].tdd->m_tkTypeSpec; } break;
-case 216:
+ { (yyval.token) = (yyvsp[0].tdd)->m_tkTypeSpec; }
+#line 4769 "asmparse.cpp"
+ break;
+
+ case 217: /* methodRef: TYPEDEF_MR */
#line 663 "asmparse.y"
-{ yyval.token = yypvt[-0].tdd->m_tkTypeSpec; } break;
-case 217:
+ { (yyval.token) = (yyvsp[0].tdd)->m_tkTypeSpec; }
+#line 4775 "asmparse.cpp"
+ break;
+
+ case 218: /* callConv: INSTANCE_ callConv */
#line 666 "asmparse.y"
-{ yyval.int32 = (yypvt[-0].int32 | IMAGE_CEE_CS_CALLCONV_HASTHIS); } break;
-case 218:
+ { (yyval.int32) = ((yyvsp[0].int32) | IMAGE_CEE_CS_CALLCONV_HASTHIS); }
+#line 4781 "asmparse.cpp"
+ break;
+
+ case 219: /* callConv: EXPLICIT_ callConv */
#line 667 "asmparse.y"
-{ yyval.int32 = (yypvt[-0].int32 | IMAGE_CEE_CS_CALLCONV_EXPLICITTHIS); } break;
-case 219:
+ { (yyval.int32) = ((yyvsp[0].int32) | IMAGE_CEE_CS_CALLCONV_EXPLICITTHIS); }
+#line 4787 "asmparse.cpp"
+ break;
+
+ case 220: /* callConv: callKind */
#line 668 "asmparse.y"
-{ yyval.int32 = yypvt[-0].int32; } break;
-case 220:
+ { (yyval.int32) = (yyvsp[0].int32); }
+#line 4793 "asmparse.cpp"
+ break;
+
+ case 221: /* callConv: CALLCONV_ '(' int32 ')' */
#line 669 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32; } break;
-case 221:
+ { (yyval.int32) = (yyvsp[-1].int32); }
+#line 4799 "asmparse.cpp"
+ break;
+
+ case 222: /* callKind: %empty */
#line 672 "asmparse.y"
-{ yyval.int32 = IMAGE_CEE_CS_CALLCONV_DEFAULT; } break;
-case 222:
+ { (yyval.int32) = IMAGE_CEE_CS_CALLCONV_DEFAULT; }
+#line 4805 "asmparse.cpp"
+ break;
+
+ case 223: /* callKind: DEFAULT_ */
#line 673 "asmparse.y"
-{ yyval.int32 = IMAGE_CEE_CS_CALLCONV_DEFAULT; } break;
-case 223:
+ { (yyval.int32) = IMAGE_CEE_CS_CALLCONV_DEFAULT; }
+#line 4811 "asmparse.cpp"
+ break;
+
+ case 224: /* callKind: VARARG_ */
#line 674 "asmparse.y"
-{ yyval.int32 = IMAGE_CEE_CS_CALLCONV_VARARG; } break;
-case 224:
+ { (yyval.int32) = IMAGE_CEE_CS_CALLCONV_VARARG; }
+#line 4817 "asmparse.cpp"
+ break;
+
+ case 225: /* callKind: UNMANAGED_ CDECL_ */
#line 675 "asmparse.y"
-{ yyval.int32 = IMAGE_CEE_CS_CALLCONV_C; } break;
-case 225:
+ { (yyval.int32) = IMAGE_CEE_CS_CALLCONV_C; }
+#line 4823 "asmparse.cpp"
+ break;
+
+ case 226: /* callKind: UNMANAGED_ STDCALL_ */
#line 676 "asmparse.y"
-{ yyval.int32 = IMAGE_CEE_CS_CALLCONV_STDCALL; } break;
-case 226:
+ { (yyval.int32) = IMAGE_CEE_CS_CALLCONV_STDCALL; }
+#line 4829 "asmparse.cpp"
+ break;
+
+ case 227: /* callKind: UNMANAGED_ THISCALL_ */
#line 677 "asmparse.y"
-{ yyval.int32 = IMAGE_CEE_CS_CALLCONV_THISCALL; } break;
-case 227:
+ { (yyval.int32) = IMAGE_CEE_CS_CALLCONV_THISCALL; }
+#line 4835 "asmparse.cpp"
+ break;
+
+ case 228: /* callKind: UNMANAGED_ FASTCALL_ */
#line 678 "asmparse.y"
-{ yyval.int32 = IMAGE_CEE_CS_CALLCONV_FASTCALL; } break;
-case 228:
+ { (yyval.int32) = IMAGE_CEE_CS_CALLCONV_FASTCALL; }
+#line 4841 "asmparse.cpp"
+ break;
+
+ case 229: /* callKind: UNMANAGED_ */
#line 679 "asmparse.y"
-{ yyval.int32 = IMAGE_CEE_CS_CALLCONV_UNMANAGED; } break;
-case 229:
+ { (yyval.int32) = IMAGE_CEE_CS_CALLCONV_UNMANAGED; }
+#line 4847 "asmparse.cpp"
+ break;
+
+ case 230: /* mdtoken: MDTOKEN_ '(' int32 ')' */
#line 682 "asmparse.y"
-{ yyval.token = yypvt[-1].int32; } break;
-case 230:
+ { (yyval.token) = (yyvsp[-1].int32); }
+#line 4853 "asmparse.cpp"
+ break;
+
+ case 231: /* memberRef: methodSpec methodRef */
#line 685 "asmparse.y"
-{ yyval.token = yypvt[-0].token;
+ { (yyval.token) = (yyvsp[0].token);
PASM->delArgNameList(PASM->m_firstArgName);
PASM->m_firstArgName = parser->m_ANSFirst.POP();
PASM->m_lastArgName = parser->m_ANSLast.POP();
- PASM->SetMemberRefFixup(yypvt[-0].token,iOpcodeLen); } break;
-case 231:
+ PASM->SetMemberRefFixup((yyvsp[0].token),iOpcodeLen); }
+#line 4863 "asmparse.cpp"
+ break;
+
+ case 232: /* memberRef: FIELD_ type typeSpec DCOLON dottedName */
#line 691 "asmparse.y"
-{ yypvt[-3].binstr->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
- yyval.token = PASM->MakeMemberRef(yypvt[-2].token, yypvt[-0].string, yypvt[-3].binstr);
- PASM->SetMemberRefFixup(yyval.token,iOpcodeLen); } break;
-case 232:
+ { (yyvsp[-3].binstr)->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
+ (yyval.token) = PASM->MakeMemberRef((yyvsp[-2].token), (yyvsp[0].string), (yyvsp[-3].binstr));
+ PASM->SetMemberRefFixup((yyval.token),iOpcodeLen); }
+#line 4871 "asmparse.cpp"
+ break;
+
+ case 233: /* memberRef: FIELD_ type dottedName */
#line 695 "asmparse.y"
-{ yypvt[-1].binstr->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
- yyval.token = PASM->MakeMemberRef(NULL, yypvt[-0].string, yypvt[-1].binstr);
- PASM->SetMemberRefFixup(yyval.token,iOpcodeLen); } break;
-case 233:
+ { (yyvsp[-1].binstr)->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
+ (yyval.token) = PASM->MakeMemberRef(mdTokenNil, (yyvsp[0].string), (yyvsp[-1].binstr));
+ PASM->SetMemberRefFixup((yyval.token),iOpcodeLen); }
+#line 4879 "asmparse.cpp"
+ break;
+
+ case 234: /* memberRef: FIELD_ TYPEDEF_F */
#line 698 "asmparse.y"
-{ yyval.token = yypvt[-0].tdd->m_tkTypeSpec;
- PASM->SetMemberRefFixup(yyval.token,iOpcodeLen); } break;
-case 234:
+ { (yyval.token) = (yyvsp[0].tdd)->m_tkTypeSpec;
+ PASM->SetMemberRefFixup((yyval.token),iOpcodeLen); }
+#line 4886 "asmparse.cpp"
+ break;
+
+ case 235: /* memberRef: FIELD_ TYPEDEF_MR */
#line 700 "asmparse.y"
-{ yyval.token = yypvt[-0].tdd->m_tkTypeSpec;
- PASM->SetMemberRefFixup(yyval.token,iOpcodeLen); } break;
-case 235:
+ { (yyval.token) = (yyvsp[0].tdd)->m_tkTypeSpec;
+ PASM->SetMemberRefFixup((yyval.token),iOpcodeLen); }
+#line 4893 "asmparse.cpp"
+ break;
+
+ case 236: /* memberRef: mdtoken */
#line 702 "asmparse.y"
-{ yyval.token = yypvt[-0].token;
- PASM->SetMemberRefFixup(yyval.token,iOpcodeLen); } break;
-case 236:
+ { (yyval.token) = (yyvsp[0].token);
+ PASM->SetMemberRefFixup((yyval.token),iOpcodeLen); }
+#line 4900 "asmparse.cpp"
+ break;
+
+ case 237: /* eventHead: _EVENT eventAttr typeSpec dottedName */
#line 707 "asmparse.y"
-{ PASM->ResetEvent(yypvt[-0].string, yypvt[-1].token, yypvt[-2].eventAttr); } break;
-case 237:
+ { PASM->ResetEvent((yyvsp[0].string), (yyvsp[-1].token), (yyvsp[-2].eventAttr)); }
+#line 4906 "asmparse.cpp"
+ break;
+
+ case 238: /* eventHead: _EVENT eventAttr dottedName */
#line 708 "asmparse.y"
-{ PASM->ResetEvent(yypvt[-0].string, mdTypeRefNil, yypvt[-1].eventAttr); } break;
-case 238:
+ { PASM->ResetEvent((yyvsp[0].string), mdTypeRefNil, (yyvsp[-1].eventAttr)); }
+#line 4912 "asmparse.cpp"
+ break;
+
+ case 239: /* eventAttr: %empty */
#line 712 "asmparse.y"
-{ yyval.eventAttr = (CorEventAttr) 0; } break;
-case 239:
+ { (yyval.eventAttr) = (CorEventAttr) 0; }
+#line 4918 "asmparse.cpp"
+ break;
+
+ case 240: /* eventAttr: eventAttr RTSPECIALNAME_ */
#line 713 "asmparse.y"
-{ yyval.eventAttr = yypvt[-1].eventAttr; } break;
-case 240:
+ { (yyval.eventAttr) = (yyvsp[-1].eventAttr); }
+#line 4924 "asmparse.cpp"
+ break;
+
+ case 241: /* eventAttr: eventAttr SPECIALNAME_ */
#line 714 "asmparse.y"
-{ yyval.eventAttr = (CorEventAttr) (yypvt[-1].eventAttr | evSpecialName); } break;
-case 243:
+ { (yyval.eventAttr) = (CorEventAttr) ((yyvsp[-1].eventAttr) | evSpecialName); }
+#line 4930 "asmparse.cpp"
+ break;
+
+ case 244: /* eventDecl: _ADDON methodRef */
#line 721 "asmparse.y"
-{ PASM->SetEventMethod(0, yypvt[-0].token); } break;
-case 244:
+ { PASM->SetEventMethod(0, (yyvsp[0].token)); }
+#line 4936 "asmparse.cpp"
+ break;
+
+ case 245: /* eventDecl: _REMOVEON methodRef */
#line 722 "asmparse.y"
-{ PASM->SetEventMethod(1, yypvt[-0].token); } break;
-case 245:
+ { PASM->SetEventMethod(1, (yyvsp[0].token)); }
+#line 4942 "asmparse.cpp"
+ break;
+
+ case 246: /* eventDecl: _FIRE methodRef */
#line 723 "asmparse.y"
-{ PASM->SetEventMethod(2, yypvt[-0].token); } break;
-case 246:
+ { PASM->SetEventMethod(2, (yyvsp[0].token)); }
+#line 4948 "asmparse.cpp"
+ break;
+
+ case 247: /* eventDecl: _OTHER methodRef */
#line 724 "asmparse.y"
-{ PASM->SetEventMethod(3, yypvt[-0].token); } break;
-case 251:
+ { PASM->SetEventMethod(3, (yyvsp[0].token)); }
+#line 4954 "asmparse.cpp"
+ break;
+
+ case 252: /* propHead: _PROPERTY propAttr callConv type dottedName '(' sigArgs0 ')' initOpt */
#line 733 "asmparse.y"
-{ PASM->ResetProp(yypvt[-4].string,
+ { PASM->ResetProp((yyvsp[-4].string),
parser->MakeSig((IMAGE_CEE_CS_CALLCONV_PROPERTY |
- (yypvt[-6].int32 & IMAGE_CEE_CS_CALLCONV_HASTHIS)),yypvt[-5].binstr,yypvt[-2].binstr), yypvt[-7].propAttr, yypvt[-0].binstr);} break;
-case 252:
+ ((yyvsp[-6].int32) & IMAGE_CEE_CS_CALLCONV_HASTHIS)),(yyvsp[-5].binstr),(yyvsp[-2].binstr)), (yyvsp[-7].propAttr), (yyvsp[0].binstr));}
+#line 4962 "asmparse.cpp"
+ break;
+
+ case 253: /* propAttr: %empty */
#line 738 "asmparse.y"
-{ yyval.propAttr = (CorPropertyAttr) 0; } break;
-case 253:
+ { (yyval.propAttr) = (CorPropertyAttr) 0; }
+#line 4968 "asmparse.cpp"
+ break;
+
+ case 254: /* propAttr: propAttr RTSPECIALNAME_ */
#line 739 "asmparse.y"
-{ yyval.propAttr = yypvt[-1].propAttr; } break;
-case 254:
+ { (yyval.propAttr) = (yyvsp[-1].propAttr); }
+#line 4974 "asmparse.cpp"
+ break;
+
+ case 255: /* propAttr: propAttr SPECIALNAME_ */
#line 740 "asmparse.y"
-{ yyval.propAttr = (CorPropertyAttr) (yypvt[-1].propAttr | prSpecialName); } break;
-case 257:
+ { (yyval.propAttr) = (CorPropertyAttr) ((yyvsp[-1].propAttr) | prSpecialName); }
+#line 4980 "asmparse.cpp"
+ break;
+
+ case 258: /* propDecl: _SET methodRef */
#line 748 "asmparse.y"
-{ PASM->SetPropMethod(0, yypvt[-0].token); } break;
-case 258:
+ { PASM->SetPropMethod(0, (yyvsp[0].token)); }
+#line 4986 "asmparse.cpp"
+ break;
+
+ case 259: /* propDecl: _GET methodRef */
#line 749 "asmparse.y"
-{ PASM->SetPropMethod(1, yypvt[-0].token); } break;
-case 259:
+ { PASM->SetPropMethod(1, (yyvsp[0].token)); }
+#line 4992 "asmparse.cpp"
+ break;
+
+ case 260: /* propDecl: _OTHER methodRef */
#line 750 "asmparse.y"
-{ PASM->SetPropMethod(2, yypvt[-0].token); } break;
-case 264:
+ { PASM->SetPropMethod(2, (yyvsp[0].token)); }
+#line 4998 "asmparse.cpp"
+ break;
+
+ case 265: /* methodHeadPart1: _METHOD */
#line 758 "asmparse.y"
-{ PASM->ResetForNextMethod();
+ { PASM->ResetForNextMethod();
uMethodBeginLine = PASM->m_ulCurLine;
uMethodBeginColumn=PASM->m_ulCurColumn;
- } break;
-case 265:
+ }
+#line 5007 "asmparse.cpp"
+ break;
+
+ case 266: /* marshalClause: %empty */
#line 764 "asmparse.y"
-{ yyval.binstr = NULL; } break;
-case 266:
+ { (yyval.binstr) = NULL; }
+#line 5013 "asmparse.cpp"
+ break;
+
+ case 267: /* marshalClause: MARSHAL_ '(' marshalBlob ')' */
#line 765 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; } break;
-case 267:
+ { (yyval.binstr) = (yyvsp[-1].binstr); }
+#line 5019 "asmparse.cpp"
+ break;
+
+ case 268: /* marshalBlob: nativeType */
#line 768 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 268:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 5025 "asmparse.cpp"
+ break;
+
+ case 269: /* marshalBlob: marshalBlobHead hexbytes '}' */
#line 769 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; } break;
-case 269:
+ { (yyval.binstr) = (yyvsp[-1].binstr); }
+#line 5031 "asmparse.cpp"
+ break;
+
+ case 270: /* marshalBlobHead: '{' */
#line 772 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
-case 270:
+ { bParsingByteArray = TRUE; }
+#line 5037 "asmparse.cpp"
+ break;
+
+ case 271: /* methodHead: methodHeadPart1 methAttr callConv paramAttr type marshalClause methodName typarsClause '(' sigArgs0 ')' implAttr '{' */
#line 776 "asmparse.y"
-{ BinStr* sig;
- if (yypvt[-5].typarlist == NULL) sig = parser->MakeSig(yypvt[-10].int32, yypvt[-8].binstr, yypvt[-3].binstr);
+ { BinStr* sig;
+ if ((yyvsp[-5].typarlist) == NULL) sig = parser->MakeSig((yyvsp[-10].int32), (yyvsp[-8].binstr), (yyvsp[-3].binstr));
else {
- FixupTyPars(yypvt[-8].binstr);
- sig = parser->MakeSig(yypvt[-10].int32 | IMAGE_CEE_CS_CALLCONV_GENERIC, yypvt[-8].binstr, yypvt[-3].binstr, yypvt[-5].typarlist->Count());
+ FixupTyPars((yyvsp[-8].binstr));
+ sig = parser->MakeSig((yyvsp[-10].int32) | IMAGE_CEE_CS_CALLCONV_GENERIC, (yyvsp[-8].binstr), (yyvsp[-3].binstr), (yyvsp[-5].typarlist)->Count());
FixupConstraints();
}
- PASM->StartMethod(yypvt[-6].string, sig, yypvt[-11].methAttr, yypvt[-7].binstr, yypvt[-9].int32, yypvt[-5].typarlist);
+ PASM->StartMethod((yyvsp[-6].string), sig, (yyvsp[-11].methAttr), (yyvsp[-7].binstr), (yyvsp[-9].int32), (yyvsp[-5].typarlist));
TyParFixupList.RESET(false);
- PASM->SetImplAttr((USHORT)yypvt[-1].implAttr);
+ PASM->SetImplAttr((USHORT)(yyvsp[-1].implAttr));
PASM->m_pCurMethod->m_ulLines[0] = uMethodBeginLine;
PASM->m_pCurMethod->m_ulColumns[0]=uMethodBeginColumn;
- } break;
-case 271:
+ }
+#line 5055 "asmparse.cpp"
+ break;
+
+ case 272: /* methAttr: %empty */
#line 791 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) 0; } break;
-case 272:
+ { (yyval.methAttr) = (CorMethodAttr) 0; }
+#line 5061 "asmparse.cpp"
+ break;
+
+ case 273: /* methAttr: methAttr STATIC_ */
#line 792 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdStatic); } break;
-case 273:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdStatic); }
+#line 5067 "asmparse.cpp"
+ break;
+
+ case 274: /* methAttr: methAttr PUBLIC_ */
#line 793 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) ((yypvt[-1].methAttr & ~mdMemberAccessMask) | mdPublic); } break;
-case 274:
+ { (yyval.methAttr) = (CorMethodAttr) (((yyvsp[-1].methAttr) & ~mdMemberAccessMask) | mdPublic); }
+#line 5073 "asmparse.cpp"
+ break;
+
+ case 275: /* methAttr: methAttr PRIVATE_ */
#line 794 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) ((yypvt[-1].methAttr & ~mdMemberAccessMask) | mdPrivate); } break;
-case 275:
+ { (yyval.methAttr) = (CorMethodAttr) (((yyvsp[-1].methAttr) & ~mdMemberAccessMask) | mdPrivate); }
+#line 5079 "asmparse.cpp"
+ break;
+
+ case 276: /* methAttr: methAttr FAMILY_ */
#line 795 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) ((yypvt[-1].methAttr & ~mdMemberAccessMask) | mdFamily); } break;
-case 276:
+ { (yyval.methAttr) = (CorMethodAttr) (((yyvsp[-1].methAttr) & ~mdMemberAccessMask) | mdFamily); }
+#line 5085 "asmparse.cpp"
+ break;
+
+ case 277: /* methAttr: methAttr FINAL_ */
#line 796 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdFinal); } break;
-case 277:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdFinal); }
+#line 5091 "asmparse.cpp"
+ break;
+
+ case 278: /* methAttr: methAttr SPECIALNAME_ */
#line 797 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdSpecialName); } break;
-case 278:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdSpecialName); }
+#line 5097 "asmparse.cpp"
+ break;
+
+ case 279: /* methAttr: methAttr VIRTUAL_ */
#line 798 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdVirtual); } break;
-case 279:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdVirtual); }
+#line 5103 "asmparse.cpp"
+ break;
+
+ case 280: /* methAttr: methAttr STRICT_ */
#line 799 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdCheckAccessOnOverride); } break;
-case 280:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdCheckAccessOnOverride); }
+#line 5109 "asmparse.cpp"
+ break;
+
+ case 281: /* methAttr: methAttr ABSTRACT_ */
#line 800 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdAbstract); } break;
-case 281:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdAbstract); }
+#line 5115 "asmparse.cpp"
+ break;
+
+ case 282: /* methAttr: methAttr ASSEMBLY_ */
#line 801 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) ((yypvt[-1].methAttr & ~mdMemberAccessMask) | mdAssem); } break;
-case 282:
+ { (yyval.methAttr) = (CorMethodAttr) (((yyvsp[-1].methAttr) & ~mdMemberAccessMask) | mdAssem); }
+#line 5121 "asmparse.cpp"
+ break;
+
+ case 283: /* methAttr: methAttr FAMANDASSEM_ */
#line 802 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) ((yypvt[-1].methAttr & ~mdMemberAccessMask) | mdFamANDAssem); } break;
-case 283:
+ { (yyval.methAttr) = (CorMethodAttr) (((yyvsp[-1].methAttr) & ~mdMemberAccessMask) | mdFamANDAssem); }
+#line 5127 "asmparse.cpp"
+ break;
+
+ case 284: /* methAttr: methAttr FAMORASSEM_ */
#line 803 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) ((yypvt[-1].methAttr & ~mdMemberAccessMask) | mdFamORAssem); } break;
-case 284:
+ { (yyval.methAttr) = (CorMethodAttr) (((yyvsp[-1].methAttr) & ~mdMemberAccessMask) | mdFamORAssem); }
+#line 5133 "asmparse.cpp"
+ break;
+
+ case 285: /* methAttr: methAttr PRIVATESCOPE_ */
#line 804 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) ((yypvt[-1].methAttr & ~mdMemberAccessMask) | mdPrivateScope); } break;
-case 285:
+ { (yyval.methAttr) = (CorMethodAttr) (((yyvsp[-1].methAttr) & ~mdMemberAccessMask) | mdPrivateScope); }
+#line 5139 "asmparse.cpp"
+ break;
+
+ case 286: /* methAttr: methAttr HIDEBYSIG_ */
#line 805 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdHideBySig); } break;
-case 286:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdHideBySig); }
+#line 5145 "asmparse.cpp"
+ break;
+
+ case 287: /* methAttr: methAttr NEWSLOT_ */
#line 806 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdNewSlot); } break;
-case 287:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdNewSlot); }
+#line 5151 "asmparse.cpp"
+ break;
+
+ case 288: /* methAttr: methAttr RTSPECIALNAME_ */
#line 807 "asmparse.y"
-{ yyval.methAttr = yypvt[-1].methAttr; } break;
-case 288:
+ { (yyval.methAttr) = (yyvsp[-1].methAttr); }
+#line 5157 "asmparse.cpp"
+ break;
+
+ case 289: /* methAttr: methAttr UNMANAGEDEXP_ */
#line 808 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdUnmanagedExport); } break;
-case 289:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdUnmanagedExport); }
+#line 5163 "asmparse.cpp"
+ break;
+
+ case 290: /* methAttr: methAttr REQSECOBJ_ */
#line 809 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].methAttr | mdRequireSecObject); } break;
-case 290:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].methAttr) | mdRequireSecObject); }
+#line 5169 "asmparse.cpp"
+ break;
+
+ case 291: /* methAttr: methAttr FLAGS_ '(' int32 ')' */
#line 810 "asmparse.y"
-{ yyval.methAttr = (CorMethodAttr) (yypvt[-1].int32); } break;
-case 291:
+ { (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-1].int32)); }
+#line 5175 "asmparse.cpp"
+ break;
+
+ case 292: /* methAttr: methAttr PINVOKEIMPL_ '(' compQstring AS_ compQstring pinvAttr ')' */
#line 812 "asmparse.y"
-{ PASM->SetPinvoke(yypvt[-4].binstr,0,yypvt[-2].binstr,yypvt[-1].pinvAttr);
- yyval.methAttr = (CorMethodAttr) (yypvt[-7].methAttr | mdPinvokeImpl); } break;
-case 292:
+ { PASM->SetPinvoke((yyvsp[-4].binstr),0,(yyvsp[-2].binstr),(yyvsp[-1].pinvAttr));
+ (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-7].methAttr) | mdPinvokeImpl); }
+#line 5182 "asmparse.cpp"
+ break;
+
+ case 293: /* methAttr: methAttr PINVOKEIMPL_ '(' compQstring pinvAttr ')' */
#line 815 "asmparse.y"
-{ PASM->SetPinvoke(yypvt[-2].binstr,0,NULL,yypvt[-1].pinvAttr);
- yyval.methAttr = (CorMethodAttr) (yypvt[-5].methAttr | mdPinvokeImpl); } break;
-case 293:
+ { PASM->SetPinvoke((yyvsp[-2].binstr),0,NULL,(yyvsp[-1].pinvAttr));
+ (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-5].methAttr) | mdPinvokeImpl); }
+#line 5189 "asmparse.cpp"
+ break;
+
+ case 294: /* methAttr: methAttr PINVOKEIMPL_ '(' pinvAttr ')' */
#line 818 "asmparse.y"
-{ PASM->SetPinvoke(new BinStr(),0,NULL,yypvt[-1].pinvAttr);
- yyval.methAttr = (CorMethodAttr) (yypvt[-4].methAttr | mdPinvokeImpl); } break;
-case 294:
+ { PASM->SetPinvoke(new BinStr(),0,NULL,(yyvsp[-1].pinvAttr));
+ (yyval.methAttr) = (CorMethodAttr) ((yyvsp[-4].methAttr) | mdPinvokeImpl); }
+#line 5196 "asmparse.cpp"
+ break;
+
+ case 295: /* pinvAttr: %empty */
#line 822 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) 0; } break;
-case 295:
+ { (yyval.pinvAttr) = (CorPinvokeMap) 0; }
+#line 5202 "asmparse.cpp"
+ break;
+
+ case 296: /* pinvAttr: pinvAttr NOMANGLE_ */
#line 823 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmNoMangle); } break;
-case 296:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmNoMangle); }
+#line 5208 "asmparse.cpp"
+ break;
+
+ case 297: /* pinvAttr: pinvAttr ANSI_ */
#line 824 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmCharSetAnsi); } break;
-case 297:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmCharSetAnsi); }
+#line 5214 "asmparse.cpp"
+ break;
+
+ case 298: /* pinvAttr: pinvAttr UNICODE_ */
#line 825 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmCharSetUnicode); } break;
-case 298:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmCharSetUnicode); }
+#line 5220 "asmparse.cpp"
+ break;
+
+ case 299: /* pinvAttr: pinvAttr AUTOCHAR_ */
#line 826 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmCharSetAuto); } break;
-case 299:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmCharSetAuto); }
+#line 5226 "asmparse.cpp"
+ break;
+
+ case 300: /* pinvAttr: pinvAttr LASTERR_ */
#line 827 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmSupportsLastError); } break;
-case 300:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmSupportsLastError); }
+#line 5232 "asmparse.cpp"
+ break;
+
+ case 301: /* pinvAttr: pinvAttr WINAPI_ */
#line 828 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmCallConvWinapi); } break;
-case 301:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmCallConvWinapi); }
+#line 5238 "asmparse.cpp"
+ break;
+
+ case 302: /* pinvAttr: pinvAttr CDECL_ */
#line 829 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmCallConvCdecl); } break;
-case 302:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmCallConvCdecl); }
+#line 5244 "asmparse.cpp"
+ break;
+
+ case 303: /* pinvAttr: pinvAttr STDCALL_ */
#line 830 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmCallConvStdcall); } break;
-case 303:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmCallConvStdcall); }
+#line 5250 "asmparse.cpp"
+ break;
+
+ case 304: /* pinvAttr: pinvAttr THISCALL_ */
#line 831 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmCallConvThiscall); } break;
-case 304:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmCallConvThiscall); }
+#line 5256 "asmparse.cpp"
+ break;
+
+ case 305: /* pinvAttr: pinvAttr FASTCALL_ */
#line 832 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].pinvAttr | pmCallConvFastcall); } break;
-case 305:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].pinvAttr) | pmCallConvFastcall); }
+#line 5262 "asmparse.cpp"
+ break;
+
+ case 306: /* pinvAttr: pinvAttr BESTFIT_ ':' ON_ */
#line 833 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-3].pinvAttr | pmBestFitEnabled); } break;
-case 306:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-3].pinvAttr) | pmBestFitEnabled); }
+#line 5268 "asmparse.cpp"
+ break;
+
+ case 307: /* pinvAttr: pinvAttr BESTFIT_ ':' OFF_ */
#line 834 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-3].pinvAttr | pmBestFitDisabled); } break;
-case 307:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-3].pinvAttr) | pmBestFitDisabled); }
+#line 5274 "asmparse.cpp"
+ break;
+
+ case 308: /* pinvAttr: pinvAttr CHARMAPERROR_ ':' ON_ */
#line 835 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-3].pinvAttr | pmThrowOnUnmappableCharEnabled); } break;
-case 308:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-3].pinvAttr) | pmThrowOnUnmappableCharEnabled); }
+#line 5280 "asmparse.cpp"
+ break;
+
+ case 309: /* pinvAttr: pinvAttr CHARMAPERROR_ ':' OFF_ */
#line 836 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-3].pinvAttr | pmThrowOnUnmappableCharDisabled); } break;
-case 309:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-3].pinvAttr) | pmThrowOnUnmappableCharDisabled); }
+#line 5286 "asmparse.cpp"
+ break;
+
+ case 310: /* pinvAttr: pinvAttr FLAGS_ '(' int32 ')' */
#line 837 "asmparse.y"
-{ yyval.pinvAttr = (CorPinvokeMap) (yypvt[-1].int32); } break;
-case 310:
+ { (yyval.pinvAttr) = (CorPinvokeMap) ((yyvsp[-1].int32)); }
+#line 5292 "asmparse.cpp"
+ break;
+
+ case 311: /* methodName: _CTOR */
#line 840 "asmparse.y"
-{ yyval.string = newString(COR_CTOR_METHOD_NAME); } break;
-case 311:
+ { (yyval.string) = newString(COR_CTOR_METHOD_NAME); }
+#line 5298 "asmparse.cpp"
+ break;
+
+ case 312: /* methodName: _CCTOR */
#line 841 "asmparse.y"
-{ yyval.string = newString(COR_CCTOR_METHOD_NAME); } break;
-case 312:
+ { (yyval.string) = newString(COR_CCTOR_METHOD_NAME); }
+#line 5304 "asmparse.cpp"
+ break;
+
+ case 313: /* methodName: dottedName */
#line 842 "asmparse.y"
-{ yyval.string = yypvt[-0].string; } break;
-case 313:
+ { (yyval.string) = (yyvsp[0].string); }
+#line 5310 "asmparse.cpp"
+ break;
+
+ case 314: /* paramAttr: %empty */
#line 845 "asmparse.y"
-{ yyval.int32 = 0; } break;
-case 314:
+ { (yyval.int32) = 0; }
+#line 5316 "asmparse.cpp"
+ break;
+
+ case 315: /* paramAttr: paramAttr '[' IN_ ']' */
#line 846 "asmparse.y"
-{ yyval.int32 = yypvt[-3].int32 | pdIn; } break;
-case 315:
+ { (yyval.int32) = (yyvsp[-3].int32) | pdIn; }
+#line 5322 "asmparse.cpp"
+ break;
+
+ case 316: /* paramAttr: paramAttr '[' OUT_ ']' */
#line 847 "asmparse.y"
-{ yyval.int32 = yypvt[-3].int32 | pdOut; } break;
-case 316:
+ { (yyval.int32) = (yyvsp[-3].int32) | pdOut; }
+#line 5328 "asmparse.cpp"
+ break;
+
+ case 317: /* paramAttr: paramAttr '[' OPT_ ']' */
#line 848 "asmparse.y"
-{ yyval.int32 = yypvt[-3].int32 | pdOptional; } break;
-case 317:
+ { (yyval.int32) = (yyvsp[-3].int32) | pdOptional; }
+#line 5334 "asmparse.cpp"
+ break;
+
+ case 318: /* paramAttr: paramAttr '[' int32 ']' */
#line 849 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 + 1; } break;
-case 318:
+ { (yyval.int32) = (yyvsp[-1].int32) + 1; }
+#line 5340 "asmparse.cpp"
+ break;
+
+ case 319: /* implAttr: %empty */
#line 852 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (miIL | miManaged); } break;
-case 319:
+ { (yyval.implAttr) = (CorMethodImpl) (miIL | miManaged); }
+#line 5346 "asmparse.cpp"
+ break;
+
+ case 320: /* implAttr: implAttr NATIVE_ */
#line 853 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) ((yypvt[-1].implAttr & 0xFFF4) | miNative); } break;
-case 320:
+ { (yyval.implAttr) = (CorMethodImpl) (((yyvsp[-1].implAttr) & 0xFFF4) | miNative); }
+#line 5352 "asmparse.cpp"
+ break;
+
+ case 321: /* implAttr: implAttr CIL_ */
#line 854 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) ((yypvt[-1].implAttr & 0xFFF4) | miIL); } break;
-case 321:
+ { (yyval.implAttr) = (CorMethodImpl) (((yyvsp[-1].implAttr) & 0xFFF4) | miIL); }
+#line 5358 "asmparse.cpp"
+ break;
+
+ case 322: /* implAttr: implAttr OPTIL_ */
#line 855 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) ((yypvt[-1].implAttr & 0xFFF4) | miOPTIL); } break;
-case 322:
+ { (yyval.implAttr) = (CorMethodImpl) (((yyvsp[-1].implAttr) & 0xFFF4) | miOPTIL); }
+#line 5364 "asmparse.cpp"
+ break;
+
+ case 323: /* implAttr: implAttr MANAGED_ */
#line 856 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) ((yypvt[-1].implAttr & 0xFFFB) | miManaged); } break;
-case 323:
+ { (yyval.implAttr) = (CorMethodImpl) (((yyvsp[-1].implAttr) & 0xFFFB) | miManaged); }
+#line 5370 "asmparse.cpp"
+ break;
+
+ case 324: /* implAttr: implAttr UNMANAGED_ */
#line 857 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) ((yypvt[-1].implAttr & 0xFFFB) | miUnmanaged); } break;
-case 324:
+ { (yyval.implAttr) = (CorMethodImpl) (((yyvsp[-1].implAttr) & 0xFFFB) | miUnmanaged); }
+#line 5376 "asmparse.cpp"
+ break;
+
+ case 325: /* implAttr: implAttr FORWARDREF_ */
#line 858 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miForwardRef); } break;
-case 325:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].implAttr) | miForwardRef); }
+#line 5382 "asmparse.cpp"
+ break;
+
+ case 326: /* implAttr: implAttr PRESERVESIG_ */
#line 859 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miPreserveSig); } break;
-case 326:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].implAttr) | miPreserveSig); }
+#line 5388 "asmparse.cpp"
+ break;
+
+ case 327: /* implAttr: implAttr RUNTIME_ */
#line 860 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miRuntime); } break;
-case 327:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].implAttr) | miRuntime); }
+#line 5394 "asmparse.cpp"
+ break;
+
+ case 328: /* implAttr: implAttr INTERNALCALL_ */
#line 861 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miInternalCall); } break;
-case 328:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].implAttr) | miInternalCall); }
+#line 5400 "asmparse.cpp"
+ break;
+
+ case 329: /* implAttr: implAttr SYNCHRONIZED_ */
#line 862 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miSynchronized); } break;
-case 329:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].implAttr) | miSynchronized); }
+#line 5406 "asmparse.cpp"
+ break;
+
+ case 330: /* implAttr: implAttr NOINLINING_ */
#line 863 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miNoInlining); } break;
-case 330:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].implAttr) | miNoInlining); }
+#line 5412 "asmparse.cpp"
+ break;
+
+ case 331: /* implAttr: implAttr AGGRESSIVEINLINING_ */
#line 864 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miAggressiveInlining); } break;
-case 331:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].implAttr) | miAggressiveInlining); }
+#line 5418 "asmparse.cpp"
+ break;
+
+ case 332: /* implAttr: implAttr NOOPTIMIZATION_ */
#line 865 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miNoOptimization); } break;
-case 332:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].implAttr) | miNoOptimization); }
+#line 5424 "asmparse.cpp"
+ break;
+
+ case 333: /* implAttr: implAttr AGGRESSIVEOPTIMIZATION_ */
#line 866 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].implAttr | miAggressiveOptimization); } break;
-case 333:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].implAttr) | miAggressiveOptimization); }
+#line 5430 "asmparse.cpp"
+ break;
+
+ case 334: /* implAttr: implAttr FLAGS_ '(' int32 ')' */
#line 867 "asmparse.y"
-{ yyval.implAttr = (CorMethodImpl) (yypvt[-1].int32); } break;
-case 334:
+ { (yyval.implAttr) = (CorMethodImpl) ((yyvsp[-1].int32)); }
+#line 5436 "asmparse.cpp"
+ break;
+
+ case 335: /* localsHead: _LOCALS */
#line 870 "asmparse.y"
-{ PASM->delArgNameList(PASM->m_firstArgName); PASM->m_firstArgName = NULL;PASM->m_lastArgName = NULL;
- } break;
-case 337:
+ { PASM->delArgNameList(PASM->m_firstArgName); PASM->m_firstArgName = NULL;PASM->m_lastArgName = NULL;
+ }
+#line 5443 "asmparse.cpp"
+ break;
+
+ case 338: /* methodDecl: _EMITBYTE int32 */
#line 878 "asmparse.y"
-{ PASM->EmitByte(yypvt[-0].int32); } break;
-case 338:
+ { PASM->EmitByte((yyvsp[0].int32)); }
+#line 5449 "asmparse.cpp"
+ break;
+
+ case 339: /* methodDecl: sehBlock */
#line 879 "asmparse.y"
-{ delete PASM->m_SEHD; PASM->m_SEHD = PASM->m_SEHDstack.POP(); } break;
-case 339:
+ { delete PASM->m_SEHD; PASM->m_SEHD = PASM->m_SEHDstack.POP(); }
+#line 5455 "asmparse.cpp"
+ break;
+
+ case 340: /* methodDecl: _MAXSTACK int32 */
#line 880 "asmparse.y"
-{ PASM->EmitMaxStack(yypvt[-0].int32); } break;
-case 340:
+ { PASM->EmitMaxStack((yyvsp[0].int32)); }
+#line 5461 "asmparse.cpp"
+ break;
+
+ case 341: /* methodDecl: localsHead '(' sigArgs0 ')' */
#line 881 "asmparse.y"
-{ PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, yypvt[-1].binstr));
- } break;
-case 341:
+ { PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, (yyvsp[-1].binstr)));
+ }
+#line 5468 "asmparse.cpp"
+ break;
+
+ case 342: /* methodDecl: localsHead INIT_ '(' sigArgs0 ')' */
#line 883 "asmparse.y"
-{ PASM->EmitZeroInit();
- PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, yypvt[-1].binstr));
- } break;
-case 342:
+ { PASM->EmitZeroInit();
+ PASM->EmitLocals(parser->MakeSig(IMAGE_CEE_CS_CALLCONV_LOCAL_SIG, 0, (yyvsp[-1].binstr)));
+ }
+#line 5476 "asmparse.cpp"
+ break;
+
+ case 343: /* methodDecl: _ENTRYPOINT */
#line 886 "asmparse.y"
-{ PASM->EmitEntryPoint(); } break;
-case 343:
+ { PASM->EmitEntryPoint(); }
+#line 5482 "asmparse.cpp"
+ break;
+
+ case 344: /* methodDecl: _ZEROINIT */
#line 887 "asmparse.y"
-{ PASM->EmitZeroInit(); } break;
-case 346:
+ { PASM->EmitZeroInit(); }
+#line 5488 "asmparse.cpp"
+ break;
+
+ case 347: /* methodDecl: id ':' */
#line 890 "asmparse.y"
-{ PASM->AddLabel(PASM->m_CurPC,yypvt[-1].string); /*PASM->EmitLabel($1);*/ } break;
-case 352:
+ { PASM->AddLabel(PASM->m_CurPC,(yyvsp[-1].string)); /*PASM->EmitLabel($1);*/ }
+#line 5494 "asmparse.cpp"
+ break;
+
+ case 353: /* methodDecl: _EXPORT '[' int32 ']' */
#line 896 "asmparse.y"
-{ if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF)
+ { if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF)
{
- PASM->m_pCurMethod->m_dwExportOrdinal = yypvt[-1].int32;
+ PASM->m_pCurMethod->m_dwExportOrdinal = (yyvsp[-1].int32);
PASM->m_pCurMethod->m_szExportAlias = NULL;
if(PASM->m_pCurMethod->m_wVTEntry == 0) PASM->m_pCurMethod->m_wVTEntry = 1;
- if(PASM->m_pCurMethod->m_wVTSlot == 0) PASM->m_pCurMethod->m_wVTSlot = (WORD)(yypvt[-1].int32 + 0x8000);
+ if(PASM->m_pCurMethod->m_wVTSlot == 0) PASM->m_pCurMethod->m_wVTSlot = (WORD)((yyvsp[-1].int32) + 0x8000);
}
else
PASM->report->warn("Duplicate .export directive, ignored\n");
- } break;
-case 353:
+ }
+#line 5509 "asmparse.cpp"
+ break;
+
+ case 354: /* methodDecl: _EXPORT '[' int32 ']' AS_ id */
#line 906 "asmparse.y"
-{ if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF)
+ { if(PASM->m_pCurMethod->m_dwExportOrdinal == 0xFFFFFFFF)
{
- PASM->m_pCurMethod->m_dwExportOrdinal = yypvt[-3].int32;
- PASM->m_pCurMethod->m_szExportAlias = yypvt[-0].string;
+ PASM->m_pCurMethod->m_dwExportOrdinal = (yyvsp[-3].int32);
+ PASM->m_pCurMethod->m_szExportAlias = (yyvsp[0].string);
if(PASM->m_pCurMethod->m_wVTEntry == 0) PASM->m_pCurMethod->m_wVTEntry = 1;
- if(PASM->m_pCurMethod->m_wVTSlot == 0) PASM->m_pCurMethod->m_wVTSlot = (WORD)(yypvt[-3].int32 + 0x8000);
+ if(PASM->m_pCurMethod->m_wVTSlot == 0) PASM->m_pCurMethod->m_wVTSlot = (WORD)((yyvsp[-3].int32) + 0x8000);
}
else
PASM->report->warn("Duplicate .export directive, ignored\n");
- } break;
-case 354:
+ }
+#line 5524 "asmparse.cpp"
+ break;
+
+ case 355: /* methodDecl: _VTENTRY int32 ':' int32 */
#line 916 "asmparse.y"
-{ PASM->m_pCurMethod->m_wVTEntry = (WORD)yypvt[-2].int32;
- PASM->m_pCurMethod->m_wVTSlot = (WORD)yypvt[-0].int32; } break;
-case 355:
+ { PASM->m_pCurMethod->m_wVTEntry = (WORD)(yyvsp[-2].int32);
+ PASM->m_pCurMethod->m_wVTSlot = (WORD)(yyvsp[0].int32); }
+#line 5531 "asmparse.cpp"
+ break;
+
+ case 356: /* methodDecl: _OVERRIDE typeSpec DCOLON methodName */
#line 919 "asmparse.y"
-{ PASM->AddMethodImpl(yypvt[-2].token,yypvt[-0].string,NULL,NULL,NULL,NULL); } break;
-case 356:
+ { PASM->AddMethodImpl((yyvsp[-2].token),(yyvsp[0].string),NULL,mdTokenNil,NULL,NULL); }
+#line 5537 "asmparse.cpp"
+ break;
+
+ case 357: /* methodDecl: _OVERRIDE METHOD_ callConv type typeSpec DCOLON methodName genArity '(' sigArgs0 ')' */
#line 922 "asmparse.y"
-{ PASM->AddMethodImpl(yypvt[-6].token,yypvt[-4].string,
- (yypvt[-3].int32==0 ? parser->MakeSig(yypvt[-8].int32,yypvt[-7].binstr,yypvt[-1].binstr) :
- parser->MakeSig(yypvt[-8].int32| IMAGE_CEE_CS_CALLCONV_GENERIC,yypvt[-7].binstr,yypvt[-1].binstr,yypvt[-3].int32))
- ,NULL,NULL,NULL);
+ { PASM->AddMethodImpl((yyvsp[-6].token),(yyvsp[-4].string),
+ ((yyvsp[-3].int32)==0 ? parser->MakeSig((yyvsp[-8].int32),(yyvsp[-7].binstr),(yyvsp[-1].binstr)) :
+ parser->MakeSig((yyvsp[-8].int32)| IMAGE_CEE_CS_CALLCONV_GENERIC,(yyvsp[-7].binstr),(yyvsp[-1].binstr),(yyvsp[-3].int32)))
+ ,mdTokenNil,NULL,NULL);
PASM->ResetArgNameList();
- } break;
-case 358:
+ }
+#line 5548 "asmparse.cpp"
+ break;
+
+ case 359: /* methodDecl: _PARAM TYPE_ '[' int32 ']' */
#line 929 "asmparse.y"
-{ if((yypvt[-1].int32 > 0) && (yypvt[-1].int32 <= (int)PASM->m_pCurMethod->m_NumTyPars))
- PASM->m_pCustomDescrList = PASM->m_pCurMethod->m_TyPars[yypvt[-1].int32-1].CAList();
+ { if(((yyvsp[-1].int32) > 0) && ((yyvsp[-1].int32) <= (int)PASM->m_pCurMethod->m_NumTyPars))
+ PASM->m_pCustomDescrList = PASM->m_pCurMethod->m_TyPars[(yyvsp[-1].int32)-1].CAList();
else
PASM->report->error("Type parameter index out of range\n");
- } break;
-case 359:
+ }
+#line 5558 "asmparse.cpp"
+ break;
+
+ case 360: /* methodDecl: _PARAM TYPE_ dottedName */
#line 934 "asmparse.y"
-{ int n = PASM->m_pCurMethod->FindTyPar(yypvt[-0].string);
+ { int n = PASM->m_pCurMethod->FindTyPar((yyvsp[0].string));
if(n >= 0)
PASM->m_pCustomDescrList = PASM->m_pCurMethod->m_TyPars[n].CAList();
else
- PASM->report->error("Type parameter '%s' undefined\n",yypvt[-0].string);
- } break;
-case 360:
+ PASM->report->error("Type parameter '%s' undefined\n",(yyvsp[0].string));
+ }
+#line 5569 "asmparse.cpp"
+ break;
+
+ case 361: /* methodDecl: _PARAM CONSTRAINT_ '[' int32 ']' ',' typeSpec */
#line 940 "asmparse.y"
-{ PASM->m_pCurMethod->AddGenericParamConstraint(yypvt[-3].int32, 0, yypvt[-0].token); } break;
-case 361:
+ { PASM->m_pCurMethod->AddGenericParamConstraint((yyvsp[-3].int32), 0, (yyvsp[0].token)); }
+#line 5575 "asmparse.cpp"
+ break;
+
+ case 362: /* methodDecl: _PARAM CONSTRAINT_ dottedName ',' typeSpec */
#line 941 "asmparse.y"
-{ PASM->m_pCurMethod->AddGenericParamConstraint(0, yypvt[-2].string, yypvt[-0].token); } break;
-case 362:
+ { PASM->m_pCurMethod->AddGenericParamConstraint(0, (yyvsp[-2].string), (yyvsp[0].token)); }
+#line 5581 "asmparse.cpp"
+ break;
+
+ case 363: /* methodDecl: _PARAM '[' int32 ']' initOpt */
#line 944 "asmparse.y"
-{ if( yypvt[-2].int32 ) {
- ARG_NAME_LIST* pAN=PASM->findArg(PASM->m_pCurMethod->m_firstArgName, yypvt[-2].int32 - 1);
+ { if( (yyvsp[-2].int32) ) {
+ ARG_NAME_LIST* pAN=PASM->findArg(PASM->m_pCurMethod->m_firstArgName, (yyvsp[-2].int32) - 1);
if(pAN)
{
PASM->m_pCustomDescrList = &(pAN->CustDList);
- pAN->pValue = yypvt[-0].binstr;
+ pAN->pValue = (yyvsp[0].binstr);
}
else
{
PASM->m_pCustomDescrList = NULL;
- if(yypvt[-0].binstr) delete yypvt[-0].binstr;
+ if((yyvsp[0].binstr)) delete (yyvsp[0].binstr);
}
} else {
PASM->m_pCustomDescrList = &(PASM->m_pCurMethod->m_RetCustDList);
- PASM->m_pCurMethod->m_pRetValue = yypvt[-0].binstr;
+ PASM->m_pCurMethod->m_pRetValue = (yyvsp[0].binstr);
}
PASM->m_tkCurrentCVOwner = 0;
- } break;
-case 363:
+ }
+#line 5604 "asmparse.cpp"
+ break;
+
+ case 364: /* scopeBlock: scopeOpen methodDecls '}' */
#line 964 "asmparse.y"
-{ PASM->m_pCurMethod->CloseScope(); } break;
-case 364:
+ { PASM->m_pCurMethod->CloseScope(); }
+#line 5610 "asmparse.cpp"
+ break;
+
+ case 365: /* scopeOpen: '{' */
#line 967 "asmparse.y"
-{ PASM->m_pCurMethod->OpenScope(); } break;
-case 368:
+ { PASM->m_pCurMethod->OpenScope(); }
+#line 5616 "asmparse.cpp"
+ break;
+
+ case 369: /* tryBlock: tryHead scopeBlock */
#line 978 "asmparse.y"
-{ PASM->m_SEHD->tryTo = PASM->m_CurPC; } break;
-case 369:
+ { PASM->m_SEHD->tryTo = PASM->m_CurPC; }
+#line 5622 "asmparse.cpp"
+ break;
+
+ case 370: /* tryBlock: tryHead id TO_ id */
#line 979 "asmparse.y"
-{ PASM->SetTryLabels(yypvt[-2].string, yypvt[-0].string); } break;
-case 370:
+ { PASM->SetTryLabels((yyvsp[-2].string), (yyvsp[0].string)); }
+#line 5628 "asmparse.cpp"
+ break;
+
+ case 371: /* tryBlock: tryHead int32 TO_ int32 */
#line 980 "asmparse.y"
-{ if(PASM->m_SEHD) {PASM->m_SEHD->tryFrom = yypvt[-2].int32;
- PASM->m_SEHD->tryTo = yypvt[-0].int32;} } break;
-case 371:
+ { if(PASM->m_SEHD) {PASM->m_SEHD->tryFrom = (yyvsp[-2].int32);
+ PASM->m_SEHD->tryTo = (yyvsp[0].int32);} }
+#line 5635 "asmparse.cpp"
+ break;
+
+ case 372: /* tryHead: _TRY */
#line 984 "asmparse.y"
-{ PASM->NewSEHDescriptor();
- PASM->m_SEHD->tryFrom = PASM->m_CurPC; } break;
-case 372:
+ { PASM->NewSEHDescriptor();
+ PASM->m_SEHD->tryFrom = PASM->m_CurPC; }
+#line 5642 "asmparse.cpp"
+ break;
+
+ case 373: /* sehClause: catchClause handlerBlock */
#line 989 "asmparse.y"
-{ PASM->EmitTry(); } break;
-case 373:
+ { PASM->EmitTry(); }
+#line 5648 "asmparse.cpp"
+ break;
+
+ case 374: /* sehClause: filterClause handlerBlock */
#line 990 "asmparse.y"
-{ PASM->EmitTry(); } break;
-case 374:
+ { PASM->EmitTry(); }
+#line 5654 "asmparse.cpp"
+ break;
+
+ case 375: /* sehClause: finallyClause handlerBlock */
#line 991 "asmparse.y"
-{ PASM->EmitTry(); } break;
-case 375:
+ { PASM->EmitTry(); }
+#line 5660 "asmparse.cpp"
+ break;
+
+ case 376: /* sehClause: faultClause handlerBlock */
#line 992 "asmparse.y"
-{ PASM->EmitTry(); } break;
-case 376:
+ { PASM->EmitTry(); }
+#line 5666 "asmparse.cpp"
+ break;
+
+ case 377: /* filterClause: filterHead scopeBlock */
#line 996 "asmparse.y"
-{ PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 377:
+ { PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
+#line 5672 "asmparse.cpp"
+ break;
+
+ case 378: /* filterClause: filterHead id */
#line 997 "asmparse.y"
-{ PASM->SetFilterLabel(yypvt[-0].string);
- PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 378:
+ { PASM->SetFilterLabel((yyvsp[0].string));
+ PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
+#line 5679 "asmparse.cpp"
+ break;
+
+ case 379: /* filterClause: filterHead int32 */
#line 999 "asmparse.y"
-{ PASM->m_SEHD->sehFilter = yypvt[-0].int32;
- PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 379:
+ { PASM->m_SEHD->sehFilter = (yyvsp[0].int32);
+ PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
+#line 5686 "asmparse.cpp"
+ break;
+
+ case 380: /* filterHead: FILTER_ */
#line 1003 "asmparse.y"
-{ PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FILTER;
- PASM->m_SEHD->sehFilter = PASM->m_CurPC; } break;
-case 380:
+ { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FILTER;
+ PASM->m_SEHD->sehFilter = PASM->m_CurPC; }
+#line 5693 "asmparse.cpp"
+ break;
+
+ case 381: /* catchClause: CATCH_ typeSpec */
#line 1007 "asmparse.y"
-{ PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_NONE;
- PASM->SetCatchClass(yypvt[-0].token);
- PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 381:
+ { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_NONE;
+ PASM->SetCatchClass((yyvsp[0].token));
+ PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
+#line 5701 "asmparse.cpp"
+ break;
+
+ case 382: /* finallyClause: FINALLY_ */
#line 1012 "asmparse.y"
-{ PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FINALLY;
- PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 382:
+ { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FINALLY;
+ PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
+#line 5708 "asmparse.cpp"
+ break;
+
+ case 383: /* faultClause: FAULT_ */
#line 1016 "asmparse.y"
-{ PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FAULT;
- PASM->m_SEHD->sehHandler = PASM->m_CurPC; } break;
-case 383:
+ { PASM->m_SEHD->sehClause = COR_ILEXCEPTION_CLAUSE_FAULT;
+ PASM->m_SEHD->sehHandler = PASM->m_CurPC; }
+#line 5715 "asmparse.cpp"
+ break;
+
+ case 384: /* handlerBlock: scopeBlock */
#line 1020 "asmparse.y"
-{ PASM->m_SEHD->sehHandlerTo = PASM->m_CurPC; } break;
-case 384:
+ { PASM->m_SEHD->sehHandlerTo = PASM->m_CurPC; }
+#line 5721 "asmparse.cpp"
+ break;
+
+ case 385: /* handlerBlock: HANDLER_ id TO_ id */
#line 1021 "asmparse.y"
-{ PASM->SetHandlerLabels(yypvt[-2].string, yypvt[-0].string); } break;
-case 385:
+ { PASM->SetHandlerLabels((yyvsp[-2].string), (yyvsp[0].string)); }
+#line 5727 "asmparse.cpp"
+ break;
+
+ case 386: /* handlerBlock: HANDLER_ int32 TO_ int32 */
#line 1022 "asmparse.y"
-{ PASM->m_SEHD->sehHandler = yypvt[-2].int32;
- PASM->m_SEHD->sehHandlerTo = yypvt[-0].int32; } break;
-case 387:
+ { PASM->m_SEHD->sehHandler = (yyvsp[-2].int32);
+ PASM->m_SEHD->sehHandlerTo = (yyvsp[0].int32); }
+#line 5734 "asmparse.cpp"
+ break;
+
+ case 388: /* ddHead: _DATA tls id '=' */
#line 1030 "asmparse.y"
-{ PASM->EmitDataLabel(yypvt[-1].string); } break;
-case 389:
+ { PASM->EmitDataLabel((yyvsp[-1].string)); }
+#line 5740 "asmparse.cpp"
+ break;
+
+ case 390: /* tls: %empty */
#line 1034 "asmparse.y"
-{ PASM->SetDataSection(); } break;
-case 390:
+ { PASM->SetDataSection(); }
+#line 5746 "asmparse.cpp"
+ break;
+
+ case 391: /* tls: TLS_ */
#line 1035 "asmparse.y"
-{ PASM->SetTLSSection(); } break;
-case 391:
+ { PASM->SetTLSSection(); }
+#line 5752 "asmparse.cpp"
+ break;
+
+ case 392: /* tls: CIL_ */
#line 1036 "asmparse.y"
-{ PASM->SetILSection(); } break;
-case 396:
+ { PASM->SetILSection(); }
+#line 5758 "asmparse.cpp"
+ break;
+
+ case 397: /* ddItemCount: %empty */
#line 1047 "asmparse.y"
-{ yyval.int32 = 1; } break;
-case 397:
+ { (yyval.int32) = 1; }
+#line 5764 "asmparse.cpp"
+ break;
+
+ case 398: /* ddItemCount: '[' int32 ']' */
#line 1048 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32;
- if(yypvt[-1].int32 <= 0) { PASM->report->error("Illegal item count: %d\n",yypvt[-1].int32);
- if(!PASM->OnErrGo) yyval.int32 = 1; }} break;
-case 398:
+ { (yyval.int32) = (yyvsp[-1].int32);
+ if((yyvsp[-1].int32) <= 0) { PASM->report->error("Illegal item count: %d\n",(yyvsp[-1].int32));
+ if(!PASM->OnErrGo) (yyval.int32) = 1; }}
+#line 5772 "asmparse.cpp"
+ break;
+
+ case 399: /* ddItem: CHAR_ '*' '(' compQstring ')' */
#line 1053 "asmparse.y"
-{ PASM->EmitDataString(yypvt[-1].binstr); } break;
-case 399:
+ { PASM->EmitDataString((yyvsp[-1].binstr)); }
+#line 5778 "asmparse.cpp"
+ break;
+
+ case 400: /* ddItem: '&' '(' id ')' */
#line 1054 "asmparse.y"
-{ PASM->EmitDD(yypvt[-1].string); } break;
-case 400:
+ { PASM->EmitDD((yyvsp[-1].string)); }
+#line 5784 "asmparse.cpp"
+ break;
+
+ case 401: /* ddItem: bytearrayhead bytes ')' */
#line 1055 "asmparse.y"
-{ PASM->EmitData(yypvt[-1].binstr->ptr(),yypvt[-1].binstr->length()); } break;
-case 401:
+ { PASM->EmitData((yyvsp[-1].binstr)->ptr(),(yyvsp[-1].binstr)->length()); }
+#line 5790 "asmparse.cpp"
+ break;
+
+ case 402: /* ddItem: FLOAT32_ '(' float64 ')' ddItemCount */
#line 1057 "asmparse.y"
-{ float f = (float) (*yypvt[-2].float64); float* p = new (nothrow) float[yypvt[-0].int32];
+ { float f = (float) (*(yyvsp[-2].float64)); float* p = new (nothrow) float[(yyvsp[0].int32)];
if(p != NULL) {
- for(int i=0; i < yypvt[-0].int32; i++) p[i] = f;
- PASM->EmitData(p, sizeof(float)*yypvt[-0].int32); delete yypvt[-2].float64; delete [] p;
+ for(int i=0; i < (yyvsp[0].int32); i++) p[i] = f;
+ PASM->EmitData(p, sizeof(float)*(yyvsp[0].int32)); delete (yyvsp[-2].float64); delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(float)*yypvt[-0].int32); } break;
-case 402:
+ sizeof(float)*(yyvsp[0].int32)); }
+#line 5801 "asmparse.cpp"
+ break;
+
+ case 403: /* ddItem: FLOAT64_ '(' float64 ')' ddItemCount */
#line 1064 "asmparse.y"
-{ double* p = new (nothrow) double[yypvt[-0].int32];
+ { double* p = new (nothrow) double[(yyvsp[0].int32)];
if(p != NULL) {
- for(int i=0; iEmitData(p, sizeof(double)*yypvt[-0].int32); delete yypvt[-2].float64; delete [] p;
+ for(int i=0; i<(yyvsp[0].int32); i++) p[i] = *((yyvsp[-2].float64));
+ PASM->EmitData(p, sizeof(double)*(yyvsp[0].int32)); delete (yyvsp[-2].float64); delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(double)*yypvt[-0].int32); } break;
-case 403:
+ sizeof(double)*(yyvsp[0].int32)); }
+#line 5812 "asmparse.cpp"
+ break;
+
+ case 404: /* ddItem: INT64_ '(' int64 ')' ddItemCount */
#line 1071 "asmparse.y"
-{ __int64* p = new (nothrow) __int64[yypvt[-0].int32];
+ { int64_t* p = new (nothrow) int64_t[(yyvsp[0].int32)];
if(p != NULL) {
- for(int i=0; iEmitData(p, sizeof(__int64)*yypvt[-0].int32); delete yypvt[-2].int64; delete [] p;
+ for(int i=0; i<(yyvsp[0].int32); i++) p[i] = *((yyvsp[-2].int64));
+ PASM->EmitData(p, sizeof(int64_t)*(yyvsp[0].int32)); delete (yyvsp[-2].int64); delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(__int64)*yypvt[-0].int32); } break;
-case 404:
+ sizeof(int64_t)*(yyvsp[0].int32)); }
+#line 5823 "asmparse.cpp"
+ break;
+
+ case 405: /* ddItem: INT32_ '(' int32 ')' ddItemCount */
#line 1078 "asmparse.y"
-{ __int32* p = new (nothrow) __int32[yypvt[-0].int32];
+ { int32_t* p = new (nothrow) int32_t[(yyvsp[0].int32)];
if(p != NULL) {
- for(int i=0; iEmitData(p, sizeof(__int32)*yypvt[-0].int32); delete [] p;
+ for(int i=0; i<(yyvsp[0].int32); i++) p[i] = (yyvsp[-2].int32);
+ PASM->EmitData(p, sizeof(int32_t)*(yyvsp[0].int32)); delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(__int32)*yypvt[-0].int32); } break;
-case 405:
+ sizeof(int32_t)*(yyvsp[0].int32)); }
+#line 5834 "asmparse.cpp"
+ break;
+
+ case 406: /* ddItem: INT16_ '(' int32 ')' ddItemCount */
#line 1085 "asmparse.y"
-{ __int16 i = (__int16) yypvt[-2].int32; FAIL_UNLESS(i == yypvt[-2].int32, ("Value %d too big\n", yypvt[-2].int32));
- __int16* p = new (nothrow) __int16[yypvt[-0].int32];
+ { int16_t i = (int16_t) (yyvsp[-2].int32); FAIL_UNLESS(i == (yyvsp[-2].int32), ("Value %d too big\n", (yyvsp[-2].int32)));
+ int16_t* p = new (nothrow) int16_t[(yyvsp[0].int32)];
if(p != NULL) {
- for(int j=0; jEmitData(p, sizeof(__int16)*yypvt[-0].int32); delete [] p;
+ for(int j=0; j<(yyvsp[0].int32); j++) p[j] = i;
+ PASM->EmitData(p, sizeof(int16_t)*(yyvsp[0].int32)); delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(__int16)*yypvt[-0].int32); } break;
-case 406:
+ sizeof(int16_t)*(yyvsp[0].int32)); }
+#line 5846 "asmparse.cpp"
+ break;
+
+ case 407: /* ddItem: INT8_ '(' int32 ')' ddItemCount */
#line 1093 "asmparse.y"
-{ __int8 i = (__int8) yypvt[-2].int32; FAIL_UNLESS(i == yypvt[-2].int32, ("Value %d too big\n", yypvt[-2].int32));
- __int8* p = new (nothrow) __int8[yypvt[-0].int32];
+ { int8_t i = (int8_t) (yyvsp[-2].int32); FAIL_UNLESS(i == (yyvsp[-2].int32), ("Value %d too big\n", (yyvsp[-2].int32)));
+ int8_t* p = new (nothrow) int8_t[(yyvsp[0].int32)];
if(p != NULL) {
- for(int j=0; jEmitData(p, sizeof(__int8)*yypvt[-0].int32); delete [] p;
+ for(int j=0; j<(yyvsp[0].int32); j++) p[j] = i;
+ PASM->EmitData(p, sizeof(int8_t)*(yyvsp[0].int32)); delete [] p;
} else PASM->report->error("Out of memory emitting data block %d bytes\n",
- sizeof(__int8)*yypvt[-0].int32); } break;
-case 407:
+ sizeof(int8_t)*(yyvsp[0].int32)); }
+#line 5858 "asmparse.cpp"
+ break;
+
+ case 408: /* ddItem: FLOAT32_ ddItemCount */
#line 1100 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(float)*yypvt[-0].int32); } break;
-case 408:
+ { PASM->EmitData(NULL, sizeof(float)*(yyvsp[0].int32)); }
+#line 5864 "asmparse.cpp"
+ break;
+
+ case 409: /* ddItem: FLOAT64_ ddItemCount */
#line 1101 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(double)*yypvt[-0].int32); } break;
-case 409:
+ { PASM->EmitData(NULL, sizeof(double)*(yyvsp[0].int32)); }
+#line 5870 "asmparse.cpp"
+ break;
+
+ case 410: /* ddItem: INT64_ ddItemCount */
#line 1102 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(__int64)*yypvt[-0].int32); } break;
-case 410:
+ { PASM->EmitData(NULL, sizeof(int64_t)*(yyvsp[0].int32)); }
+#line 5876 "asmparse.cpp"
+ break;
+
+ case 411: /* ddItem: INT32_ ddItemCount */
#line 1103 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(__int32)*yypvt[-0].int32); } break;
-case 411:
+ { PASM->EmitData(NULL, sizeof(int32_t)*(yyvsp[0].int32)); }
+#line 5882 "asmparse.cpp"
+ break;
+
+ case 412: /* ddItem: INT16_ ddItemCount */
#line 1104 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(__int16)*yypvt[-0].int32); } break;
-case 412:
+ { PASM->EmitData(NULL, sizeof(int16_t)*(yyvsp[0].int32)); }
+#line 5888 "asmparse.cpp"
+ break;
+
+ case 413: /* ddItem: INT8_ ddItemCount */
#line 1105 "asmparse.y"
-{ PASM->EmitData(NULL, sizeof(__int8)*yypvt[-0].int32); } break;
-case 413:
+ { PASM->EmitData(NULL, sizeof(int8_t)*(yyvsp[0].int32)); }
+#line 5894 "asmparse.cpp"
+ break;
+
+ case 414: /* fieldSerInit: FLOAT32_ '(' float64 ')' */
#line 1109 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4);
- float f = (float)(*yypvt[-1].float64);
- yyval.binstr->appendInt32(*((__int32*)&f)); delete yypvt[-1].float64; } break;
-case 414:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_R4);
+ float f = (float)(*(yyvsp[-1].float64));
+ (yyval.binstr)->appendInt32(*((int32_t*)&f)); delete (yyvsp[-1].float64); }
+#line 5902 "asmparse.cpp"
+ break;
+
+ case 415: /* fieldSerInit: FLOAT64_ '(' float64 ')' */
#line 1112 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8);
- yyval.binstr->appendInt64((__int64 *)yypvt[-1].float64); delete yypvt[-1].float64; } break;
-case 415:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_R8);
+ (yyval.binstr)->appendInt64((int64_t *)(yyvsp[-1].float64)); delete (yyvsp[-1].float64); }
+#line 5909 "asmparse.cpp"
+ break;
+
+ case 416: /* fieldSerInit: FLOAT32_ '(' int32 ')' */
#line 1114 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4);
- yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 416:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_R4);
+ (yyval.binstr)->appendInt32((yyvsp[-1].int32)); }
+#line 5916 "asmparse.cpp"
+ break;
+
+ case 417: /* fieldSerInit: FLOAT64_ '(' int64 ')' */
#line 1116 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8);
- yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break;
-case 417:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_R8);
+ (yyval.binstr)->appendInt64((int64_t *)(yyvsp[-1].int64)); delete (yyvsp[-1].int64); }
+#line 5923 "asmparse.cpp"
+ break;
+
+ case 418: /* fieldSerInit: INT64_ '(' int64 ')' */
#line 1118 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I8);
- yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break;
-case 418:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_I8);
+ (yyval.binstr)->appendInt64((int64_t *)(yyvsp[-1].int64)); delete (yyvsp[-1].int64); }
+#line 5930 "asmparse.cpp"
+ break;
+
+ case 419: /* fieldSerInit: INT32_ '(' int32 ')' */
#line 1120 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I4);
- yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 419:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_I4);
+ (yyval.binstr)->appendInt32((yyvsp[-1].int32)); }
+#line 5937 "asmparse.cpp"
+ break;
+
+ case 420: /* fieldSerInit: INT16_ '(' int32 ')' */
#line 1122 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I2);
- yyval.binstr->appendInt16(yypvt[-1].int32); } break;
-case 420:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_I2);
+ (yyval.binstr)->appendInt16((yyvsp[-1].int32)); }
+#line 5944 "asmparse.cpp"
+ break;
+
+ case 421: /* fieldSerInit: INT8_ '(' int32 ')' */
#line 1124 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I1);
- yyval.binstr->appendInt8(yypvt[-1].int32); } break;
-case 421:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_I1);
+ (yyval.binstr)->appendInt8((yyvsp[-1].int32)); }
+#line 5951 "asmparse.cpp"
+ break;
+
+ case 422: /* fieldSerInit: UNSIGNED_ INT64_ '(' int64 ')' */
#line 1126 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8);
- yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break;
-case 422:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U8);
+ (yyval.binstr)->appendInt64((int64_t *)(yyvsp[-1].int64)); delete (yyvsp[-1].int64); }
+#line 5958 "asmparse.cpp"
+ break;
+
+ case 423: /* fieldSerInit: UNSIGNED_ INT32_ '(' int32 ')' */
#line 1128 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4);
- yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 423:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U4);
+ (yyval.binstr)->appendInt32((yyvsp[-1].int32)); }
+#line 5965 "asmparse.cpp"
+ break;
+
+ case 424: /* fieldSerInit: UNSIGNED_ INT16_ '(' int32 ')' */
#line 1130 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2);
- yyval.binstr->appendInt16(yypvt[-1].int32); } break;
-case 424:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U2);
+ (yyval.binstr)->appendInt16((yyvsp[-1].int32)); }
+#line 5972 "asmparse.cpp"
+ break;
+
+ case 425: /* fieldSerInit: UNSIGNED_ INT8_ '(' int32 ')' */
#line 1132 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1);
- yyval.binstr->appendInt8(yypvt[-1].int32); } break;
-case 425:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U1);
+ (yyval.binstr)->appendInt8((yyvsp[-1].int32)); }
+#line 5979 "asmparse.cpp"
+ break;
+
+ case 426: /* fieldSerInit: UINT64_ '(' int64 ')' */
#line 1134 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8);
- yyval.binstr->appendInt64((__int64 *)yypvt[-1].int64); delete yypvt[-1].int64; } break;
-case 426:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U8);
+ (yyval.binstr)->appendInt64((int64_t *)(yyvsp[-1].int64)); delete (yyvsp[-1].int64); }
+#line 5986 "asmparse.cpp"
+ break;
+
+ case 427: /* fieldSerInit: UINT32_ '(' int32 ')' */
#line 1136 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4);
- yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 427:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U4);
+ (yyval.binstr)->appendInt32((yyvsp[-1].int32)); }
+#line 5993 "asmparse.cpp"
+ break;
+
+ case 428: /* fieldSerInit: UINT16_ '(' int32 ')' */
#line 1138 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2);
- yyval.binstr->appendInt16(yypvt[-1].int32); } break;
-case 428:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U2);
+ (yyval.binstr)->appendInt16((yyvsp[-1].int32)); }
+#line 6000 "asmparse.cpp"
+ break;
+
+ case 429: /* fieldSerInit: UINT8_ '(' int32 ')' */
#line 1140 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1);
- yyval.binstr->appendInt8(yypvt[-1].int32); } break;
-case 429:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U1);
+ (yyval.binstr)->appendInt8((yyvsp[-1].int32)); }
+#line 6007 "asmparse.cpp"
+ break;
+
+ case 430: /* fieldSerInit: CHAR_ '(' int32 ')' */
#line 1142 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CHAR);
- yyval.binstr->appendInt16(yypvt[-1].int32); } break;
-case 430:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_CHAR);
+ (yyval.binstr)->appendInt16((yyvsp[-1].int32)); }
+#line 6014 "asmparse.cpp"
+ break;
+
+ case 431: /* fieldSerInit: BOOL_ '(' truefalse ')' */
#line 1144 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_BOOLEAN);
- yyval.binstr->appendInt8(yypvt[-1].int32);} break;
-case 431:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_BOOLEAN);
+ (yyval.binstr)->appendInt8((yyvsp[-1].int32));}
+#line 6021 "asmparse.cpp"
+ break;
+
+ case 432: /* fieldSerInit: bytearrayhead bytes ')' */
#line 1146 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING);
- yyval.binstr->append(yypvt[-1].binstr); delete yypvt[-1].binstr;} break;
-case 432:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_STRING);
+ (yyval.binstr)->append((yyvsp[-1].binstr)); delete (yyvsp[-1].binstr);}
+#line 6028 "asmparse.cpp"
+ break;
+
+ case 433: /* bytearrayhead: BYTEARRAY_ '(' */
#line 1150 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
-case 433:
+ { bParsingByteArray = TRUE; }
+#line 6034 "asmparse.cpp"
+ break;
+
+ case 434: /* bytes: %empty */
#line 1153 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 434:
+ { (yyval.binstr) = new BinStr(); }
+#line 6040 "asmparse.cpp"
+ break;
+
+ case 435: /* bytes: hexbytes */
#line 1154 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 435:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 6046 "asmparse.cpp"
+ break;
+
+ case 436: /* hexbytes: HEXBYTE */
#line 1157 "asmparse.y"
-{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = new BinStr(); yyval.binstr->appendInt8(i); } break;
-case 436:
+ { int8_t i = (int8_t) (yyvsp[0].int32); (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(i); }
+#line 6052 "asmparse.cpp"
+ break;
+
+ case 437: /* hexbytes: hexbytes HEXBYTE */
#line 1158 "asmparse.y"
-{ __int8 i = (__int8) yypvt[-0].int32; yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(i); } break;
-case 437:
+ { int8_t i = (int8_t) (yyvsp[0].int32); (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->appendInt8(i); }
+#line 6058 "asmparse.cpp"
+ break;
+
+ case 438: /* fieldInit: fieldSerInit */
#line 1162 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 438:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 6064 "asmparse.cpp"
+ break;
+
+ case 439: /* fieldInit: compQstring */
#line 1163 "asmparse.y"
-{ yyval.binstr = BinStrToUnicode(yypvt[-0].binstr,true); yyval.binstr->insertInt8(ELEMENT_TYPE_STRING);} break;
-case 439:
+ { (yyval.binstr) = BinStrToUnicode((yyvsp[0].binstr),true); (yyval.binstr)->insertInt8(ELEMENT_TYPE_STRING);}
+#line 6070 "asmparse.cpp"
+ break;
+
+ case 440: /* fieldInit: NULLREF_ */
#line 1164 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CLASS);
- yyval.binstr->appendInt32(0); } break;
-case 440:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_CLASS);
+ (yyval.binstr)->appendInt32(0); }
+#line 6077 "asmparse.cpp"
+ break;
+
+ case 441: /* serInit: fieldSerInit */
#line 1169 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 441:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 6083 "asmparse.cpp"
+ break;
+
+ case 442: /* serInit: STRING_ '(' NULLREF_ ')' */
#line 1170 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); yyval.binstr->appendInt8(0xFF); } break;
-case 442:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_STRING); (yyval.binstr)->appendInt8(0xFF); }
+#line 6089 "asmparse.cpp"
+ break;
+
+ case 443: /* serInit: STRING_ '(' SQSTRING ')' */
#line 1171 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING);
- AppendStringWithLength(yyval.binstr,yypvt[-1].string); delete [] yypvt[-1].string;} break;
-case 443:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_STRING);
+ AppendStringWithLength((yyval.binstr),(yyvsp[-1].string)); delete [] (yyvsp[-1].string);}
+#line 6096 "asmparse.cpp"
+ break;
+
+ case 444: /* serInit: TYPE_ '(' CLASS_ SQSTRING ')' */
#line 1173 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE);
- AppendStringWithLength(yyval.binstr,yypvt[-1].string); delete [] yypvt[-1].string;} break;
-case 444:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_TYPE);
+ AppendStringWithLength((yyval.binstr),(yyvsp[-1].string)); delete [] (yyvsp[-1].string);}
+#line 6103 "asmparse.cpp"
+ break;
+
+ case 445: /* serInit: TYPE_ '(' className ')' */
#line 1175 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE);
- AppendStringWithLength(yyval.binstr,PASM->ReflectionNotation(yypvt[-1].token));} break;
-case 445:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_TYPE);
+ AppendStringWithLength((yyval.binstr),PASM->ReflectionNotation((yyvsp[-1].token)));}
+#line 6110 "asmparse.cpp"
+ break;
+
+ case 446: /* serInit: TYPE_ '(' NULLREF_ ')' */
#line 1177 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(SERIALIZATION_TYPE_TYPE); yyval.binstr->appendInt8(0xFF); } break;
-case 446:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_TYPE); (yyval.binstr)->appendInt8(0xFF); }
+#line 6116 "asmparse.cpp"
+ break;
+
+ case 447: /* serInit: OBJECT_ '(' serInit ')' */
#line 1178 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);} break;
-case 447:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);}
+#line 6122 "asmparse.cpp"
+ break;
+
+ case 448: /* serInit: FLOAT32_ '[' int32 ']' '(' f32seq ')' */
#line 1180 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_R4);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 448:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_R4);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6130 "asmparse.cpp"
+ break;
+
+ case 449: /* serInit: FLOAT64_ '[' int32 ']' '(' f64seq ')' */
#line 1184 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_R8);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 449:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_R8);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6138 "asmparse.cpp"
+ break;
+
+ case 450: /* serInit: INT64_ '[' int32 ']' '(' i64seq ')' */
#line 1188 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_I8);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 450:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_I8);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6146 "asmparse.cpp"
+ break;
+
+ case 451: /* serInit: INT32_ '[' int32 ']' '(' i32seq ')' */
#line 1192 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_I4);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 451:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_I4);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6154 "asmparse.cpp"
+ break;
+
+ case 452: /* serInit: INT16_ '[' int32 ']' '(' i16seq ')' */
#line 1196 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_I2);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 452:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_I2);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6162 "asmparse.cpp"
+ break;
+
+ case 453: /* serInit: INT8_ '[' int32 ']' '(' i8seq ')' */
#line 1200 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_I1);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 453:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_I1);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6170 "asmparse.cpp"
+ break;
+
+ case 454: /* serInit: UINT64_ '[' int32 ']' '(' i64seq ')' */
#line 1204 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_U8);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 454:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_U8);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6178 "asmparse.cpp"
+ break;
+
+ case 455: /* serInit: UINT32_ '[' int32 ']' '(' i32seq ')' */
#line 1208 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_U4);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 455:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_U4);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6186 "asmparse.cpp"
+ break;
+
+ case 456: /* serInit: UINT16_ '[' int32 ']' '(' i16seq ')' */
#line 1212 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_U2);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 456:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_U2);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6194 "asmparse.cpp"
+ break;
+
+ case 457: /* serInit: UINT8_ '[' int32 ']' '(' i8seq ')' */
#line 1216 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_U1);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 457:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_U1);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6202 "asmparse.cpp"
+ break;
+
+ case 458: /* serInit: UNSIGNED_ INT64_ '[' int32 ']' '(' i64seq ')' */
#line 1220 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_U8);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 458:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_U8);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6210 "asmparse.cpp"
+ break;
+
+ case 459: /* serInit: UNSIGNED_ INT32_ '[' int32 ']' '(' i32seq ')' */
#line 1224 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_U4);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 459:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_U4);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6218 "asmparse.cpp"
+ break;
+
+ case 460: /* serInit: UNSIGNED_ INT16_ '[' int32 ']' '(' i16seq ')' */
#line 1228 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_U2);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 460:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_U2);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6226 "asmparse.cpp"
+ break;
+
+ case 461: /* serInit: UNSIGNED_ INT8_ '[' int32 ']' '(' i8seq ')' */
#line 1232 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_U1);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 461:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_U1);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6234 "asmparse.cpp"
+ break;
+
+ case 462: /* serInit: CHAR_ '[' int32 ']' '(' i16seq ')' */
#line 1236 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_CHAR);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 462:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_CHAR);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6242 "asmparse.cpp"
+ break;
+
+ case 463: /* serInit: BOOL_ '[' int32 ']' '(' boolSeq ')' */
#line 1240 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_BOOLEAN);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 463:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_BOOLEAN);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6250 "asmparse.cpp"
+ break;
+
+ case 464: /* serInit: STRING_ '[' int32 ']' '(' sqstringSeq ')' */
#line 1244 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(ELEMENT_TYPE_STRING);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 464:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_STRING);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6258 "asmparse.cpp"
+ break;
+
+ case 465: /* serInit: TYPE_ '[' int32 ']' '(' classSeq ')' */
#line 1248 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(SERIALIZATION_TYPE_TYPE);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 465:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(SERIALIZATION_TYPE_TYPE);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6266 "asmparse.cpp"
+ break;
+
+ case 466: /* serInit: OBJECT_ '[' int32 ']' '(' objSeq ')' */
#line 1252 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt32(yypvt[-4].int32);
- yyval.binstr->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);
- yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 466:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt32((yyvsp[-4].int32));
+ (yyval.binstr)->insertInt8(SERIALIZATION_TYPE_TAGGED_OBJECT);
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 6274 "asmparse.cpp"
+ break;
+
+ case 467: /* f32seq: %empty */
#line 1258 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 467:
+ { (yyval.binstr) = new BinStr(); }
+#line 6280 "asmparse.cpp"
+ break;
+
+ case 468: /* f32seq: f32seq float64 */
#line 1259 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- float f = (float) (*yypvt[-0].float64); yyval.binstr->appendInt32(*((__int32*)&f)); delete yypvt[-0].float64; } break;
-case 468:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ float f = (float) (*(yyvsp[0].float64)); (yyval.binstr)->appendInt32(*((int32_t*)&f)); delete (yyvsp[0].float64); }
+#line 6287 "asmparse.cpp"
+ break;
+
+ case 469: /* f32seq: f32seq int32 */
#line 1261 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- yyval.binstr->appendInt32(yypvt[-0].int32); } break;
-case 469:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ (yyval.binstr)->appendInt32((yyvsp[0].int32)); }
+#line 6294 "asmparse.cpp"
+ break;
+
+ case 470: /* f64seq: %empty */
#line 1265 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 470:
+ { (yyval.binstr) = new BinStr(); }
+#line 6300 "asmparse.cpp"
+ break;
+
+ case 471: /* f64seq: f64seq float64 */
#line 1266 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- yyval.binstr->appendInt64((__int64 *)yypvt[-0].float64); delete yypvt[-0].float64; } break;
-case 471:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ (yyval.binstr)->appendInt64((int64_t *)(yyvsp[0].float64)); delete (yyvsp[0].float64); }
+#line 6307 "asmparse.cpp"
+ break;
+
+ case 472: /* f64seq: f64seq int64 */
#line 1268 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- yyval.binstr->appendInt64((__int64 *)yypvt[-0].int64); delete yypvt[-0].int64; } break;
-case 472:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ (yyval.binstr)->appendInt64((int64_t *)(yyvsp[0].int64)); delete (yyvsp[0].int64); }
+#line 6314 "asmparse.cpp"
+ break;
+
+ case 473: /* i64seq: %empty */
#line 1272 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 473:
+ { (yyval.binstr) = new BinStr(); }
+#line 6320 "asmparse.cpp"
+ break;
+
+ case 474: /* i64seq: i64seq int64 */
#line 1273 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- yyval.binstr->appendInt64((__int64 *)yypvt[-0].int64); delete yypvt[-0].int64; } break;
-case 474:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ (yyval.binstr)->appendInt64((int64_t *)(yyvsp[0].int64)); delete (yyvsp[0].int64); }
+#line 6327 "asmparse.cpp"
+ break;
+
+ case 475: /* i32seq: %empty */
#line 1277 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 475:
+ { (yyval.binstr) = new BinStr(); }
+#line 6333 "asmparse.cpp"
+ break;
+
+ case 476: /* i32seq: i32seq int32 */
#line 1278 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt32(yypvt[-0].int32);} break;
-case 476:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->appendInt32((yyvsp[0].int32));}
+#line 6339 "asmparse.cpp"
+ break;
+
+ case 477: /* i16seq: %empty */
#line 1281 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 477:
+ { (yyval.binstr) = new BinStr(); }
+#line 6345 "asmparse.cpp"
+ break;
+
+ case 478: /* i16seq: i16seq int32 */
#line 1282 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt16(yypvt[-0].int32);} break;
-case 478:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->appendInt16((yyvsp[0].int32));}
+#line 6351 "asmparse.cpp"
+ break;
+
+ case 479: /* i8seq: %empty */
#line 1285 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 479:
+ { (yyval.binstr) = new BinStr(); }
+#line 6357 "asmparse.cpp"
+ break;
+
+ case 480: /* i8seq: i8seq int32 */
#line 1286 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(yypvt[-0].int32); } break;
-case 480:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->appendInt8((yyvsp[0].int32)); }
+#line 6363 "asmparse.cpp"
+ break;
+
+ case 481: /* boolSeq: %empty */
#line 1289 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 481:
+ { (yyval.binstr) = new BinStr(); }
+#line 6369 "asmparse.cpp"
+ break;
+
+ case 482: /* boolSeq: boolSeq truefalse */
#line 1290 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- yyval.binstr->appendInt8(yypvt[-0].int32);} break;
-case 482:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ (yyval.binstr)->appendInt8((yyvsp[0].int32));}
+#line 6376 "asmparse.cpp"
+ break;
+
+ case 483: /* sqstringSeq: %empty */
#line 1294 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 483:
+ { (yyval.binstr) = new BinStr(); }
+#line 6382 "asmparse.cpp"
+ break;
+
+ case 484: /* sqstringSeq: sqstringSeq NULLREF_ */
#line 1295 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break;
-case 484:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->appendInt8(0xFF); }
+#line 6388 "asmparse.cpp"
+ break;
+
+ case 485: /* sqstringSeq: sqstringSeq SQSTRING */
#line 1296 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- AppendStringWithLength(yyval.binstr,yypvt[-0].string); delete [] yypvt[-0].string;} break;
-case 485:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ AppendStringWithLength((yyval.binstr),(yyvsp[0].string)); delete [] (yyvsp[0].string);}
+#line 6395 "asmparse.cpp"
+ break;
+
+ case 486: /* classSeq: %empty */
#line 1300 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 486:
+ { (yyval.binstr) = new BinStr(); }
+#line 6401 "asmparse.cpp"
+ break;
+
+ case 487: /* classSeq: classSeq NULLREF_ */
#line 1301 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->appendInt8(0xFF); } break;
-case 487:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->appendInt8(0xFF); }
+#line 6407 "asmparse.cpp"
+ break;
+
+ case 488: /* classSeq: classSeq CLASS_ SQSTRING */
#line 1302 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr;
- AppendStringWithLength(yyval.binstr,yypvt[-0].string); delete [] yypvt[-0].string;} break;
-case 488:
+ { (yyval.binstr) = (yyvsp[-2].binstr);
+ AppendStringWithLength((yyval.binstr),(yyvsp[0].string)); delete [] (yyvsp[0].string);}
+#line 6414 "asmparse.cpp"
+ break;
+
+ case 489: /* classSeq: classSeq className */
#line 1304 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr;
- AppendStringWithLength(yyval.binstr,PASM->ReflectionNotation(yypvt[-0].token));} break;
-case 489:
+ { (yyval.binstr) = (yyvsp[-1].binstr);
+ AppendStringWithLength((yyval.binstr),PASM->ReflectionNotation((yyvsp[0].token)));}
+#line 6421 "asmparse.cpp"
+ break;
+
+ case 490: /* objSeq: %empty */
#line 1308 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 490:
+ { (yyval.binstr) = new BinStr(); }
+#line 6427 "asmparse.cpp"
+ break;
+
+ case 491: /* objSeq: objSeq serInit */
#line 1309 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
-case 491:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->append((yyvsp[0].binstr)); delete (yyvsp[0].binstr); }
+#line 6433 "asmparse.cpp"
+ break;
+
+ case 492: /* methodSpec: METHOD_ */
#line 1313 "asmparse.y"
-{ parser->m_ANSFirst.PUSH(PASM->m_firstArgName);
+ { parser->m_ANSFirst.PUSH(PASM->m_firstArgName);
parser->m_ANSLast.PUSH(PASM->m_lastArgName);
PASM->m_firstArgName = NULL;
- PASM->m_lastArgName = NULL; } break;
-case 492:
+ PASM->m_lastArgName = NULL; }
+#line 6442 "asmparse.cpp"
+ break;
+
+ case 493: /* instr_none: INSTR_NONE */
#line 1319 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 493:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6448 "asmparse.cpp"
+ break;
+
+ case 494: /* instr_var: INSTR_VAR */
#line 1322 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 494:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6454 "asmparse.cpp"
+ break;
+
+ case 495: /* instr_i: INSTR_I */
#line 1325 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 495:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6460 "asmparse.cpp"
+ break;
+
+ case 496: /* instr_i8: INSTR_I8 */
#line 1328 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 496:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6466 "asmparse.cpp"
+ break;
+
+ case 497: /* instr_r: INSTR_R */
#line 1331 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 497:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6472 "asmparse.cpp"
+ break;
+
+ case 498: /* instr_brtarget: INSTR_BRTARGET */
#line 1334 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 498:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6478 "asmparse.cpp"
+ break;
+
+ case 499: /* instr_method: INSTR_METHOD */
#line 1337 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode);
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode));
if((!PASM->OnErrGo)&&
- ((yypvt[-0].opcode == CEE_NEWOBJ)||
- (yypvt[-0].opcode == CEE_CALLVIRT)))
+ (((yyvsp[0].opcode) == CEE_NEWOBJ)||
+ ((yyvsp[0].opcode) == CEE_CALLVIRT)))
iCallConv = IMAGE_CEE_CS_CALLCONV_HASTHIS;
- } break;
-case 499:
+ }
+#line 6489 "asmparse.cpp"
+ break;
+
+ case 500: /* instr_field: INSTR_FIELD */
#line 1345 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 500:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6495 "asmparse.cpp"
+ break;
+
+ case 501: /* instr_type: INSTR_TYPE */
#line 1348 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 501:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6501 "asmparse.cpp"
+ break;
+
+ case 502: /* instr_string: INSTR_STRING */
#line 1351 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 502:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6507 "asmparse.cpp"
+ break;
+
+ case 503: /* instr_sig: INSTR_SIG */
#line 1354 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 503:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6513 "asmparse.cpp"
+ break;
+
+ case 504: /* instr_tok: INSTR_TOK */
#line 1357 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); iOpcodeLen = PASM->OpcodeLen(yyval.instr); } break;
-case 504:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); iOpcodeLen = PASM->OpcodeLen((yyval.instr)); }
+#line 6519 "asmparse.cpp"
+ break;
+
+ case 505: /* instr_switch: INSTR_SWITCH */
#line 1360 "asmparse.y"
-{ yyval.instr = SetupInstr(yypvt[-0].opcode); } break;
-case 505:
+ { (yyval.instr) = SetupInstr((yyvsp[0].opcode)); }
+#line 6525 "asmparse.cpp"
+ break;
+
+ case 506: /* instr_r_head: instr_r '(' */
#line 1363 "asmparse.y"
-{ yyval.instr = yypvt[-1].instr; bParsingByteArray = TRUE; } break;
-case 506:
+ { (yyval.instr) = (yyvsp[-1].instr); bParsingByteArray = TRUE; }
+#line 6531 "asmparse.cpp"
+ break;
+
+ case 507: /* instr: instr_none */
#line 1367 "asmparse.y"
-{ PASM->EmitOpcode(yypvt[-0].instr); } break;
-case 507:
+ { PASM->EmitOpcode((yyvsp[0].instr)); }
+#line 6537 "asmparse.cpp"
+ break;
+
+ case 508: /* instr: instr_var int32 */
#line 1368 "asmparse.y"
-{ PASM->EmitInstrVar(yypvt[-1].instr, yypvt[-0].int32); } break;
-case 508:
+ { PASM->EmitInstrVar((yyvsp[-1].instr), (yyvsp[0].int32)); }
+#line 6543 "asmparse.cpp"
+ break;
+
+ case 509: /* instr: instr_var id */
#line 1369 "asmparse.y"
-{ PASM->EmitInstrVarByName(yypvt[-1].instr, yypvt[-0].string); } break;
-case 509:
+ { PASM->EmitInstrVarByName((yyvsp[-1].instr), (yyvsp[0].string)); }
+#line 6549 "asmparse.cpp"
+ break;
+
+ case 510: /* instr: instr_i int32 */
#line 1370 "asmparse.y"
-{ PASM->EmitInstrI(yypvt[-1].instr, yypvt[-0].int32); } break;
-case 510:
+ { PASM->EmitInstrI((yyvsp[-1].instr), (yyvsp[0].int32)); }
+#line 6555 "asmparse.cpp"
+ break;
+
+ case 511: /* instr: instr_i8 int64 */
#line 1371 "asmparse.y"
-{ PASM->EmitInstrI8(yypvt[-1].instr, yypvt[-0].int64); } break;
-case 511:
+ { PASM->EmitInstrI8((yyvsp[-1].instr), (yyvsp[0].int64)); }
+#line 6561 "asmparse.cpp"
+ break;
+
+ case 512: /* instr: instr_r float64 */
#line 1372 "asmparse.y"
-{ PASM->EmitInstrR(yypvt[-1].instr, yypvt[-0].float64); delete (yypvt[-0].float64);} break;
-case 512:
+ { PASM->EmitInstrR((yyvsp[-1].instr), (yyvsp[0].float64)); delete ((yyvsp[0].float64));}
+#line 6567 "asmparse.cpp"
+ break;
+
+ case 513: /* instr: instr_r int64 */
#line 1373 "asmparse.y"
-{ double f = (double) (*yypvt[-0].int64); PASM->EmitInstrR(yypvt[-1].instr, &f); } break;
-case 513:
+ { double f = (double) (*(yyvsp[0].int64)); PASM->EmitInstrR((yyvsp[-1].instr), &f); }
+#line 6573 "asmparse.cpp"
+ break;
+
+ case 514: /* instr: instr_r_head bytes ')' */
#line 1374 "asmparse.y"
-{ unsigned L = yypvt[-1].binstr->length();
+ { unsigned L = (yyvsp[-1].binstr)->length();
FAIL_UNLESS(L >= sizeof(float), ("%d hexbytes, must be at least %d\n",
L,sizeof(float)));
if(L < sizeof(float)) {YYERROR; }
else {
- double f = (L >= sizeof(double)) ? *((double *)(yypvt[-1].binstr->ptr()))
- : (double)(*(float *)(yypvt[-1].binstr->ptr()));
- PASM->EmitInstrR(yypvt[-2].instr,&f); }
- delete yypvt[-1].binstr; } break;
-case 514:
+ double f = (L >= sizeof(double)) ? *((double *)((yyvsp[-1].binstr)->ptr()))
+ : (double)(*(float *)((yyvsp[-1].binstr)->ptr()));
+ PASM->EmitInstrR((yyvsp[-2].instr),&f); }
+ delete (yyvsp[-1].binstr); }
+#line 6587 "asmparse.cpp"
+ break;
+
+ case 515: /* instr: instr_brtarget int32 */
#line 1383 "asmparse.y"
-{ PASM->EmitInstrBrOffset(yypvt[-1].instr, yypvt[-0].int32); } break;
-case 515:
+ { PASM->EmitInstrBrOffset((yyvsp[-1].instr), (yyvsp[0].int32)); }
+#line 6593 "asmparse.cpp"
+ break;
+
+ case 516: /* instr: instr_brtarget id */
#line 1384 "asmparse.y"
-{ PASM->EmitInstrBrTarget(yypvt[-1].instr, yypvt[-0].string); } break;
-case 516:
+ { PASM->EmitInstrBrTarget((yyvsp[-1].instr), (yyvsp[0].string)); }
+#line 6599 "asmparse.cpp"
+ break;
+
+ case 517: /* instr: instr_method methodRef */
#line 1386 "asmparse.y"
-{ PASM->SetMemberRefFixup(yypvt[-0].token,PASM->OpcodeLen(yypvt[-1].instr));
- PASM->EmitInstrI(yypvt[-1].instr,yypvt[-0].token);
- PASM->m_tkCurrentCVOwner = yypvt[-0].token;
+ { PASM->SetMemberRefFixup((yyvsp[0].token),PASM->OpcodeLen((yyvsp[-1].instr)));
+ PASM->EmitInstrI((yyvsp[-1].instr),(yyvsp[0].token));
+ PASM->m_tkCurrentCVOwner = (yyvsp[0].token);
PASM->m_pCustomDescrList = NULL;
iCallConv = 0;
- } break;
-case 517:
+ }
+#line 6610 "asmparse.cpp"
+ break;
+
+ case 518: /* instr: instr_field type typeSpec DCOLON dottedName */
#line 1393 "asmparse.y"
-{ yypvt[-3].binstr->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
- mdToken mr = PASM->MakeMemberRef(yypvt[-2].token, yypvt[-0].string, yypvt[-3].binstr);
- PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-4].instr));
- PASM->EmitInstrI(yypvt[-4].instr,mr);
+ { (yyvsp[-3].binstr)->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
+ mdToken mr = PASM->MakeMemberRef((yyvsp[-2].token), (yyvsp[0].string), (yyvsp[-3].binstr));
+ PASM->SetMemberRefFixup(mr, PASM->OpcodeLen((yyvsp[-4].instr)));
+ PASM->EmitInstrI((yyvsp[-4].instr),mr);
PASM->m_tkCurrentCVOwner = mr;
PASM->m_pCustomDescrList = NULL;
- } break;
-case 518:
+ }
+#line 6622 "asmparse.cpp"
+ break;
+
+ case 519: /* instr: instr_field type dottedName */
#line 1401 "asmparse.y"
-{ yypvt[-1].binstr->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
- mdToken mr = PASM->MakeMemberRef(mdTokenNil, yypvt[-0].string, yypvt[-1].binstr);
- PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-2].instr));
- PASM->EmitInstrI(yypvt[-2].instr,mr);
+ { (yyvsp[-1].binstr)->insertInt8(IMAGE_CEE_CS_CALLCONV_FIELD);
+ mdToken mr = PASM->MakeMemberRef(mdTokenNil, (yyvsp[0].string), (yyvsp[-1].binstr));
+ PASM->SetMemberRefFixup(mr, PASM->OpcodeLen((yyvsp[-2].instr)));
+ PASM->EmitInstrI((yyvsp[-2].instr),mr);
PASM->m_tkCurrentCVOwner = mr;
PASM->m_pCustomDescrList = NULL;
- } break;
-case 519:
+ }
+#line 6634 "asmparse.cpp"
+ break;
+
+ case 520: /* instr: instr_field mdtoken */
#line 1408 "asmparse.y"
-{ mdToken mr = yypvt[-0].token;
- PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-1].instr));
- PASM->EmitInstrI(yypvt[-1].instr,mr);
+ { mdToken mr = (yyvsp[0].token);
+ PASM->SetMemberRefFixup(mr, PASM->OpcodeLen((yyvsp[-1].instr)));
+ PASM->EmitInstrI((yyvsp[-1].instr),mr);
PASM->m_tkCurrentCVOwner = mr;
PASM->m_pCustomDescrList = NULL;
- } break;
-case 520:
+ }
+#line 6645 "asmparse.cpp"
+ break;
+
+ case 521: /* instr: instr_field TYPEDEF_F */
#line 1414 "asmparse.y"
-{ mdToken mr = yypvt[-0].tdd->m_tkTypeSpec;
- PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-1].instr));
- PASM->EmitInstrI(yypvt[-1].instr,mr);
+ { mdToken mr = (yyvsp[0].tdd)->m_tkTypeSpec;
+ PASM->SetMemberRefFixup(mr, PASM->OpcodeLen((yyvsp[-1].instr)));
+ PASM->EmitInstrI((yyvsp[-1].instr),mr);
PASM->m_tkCurrentCVOwner = mr;
PASM->m_pCustomDescrList = NULL;
- } break;
-case 521:
+ }
+#line 6656 "asmparse.cpp"
+ break;
+
+ case 522: /* instr: instr_field TYPEDEF_MR */
#line 1420 "asmparse.y"
-{ mdToken mr = yypvt[-0].tdd->m_tkTypeSpec;
- PASM->SetMemberRefFixup(mr, PASM->OpcodeLen(yypvt[-1].instr));
- PASM->EmitInstrI(yypvt[-1].instr,mr);
+ { mdToken mr = (yyvsp[0].tdd)->m_tkTypeSpec;
+ PASM->SetMemberRefFixup(mr, PASM->OpcodeLen((yyvsp[-1].instr)));
+ PASM->EmitInstrI((yyvsp[-1].instr),mr);
PASM->m_tkCurrentCVOwner = mr;
PASM->m_pCustomDescrList = NULL;
- } break;
-case 522:
+ }
+#line 6667 "asmparse.cpp"
+ break;
+
+ case 523: /* instr: instr_type typeSpec */
#line 1426 "asmparse.y"
-{ PASM->EmitInstrI(yypvt[-1].instr, yypvt[-0].token);
- PASM->m_tkCurrentCVOwner = yypvt[-0].token;
+ { PASM->EmitInstrI((yyvsp[-1].instr), (yyvsp[0].token));
+ PASM->m_tkCurrentCVOwner = (yyvsp[0].token);
PASM->m_pCustomDescrList = NULL;
- } break;
-case 523:
+ }
+#line 6676 "asmparse.cpp"
+ break;
+
+ case 524: /* instr: instr_string compQstring */
#line 1430 "asmparse.y"
-{ PASM->EmitInstrStringLiteral(yypvt[-1].instr, yypvt[-0].binstr,TRUE); } break;
-case 524:
+ { PASM->EmitInstrStringLiteral((yyvsp[-1].instr), (yyvsp[0].binstr),TRUE); }
+#line 6682 "asmparse.cpp"
+ break;
+
+ case 525: /* instr: instr_string ANSI_ '(' compQstring ')' */
#line 1432 "asmparse.y"
-{ PASM->EmitInstrStringLiteral(yypvt[-4].instr, yypvt[-1].binstr,FALSE); } break;
-case 525:
+ { PASM->EmitInstrStringLiteral((yyvsp[-4].instr), (yyvsp[-1].binstr),FALSE); }
+#line 6688 "asmparse.cpp"
+ break;
+
+ case 526: /* instr: instr_string bytearrayhead bytes ')' */
#line 1434 "asmparse.y"
-{ PASM->EmitInstrStringLiteral(yypvt[-3].instr, yypvt[-1].binstr,FALSE,TRUE); } break;
-case 526:
+ { PASM->EmitInstrStringLiteral((yyvsp[-3].instr), (yyvsp[-1].binstr),FALSE,TRUE); }
+#line 6694 "asmparse.cpp"
+ break;
+
+ case 527: /* instr: instr_sig callConv type '(' sigArgs0 ')' */
#line 1436 "asmparse.y"
-{ PASM->EmitInstrSig(yypvt[-5].instr, parser->MakeSig(yypvt[-4].int32, yypvt[-3].binstr, yypvt[-1].binstr));
+ { PASM->EmitInstrSig((yyvsp[-5].instr), parser->MakeSig((yyvsp[-4].int32), (yyvsp[-3].binstr), (yyvsp[-1].binstr)));
PASM->ResetArgNameList();
- } break;
-case 527:
+ }
+#line 6702 "asmparse.cpp"
+ break;
+
+ case 528: /* instr: instr_tok ownerType */
#line 1440 "asmparse.y"
-{ PASM->EmitInstrI(yypvt[-1].instr,yypvt[-0].token);
- PASM->m_tkCurrentCVOwner = yypvt[-0].token;
+ { PASM->EmitInstrI((yyvsp[-1].instr),(yyvsp[0].token));
+ PASM->m_tkCurrentCVOwner = (yyvsp[0].token);
PASM->m_pCustomDescrList = NULL;
iOpcodeLen = 0;
- } break;
-case 528:
+ }
+#line 6712 "asmparse.cpp"
+ break;
+
+ case 529: /* instr: instr_switch '(' labels ')' */
#line 1445 "asmparse.y"
-{ PASM->EmitInstrSwitch(yypvt[-3].instr, yypvt[-1].labels); } break;
-case 529:
+ { PASM->EmitInstrSwitch((yyvsp[-3].instr), (yyvsp[-1].labels)); }
+#line 6718 "asmparse.cpp"
+ break;
+
+ case 530: /* labels: %empty */
#line 1448 "asmparse.y"
-{ yyval.labels = 0; } break;
-case 530:
+ { (yyval.labels) = 0; }
+#line 6724 "asmparse.cpp"
+ break;
+
+ case 531: /* labels: id ',' labels */
#line 1449 "asmparse.y"
-{ yyval.labels = new Labels(yypvt[-2].string, yypvt[-0].labels, TRUE); } break;
-case 531:
+ { (yyval.labels) = new Labels((yyvsp[-2].string), (yyvsp[0].labels), TRUE); }
+#line 6730 "asmparse.cpp"
+ break;
+
+ case 532: /* labels: int32 ',' labels */
#line 1450 "asmparse.y"
-{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-2].int32, yypvt[-0].labels, FALSE); } break;
-case 532:
+ { (yyval.labels) = new Labels((char *)(UINT_PTR)(yyvsp[-2].int32), (yyvsp[0].labels), FALSE); }
+#line 6736 "asmparse.cpp"
+ break;
+
+ case 533: /* labels: id */
#line 1451 "asmparse.y"
-{ yyval.labels = new Labels(yypvt[-0].string, NULL, TRUE); } break;
-case 533:
+ { (yyval.labels) = new Labels((yyvsp[0].string), NULL, TRUE); }
+#line 6742 "asmparse.cpp"
+ break;
+
+ case 534: /* labels: int32 */
#line 1452 "asmparse.y"
-{ yyval.labels = new Labels((char *)(UINT_PTR)yypvt[-0].int32, NULL, FALSE); } break;
-case 534:
+ { (yyval.labels) = new Labels((char *)(UINT_PTR)(yyvsp[0].int32), NULL, FALSE); }
+#line 6748 "asmparse.cpp"
+ break;
+
+ case 535: /* tyArgs0: %empty */
#line 1456 "asmparse.y"
-{ yyval.binstr = NULL; } break;
-case 535:
+ { (yyval.binstr) = NULL; }
+#line 6754 "asmparse.cpp"
+ break;
+
+ case 536: /* tyArgs0: '<' tyArgs1 '>' */
#line 1457 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; } break;
-case 536:
+ { (yyval.binstr) = (yyvsp[-1].binstr); }
+#line 6760 "asmparse.cpp"
+ break;
+
+ case 537: /* tyArgs1: %empty */
#line 1460 "asmparse.y"
-{ yyval.binstr = NULL; } break;
-case 537:
+ { (yyval.binstr) = NULL; }
+#line 6766 "asmparse.cpp"
+ break;
+
+ case 538: /* tyArgs1: tyArgs2 */
#line 1461 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 538:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 6772 "asmparse.cpp"
+ break;
+
+ case 539: /* tyArgs2: type */
#line 1464 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 539:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 6778 "asmparse.cpp"
+ break;
+
+ case 540: /* tyArgs2: tyArgs2 ',' type */
#line 1465 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
-case 540:
+ { (yyval.binstr) = (yyvsp[-2].binstr); (yyval.binstr)->append((yyvsp[0].binstr)); delete (yyvsp[0].binstr); }
+#line 6784 "asmparse.cpp"
+ break;
+
+ case 541: /* sigArgs0: %empty */
#line 1469 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 541:
+ { (yyval.binstr) = new BinStr(); }
+#line 6790 "asmparse.cpp"
+ break;
+
+ case 542: /* sigArgs0: sigArgs1 */
#line 1470 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr;} break;
-case 542:
+ { (yyval.binstr) = (yyvsp[0].binstr);}
+#line 6796 "asmparse.cpp"
+ break;
+
+ case 543: /* sigArgs1: sigArg */
#line 1473 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 543:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 6802 "asmparse.cpp"
+ break;
+
+ case 544: /* sigArgs1: sigArgs1 ',' sigArg */
#line 1474 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
-case 544:
+ { (yyval.binstr) = (yyvsp[-2].binstr); (yyval.binstr)->append((yyvsp[0].binstr)); delete (yyvsp[0].binstr); }
+#line 6808 "asmparse.cpp"
+ break;
+
+ case 545: /* sigArg: ELLIPSIS */
#line 1477 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_SENTINEL); } break;
-case 545:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_SENTINEL); }
+#line 6814 "asmparse.cpp"
+ break;
+
+ case 546: /* sigArg: paramAttr type marshalClause */
#line 1478 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-1].binstr); PASM->addArgName(NULL, yypvt[-1].binstr, yypvt[-0].binstr, yypvt[-2].int32); } break;
-case 546:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->append((yyvsp[-1].binstr)); PASM->addArgName(NULL, (yyvsp[-1].binstr), (yyvsp[0].binstr), (yyvsp[-2].int32)); }
+#line 6820 "asmparse.cpp"
+ break;
+
+ case 547: /* sigArg: paramAttr type marshalClause id */
#line 1479 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-2].binstr); PASM->addArgName(yypvt[-0].string, yypvt[-2].binstr, yypvt[-1].binstr, yypvt[-3].int32);} break;
-case 547:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->append((yyvsp[-2].binstr)); PASM->addArgName((yyvsp[0].string), (yyvsp[-2].binstr), (yyvsp[-1].binstr), (yyvsp[-3].int32));}
+#line 6826 "asmparse.cpp"
+ break;
+
+ case 548: /* className: '[' dottedName ']' slashedName */
#line 1483 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(PASM->GetAsmRef(yypvt[-2].string), yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break;
-case 548:
+ { (yyval.token) = PASM->ResolveClassRef(PASM->GetAsmRef((yyvsp[-2].string)), (yyvsp[0].string), NULL); delete[] (yyvsp[-2].string);}
+#line 6832 "asmparse.cpp"
+ break;
+
+ case 549: /* className: '[' mdtoken ']' slashedName */
#line 1484 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(yypvt[-2].token, yypvt[-0].string, NULL); } break;
-case 549:
+ { (yyval.token) = PASM->ResolveClassRef((yyvsp[-2].token), (yyvsp[0].string), NULL); }
+#line 6838 "asmparse.cpp"
+ break;
+
+ case 550: /* className: '[' '*' ']' slashedName */
#line 1485 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(mdTokenNil, yypvt[-0].string, NULL); } break;
-case 550:
+ { (yyval.token) = PASM->ResolveClassRef(mdTokenNil, (yyvsp[0].string), NULL); }
+#line 6844 "asmparse.cpp"
+ break;
+
+ case 551: /* className: '[' _MODULE dottedName ']' slashedName */
#line 1486 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(PASM->GetModRef(yypvt[-2].string),yypvt[-0].string, NULL); delete[] yypvt[-2].string;} break;
-case 551:
+ { (yyval.token) = PASM->ResolveClassRef(PASM->GetModRef((yyvsp[-2].string)),(yyvsp[0].string), NULL); delete[] (yyvsp[-2].string);}
+#line 6850 "asmparse.cpp"
+ break;
+
+ case 552: /* className: slashedName */
#line 1487 "asmparse.y"
-{ yyval.token = PASM->ResolveClassRef(1,yypvt[-0].string,NULL); } break;
-case 552:
+ { (yyval.token) = PASM->ResolveClassRef(1,(yyvsp[0].string),NULL); }
+#line 6856 "asmparse.cpp"
+ break;
+
+ case 553: /* className: mdtoken */
#line 1488 "asmparse.y"
-{ yyval.token = yypvt[-0].token; } break;
-case 553:
+ { (yyval.token) = (yyvsp[0].token); }
+#line 6862 "asmparse.cpp"
+ break;
+
+ case 554: /* className: TYPEDEF_T */
#line 1489 "asmparse.y"
-{ yyval.token = yypvt[-0].tdd->m_tkTypeSpec; } break;
-case 554:
+ { (yyval.token) = (yyvsp[0].tdd)->m_tkTypeSpec; }
+#line 6868 "asmparse.cpp"
+ break;
+
+ case 555: /* className: _THIS */
#line 1490 "asmparse.y"
-{ if(PASM->m_pCurClass != NULL) yyval.token = PASM->m_pCurClass->m_cl;
- else { yyval.token = 0; PASM->report->error(".this outside class scope\n"); }
- } break;
-case 555:
+ { if(PASM->m_pCurClass != NULL) (yyval.token) = PASM->m_pCurClass->m_cl;
+ else { (yyval.token) = 0; PASM->report->error(".this outside class scope\n"); }
+ }
+#line 6876 "asmparse.cpp"
+ break;
+
+ case 556: /* className: _BASE */
#line 1493 "asmparse.y"
-{ if(PASM->m_pCurClass != NULL) {
- yyval.token = PASM->m_pCurClass->m_crExtends;
- if(RidFromToken(yyval.token) == 0)
+ { if(PASM->m_pCurClass != NULL) {
+ (yyval.token) = PASM->m_pCurClass->m_crExtends;
+ if(RidFromToken((yyval.token)) == 0)
PASM->report->error(".base undefined\n");
- } else { yyval.token = 0; PASM->report->error(".base outside class scope\n"); }
- } break;
-case 556:
+ } else { (yyval.token) = 0; PASM->report->error(".base outside class scope\n"); }
+ }
+#line 6887 "asmparse.cpp"
+ break;
+
+ case 557: /* className: _NESTER */
#line 1499 "asmparse.y"
-{ if(PASM->m_pCurClass != NULL) {
- if(PASM->m_pCurClass->m_pEncloser != NULL) yyval.token = PASM->m_pCurClass->m_pEncloser->m_cl;
- else { yyval.token = 0; PASM->report->error(".nester undefined\n"); }
- } else { yyval.token = 0; PASM->report->error(".nester outside class scope\n"); }
- } break;
-case 557:
+ { if(PASM->m_pCurClass != NULL) {
+ if(PASM->m_pCurClass->m_pEncloser != NULL) (yyval.token) = PASM->m_pCurClass->m_pEncloser->m_cl;
+ else { (yyval.token) = 0; PASM->report->error(".nester undefined\n"); }
+ } else { (yyval.token) = 0; PASM->report->error(".nester outside class scope\n"); }
+ }
+#line 6897 "asmparse.cpp"
+ break;
+
+ case 558: /* slashedName: dottedName */
#line 1506 "asmparse.y"
-{ yyval.string = yypvt[-0].string; } break;
-case 558:
+ { (yyval.string) = (yyvsp[0].string); }
+#line 6903 "asmparse.cpp"
+ break;
+
+ case 559: /* slashedName: slashedName '/' dottedName */
#line 1507 "asmparse.y"
-{ yyval.string = newStringWDel(yypvt[-2].string, NESTING_SEP, yypvt[-0].string); } break;
-case 559:
+ { (yyval.string) = newStringWDel((yyvsp[-2].string), NESTING_SEP, (yyvsp[0].string)); }
+#line 6909 "asmparse.cpp"
+ break;
+
+ case 560: /* typeSpec: className */
#line 1510 "asmparse.y"
-{ yyval.token = yypvt[-0].token;} break;
-case 560:
+ { (yyval.token) = (yyvsp[0].token);}
+#line 6915 "asmparse.cpp"
+ break;
+
+ case 561: /* typeSpec: '[' dottedName ']' */
#line 1511 "asmparse.y"
-{ yyval.token = PASM->GetAsmRef(yypvt[-1].string); delete[] yypvt[-1].string;} break;
-case 561:
+ { (yyval.token) = PASM->GetAsmRef((yyvsp[-1].string)); delete[] (yyvsp[-1].string);}
+#line 6921 "asmparse.cpp"
+ break;
+
+ case 562: /* typeSpec: '[' _MODULE dottedName ']' */
#line 1512 "asmparse.y"
-{ yyval.token = PASM->GetModRef(yypvt[-1].string); delete[] yypvt[-1].string;} break;
-case 562:
+ { (yyval.token) = PASM->GetModRef((yyvsp[-1].string)); delete[] (yyvsp[-1].string);}
+#line 6927 "asmparse.cpp"
+ break;
+
+ case 563: /* typeSpec: type */
#line 1513 "asmparse.y"
-{ yyval.token = PASM->ResolveTypeSpec(yypvt[-0].binstr); } break;
-case 563:
+ { (yyval.token) = PASM->ResolveTypeSpec((yyvsp[0].binstr)); }
+#line 6933 "asmparse.cpp"
+ break;
+
+ case 564: /* nativeType: %empty */
#line 1517 "asmparse.y"
-{ yyval.binstr = new BinStr(); } break;
-case 564:
+ { (yyval.binstr) = new BinStr(); }
+#line 6939 "asmparse.cpp"
+ break;
+
+ case 565: /* nativeType: CUSTOM_ '(' compQstring ',' compQstring ',' compQstring ',' compQstring ')' */
#line 1519 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER);
- corEmitInt(yyval.binstr,yypvt[-7].binstr->length()); yyval.binstr->append(yypvt[-7].binstr);
- corEmitInt(yyval.binstr,yypvt[-5].binstr->length()); yyval.binstr->append(yypvt[-5].binstr);
- corEmitInt(yyval.binstr,yypvt[-3].binstr->length()); yyval.binstr->append(yypvt[-3].binstr);
- corEmitInt(yyval.binstr,yypvt[-1].binstr->length()); yyval.binstr->append(yypvt[-1].binstr);
- PASM->report->warn("Deprecated 4-string form of custom marshaler, first two strings ignored\n");} break;
-case 565:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER);
+ corEmitInt((yyval.binstr),(yyvsp[-7].binstr)->length()); (yyval.binstr)->append((yyvsp[-7].binstr));
+ corEmitInt((yyval.binstr),(yyvsp[-5].binstr)->length()); (yyval.binstr)->append((yyvsp[-5].binstr));
+ corEmitInt((yyval.binstr),(yyvsp[-3].binstr)->length()); (yyval.binstr)->append((yyvsp[-3].binstr));
+ corEmitInt((yyval.binstr),(yyvsp[-1].binstr)->length()); (yyval.binstr)->append((yyvsp[-1].binstr));
+ PASM->report->warn("Deprecated 4-string form of custom marshaler, first two strings ignored\n");}
+#line 6950 "asmparse.cpp"
+ break;
+
+ case 566: /* nativeType: CUSTOM_ '(' compQstring ',' compQstring ')' */
#line 1526 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER);
- corEmitInt(yyval.binstr,0);
- corEmitInt(yyval.binstr,0);
- corEmitInt(yyval.binstr,yypvt[-3].binstr->length()); yyval.binstr->append(yypvt[-3].binstr);
- corEmitInt(yyval.binstr,yypvt[-1].binstr->length()); yyval.binstr->append(yypvt[-1].binstr); } break;
-case 566:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_CUSTOMMARSHALER);
+ corEmitInt((yyval.binstr),0);
+ corEmitInt((yyval.binstr),0);
+ corEmitInt((yyval.binstr),(yyvsp[-3].binstr)->length()); (yyval.binstr)->append((yyvsp[-3].binstr));
+ corEmitInt((yyval.binstr),(yyvsp[-1].binstr)->length()); (yyval.binstr)->append((yyvsp[-1].binstr)); }
+#line 6960 "asmparse.cpp"
+ break;
+
+ case 567: /* nativeType: FIXED_ SYSSTRING_ '[' int32 ']' */
#line 1531 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FIXEDSYSSTRING);
- corEmitInt(yyval.binstr,yypvt[-1].int32); } break;
-case 567:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_FIXEDSYSSTRING);
+ corEmitInt((yyval.binstr),(yyvsp[-1].int32)); }
+#line 6967 "asmparse.cpp"
+ break;
+
+ case 568: /* nativeType: FIXED_ ARRAY_ '[' int32 ']' nativeType */
#line 1534 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FIXEDARRAY);
- corEmitInt(yyval.binstr,yypvt[-2].int32); yyval.binstr->append(yypvt[-0].binstr); } break;
-case 568:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_FIXEDARRAY);
+ corEmitInt((yyval.binstr),(yyvsp[-2].int32)); (yyval.binstr)->append((yyvsp[0].binstr)); }
+#line 6974 "asmparse.cpp"
+ break;
+
+ case 569: /* nativeType: VARIANT_ */
#line 1536 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VARIANT);
- PASM->report->warn("Deprecated native type 'variant'\n"); } break;
-case 569:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_VARIANT);
+ PASM->report->warn("Deprecated native type 'variant'\n"); }
+#line 6981 "asmparse.cpp"
+ break;
+
+ case 570: /* nativeType: CURRENCY_ */
#line 1538 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_CURRENCY); } break;
-case 570:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_CURRENCY); }
+#line 6987 "asmparse.cpp"
+ break;
+
+ case 571: /* nativeType: SYSCHAR_ */
#line 1539 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_SYSCHAR);
- PASM->report->warn("Deprecated native type 'syschar'\n"); } break;
-case 571:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_SYSCHAR);
+ PASM->report->warn("Deprecated native type 'syschar'\n"); }
+#line 6994 "asmparse.cpp"
+ break;
+
+ case 572: /* nativeType: VOID_ */
#line 1541 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VOID);
- PASM->report->warn("Deprecated native type 'void'\n"); } break;
-case 572:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_VOID);
+ PASM->report->warn("Deprecated native type 'void'\n"); }
+#line 7001 "asmparse.cpp"
+ break;
+
+ case 573: /* nativeType: BOOL_ */
#line 1543 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BOOLEAN); } break;
-case 573:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_BOOLEAN); }
+#line 7007 "asmparse.cpp"
+ break;
+
+ case 574: /* nativeType: INT8_ */
#line 1544 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I1); } break;
-case 574:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_I1); }
+#line 7013 "asmparse.cpp"
+ break;
+
+ case 575: /* nativeType: INT16_ */
#line 1545 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I2); } break;
-case 575:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_I2); }
+#line 7019 "asmparse.cpp"
+ break;
+
+ case 576: /* nativeType: INT32_ */
#line 1546 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I4); } break;
-case 576:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_I4); }
+#line 7025 "asmparse.cpp"
+ break;
+
+ case 577: /* nativeType: INT64_ */
#line 1547 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_I8); } break;
-case 577:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_I8); }
+#line 7031 "asmparse.cpp"
+ break;
+
+ case 578: /* nativeType: FLOAT32_ */
#line 1548 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R4); } break;
-case 578:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_R4); }
+#line 7037 "asmparse.cpp"
+ break;
+
+ case 579: /* nativeType: FLOAT64_ */
#line 1549 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_R8); } break;
-case 579:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_R8); }
+#line 7043 "asmparse.cpp"
+ break;
+
+ case 580: /* nativeType: ERROR_ */
#line 1550 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ERROR); } break;
-case 580:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_ERROR); }
+#line 7049 "asmparse.cpp"
+ break;
+
+ case 581: /* nativeType: UNSIGNED_ INT8_ */
#line 1551 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break;
-case 581:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_U1); }
+#line 7055 "asmparse.cpp"
+ break;
+
+ case 582: /* nativeType: UNSIGNED_ INT16_ */
#line 1552 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break;
-case 582:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_U2); }
+#line 7061 "asmparse.cpp"
+ break;
+
+ case 583: /* nativeType: UNSIGNED_ INT32_ */
#line 1553 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break;
-case 583:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_U4); }
+#line 7067 "asmparse.cpp"
+ break;
+
+ case 584: /* nativeType: UNSIGNED_ INT64_ */
#line 1554 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break;
-case 584:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_U8); }
+#line 7073 "asmparse.cpp"
+ break;
+
+ case 585: /* nativeType: UINT8_ */
#line 1555 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U1); } break;
-case 585:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_U1); }
+#line 7079 "asmparse.cpp"
+ break;
+
+ case 586: /* nativeType: UINT16_ */
#line 1556 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U2); } break;
-case 586:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_U2); }
+#line 7085 "asmparse.cpp"
+ break;
+
+ case 587: /* nativeType: UINT32_ */
#line 1557 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U4); } break;
-case 587:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_U4); }
+#line 7091 "asmparse.cpp"
+ break;
+
+ case 588: /* nativeType: UINT64_ */
#line 1558 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_U8); } break;
-case 588:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_U8); }
+#line 7097 "asmparse.cpp"
+ break;
+
+ case 589: /* nativeType: nativeType '*' */
#line 1559 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(NATIVE_TYPE_PTR);
- PASM->report->warn("Deprecated native type '*'\n"); } break;
-case 589:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt8(NATIVE_TYPE_PTR);
+ PASM->report->warn("Deprecated native type '*'\n"); }
+#line 7104 "asmparse.cpp"
+ break;
+
+ case 590: /* nativeType: nativeType '[' ']' */
#line 1561 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX);
- yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY); } break;
-case 590:
+ { (yyval.binstr) = (yyvsp[-2].binstr); if((yyval.binstr)->length()==0) (yyval.binstr)->appendInt8(NATIVE_TYPE_MAX);
+ (yyval.binstr)->insertInt8(NATIVE_TYPE_ARRAY); }
+#line 7111 "asmparse.cpp"
+ break;
+
+ case 591: /* nativeType: nativeType '[' int32 ']' */
#line 1563 "asmparse.y"
-{ yyval.binstr = yypvt[-3].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX);
- yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY);
- corEmitInt(yyval.binstr,0);
- corEmitInt(yyval.binstr,yypvt[-1].int32);
- corEmitInt(yyval.binstr,0); } break;
-case 591:
+ { (yyval.binstr) = (yyvsp[-3].binstr); if((yyval.binstr)->length()==0) (yyval.binstr)->appendInt8(NATIVE_TYPE_MAX);
+ (yyval.binstr)->insertInt8(NATIVE_TYPE_ARRAY);
+ corEmitInt((yyval.binstr),0);
+ corEmitInt((yyval.binstr),(yyvsp[-1].int32));
+ corEmitInt((yyval.binstr),0); }
+#line 7121 "asmparse.cpp"
+ break;
+
+ case 592: /* nativeType: nativeType '[' int32 '+' int32 ']' */
#line 1568 "asmparse.y"
-{ yyval.binstr = yypvt[-5].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX);
- yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY);
- corEmitInt(yyval.binstr,yypvt[-1].int32);
- corEmitInt(yyval.binstr,yypvt[-3].int32);
- corEmitInt(yyval.binstr,ntaSizeParamIndexSpecified); } break;
-case 592:
+ { (yyval.binstr) = (yyvsp[-5].binstr); if((yyval.binstr)->length()==0) (yyval.binstr)->appendInt8(NATIVE_TYPE_MAX);
+ (yyval.binstr)->insertInt8(NATIVE_TYPE_ARRAY);
+ corEmitInt((yyval.binstr),(yyvsp[-1].int32));
+ corEmitInt((yyval.binstr),(yyvsp[-3].int32));
+ corEmitInt((yyval.binstr),ntaSizeParamIndexSpecified); }
+#line 7131 "asmparse.cpp"
+ break;
+
+ case 593: /* nativeType: nativeType '[' '+' int32 ']' */
#line 1573 "asmparse.y"
-{ yyval.binstr = yypvt[-4].binstr; if(yyval.binstr->length()==0) yyval.binstr->appendInt8(NATIVE_TYPE_MAX);
- yyval.binstr->insertInt8(NATIVE_TYPE_ARRAY);
- corEmitInt(yyval.binstr,yypvt[-1].int32); } break;
-case 593:
+ { (yyval.binstr) = (yyvsp[-4].binstr); if((yyval.binstr)->length()==0) (yyval.binstr)->appendInt8(NATIVE_TYPE_MAX);
+ (yyval.binstr)->insertInt8(NATIVE_TYPE_ARRAY);
+ corEmitInt((yyval.binstr),(yyvsp[-1].int32)); }
+#line 7139 "asmparse.cpp"
+ break;
+
+ case 594: /* nativeType: DECIMAL_ */
#line 1576 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_DECIMAL);
- PASM->report->warn("Deprecated native type 'decimal'\n"); } break;
-case 594:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_DECIMAL);
+ PASM->report->warn("Deprecated native type 'decimal'\n"); }
+#line 7146 "asmparse.cpp"
+ break;
+
+ case 595: /* nativeType: DATE_ */
#line 1578 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_DATE);
- PASM->report->warn("Deprecated native type 'date'\n"); } break;
-case 595:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_DATE);
+ PASM->report->warn("Deprecated native type 'date'\n"); }
+#line 7153 "asmparse.cpp"
+ break;
+
+ case 596: /* nativeType: BSTR_ */
#line 1580 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BSTR); } break;
-case 596:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_BSTR); }
+#line 7159 "asmparse.cpp"
+ break;
+
+ case 597: /* nativeType: LPSTR_ */
#line 1581 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTR); } break;
-case 597:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_LPSTR); }
+#line 7165 "asmparse.cpp"
+ break;
+
+ case 598: /* nativeType: LPWSTR_ */
#line 1582 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPWSTR); } break;
-case 598:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_LPWSTR); }
+#line 7171 "asmparse.cpp"
+ break;
+
+ case 599: /* nativeType: LPTSTR_ */
#line 1583 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPTSTR); } break;
-case 599:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_LPTSTR); }
+#line 7177 "asmparse.cpp"
+ break;
+
+ case 600: /* nativeType: OBJECTREF_ */
#line 1584 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_OBJECTREF);
- PASM->report->warn("Deprecated native type 'objectref'\n"); } break;
-case 600:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_OBJECTREF);
+ PASM->report->warn("Deprecated native type 'objectref'\n"); }
+#line 7184 "asmparse.cpp"
+ break;
+
+ case 601: /* nativeType: IUNKNOWN_ iidParamIndex */
#line 1586 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_IUNKNOWN);
- if(yypvt[-0].int32 != -1) corEmitInt(yyval.binstr,yypvt[-0].int32); } break;
-case 601:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_IUNKNOWN);
+ if((yyvsp[0].int32) != -1) corEmitInt((yyval.binstr),(yyvsp[0].int32)); }
+#line 7191 "asmparse.cpp"
+ break;
+
+ case 602: /* nativeType: IDISPATCH_ iidParamIndex */
#line 1588 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_IDISPATCH);
- if(yypvt[-0].int32 != -1) corEmitInt(yyval.binstr,yypvt[-0].int32); } break;
-case 602:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_IDISPATCH);
+ if((yyvsp[0].int32) != -1) corEmitInt((yyval.binstr),(yyvsp[0].int32)); }
+#line 7198 "asmparse.cpp"
+ break;
+
+ case 603: /* nativeType: STRUCT_ */
#line 1590 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_STRUCT); } break;
-case 603:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_STRUCT); }
+#line 7204 "asmparse.cpp"
+ break;
+
+ case 604: /* nativeType: INTERFACE_ iidParamIndex */
#line 1591 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_INTF);
- if(yypvt[-0].int32 != -1) corEmitInt(yyval.binstr,yypvt[-0].int32); } break;
-case 604:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_INTF);
+ if((yyvsp[0].int32) != -1) corEmitInt((yyval.binstr),(yyvsp[0].int32)); }
+#line 7211 "asmparse.cpp"
+ break;
+
+ case 605: /* nativeType: SAFEARRAY_ variantType */
#line 1593 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_SAFEARRAY);
- corEmitInt(yyval.binstr,yypvt[-0].int32);
- corEmitInt(yyval.binstr,0);} break;
-case 605:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_SAFEARRAY);
+ corEmitInt((yyval.binstr),(yyvsp[0].int32));
+ corEmitInt((yyval.binstr),0);}
+#line 7219 "asmparse.cpp"
+ break;
+
+ case 606: /* nativeType: SAFEARRAY_ variantType ',' compQstring */
#line 1596 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_SAFEARRAY);
- corEmitInt(yyval.binstr,yypvt[-2].int32);
- corEmitInt(yyval.binstr,yypvt[-0].binstr->length()); yyval.binstr->append(yypvt[-0].binstr); } break;
-case 606:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_SAFEARRAY);
+ corEmitInt((yyval.binstr),(yyvsp[-2].int32));
+ corEmitInt((yyval.binstr),(yyvsp[0].binstr)->length()); (yyval.binstr)->append((yyvsp[0].binstr)); }
+#line 7227 "asmparse.cpp"
+ break;
+
+ case 607: /* nativeType: INT_ */
#line 1600 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_INT); } break;
-case 607:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_INT); }
+#line 7233 "asmparse.cpp"
+ break;
+
+ case 608: /* nativeType: UNSIGNED_ INT_ */
#line 1601 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_UINT); } break;
-case 608:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_UINT); }
+#line 7239 "asmparse.cpp"
+ break;
+
+ case 609: /* nativeType: UINT_ */
#line 1602 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_UINT); } break;
-case 609:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_UINT); }
+#line 7245 "asmparse.cpp"
+ break;
+
+ case 610: /* nativeType: NESTED_ STRUCT_ */
#line 1603 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_NESTEDSTRUCT);
- PASM->report->warn("Deprecated native type 'nested struct'\n"); } break;
-case 610:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_NESTEDSTRUCT);
+ PASM->report->warn("Deprecated native type 'nested struct'\n"); }
+#line 7252 "asmparse.cpp"
+ break;
+
+ case 611: /* nativeType: BYVALSTR_ */
#line 1605 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_BYVALSTR); } break;
-case 611:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_BYVALSTR); }
+#line 7258 "asmparse.cpp"
+ break;
+
+ case 612: /* nativeType: ANSI_ BSTR_ */
#line 1606 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ANSIBSTR); } break;
-case 612:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_ANSIBSTR); }
+#line 7264 "asmparse.cpp"
+ break;
+
+ case 613: /* nativeType: TBSTR_ */
#line 1607 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_TBSTR); } break;
-case 613:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_TBSTR); }
+#line 7270 "asmparse.cpp"
+ break;
+
+ case 614: /* nativeType: VARIANT_ BOOL_ */
#line 1608 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_VARIANTBOOL); } break;
-case 614:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_VARIANTBOOL); }
+#line 7276 "asmparse.cpp"
+ break;
+
+ case 615: /* nativeType: METHOD_ */
#line 1609 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_FUNC); } break;
-case 615:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_FUNC); }
+#line 7282 "asmparse.cpp"
+ break;
+
+ case 616: /* nativeType: AS_ ANY_ */
#line 1610 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_ASANY); } break;
-case 616:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_ASANY); }
+#line 7288 "asmparse.cpp"
+ break;
+
+ case 617: /* nativeType: LPSTRUCT_ */
#line 1611 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(NATIVE_TYPE_LPSTRUCT); } break;
-case 617:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(NATIVE_TYPE_LPSTRUCT); }
+#line 7294 "asmparse.cpp"
+ break;
+
+ case 618: /* nativeType: TYPEDEF_TS */
#line 1612 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break;
-case 618:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->append((yyvsp[0].tdd)->m_pbsTypeSpec); }
+#line 7300 "asmparse.cpp"
+ break;
+
+ case 619: /* iidParamIndex: %empty */
#line 1615 "asmparse.y"
-{ yyval.int32 = -1; } break;
-case 619:
+ { (yyval.int32) = -1; }
+#line 7306 "asmparse.cpp"
+ break;
+
+ case 620: /* iidParamIndex: '(' IIDPARAM_ '=' int32 ')' */
#line 1616 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32; } break;
-case 620:
+ { (yyval.int32) = (yyvsp[-1].int32); }
+#line 7312 "asmparse.cpp"
+ break;
+
+ case 621: /* variantType: %empty */
#line 1619 "asmparse.y"
-{ yyval.int32 = VT_EMPTY; } break;
-case 621:
+ { (yyval.int32) = VT_EMPTY; }
+#line 7318 "asmparse.cpp"
+ break;
+
+ case 622: /* variantType: NULL_ */
#line 1620 "asmparse.y"
-{ yyval.int32 = VT_NULL; } break;
-case 622:
+ { (yyval.int32) = VT_NULL; }
+#line 7324 "asmparse.cpp"
+ break;
+
+ case 623: /* variantType: VARIANT_ */
#line 1621 "asmparse.y"
-{ yyval.int32 = VT_VARIANT; } break;
-case 623:
+ { (yyval.int32) = VT_VARIANT; }
+#line 7330 "asmparse.cpp"
+ break;
+
+ case 624: /* variantType: CURRENCY_ */
#line 1622 "asmparse.y"
-{ yyval.int32 = VT_CY; } break;
-case 624:
+ { (yyval.int32) = VT_CY; }
+#line 7336 "asmparse.cpp"
+ break;
+
+ case 625: /* variantType: VOID_ */
#line 1623 "asmparse.y"
-{ yyval.int32 = VT_VOID; } break;
-case 625:
+ { (yyval.int32) = VT_VOID; }
+#line 7342 "asmparse.cpp"
+ break;
+
+ case 626: /* variantType: BOOL_ */
#line 1624 "asmparse.y"
-{ yyval.int32 = VT_BOOL; } break;
-case 626:
+ { (yyval.int32) = VT_BOOL; }
+#line 7348 "asmparse.cpp"
+ break;
+
+ case 627: /* variantType: INT8_ */
#line 1625 "asmparse.y"
-{ yyval.int32 = VT_I1; } break;
-case 627:
+ { (yyval.int32) = VT_I1; }
+#line 7354 "asmparse.cpp"
+ break;
+
+ case 628: /* variantType: INT16_ */
#line 1626 "asmparse.y"
-{ yyval.int32 = VT_I2; } break;
-case 628:
+ { (yyval.int32) = VT_I2; }
+#line 7360 "asmparse.cpp"
+ break;
+
+ case 629: /* variantType: INT32_ */
#line 1627 "asmparse.y"
-{ yyval.int32 = VT_I4; } break;
-case 629:
+ { (yyval.int32) = VT_I4; }
+#line 7366 "asmparse.cpp"
+ break;
+
+ case 630: /* variantType: INT64_ */
#line 1628 "asmparse.y"
-{ yyval.int32 = VT_I8; } break;
-case 630:
+ { (yyval.int32) = VT_I8; }
+#line 7372 "asmparse.cpp"
+ break;
+
+ case 631: /* variantType: FLOAT32_ */
#line 1629 "asmparse.y"
-{ yyval.int32 = VT_R4; } break;
-case 631:
+ { (yyval.int32) = VT_R4; }
+#line 7378 "asmparse.cpp"
+ break;
+
+ case 632: /* variantType: FLOAT64_ */
#line 1630 "asmparse.y"
-{ yyval.int32 = VT_R8; } break;
-case 632:
+ { (yyval.int32) = VT_R8; }
+#line 7384 "asmparse.cpp"
+ break;
+
+ case 633: /* variantType: UNSIGNED_ INT8_ */
#line 1631 "asmparse.y"
-{ yyval.int32 = VT_UI1; } break;
-case 633:
+ { (yyval.int32) = VT_UI1; }
+#line 7390 "asmparse.cpp"
+ break;
+
+ case 634: /* variantType: UNSIGNED_ INT16_ */
#line 1632 "asmparse.y"
-{ yyval.int32 = VT_UI2; } break;
-case 634:
+ { (yyval.int32) = VT_UI2; }
+#line 7396 "asmparse.cpp"
+ break;
+
+ case 635: /* variantType: UNSIGNED_ INT32_ */
#line 1633 "asmparse.y"
-{ yyval.int32 = VT_UI4; } break;
-case 635:
+ { (yyval.int32) = VT_UI4; }
+#line 7402 "asmparse.cpp"
+ break;
+
+ case 636: /* variantType: UNSIGNED_ INT64_ */
#line 1634 "asmparse.y"
-{ yyval.int32 = VT_UI8; } break;
-case 636:
+ { (yyval.int32) = VT_UI8; }
+#line 7408 "asmparse.cpp"
+ break;
+
+ case 637: /* variantType: UINT8_ */
#line 1635 "asmparse.y"
-{ yyval.int32 = VT_UI1; } break;
-case 637:
+ { (yyval.int32) = VT_UI1; }
+#line 7414 "asmparse.cpp"
+ break;
+
+ case 638: /* variantType: UINT16_ */
#line 1636 "asmparse.y"
-{ yyval.int32 = VT_UI2; } break;
-case 638:
+ { (yyval.int32) = VT_UI2; }
+#line 7420 "asmparse.cpp"
+ break;
+
+ case 639: /* variantType: UINT32_ */
#line 1637 "asmparse.y"
-{ yyval.int32 = VT_UI4; } break;
-case 639:
+ { (yyval.int32) = VT_UI4; }
+#line 7426 "asmparse.cpp"
+ break;
+
+ case 640: /* variantType: UINT64_ */
#line 1638 "asmparse.y"
-{ yyval.int32 = VT_UI8; } break;
-case 640:
+ { (yyval.int32) = VT_UI8; }
+#line 7432 "asmparse.cpp"
+ break;
+
+ case 641: /* variantType: '*' */
#line 1639 "asmparse.y"
-{ yyval.int32 = VT_PTR; } break;
-case 641:
+ { (yyval.int32) = VT_PTR; }
+#line 7438 "asmparse.cpp"
+ break;
+
+ case 642: /* variantType: variantType '[' ']' */
#line 1640 "asmparse.y"
-{ yyval.int32 = yypvt[-2].int32 | VT_ARRAY; } break;
-case 642:
+ { (yyval.int32) = (yyvsp[-2].int32) | VT_ARRAY; }
+#line 7444 "asmparse.cpp"
+ break;
+
+ case 643: /* variantType: variantType VECTOR_ */
#line 1641 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | VT_VECTOR; } break;
-case 643:
+ { (yyval.int32) = (yyvsp[-1].int32) | VT_VECTOR; }
+#line 7450 "asmparse.cpp"
+ break;
+
+ case 644: /* variantType: variantType '&' */
#line 1642 "asmparse.y"
-{ yyval.int32 = yypvt[-1].int32 | VT_BYREF; } break;
-case 644:
+ { (yyval.int32) = (yyvsp[-1].int32) | VT_BYREF; }
+#line 7456 "asmparse.cpp"
+ break;
+
+ case 645: /* variantType: DECIMAL_ */
#line 1643 "asmparse.y"
-{ yyval.int32 = VT_DECIMAL; } break;
-case 645:
+ { (yyval.int32) = VT_DECIMAL; }
+#line 7462 "asmparse.cpp"
+ break;
+
+ case 646: /* variantType: DATE_ */
#line 1644 "asmparse.y"
-{ yyval.int32 = VT_DATE; } break;
-case 646:
+ { (yyval.int32) = VT_DATE; }
+#line 7468 "asmparse.cpp"
+ break;
+
+ case 647: /* variantType: BSTR_ */
#line 1645 "asmparse.y"
-{ yyval.int32 = VT_BSTR; } break;
-case 647:
+ { (yyval.int32) = VT_BSTR; }
+#line 7474 "asmparse.cpp"
+ break;
+
+ case 648: /* variantType: LPSTR_ */
#line 1646 "asmparse.y"
-{ yyval.int32 = VT_LPSTR; } break;
-case 648:
+ { (yyval.int32) = VT_LPSTR; }
+#line 7480 "asmparse.cpp"
+ break;
+
+ case 649: /* variantType: LPWSTR_ */
#line 1647 "asmparse.y"
-{ yyval.int32 = VT_LPWSTR; } break;
-case 649:
+ { (yyval.int32) = VT_LPWSTR; }
+#line 7486 "asmparse.cpp"
+ break;
+
+ case 650: /* variantType: IUNKNOWN_ */
#line 1648 "asmparse.y"
-{ yyval.int32 = VT_UNKNOWN; } break;
-case 650:
+ { (yyval.int32) = VT_UNKNOWN; }
+#line 7492 "asmparse.cpp"
+ break;
+
+ case 651: /* variantType: IDISPATCH_ */
#line 1649 "asmparse.y"
-{ yyval.int32 = VT_DISPATCH; } break;
-case 651:
+ { (yyval.int32) = VT_DISPATCH; }
+#line 7498 "asmparse.cpp"
+ break;
+
+ case 652: /* variantType: SAFEARRAY_ */
#line 1650 "asmparse.y"
-{ yyval.int32 = VT_SAFEARRAY; } break;
-case 652:
+ { (yyval.int32) = VT_SAFEARRAY; }
+#line 7504 "asmparse.cpp"
+ break;
+
+ case 653: /* variantType: INT_ */
#line 1651 "asmparse.y"
-{ yyval.int32 = VT_INT; } break;
-case 653:
+ { (yyval.int32) = VT_INT; }
+#line 7510 "asmparse.cpp"
+ break;
+
+ case 654: /* variantType: UNSIGNED_ INT_ */
#line 1652 "asmparse.y"
-{ yyval.int32 = VT_UINT; } break;
-case 654:
+ { (yyval.int32) = VT_UINT; }
+#line 7516 "asmparse.cpp"
+ break;
+
+ case 655: /* variantType: UINT_ */
#line 1653 "asmparse.y"
-{ yyval.int32 = VT_UINT; } break;
-case 655:
+ { (yyval.int32) = VT_UINT; }
+#line 7522 "asmparse.cpp"
+ break;
+
+ case 656: /* variantType: ERROR_ */
#line 1654 "asmparse.y"
-{ yyval.int32 = VT_ERROR; } break;
-case 656:
+ { (yyval.int32) = VT_ERROR; }
+#line 7528 "asmparse.cpp"
+ break;
+
+ case 657: /* variantType: HRESULT_ */
#line 1655 "asmparse.y"
-{ yyval.int32 = VT_HRESULT; } break;
-case 657:
+ { (yyval.int32) = VT_HRESULT; }
+#line 7534 "asmparse.cpp"
+ break;
+
+ case 658: /* variantType: CARRAY_ */
#line 1656 "asmparse.y"
-{ yyval.int32 = VT_CARRAY; } break;
-case 658:
+ { (yyval.int32) = VT_CARRAY; }
+#line 7540 "asmparse.cpp"
+ break;
+
+ case 659: /* variantType: USERDEFINED_ */
#line 1657 "asmparse.y"
-{ yyval.int32 = VT_USERDEFINED; } break;
-case 659:
+ { (yyval.int32) = VT_USERDEFINED; }
+#line 7546 "asmparse.cpp"
+ break;
+
+ case 660: /* variantType: RECORD_ */
#line 1658 "asmparse.y"
-{ yyval.int32 = VT_RECORD; } break;
-case 660:
+ { (yyval.int32) = VT_RECORD; }
+#line 7552 "asmparse.cpp"
+ break;
+
+ case 661: /* variantType: FILETIME_ */
#line 1659 "asmparse.y"
-{ yyval.int32 = VT_FILETIME; } break;
-case 661:
+ { (yyval.int32) = VT_FILETIME; }
+#line 7558 "asmparse.cpp"
+ break;
+
+ case 662: /* variantType: BLOB_ */
#line 1660 "asmparse.y"
-{ yyval.int32 = VT_BLOB; } break;
-case 662:
+ { (yyval.int32) = VT_BLOB; }
+#line 7564 "asmparse.cpp"
+ break;
+
+ case 663: /* variantType: STREAM_ */
#line 1661 "asmparse.y"
-{ yyval.int32 = VT_STREAM; } break;
-case 663:
+ { (yyval.int32) = VT_STREAM; }
+#line 7570 "asmparse.cpp"
+ break;
+
+ case 664: /* variantType: STORAGE_ */
#line 1662 "asmparse.y"
-{ yyval.int32 = VT_STORAGE; } break;
-case 664:
+ { (yyval.int32) = VT_STORAGE; }
+#line 7576 "asmparse.cpp"
+ break;
+
+ case 665: /* variantType: STREAMED_OBJECT_ */
#line 1663 "asmparse.y"
-{ yyval.int32 = VT_STREAMED_OBJECT; } break;
-case 665:
+ { (yyval.int32) = VT_STREAMED_OBJECT; }
+#line 7582 "asmparse.cpp"
+ break;
+
+ case 666: /* variantType: STORED_OBJECT_ */
#line 1664 "asmparse.y"
-{ yyval.int32 = VT_STORED_OBJECT; } break;
-case 666:
+ { (yyval.int32) = VT_STORED_OBJECT; }
+#line 7588 "asmparse.cpp"
+ break;
+
+ case 667: /* variantType: BLOB_OBJECT_ */
#line 1665 "asmparse.y"
-{ yyval.int32 = VT_BLOB_OBJECT; } break;
-case 667:
+ { (yyval.int32) = VT_BLOB_OBJECT; }
+#line 7594 "asmparse.cpp"
+ break;
+
+ case 668: /* variantType: CF_ */
#line 1666 "asmparse.y"
-{ yyval.int32 = VT_CF; } break;
-case 668:
+ { (yyval.int32) = VT_CF; }
+#line 7600 "asmparse.cpp"
+ break;
+
+ case 669: /* variantType: CLSID_ */
#line 1667 "asmparse.y"
-{ yyval.int32 = VT_CLSID; } break;
-case 669:
+ { (yyval.int32) = VT_CLSID; }
+#line 7606 "asmparse.cpp"
+ break;
+
+ case 670: /* type: CLASS_ className */
#line 1671 "asmparse.y"
-{ if(yypvt[-0].token == PASM->m_tkSysString)
- { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); }
- else if(yypvt[-0].token == PASM->m_tkSysObject)
- { yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_OBJECT); }
+ { if((yyvsp[0].token) == PASM->m_tkSysString)
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_STRING); }
+ else if((yyvsp[0].token) == PASM->m_tkSysObject)
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_OBJECT); }
else
- yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_CLASS, yypvt[-0].token); } break;
-case 670:
+ (yyval.binstr) = parser->MakeTypeClass(ELEMENT_TYPE_CLASS, (yyvsp[0].token)); }
+#line 7617 "asmparse.cpp"
+ break;
+
+ case 671: /* type: OBJECT_ */
#line 1677 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_OBJECT); } break;
-case 671:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_OBJECT); }
+#line 7623 "asmparse.cpp"
+ break;
+
+ case 672: /* type: VALUE_ CLASS_ className */
#line 1678 "asmparse.y"
-{ yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, yypvt[-0].token); } break;
-case 672:
+ { (yyval.binstr) = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, (yyvsp[0].token)); }
+#line 7629 "asmparse.cpp"
+ break;
+
+ case 673: /* type: VALUETYPE_ className */
#line 1679 "asmparse.y"
-{ yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, yypvt[-0].token); } break;
-case 673:
+ { (yyval.binstr) = parser->MakeTypeClass(ELEMENT_TYPE_VALUETYPE, (yyvsp[0].token)); }
+#line 7635 "asmparse.cpp"
+ break;
+
+ case 674: /* type: type '[' ']' */
#line 1680 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SZARRAY); } break;
-case 674:
+ { (yyval.binstr) = (yyvsp[-2].binstr); (yyval.binstr)->insertInt8(ELEMENT_TYPE_SZARRAY); }
+#line 7641 "asmparse.cpp"
+ break;
+
+ case 675: /* type: type '[' bounds1 ']' */
#line 1681 "asmparse.y"
-{ yyval.binstr = parser->MakeTypeArray(ELEMENT_TYPE_ARRAY, yypvt[-3].binstr, yypvt[-1].binstr); } break;
-case 675:
+ { (yyval.binstr) = parser->MakeTypeArray(ELEMENT_TYPE_ARRAY, (yyvsp[-3].binstr), (yyvsp[-1].binstr)); }
+#line 7647 "asmparse.cpp"
+ break;
+
+ case 676: /* type: type '&' */
#line 1682 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_BYREF); } break;
-case 676:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt8(ELEMENT_TYPE_BYREF); }
+#line 7653 "asmparse.cpp"
+ break;
+
+ case 677: /* type: type '*' */
#line 1683 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PTR); } break;
-case 677:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt8(ELEMENT_TYPE_PTR); }
+#line 7659 "asmparse.cpp"
+ break;
+
+ case 678: /* type: type PINNED_ */
#line 1684 "asmparse.y"
-{ yyval.binstr = yypvt[-1].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_PINNED); } break;
-case 678:
+ { (yyval.binstr) = (yyvsp[-1].binstr); (yyval.binstr)->insertInt8(ELEMENT_TYPE_PINNED); }
+#line 7665 "asmparse.cpp"
+ break;
+
+ case 679: /* type: type MODREQ_ '(' typeSpec ')' */
#line 1685 "asmparse.y"
-{ yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_REQD, yypvt[-1].token);
- yyval.binstr->append(yypvt[-4].binstr); } break;
-case 679:
+ { (yyval.binstr) = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_REQD, (yyvsp[-1].token));
+ (yyval.binstr)->append((yyvsp[-4].binstr)); }
+#line 7672 "asmparse.cpp"
+ break;
+
+ case 680: /* type: type MODOPT_ '(' typeSpec ')' */
#line 1687 "asmparse.y"
-{ yyval.binstr = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_OPT, yypvt[-1].token);
- yyval.binstr->append(yypvt[-4].binstr); } break;
-case 680:
+ { (yyval.binstr) = parser->MakeTypeClass(ELEMENT_TYPE_CMOD_OPT, (yyvsp[-1].token));
+ (yyval.binstr)->append((yyvsp[-4].binstr)); }
+#line 7679 "asmparse.cpp"
+ break;
+
+ case 681: /* type: methodSpec callConv type '*' '(' sigArgs0 ')' */
#line 1690 "asmparse.y"
-{ yyval.binstr = parser->MakeSig(yypvt[-5].int32, yypvt[-4].binstr, yypvt[-1].binstr);
- yyval.binstr->insertInt8(ELEMENT_TYPE_FNPTR);
+ { (yyval.binstr) = parser->MakeSig((yyvsp[-5].int32), (yyvsp[-4].binstr), (yyvsp[-1].binstr));
+ (yyval.binstr)->insertInt8(ELEMENT_TYPE_FNPTR);
PASM->delArgNameList(PASM->m_firstArgName);
PASM->m_firstArgName = parser->m_ANSFirst.POP();
PASM->m_lastArgName = parser->m_ANSLast.POP();
- } break;
-case 681:
+ }
+#line 7690 "asmparse.cpp"
+ break;
+
+ case 682: /* type: type '<' tyArgs1 '>' */
#line 1696 "asmparse.y"
-{ if(yypvt[-1].binstr == NULL) yyval.binstr = yypvt[-3].binstr;
+ { if((yyvsp[-1].binstr) == NULL) (yyval.binstr) = (yyvsp[-3].binstr);
else {
- yyval.binstr = new BinStr();
- yyval.binstr->appendInt8(ELEMENT_TYPE_GENERICINST);
- yyval.binstr->append(yypvt[-3].binstr);
- corEmitInt(yyval.binstr, corCountArgs(yypvt[-1].binstr));
- yyval.binstr->append(yypvt[-1].binstr); delete yypvt[-3].binstr; delete yypvt[-1].binstr; }} break;
-case 682:
+ (yyval.binstr) = new BinStr();
+ (yyval.binstr)->appendInt8(ELEMENT_TYPE_GENERICINST);
+ (yyval.binstr)->append((yyvsp[-3].binstr));
+ corEmitInt((yyval.binstr), corCountArgs((yyvsp[-1].binstr)));
+ (yyval.binstr)->append((yyvsp[-1].binstr)); delete (yyvsp[-3].binstr); delete (yyvsp[-1].binstr); }}
+#line 7702 "asmparse.cpp"
+ break;
+
+ case 683: /* type: '!' '!' int32 */
#line 1703 "asmparse.y"
-{ //if(PASM->m_pCurMethod) {
+ { //if(PASM->m_pCurMethod) {
// if(($3 < 0)||((DWORD)$3 >= PASM->m_pCurMethod->m_NumTyPars))
// PASM->report->error("Invalid method type parameter '%d'\n",$3);
- yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_MVAR); corEmitInt(yyval.binstr, yypvt[-0].int32);
+ (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_MVAR); corEmitInt((yyval.binstr), (yyvsp[0].int32));
//} else PASM->report->error("Method type parameter '%d' outside method scope\n",$3);
- } break;
-case 683:
+ }
+#line 7713 "asmparse.cpp"
+ break;
+
+ case 684: /* type: '!' int32 */
#line 1709 "asmparse.y"
-{ //if(PASM->m_pCurClass) {
+ { //if(PASM->m_pCurClass) {
// if(($2 < 0)||((DWORD)$2 >= PASM->m_pCurClass->m_NumTyPars))
// PASM->report->error("Invalid type parameter '%d'\n",$2);
- yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_VAR); corEmitInt(yyval.binstr, yypvt[-0].int32);
+ (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_VAR); corEmitInt((yyval.binstr), (yyvsp[0].int32));
//} else PASM->report->error("Type parameter '%d' outside class scope\n",$2);
- } break;
-case 684:
+ }
+#line 7724 "asmparse.cpp"
+ break;
+
+ case 685: /* type: '!' '!' dottedName */
#line 1715 "asmparse.y"
-{ int eltype = ELEMENT_TYPE_MVAR;
+ { int eltype = ELEMENT_TYPE_MVAR;
int n=-1;
- if(PASM->m_pCurMethod) n = PASM->m_pCurMethod->FindTyPar(yypvt[-0].string);
+ if(PASM->m_pCurMethod) n = PASM->m_pCurMethod->FindTyPar((yyvsp[0].string));
else {
- if(PASM->m_TyParList) n = PASM->m_TyParList->IndexOf(yypvt[-0].string);
+ if(PASM->m_TyParList) n = PASM->m_TyParList->IndexOf((yyvsp[0].string));
if(n == -1)
{ n = TyParFixupList.COUNT();
- TyParFixupList.PUSH(yypvt[-0].string);
+ TyParFixupList.PUSH((yyvsp[0].string));
eltype = ELEMENT_TYPE_MVARFIXUP;
}
}
- if(n == -1) { PASM->report->error("Invalid method type parameter '%s'\n",yypvt[-0].string);
+ if(n == -1) { PASM->report->error("Invalid method type parameter '%s'\n",(yyvsp[0].string));
n = 0x1FFFFFFF; }
- yyval.binstr = new BinStr(); yyval.binstr->appendInt8(eltype); corEmitInt(yyval.binstr,n);
- } break;
-case 685:
+ (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(eltype); corEmitInt((yyval.binstr),n);
+ }
+#line 7744 "asmparse.cpp"
+ break;
+
+ case 686: /* type: '!' dottedName */
#line 1730 "asmparse.y"
-{ int eltype = ELEMENT_TYPE_VAR;
+ { int eltype = ELEMENT_TYPE_VAR;
int n=-1;
- if(PASM->m_pCurClass && !newclass) n = PASM->m_pCurClass->FindTyPar(yypvt[-0].string);
+ if(PASM->m_pCurClass && !newclass) n = PASM->m_pCurClass->FindTyPar((yyvsp[0].string));
else {
- if(PASM->m_TyParList) n = PASM->m_TyParList->IndexOf(yypvt[-0].string);
+ if(PASM->m_TyParList) n = PASM->m_TyParList->IndexOf((yyvsp[0].string));
if(n == -1)
{ n = TyParFixupList.COUNT();
- TyParFixupList.PUSH(yypvt[-0].string);
+ TyParFixupList.PUSH((yyvsp[0].string));
eltype = ELEMENT_TYPE_VARFIXUP;
}
}
- if(n == -1) { PASM->report->error("Invalid type parameter '%s'\n",yypvt[-0].string);
+ if(n == -1) { PASM->report->error("Invalid type parameter '%s'\n",(yyvsp[0].string));
n = 0x1FFFFFFF; }
- yyval.binstr = new BinStr(); yyval.binstr->appendInt8(eltype); corEmitInt(yyval.binstr,n);
- } break;
-case 686:
+ (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(eltype); corEmitInt((yyval.binstr),n);
+ }
+#line 7764 "asmparse.cpp"
+ break;
+
+ case 687: /* type: TYPEDREF_ */
#line 1745 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_TYPEDBYREF); } break;
-case 687:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_TYPEDBYREF); }
+#line 7770 "asmparse.cpp"
+ break;
+
+ case 688: /* type: VOID_ */
#line 1746 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_VOID); } break;
-case 688:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_VOID); }
+#line 7776 "asmparse.cpp"
+ break;
+
+ case 689: /* type: NATIVE_ INT_ */
#line 1747 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I); } break;
-case 689:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_I); }
+#line 7782 "asmparse.cpp"
+ break;
+
+ case 690: /* type: NATIVE_ UNSIGNED_ INT_ */
#line 1748 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U); } break;
-case 690:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U); }
+#line 7788 "asmparse.cpp"
+ break;
+
+ case 691: /* type: NATIVE_ UINT_ */
#line 1749 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U); } break;
-case 691:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U); }
+#line 7794 "asmparse.cpp"
+ break;
+
+ case 692: /* type: simpleType */
#line 1750 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 692:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 7800 "asmparse.cpp"
+ break;
+
+ case 693: /* type: ELLIPSIS type */
#line 1751 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; yyval.binstr->insertInt8(ELEMENT_TYPE_SENTINEL); } break;
-case 693:
+ { (yyval.binstr) = (yyvsp[0].binstr); (yyval.binstr)->insertInt8(ELEMENT_TYPE_SENTINEL); }
+#line 7806 "asmparse.cpp"
+ break;
+
+ case 694: /* simpleType: CHAR_ */
#line 1754 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_CHAR); } break;
-case 694:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_CHAR); }
+#line 7812 "asmparse.cpp"
+ break;
+
+ case 695: /* simpleType: STRING_ */
#line 1755 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_STRING); } break;
-case 695:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_STRING); }
+#line 7818 "asmparse.cpp"
+ break;
+
+ case 696: /* simpleType: BOOL_ */
#line 1756 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_BOOLEAN); } break;
-case 696:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_BOOLEAN); }
+#line 7824 "asmparse.cpp"
+ break;
+
+ case 697: /* simpleType: INT8_ */
#line 1757 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I1); } break;
-case 697:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_I1); }
+#line 7830 "asmparse.cpp"
+ break;
+
+ case 698: /* simpleType: INT16_ */
#line 1758 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I2); } break;
-case 698:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_I2); }
+#line 7836 "asmparse.cpp"
+ break;
+
+ case 699: /* simpleType: INT32_ */
#line 1759 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I4); } break;
-case 699:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_I4); }
+#line 7842 "asmparse.cpp"
+ break;
+
+ case 700: /* simpleType: INT64_ */
#line 1760 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_I8); } break;
-case 700:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_I8); }
+#line 7848 "asmparse.cpp"
+ break;
+
+ case 701: /* simpleType: FLOAT32_ */
#line 1761 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R4); } break;
-case 701:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_R4); }
+#line 7854 "asmparse.cpp"
+ break;
+
+ case 702: /* simpleType: FLOAT64_ */
#line 1762 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_R8); } break;
-case 702:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_R8); }
+#line 7860 "asmparse.cpp"
+ break;
+
+ case 703: /* simpleType: UNSIGNED_ INT8_ */
#line 1763 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break;
-case 703:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U1); }
+#line 7866 "asmparse.cpp"
+ break;
+
+ case 704: /* simpleType: UNSIGNED_ INT16_ */
#line 1764 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break;
-case 704:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U2); }
+#line 7872 "asmparse.cpp"
+ break;
+
+ case 705: /* simpleType: UNSIGNED_ INT32_ */
#line 1765 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break;
-case 705:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U4); }
+#line 7878 "asmparse.cpp"
+ break;
+
+ case 706: /* simpleType: UNSIGNED_ INT64_ */
#line 1766 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break;
-case 706:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U8); }
+#line 7884 "asmparse.cpp"
+ break;
+
+ case 707: /* simpleType: UINT8_ */
#line 1767 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U1); } break;
-case 707:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U1); }
+#line 7890 "asmparse.cpp"
+ break;
+
+ case 708: /* simpleType: UINT16_ */
#line 1768 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U2); } break;
-case 708:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U2); }
+#line 7896 "asmparse.cpp"
+ break;
+
+ case 709: /* simpleType: UINT32_ */
#line 1769 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U4); } break;
-case 709:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U4); }
+#line 7902 "asmparse.cpp"
+ break;
+
+ case 710: /* simpleType: UINT64_ */
#line 1770 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt8(ELEMENT_TYPE_U8); } break;
-case 710:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt8(ELEMENT_TYPE_U8); }
+#line 7908 "asmparse.cpp"
+ break;
+
+ case 711: /* simpleType: TYPEDEF_TS */
#line 1771 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->append(yypvt[-0].tdd->m_pbsTypeSpec); } break;
-case 711:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->append((yyvsp[0].tdd)->m_pbsTypeSpec); }
+#line 7914 "asmparse.cpp"
+ break;
+
+ case 712: /* bounds1: bound */
#line 1774 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; } break;
-case 712:
+ { (yyval.binstr) = (yyvsp[0].binstr); }
+#line 7920 "asmparse.cpp"
+ break;
+
+ case 713: /* bounds1: bounds1 ',' bound */
#line 1775 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yypvt[-2].binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr; } break;
-case 713:
+ { (yyval.binstr) = (yyvsp[-2].binstr); (yyvsp[-2].binstr)->append((yyvsp[0].binstr)); delete (yyvsp[0].binstr); }
+#line 7926 "asmparse.cpp"
+ break;
+
+ case 714: /* bound: %empty */
#line 1778 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0x7FFFFFFF); yyval.binstr->appendInt32(0x7FFFFFFF); } break;
-case 714:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt32(0x7FFFFFFF); (yyval.binstr)->appendInt32(0x7FFFFFFF); }
+#line 7932 "asmparse.cpp"
+ break;
+
+ case 715: /* bound: ELLIPSIS */
#line 1779 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0x7FFFFFFF); yyval.binstr->appendInt32(0x7FFFFFFF); } break;
-case 715:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt32(0x7FFFFFFF); (yyval.binstr)->appendInt32(0x7FFFFFFF); }
+#line 7938 "asmparse.cpp"
+ break;
+
+ case 716: /* bound: int32 */
#line 1780 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(0); yyval.binstr->appendInt32(yypvt[-0].int32); } break;
-case 716:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt32(0); (yyval.binstr)->appendInt32((yyvsp[0].int32)); }
+#line 7944 "asmparse.cpp"
+ break;
+
+ case 717: /* bound: int32 ELLIPSIS int32 */
#line 1781 "asmparse.y"
-{ FAIL_UNLESS(yypvt[-2].int32 <= yypvt[-0].int32, ("lower bound %d must be <= upper bound %d\n", yypvt[-2].int32, yypvt[-0].int32));
- if (yypvt[-2].int32 > yypvt[-0].int32) { YYERROR; };
- yyval.binstr = new BinStr(); yyval.binstr->appendInt32(yypvt[-2].int32); yyval.binstr->appendInt32(yypvt[-0].int32-yypvt[-2].int32+1); } break;
-case 717:
+ { FAIL_UNLESS((yyvsp[-2].int32) <= (yyvsp[0].int32), ("lower bound %d must be <= upper bound %d\n", (yyvsp[-2].int32), (yyvsp[0].int32)));
+ if ((yyvsp[-2].int32) > (yyvsp[0].int32)) { YYERROR; };
+ (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt32((yyvsp[-2].int32)); (yyval.binstr)->appendInt32((yyvsp[0].int32)-(yyvsp[-2].int32)+1); }
+#line 7952 "asmparse.cpp"
+ break;
+
+ case 718: /* bound: int32 ELLIPSIS */
#line 1784 "asmparse.y"
-{ yyval.binstr = new BinStr(); yyval.binstr->appendInt32(yypvt[-1].int32); yyval.binstr->appendInt32(0x7FFFFFFF); } break;
-case 718:
+ { (yyval.binstr) = new BinStr(); (yyval.binstr)->appendInt32((yyvsp[-1].int32)); (yyval.binstr)->appendInt32(0x7FFFFFFF); }
+#line 7958 "asmparse.cpp"
+ break;
+
+ case 719: /* secDecl: _PERMISSION secAction typeSpec '(' nameValPairs ')' */
#line 1789 "asmparse.y"
-{ PASM->AddPermissionDecl(yypvt[-4].secAct, yypvt[-3].token, yypvt[-1].pair); } break;
-case 719:
+ { PASM->AddPermissionDecl((yyvsp[-4].secAct), (yyvsp[-3].token), (yyvsp[-1].pair)); }
+#line 7964 "asmparse.cpp"
+ break;
+
+ case 720: /* secDecl: _PERMISSION secAction typeSpec '=' '{' customBlobDescr '}' */
#line 1791 "asmparse.y"
-{ PASM->AddPermissionDecl(yypvt[-5].secAct, yypvt[-4].token, yypvt[-1].binstr); } break;
-case 720:
+ { PASM->AddPermissionDecl((yyvsp[-5].secAct), (yyvsp[-4].token), (yyvsp[-1].binstr)); }
+#line 7970 "asmparse.cpp"
+ break;
+
+ case 721: /* secDecl: _PERMISSION secAction typeSpec */
#line 1792 "asmparse.y"
-{ PASM->AddPermissionDecl(yypvt[-1].secAct, yypvt[-0].token, (NVPair *)NULL); } break;
-case 721:
+ { PASM->AddPermissionDecl((yyvsp[-1].secAct), (yyvsp[0].token), (NVPair *)NULL); }
+#line 7976 "asmparse.cpp"
+ break;
+
+ case 722: /* secDecl: psetHead bytes ')' */
#line 1793 "asmparse.y"
-{ PASM->AddPermissionSetDecl(yypvt[-2].secAct, yypvt[-1].binstr); } break;
-case 722:
+ { PASM->AddPermissionSetDecl((yyvsp[-2].secAct), (yyvsp[-1].binstr)); }
+#line 7982 "asmparse.cpp"
+ break;
+
+ case 723: /* secDecl: _PERMISSIONSET secAction compQstring */
#line 1795 "asmparse.y"
-{ PASM->AddPermissionSetDecl(yypvt[-1].secAct,BinStrToUnicode(yypvt[-0].binstr,true));} break;
-case 723:
+ { PASM->AddPermissionSetDecl((yyvsp[-1].secAct),BinStrToUnicode((yyvsp[0].binstr),true));}
+#line 7988 "asmparse.cpp"
+ break;
+
+ case 724: /* secDecl: _PERMISSIONSET secAction '=' '{' secAttrSetBlob '}' */
#line 1797 "asmparse.y"
-{ BinStr* ret = new BinStr();
+ { BinStr* ret = new BinStr();
ret->insertInt8('.');
corEmitInt(ret, nSecAttrBlobs);
- ret->append(yypvt[-1].binstr);
- PASM->AddPermissionSetDecl(yypvt[-4].secAct,ret);
- nSecAttrBlobs = 0; } break;
-case 724:
+ ret->append((yyvsp[-1].binstr));
+ PASM->AddPermissionSetDecl((yyvsp[-4].secAct),ret);
+ nSecAttrBlobs = 0; }
+#line 7999 "asmparse.cpp"
+ break;
+
+ case 725: /* secAttrSetBlob: %empty */
#line 1805 "asmparse.y"
-{ yyval.binstr = new BinStr(); nSecAttrBlobs = 0;} break;
-case 725:
+ { (yyval.binstr) = new BinStr(); nSecAttrBlobs = 0;}
+#line 8005 "asmparse.cpp"
+ break;
+
+ case 726: /* secAttrSetBlob: secAttrBlob */
#line 1806 "asmparse.y"
-{ yyval.binstr = yypvt[-0].binstr; nSecAttrBlobs = 1; } break;
-case 726:
+ { (yyval.binstr) = (yyvsp[0].binstr); nSecAttrBlobs = 1; }
+#line 8011 "asmparse.cpp"
+ break;
+
+ case 727: /* secAttrSetBlob: secAttrBlob ',' secAttrSetBlob */
#line 1807 "asmparse.y"
-{ yyval.binstr = yypvt[-2].binstr; yyval.binstr->append(yypvt[-0].binstr); nSecAttrBlobs++; } break;
-case 727:
+ { (yyval.binstr) = (yyvsp[-2].binstr); (yyval.binstr)->append((yyvsp[0].binstr)); nSecAttrBlobs++; }
+#line 8017 "asmparse.cpp"
+ break;
+
+ case 728: /* secAttrBlob: typeSpec '=' '{' customBlobNVPairs '}' */
#line 1811 "asmparse.y"
-{ yyval.binstr = PASM->EncodeSecAttr(PASM->ReflectionNotation(yypvt[-4].token),yypvt[-1].binstr,nCustomBlobNVPairs);
- nCustomBlobNVPairs = 0; } break;
-case 728:
+ { (yyval.binstr) = PASM->EncodeSecAttr(PASM->ReflectionNotation((yyvsp[-4].token)),(yyvsp[-1].binstr),nCustomBlobNVPairs);
+ nCustomBlobNVPairs = 0; }
+#line 8024 "asmparse.cpp"
+ break;
+
+ case 729: /* secAttrBlob: CLASS_ SQSTRING '=' '{' customBlobNVPairs '}' */
#line 1814 "asmparse.y"
-{ yyval.binstr = PASM->EncodeSecAttr(yypvt[-4].string,yypvt[-1].binstr,nCustomBlobNVPairs);
- nCustomBlobNVPairs = 0; } break;
-case 729:
+ { (yyval.binstr) = PASM->EncodeSecAttr((yyvsp[-4].string),(yyvsp[-1].binstr),nCustomBlobNVPairs);
+ nCustomBlobNVPairs = 0; }
+#line 8031 "asmparse.cpp"
+ break;
+
+ case 730: /* psetHead: _PERMISSIONSET secAction '=' '(' */
#line 1818 "asmparse.y"
-{ yyval.secAct = yypvt[-2].secAct; bParsingByteArray = TRUE; } break;
-case 730:
+ { (yyval.secAct) = (yyvsp[-2].secAct); bParsingByteArray = TRUE; }
+#line 8037 "asmparse.cpp"
+ break;
+
+ case 731: /* psetHead: _PERMISSIONSET secAction BYTEARRAY_ '(' */
#line 1820 "asmparse.y"
-{ yyval.secAct = yypvt[-2].secAct; bParsingByteArray = TRUE; } break;
-case 731:
+ { (yyval.secAct) = (yyvsp[-2].secAct); bParsingByteArray = TRUE; }
+#line 8043 "asmparse.cpp"
+ break;
+
+ case 732: /* nameValPairs: nameValPair */
#line 1823 "asmparse.y"
-{ yyval.pair = yypvt[-0].pair; } break;
-case 732:
+ { (yyval.pair) = (yyvsp[0].pair); }
+#line 8049 "asmparse.cpp"
+ break;
+
+ case 733: /* nameValPairs: nameValPair ',' nameValPairs */
#line 1824 "asmparse.y"
-{ yyval.pair = yypvt[-2].pair->Concat(yypvt[-0].pair); } break;
-case 733:
+ { (yyval.pair) = (yyvsp[-2].pair)->Concat((yyvsp[0].pair)); }
+#line 8055 "asmparse.cpp"
+ break;
+
+ case 734: /* nameValPair: compQstring '=' caValue */
#line 1827 "asmparse.y"
-{ yypvt[-2].binstr->appendInt8(0); yyval.pair = new NVPair(yypvt[-2].binstr, yypvt[-0].binstr); } break;
-case 734:
+ { (yyvsp[-2].binstr)->appendInt8(0); (yyval.pair) = new NVPair((yyvsp[-2].binstr), (yyvsp[0].binstr)); }
+#line 8061 "asmparse.cpp"
+ break;
+
+ case 735: /* truefalse: TRUE_ */
#line 1830 "asmparse.y"
-{ yyval.int32 = 1; } break;
-case 735:
+ { (yyval.int32) = 1; }
+#line 8067 "asmparse.cpp"
+ break;
+
+ case 736: /* truefalse: FALSE_ */
#line 1831 "asmparse.y"
-{ yyval.int32 = 0; } break;
-case 736:
+ { (yyval.int32) = 0; }
+#line 8073 "asmparse.cpp"
+ break;
+
+ case 737: /* caValue: truefalse */
#line 1834 "asmparse.y"
-{ yyval.binstr = new BinStr();
- yyval.binstr->appendInt8(SERIALIZATION_TYPE_BOOLEAN);
- yyval.binstr->appendInt8(yypvt[-0].int32); } break;
-case 737:
+ { (yyval.binstr) = new BinStr();
+ (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_BOOLEAN);
+ (yyval.binstr)->appendInt8((yyvsp[0].int32)); }
+#line 8081 "asmparse.cpp"
+ break;
+
+ case 738: /* caValue: int32 */
#line 1837 "asmparse.y"
-{ yyval.binstr = new BinStr();
- yyval.binstr->appendInt8(SERIALIZATION_TYPE_I4);
- yyval.binstr->appendInt32(yypvt[-0].int32); } break;
-case 738:
+ { (yyval.binstr) = new BinStr();
+ (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_I4);
+ (yyval.binstr)->appendInt32((yyvsp[0].int32)); }
+#line 8089 "asmparse.cpp"
+ break;
+
+ case 739: /* caValue: INT32_ '(' int32 ')' */
#line 1840 "asmparse.y"
-{ yyval.binstr = new BinStr();
- yyval.binstr->appendInt8(SERIALIZATION_TYPE_I4);
- yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 739:
+ { (yyval.binstr) = new BinStr();
+ (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_I4);
+ (yyval.binstr)->appendInt32((yyvsp[-1].int32)); }
+#line 8097 "asmparse.cpp"
+ break;
+
+ case 740: /* caValue: compQstring */
#line 1843 "asmparse.y"
-{ yyval.binstr = new BinStr();
- yyval.binstr->appendInt8(SERIALIZATION_TYPE_STRING);
- yyval.binstr->append(yypvt[-0].binstr); delete yypvt[-0].binstr;
- yyval.binstr->appendInt8(0); } break;
-case 740:
+ { (yyval.binstr) = new BinStr();
+ (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_STRING);
+ (yyval.binstr)->append((yyvsp[0].binstr)); delete (yyvsp[0].binstr);
+ (yyval.binstr)->appendInt8(0); }
+#line 8106 "asmparse.cpp"
+ break;
+
+ case 741: /* caValue: className '(' INT8_ ':' int32 ')' */
#line 1847 "asmparse.y"
-{ yyval.binstr = new BinStr();
- yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
- char* sz = PASM->ReflectionNotation(yypvt[-5].token);
- strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
- yyval.binstr->appendInt8(1);
- yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 741:
+ { (yyval.binstr) = new BinStr();
+ (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_ENUM);
+ char* sz = PASM->ReflectionNotation((yyvsp[-5].token));
+ strcpy_s((char *)(yyval.binstr)->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
+ (yyval.binstr)->appendInt8(1);
+ (yyval.binstr)->appendInt32((yyvsp[-1].int32)); }
+#line 8117 "asmparse.cpp"
+ break;
+
+ case 742: /* caValue: className '(' INT16_ ':' int32 ')' */
#line 1853 "asmparse.y"
-{ yyval.binstr = new BinStr();
- yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
- char* sz = PASM->ReflectionNotation(yypvt[-5].token);
- strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
- yyval.binstr->appendInt8(2);
- yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 742:
+ { (yyval.binstr) = new BinStr();
+ (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_ENUM);
+ char* sz = PASM->ReflectionNotation((yyvsp[-5].token));
+ strcpy_s((char *)(yyval.binstr)->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
+ (yyval.binstr)->appendInt8(2);
+ (yyval.binstr)->appendInt32((yyvsp[-1].int32)); }
+#line 8128 "asmparse.cpp"
+ break;
+
+ case 743: /* caValue: className '(' INT32_ ':' int32 ')' */
#line 1859 "asmparse.y"
-{ yyval.binstr = new BinStr();
- yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
- char* sz = PASM->ReflectionNotation(yypvt[-5].token);
- strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
- yyval.binstr->appendInt8(4);
- yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 743:
+ { (yyval.binstr) = new BinStr();
+ (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_ENUM);
+ char* sz = PASM->ReflectionNotation((yyvsp[-5].token));
+ strcpy_s((char *)(yyval.binstr)->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
+ (yyval.binstr)->appendInt8(4);
+ (yyval.binstr)->appendInt32((yyvsp[-1].int32)); }
+#line 8139 "asmparse.cpp"
+ break;
+
+ case 744: /* caValue: className '(' int32 ')' */
#line 1865 "asmparse.y"
-{ yyval.binstr = new BinStr();
- yyval.binstr->appendInt8(SERIALIZATION_TYPE_ENUM);
- char* sz = PASM->ReflectionNotation(yypvt[-3].token);
- strcpy_s((char *)yyval.binstr->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
- yyval.binstr->appendInt8(4);
- yyval.binstr->appendInt32(yypvt[-1].int32); } break;
-case 744:
+ { (yyval.binstr) = new BinStr();
+ (yyval.binstr)->appendInt8(SERIALIZATION_TYPE_ENUM);
+ char* sz = PASM->ReflectionNotation((yyvsp[-3].token));
+ strcpy_s((char *)(yyval.binstr)->getBuff((unsigned)strlen(sz) + 1), strlen(sz) + 1,sz);
+ (yyval.binstr)->appendInt8(4);
+ (yyval.binstr)->appendInt32((yyvsp[-1].int32)); }
+#line 8150 "asmparse.cpp"
+ break;
+
+ case 745: /* secAction: REQUEST_ */
#line 1873 "asmparse.y"
-{ yyval.secAct = dclRequest; } break;
-case 745:
+ { (yyval.secAct) = dclRequest; }
+#line 8156 "asmparse.cpp"
+ break;
+
+ case 746: /* secAction: DEMAND_ */
#line 1874 "asmparse.y"
-{ yyval.secAct = dclDemand; } break;
-case 746:
+ { (yyval.secAct) = dclDemand; }
+#line 8162 "asmparse.cpp"
+ break;
+
+ case 747: /* secAction: ASSERT_ */
#line 1875 "asmparse.y"
-{ yyval.secAct = dclAssert; } break;
-case 747:
+ { (yyval.secAct) = dclAssert; }
+#line 8168 "asmparse.cpp"
+ break;
+
+ case 748: /* secAction: DENY_ */
#line 1876 "asmparse.y"
-{ yyval.secAct = dclDeny; } break;
-case 748:
+ { (yyval.secAct) = dclDeny; }
+#line 8174 "asmparse.cpp"
+ break;
+
+ case 749: /* secAction: PERMITONLY_ */
#line 1877 "asmparse.y"
-{ yyval.secAct = dclPermitOnly; } break;
-case 749:
+ { (yyval.secAct) = dclPermitOnly; }
+#line 8180 "asmparse.cpp"
+ break;
+
+ case 750: /* secAction: LINKCHECK_ */
#line 1878 "asmparse.y"
-{ yyval.secAct = dclLinktimeCheck; } break;
-case 750:
+ { (yyval.secAct) = dclLinktimeCheck; }
+#line 8186 "asmparse.cpp"
+ break;
+
+ case 751: /* secAction: INHERITCHECK_ */
#line 1879 "asmparse.y"
-{ yyval.secAct = dclInheritanceCheck; } break;
-case 751:
+ { (yyval.secAct) = dclInheritanceCheck; }
+#line 8192 "asmparse.cpp"
+ break;
+
+ case 752: /* secAction: REQMIN_ */
#line 1880 "asmparse.y"
-{ yyval.secAct = dclRequestMinimum; } break;
-case 752:
+ { (yyval.secAct) = dclRequestMinimum; }
+#line 8198 "asmparse.cpp"
+ break;
+
+ case 753: /* secAction: REQOPT_ */
#line 1881 "asmparse.y"
-{ yyval.secAct = dclRequestOptional; } break;
-case 753:
+ { (yyval.secAct) = dclRequestOptional; }
+#line 8204 "asmparse.cpp"
+ break;
+
+ case 754: /* secAction: REQREFUSE_ */
#line 1882 "asmparse.y"
-{ yyval.secAct = dclRequestRefuse; } break;
-case 754:
+ { (yyval.secAct) = dclRequestRefuse; }
+#line 8210 "asmparse.cpp"
+ break;
+
+ case 755: /* secAction: PREJITGRANT_ */
#line 1883 "asmparse.y"
-{ yyval.secAct = dclPrejitGrant; } break;
-case 755:
+ { (yyval.secAct) = dclPrejitGrant; }
+#line 8216 "asmparse.cpp"
+ break;
+
+ case 756: /* secAction: PREJITDENY_ */
#line 1884 "asmparse.y"
-{ yyval.secAct = dclPrejitDenied; } break;
-case 756:
+ { (yyval.secAct) = dclPrejitDenied; }
+#line 8222 "asmparse.cpp"
+ break;
+
+ case 757: /* secAction: NONCASDEMAND_ */
#line 1885 "asmparse.y"
-{ yyval.secAct = dclNonCasDemand; } break;
-case 757:
+ { (yyval.secAct) = dclNonCasDemand; }
+#line 8228 "asmparse.cpp"
+ break;
+
+ case 758: /* secAction: NONCASLINKDEMAND_ */
#line 1886 "asmparse.y"
-{ yyval.secAct = dclNonCasLinkDemand; } break;
-case 758:
+ { (yyval.secAct) = dclNonCasLinkDemand; }
+#line 8234 "asmparse.cpp"
+ break;
+
+ case 759: /* secAction: NONCASINHERITANCE_ */
#line 1887 "asmparse.y"
-{ yyval.secAct = dclNonCasInheritance; } break;
-case 759:
+ { (yyval.secAct) = dclNonCasInheritance; }
+#line 8240 "asmparse.cpp"
+ break;
+
+ case 760: /* esHead: _LINE */
#line 1891 "asmparse.y"
-{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = FALSE; } break;
-case 760:
+ { PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = FALSE; }
+#line 8246 "asmparse.cpp"
+ break;
+
+ case 761: /* esHead: P_LINE */
#line 1892 "asmparse.y"
-{ PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = TRUE; } break;
-case 761:
+ { PASM->ResetLineNumbers(); nCurrPC = PASM->m_CurPC; PENV->bExternSource = TRUE; PENV->bExternSourceAutoincrement = TRUE; }
+#line 8252 "asmparse.cpp"
+ break;
+
+ case 762: /* extSourceSpec: esHead int32 SQSTRING */
#line 1895 "asmparse.y"
-{ PENV->nExtLine = PENV->nExtLineEnd = yypvt[-1].int32;
+ { PENV->nExtLine = PENV->nExtLineEnd = (yyvsp[-1].int32);
PENV->nExtCol = 0; PENV->nExtColEnd = static_cast(-1);
- PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 762:
+ PASM->SetSourceFileName((yyvsp[0].string));}
+#line 8260 "asmparse.cpp"
+ break;
+
+ case 763: /* extSourceSpec: esHead int32 */
#line 1898 "asmparse.y"
-{ PENV->nExtLine = PENV->nExtLineEnd = yypvt[-0].int32;
- PENV->nExtCol = 0; PENV->nExtColEnd = static_cast(-1); } break;
-case 763:
+ { PENV->nExtLine = PENV->nExtLineEnd = (yyvsp[0].int32);
+ PENV->nExtCol = 0; PENV->nExtColEnd = static_cast(-1); }
+#line 8267 "asmparse.cpp"
+ break;
+
+ case 764: /* extSourceSpec: esHead int32 ':' int32 SQSTRING */
#line 1900 "asmparse.y"
-{ PENV->nExtLine = PENV->nExtLineEnd = yypvt[-3].int32;
- PENV->nExtCol=yypvt[-1].int32; PENV->nExtColEnd = static_cast(-1);
- PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 764:
+ { PENV->nExtLine = PENV->nExtLineEnd = (yyvsp[-3].int32);
+ PENV->nExtCol=(yyvsp[-1].int32); PENV->nExtColEnd = static_cast(-1);
+ PASM->SetSourceFileName((yyvsp[0].string));}
+#line 8275 "asmparse.cpp"
+ break;
+
+ case 765: /* extSourceSpec: esHead int32 ':' int32 */
#line 1903 "asmparse.y"
-{ PENV->nExtLine = PENV->nExtLineEnd = yypvt[-2].int32;
- PENV->nExtCol=yypvt[-0].int32; PENV->nExtColEnd = static_cast(-1);} break;
-case 765:
+ { PENV->nExtLine = PENV->nExtLineEnd = (yyvsp[-2].int32);
+ PENV->nExtCol=(yyvsp[0].int32); PENV->nExtColEnd = static_cast(-1);}
+#line 8282 "asmparse.cpp"
+ break;
+
+ case 766: /* extSourceSpec: esHead int32 ':' int32 ',' int32 SQSTRING */
#line 1906 "asmparse.y"
-{ PENV->nExtLine = PENV->nExtLineEnd = yypvt[-5].int32;
- PENV->nExtCol=yypvt[-3].int32; PENV->nExtColEnd = yypvt[-1].int32;
- PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 766:
+ { PENV->nExtLine = PENV->nExtLineEnd = (yyvsp[-5].int32);
+ PENV->nExtCol=(yyvsp[-3].int32); PENV->nExtColEnd = (yyvsp[-1].int32);
+ PASM->SetSourceFileName((yyvsp[0].string));}
+#line 8290 "asmparse.cpp"
+ break;
+
+ case 767: /* extSourceSpec: esHead int32 ':' int32 ',' int32 */
#line 1910 "asmparse.y"
-{ PENV->nExtLine = PENV->nExtLineEnd = yypvt[-4].int32;
- PENV->nExtCol=yypvt[-2].int32; PENV->nExtColEnd = yypvt[-0].int32; } break;
-case 767:
+ { PENV->nExtLine = PENV->nExtLineEnd = (yyvsp[-4].int32);
+ PENV->nExtCol=(yyvsp[-2].int32); PENV->nExtColEnd = (yyvsp[0].int32); }
+#line 8297 "asmparse.cpp"
+ break;
+
+ case 768: /* extSourceSpec: esHead int32 ',' int32 ':' int32 SQSTRING */
#line 1913 "asmparse.y"
-{ PENV->nExtLine = yypvt[-5].int32; PENV->nExtLineEnd = yypvt[-3].int32;
- PENV->nExtCol=yypvt[-1].int32; PENV->nExtColEnd = static_cast(-1);
- PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 768:
+ { PENV->nExtLine = (yyvsp[-5].int32); PENV->nExtLineEnd = (yyvsp[-3].int32);
+ PENV->nExtCol=(yyvsp[-1].int32); PENV->nExtColEnd = static_cast(-1);
+ PASM->SetSourceFileName((yyvsp[0].string));}
+#line 8305 "asmparse.cpp"
+ break;
+
+ case 769: /* extSourceSpec: esHead int32 ',' int32 ':' int32 */
#line 1917 "asmparse.y"
-{ PENV->nExtLine = yypvt[-4].int32; PENV->nExtLineEnd = yypvt[-2].int32;
- PENV->nExtCol=yypvt[-0].int32; PENV->nExtColEnd = static_cast(-1); } break;
-case 769:
+ { PENV->nExtLine = (yyvsp[-4].int32); PENV->nExtLineEnd = (yyvsp[-2].int32);
+ PENV->nExtCol=(yyvsp[0].int32); PENV->nExtColEnd = static_cast(-1); }
+#line 8312 "asmparse.cpp"
+ break;
+
+ case 770: /* extSourceSpec: esHead int32 ',' int32 ':' int32 ',' int32 SQSTRING */
#line 1920 "asmparse.y"
-{ PENV->nExtLine = yypvt[-7].int32; PENV->nExtLineEnd = yypvt[-5].int32;
- PENV->nExtCol=yypvt[-3].int32; PENV->nExtColEnd = yypvt[-1].int32;
- PASM->SetSourceFileName(yypvt[-0].string);} break;
-case 770:
+ { PENV->nExtLine = (yyvsp[-7].int32); PENV->nExtLineEnd = (yyvsp[-5].int32);
+ PENV->nExtCol=(yyvsp[-3].int32); PENV->nExtColEnd = (yyvsp[-1].int32);
+ PASM->SetSourceFileName((yyvsp[0].string));}
+#line 8320 "asmparse.cpp"
+ break;
+
+ case 771: /* extSourceSpec: esHead int32 ',' int32 ':' int32 ',' int32 */
#line 1924 "asmparse.y"
-{ PENV->nExtLine = yypvt[-6].int32; PENV->nExtLineEnd = yypvt[-4].int32;
- PENV->nExtCol=yypvt[-2].int32; PENV->nExtColEnd = yypvt[-0].int32; } break;
-case 771:
+ { PENV->nExtLine = (yyvsp[-6].int32); PENV->nExtLineEnd = (yyvsp[-4].int32);
+ PENV->nExtCol=(yyvsp[-2].int32); PENV->nExtColEnd = (yyvsp[0].int32); }
+#line 8327 "asmparse.cpp"
+ break;
+
+ case 772: /* extSourceSpec: esHead int32 QSTRING */
#line 1926 "asmparse.y"
-{ PENV->nExtLine = PENV->nExtLineEnd = yypvt[-1].int32 - 1;
+ { PENV->nExtLine = PENV->nExtLineEnd = (yyvsp[-1].int32) - 1;
PENV->nExtCol = 0; PENV->nExtColEnd = static_cast(-1);
- PASM->SetSourceFileName(yypvt[-0].binstr);} break;
-case 772:
+ PASM->SetSourceFileName((yyvsp[0].binstr));}
+#line 8335 "asmparse.cpp"
+ break;
+
+ case 773: /* fileDecl: _FILE fileAttr dottedName fileEntry hashHead bytes ')' fileEntry */
#line 1933 "asmparse.y"
-{ PASMM->AddFile(yypvt[-5].string, yypvt[-6].fileAttr|yypvt[-4].fileAttr|yypvt[-0].fileAttr, yypvt[-2].binstr); } break;
-case 773:
+ { PASMM->AddFile((yyvsp[-5].string), (yyvsp[-6].fileAttr)|(yyvsp[-4].fileAttr)|(yyvsp[0].fileAttr), (yyvsp[-2].binstr)); }
+#line 8341 "asmparse.cpp"
+ break;
+
+ case 774: /* fileDecl: _FILE fileAttr dottedName fileEntry */
#line 1934 "asmparse.y"
-{ PASMM->AddFile(yypvt[-1].string, yypvt[-2].fileAttr|yypvt[-0].fileAttr, NULL); } break;
-case 774:
+ { PASMM->AddFile((yyvsp[-1].string), (yyvsp[-2].fileAttr)|(yyvsp[0].fileAttr), NULL); }
+#line 8347 "asmparse.cpp"
+ break;
+
+ case 775: /* fileAttr: %empty */
#line 1937 "asmparse.y"
-{ yyval.fileAttr = (CorFileFlags) 0; } break;
-case 775:
+ { (yyval.fileAttr) = (CorFileFlags) 0; }
+#line 8353 "asmparse.cpp"
+ break;
+
+ case 776: /* fileAttr: fileAttr NOMETADATA_ */
#line 1938 "asmparse.y"
-{ yyval.fileAttr = (CorFileFlags) (yypvt[-1].fileAttr | ffContainsNoMetaData); } break;
-case 776:
+ { (yyval.fileAttr) = (CorFileFlags) ((yyvsp[-1].fileAttr) | ffContainsNoMetaData); }
+#line 8359 "asmparse.cpp"
+ break;
+
+ case 777: /* fileEntry: %empty */
#line 1941 "asmparse.y"
-{ yyval.fileAttr = (CorFileFlags) 0; } break;
-case 777:
+ { (yyval.fileAttr) = (CorFileFlags) 0; }
+#line 8365 "asmparse.cpp"
+ break;
+
+ case 778: /* fileEntry: _ENTRYPOINT */
#line 1942 "asmparse.y"
-{ yyval.fileAttr = (CorFileFlags) 0x80000000; } break;
-case 778:
+ { (yyval.fileAttr) = (CorFileFlags) 0x80000000; }
+#line 8371 "asmparse.cpp"
+ break;
+
+ case 779: /* hashHead: _HASH '=' '(' */
#line 1945 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
-case 779:
+ { bParsingByteArray = TRUE; }
+#line 8377 "asmparse.cpp"
+ break;
+
+ case 780: /* assemblyHead: _ASSEMBLY asmAttr dottedName */
#line 1948 "asmparse.y"
-{ PASMM->StartAssembly(yypvt[-0].string, NULL, (DWORD)yypvt[-1].asmAttr, FALSE); } break;
-case 780:
+ { PASMM->StartAssembly((yyvsp[0].string), NULL, (DWORD)(yyvsp[-1].asmAttr), FALSE); }
+#line 8383 "asmparse.cpp"
+ break;
+
+ case 781: /* asmAttr: %empty */
#line 1951 "asmparse.y"
-{ yyval.asmAttr = (CorAssemblyFlags) 0; } break;
-case 781:
+ { (yyval.asmAttr) = (CorAssemblyFlags) 0; }
+#line 8389 "asmparse.cpp"
+ break;
+
+ case 782: /* asmAttr: asmAttr RETARGETABLE_ */
#line 1952 "asmparse.y"
-{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afRetargetable); } break;
-case 782:
+ { (yyval.asmAttr) = (CorAssemblyFlags) ((yyvsp[-1].asmAttr) | afRetargetable); }
+#line 8395 "asmparse.cpp"
+ break;
+
+ case 783: /* asmAttr: asmAttr WINDOWSRUNTIME_ */
#line 1953 "asmparse.y"
-{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afContentType_WindowsRuntime); } break;
-case 783:
+ { (yyval.asmAttr) = (CorAssemblyFlags) ((yyvsp[-1].asmAttr) | afContentType_WindowsRuntime); }
+#line 8401 "asmparse.cpp"
+ break;
+
+ case 784: /* asmAttr: asmAttr NOPLATFORM_ */
#line 1954 "asmparse.y"
-{ yyval.asmAttr = (CorAssemblyFlags) (yypvt[-1].asmAttr | afPA_NoPlatform); } break;
-case 784:
+ { (yyval.asmAttr) = (CorAssemblyFlags) ((yyvsp[-1].asmAttr) | afPA_NoPlatform); }
+#line 8407 "asmparse.cpp"
+ break;
+
+ case 785: /* asmAttr: asmAttr LEGACY_ LIBRARY_ */
#line 1955 "asmparse.y"
-{ yyval.asmAttr = yypvt[-2].asmAttr; } break;
-case 785:
+ { (yyval.asmAttr) = (yyvsp[-2].asmAttr); }
+#line 8413 "asmparse.cpp"
+ break;
+
+ case 786: /* asmAttr: asmAttr CIL_ */
#line 1956 "asmparse.y"
-{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_MSIL); } break;
-case 786:
+ { SET_PA((yyval.asmAttr),(yyvsp[-1].asmAttr),afPA_MSIL); }
+#line 8419 "asmparse.cpp"
+ break;
+
+ case 787: /* asmAttr: asmAttr X86_ */
#line 1957 "asmparse.y"
-{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_x86); } break;
-case 787:
+ { SET_PA((yyval.asmAttr),(yyvsp[-1].asmAttr),afPA_x86); }
+#line 8425 "asmparse.cpp"
+ break;
+
+ case 788: /* asmAttr: asmAttr AMD64_ */
#line 1958 "asmparse.y"
-{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_AMD64); } break;
-case 788:
+ { SET_PA((yyval.asmAttr),(yyvsp[-1].asmAttr),afPA_AMD64); }
+#line 8431 "asmparse.cpp"
+ break;
+
+ case 789: /* asmAttr: asmAttr ARM_ */
#line 1959 "asmparse.y"
-{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_ARM); } break;
-case 789:
+ { SET_PA((yyval.asmAttr),(yyvsp[-1].asmAttr),afPA_ARM); }
+#line 8437 "asmparse.cpp"
+ break;
+
+ case 790: /* asmAttr: asmAttr ARM64_ */
#line 1960 "asmparse.y"
-{ SET_PA(yyval.asmAttr,yypvt[-1].asmAttr,afPA_ARM64); } break;
-case 792:
+ { SET_PA((yyval.asmAttr),(yyvsp[-1].asmAttr),afPA_ARM64); }
+#line 8443 "asmparse.cpp"
+ break;
+
+ case 793: /* assemblyDecl: _HASH ALGORITHM_ int32 */
#line 1967 "asmparse.y"
-{ PASMM->SetAssemblyHashAlg(yypvt[-0].int32); } break;
-case 795:
+ { PASMM->SetAssemblyHashAlg((yyvsp[0].int32)); }
+#line 8449 "asmparse.cpp"
+ break;
+
+ case 796: /* intOrWildcard: int32 */
#line 1972 "asmparse.y"
-{ yyval.int32 = yypvt[-0].int32; } break;
-case 796:
+ { (yyval.int32) = (yyvsp[0].int32); }
+#line 8455 "asmparse.cpp"
+ break;
+
+ case 797: /* intOrWildcard: '*' */
#line 1973 "asmparse.y"
-{ yyval.int32 = 0xFFFF; } break;
-case 797:
+ { (yyval.int32) = 0xFFFF; }
+#line 8461 "asmparse.cpp"
+ break;
+
+ case 798: /* asmOrRefDecl: publicKeyHead bytes ')' */
#line 1976 "asmparse.y"
-{ PASMM->SetAssemblyPublicKey(yypvt[-1].binstr); } break;
-case 798:
+ { PASMM->SetAssemblyPublicKey((yyvsp[-1].binstr)); }
+#line 8467 "asmparse.cpp"
+ break;
+
+ case 799: /* asmOrRefDecl: _VER intOrWildcard ':' intOrWildcard ':' intOrWildcard ':' intOrWildcard */
#line 1978 "asmparse.y"
-{ PASMM->SetAssemblyVer((USHORT)yypvt[-6].int32, (USHORT)yypvt[-4].int32, (USHORT)yypvt[-2].int32, (USHORT)yypvt[-0].int32); } break;
-case 799:
+ { PASMM->SetAssemblyVer((USHORT)(yyvsp[-6].int32), (USHORT)(yyvsp[-4].int32), (USHORT)(yyvsp[-2].int32), (USHORT)(yyvsp[0].int32)); }
+#line 8473 "asmparse.cpp"
+ break;
+
+ case 800: /* asmOrRefDecl: _LOCALE compQstring */
#line 1979 "asmparse.y"
-{ yypvt[-0].binstr->appendInt8(0); PASMM->SetAssemblyLocale(yypvt[-0].binstr,TRUE); } break;
-case 800:
+ { (yyvsp[0].binstr)->appendInt8(0); PASMM->SetAssemblyLocale((yyvsp[0].binstr),TRUE); }
+#line 8479 "asmparse.cpp"
+ break;
+
+ case 801: /* asmOrRefDecl: localeHead bytes ')' */
#line 1980 "asmparse.y"
-{ PASMM->SetAssemblyLocale(yypvt[-1].binstr,FALSE); } break;
-case 803:
+ { PASMM->SetAssemblyLocale((yyvsp[-1].binstr),FALSE); }
+#line 8485 "asmparse.cpp"
+ break;
+
+ case 804: /* publicKeyHead: _PUBLICKEY '=' '(' */
#line 1985 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
-case 804:
+ { bParsingByteArray = TRUE; }
+#line 8491 "asmparse.cpp"
+ break;
+
+ case 805: /* publicKeyTokenHead: _PUBLICKEYTOKEN '=' '(' */
#line 1988 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
-case 805:
+ { bParsingByteArray = TRUE; }
+#line 8497 "asmparse.cpp"
+ break;
+
+ case 806: /* localeHead: _LOCALE '=' '(' */
#line 1991 "asmparse.y"
-{ bParsingByteArray = TRUE; } break;
-case 806:
+ { bParsingByteArray = TRUE; }
+#line 8503 "asmparse.cpp"
+ break;
+
+ case 807: /* assemblyRefHead: _ASSEMBLY EXTERN_ asmAttr dottedName */
#line 1995 "asmparse.y"
-{ PASMM->StartAssembly(yypvt[-0].string, NULL, yypvt[-1].asmAttr, TRUE); } break;
-case 807:
+ { PASMM->StartAssembly((yyvsp[0].string), NULL, (yyvsp[-1].asmAttr), TRUE); }
+#line 8509 "asmparse.cpp"
+ break;
+
+ case 808: /* assemblyRefHead: _ASSEMBLY EXTERN_ asmAttr dottedName AS_ dottedName */
#line 1997 "asmparse.y"
-{ PASMM->StartAssembly(yypvt[-2].string, yypvt[-0].string, yypvt[-3].asmAttr, TRUE); } break;
-case 810:
+ { PASMM->StartAssembly((yyvsp[-2].string), (yyvsp[0].string), (yyvsp[-3].asmAttr), TRUE); }
+#line 8515 "asmparse.cpp"
+ break;
+
+ case 811: /* assemblyRefDecl: hashHead bytes ')' */
#line 2004 "asmparse.y"
-{ PASMM->SetAssemblyHashBlob(yypvt[-1].binstr); } break;
-case 812:
+ { PASMM->SetAssemblyHashBlob((yyvsp[-1].binstr)); }
+#line 8521 "asmparse.cpp"
+ break;
+
+ case 813: /* assemblyRefDecl: publicKeyTokenHead bytes ')' */
#line 2006 "asmparse.y"
-{ PASMM->SetAssemblyPublicKeyToken(yypvt[-1].binstr); } break;
-case 813:
+ { PASMM->SetAssemblyPublicKeyToken((yyvsp[-1].binstr)); }
+#line 8527 "asmparse.cpp"
+ break;
+
+ case 814: /* assemblyRefDecl: AUTO_ */
#line 2007 "asmparse.y"
-{ PASMM->SetAssemblyAutodetect(); } break;
-case 814:
+ { PASMM->SetAssemblyAutodetect(); }
+#line 8533 "asmparse.cpp"
+ break;
+
+ case 815: /* exptypeHead: _CLASS EXTERN_ exptAttr dottedName */
#line 2010 "asmparse.y"
-{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr);} break;
-case 815:
+ { PASMM->StartComType((yyvsp[0].string), (yyvsp[-1].exptAttr));}
+#line 8539 "asmparse.cpp"
+ break;
+
+ case 816: /* exportHead: _EXPORT exptAttr dottedName */
#line 2013 "asmparse.y"
-{ PASMM->StartComType(yypvt[-0].string, yypvt[-1].exptAttr); } break;
-case 816:
+ { PASMM->StartComType((yyvsp[0].string), (yyvsp[-1].exptAttr)); }
+#line 8545 "asmparse.cpp"
+ break;
+
+ case 817: /* exptAttr: %empty */
#line 2016 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) 0; } break;
-case 817:
+ { (yyval.exptAttr) = (CorTypeAttr) 0; }
+#line 8551 "asmparse.cpp"
+ break;
+
+ case 818: /* exptAttr: exptAttr PRIVATE_ */
#line 2017 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdNotPublic); } break;
-case 818:
+ { (yyval.exptAttr) = (CorTypeAttr) ((yyvsp[-1].exptAttr) | tdNotPublic); }
+#line 8557 "asmparse.cpp"
+ break;
+
+ case 819: /* exptAttr: exptAttr PUBLIC_ */
#line 2018 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdPublic); } break;
-case 819:
+ { (yyval.exptAttr) = (CorTypeAttr) ((yyvsp[-1].exptAttr) | tdPublic); }
+#line 8563 "asmparse.cpp"
+ break;
+
+ case 820: /* exptAttr: exptAttr FORWARDER_ */
#line 2019 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-1].exptAttr | tdForwarder); } break;
-case 820:
+ { (yyval.exptAttr) = (CorTypeAttr) ((yyvsp[-1].exptAttr) | tdForwarder); }
+#line 8569 "asmparse.cpp"
+ break;
+
+ case 821: /* exptAttr: exptAttr NESTED_ PUBLIC_ */
#line 2020 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPublic); } break;
-case 821:
+ { (yyval.exptAttr) = (CorTypeAttr) ((yyvsp[-2].exptAttr) | tdNestedPublic); }
+#line 8575 "asmparse.cpp"
+ break;
+
+ case 822: /* exptAttr: exptAttr NESTED_ PRIVATE_ */
#line 2021 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedPrivate); } break;
-case 822:
+ { (yyval.exptAttr) = (CorTypeAttr) ((yyvsp[-2].exptAttr) | tdNestedPrivate); }
+#line 8581 "asmparse.cpp"
+ break;
+
+ case 823: /* exptAttr: exptAttr NESTED_ FAMILY_ */
#line 2022 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamily); } break;
-case 823:
+ { (yyval.exptAttr) = (CorTypeAttr) ((yyvsp[-2].exptAttr) | tdNestedFamily); }
+#line 8587 "asmparse.cpp"
+ break;
+
+ case 824: /* exptAttr: exptAttr NESTED_ ASSEMBLY_ */
#line 2023 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedAssembly); } break;
-case 824:
+ { (yyval.exptAttr) = (CorTypeAttr) ((yyvsp[-2].exptAttr) | tdNestedAssembly); }
+#line 8593 "asmparse.cpp"
+ break;
+
+ case 825: /* exptAttr: exptAttr NESTED_ FAMANDASSEM_ */
#line 2024 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamANDAssem); } break;
-case 825:
+ { (yyval.exptAttr) = (CorTypeAttr) ((yyvsp[-2].exptAttr) | tdNestedFamANDAssem); }
+#line 8599 "asmparse.cpp"
+ break;
+
+ case 826: /* exptAttr: exptAttr NESTED_ FAMORASSEM_ */
#line 2025 "asmparse.y"
-{ yyval.exptAttr = (CorTypeAttr) (yypvt[-2].exptAttr | tdNestedFamORAssem); } break;
-case 828:
+ { (yyval.exptAttr) = (CorTypeAttr) ((yyvsp[-2].exptAttr) | tdNestedFamORAssem); }
+#line 8605 "asmparse.cpp"
+ break;
+
+ case 829: /* exptypeDecl: _FILE dottedName */
#line 2032 "asmparse.y"
-{ PASMM->SetComTypeFile(yypvt[-0].string); } break;
-case 829:
+ { PASMM->SetComTypeFile((yyvsp[0].string)); }
+#line 8611 "asmparse.cpp"
+ break;
+
+ case 830: /* exptypeDecl: _CLASS EXTERN_ slashedName */
#line 2033 "asmparse.y"
-{ PASMM->SetComTypeComType(yypvt[-0].string); } break;
-case 830:
+ { PASMM->SetComTypeComType((yyvsp[0].string)); }
+#line 8617 "asmparse.cpp"
+ break;
+
+ case 831: /* exptypeDecl: _ASSEMBLY EXTERN_ dottedName */
#line 2034 "asmparse.y"
-{ PASMM->SetComTypeAsmRef(yypvt[-0].string); } break;
-case 831:
+ { PASMM->SetComTypeAsmRef((yyvsp[0].string)); }
+#line 8623 "asmparse.cpp"
+ break;
+
+ case 832: /* exptypeDecl: MDTOKEN_ '(' int32 ')' */
#line 2035 "asmparse.y"
-{ if(!PASMM->SetComTypeImplementationTok(yypvt[-1].int32))
- PASM->report->error("Invalid implementation of exported type\n"); } break;
-case 832:
+ { if(!PASMM->SetComTypeImplementationTok((yyvsp[-1].int32)))
+ PASM->report->error("Invalid implementation of exported type\n"); }
+#line 8630 "asmparse.cpp"
+ break;
+
+ case 833: /* exptypeDecl: _CLASS int32 */
#line 2037 "asmparse.y"
-{ if(!PASMM->SetComTypeClassTok(yypvt[-0].int32))
- PASM->report->error("Invalid TypeDefID of exported type\n"); } break;
-case 835:
+ { if(!PASMM->SetComTypeClassTok((yyvsp[0].int32)))
+ PASM->report->error("Invalid TypeDefID of exported type\n"); }
+#line 8637 "asmparse.cpp"
+ break;
+
+ case 836: /* manifestResHead: _MRESOURCE manresAttr dottedName */
#line 2043 "asmparse.y"
-{ PASMM->StartManifestRes(yypvt[-0].string, yypvt[-0].string, yypvt[-1].manresAttr); } break;
-case 836:
+ { PASMM->StartManifestRes((yyvsp[0].string), (yyvsp[0].string), (yyvsp[-1].manresAttr)); }
+#line 8643 "asmparse.cpp"
+ break;
+
+ case 837: /* manifestResHead: _MRESOURCE manresAttr dottedName AS_ dottedName */
#line 2045 "asmparse.y"
-{ PASMM->StartManifestRes(yypvt[-2].string, yypvt[-0].string, yypvt[-3].manresAttr); } break;
-case 837:
+ { PASMM->StartManifestRes((yyvsp[-2].string), (yyvsp[0].string), (yyvsp[-3].manresAttr)); }
+#line 8649 "asmparse.cpp"
+ break;
+
+ case 838: /* manresAttr: %empty */
#line 2048 "asmparse.y"
-{ yyval.manresAttr = (CorManifestResourceFlags) 0; } break;
-case 838:
+ { (yyval.manresAttr) = (CorManifestResourceFlags) 0; }
+#line 8655 "asmparse.cpp"
+ break;
+
+ case 839: /* manresAttr: manresAttr PUBLIC_ */
#line 2049 "asmparse.y"
-{ yyval.manresAttr = (CorManifestResourceFlags) (yypvt[-1].manresAttr | mrPublic); } break;
-case 839:
+ { (yyval.manresAttr) = (CorManifestResourceFlags) ((yyvsp[-1].manresAttr) | mrPublic); }
+#line 8661 "asmparse.cpp"
+ break;
+
+ case 840: /* manresAttr: manresAttr PRIVATE_ */
#line 2050 "asmparse.y"
-{ yyval.manresAttr = (CorManifestResourceFlags) (yypvt[-1].manresAttr | mrPrivate); } break;
-case 842:
+ { (yyval.manresAttr) = (CorManifestResourceFlags) ((yyvsp[-1].manresAttr) | mrPrivate); }
+#line 8667 "asmparse.cpp"
+ break;
+
+ case 843: /* manifestResDecl: _FILE dottedName AT_ int32 */
#line 2057 "asmparse.y"
-{ PASMM->SetManifestResFile(yypvt[-2].string, (ULONG)yypvt[-0].int32); } break;
-case 843:
+ { PASMM->SetManifestResFile((yyvsp[-2].string), (ULONG)(yyvsp[0].int32)); }
+#line 8673 "asmparse.cpp"
+ break;
+
+ case 844: /* manifestResDecl: _ASSEMBLY EXTERN_ dottedName */
#line 2058 "asmparse.y"
-{ PASMM->SetManifestResAsmRef(yypvt[-0].string); } break;/* End of actions */
-#line 329 "F:\\NetFXDev1\\src\\tools\\devdiv\\amd64\\yypars.c"
- }
- }
- goto yystack; /* stack new state and value */
- }
-#pragma warning(default:102)
+ { PASMM->SetManifestResAsmRef((yyvsp[0].string)); }
+#line 8679 "asmparse.cpp"
+ break;
-#ifdef YYDUMP
-YYLOCAL void YYNEAR YYPASCAL yydumpinfo(void)
-{
- short stackindex;
- short valindex;
-
- //dump yys
- printf("short yys[%d] {\n", YYMAXDEPTH);
- for (stackindex = 0; stackindex < YYMAXDEPTH; stackindex++){
- if (stackindex)
- printf(", %s", stackindex % 10 ? "\0" : "\n");
- printf("%6d", yys[stackindex]);
- }
- printf("\n};\n");
-
- //dump yyv
- printf("YYSTYPE yyv[%d] {\n", YYMAXDEPTH);
- for (valindex = 0; valindex < YYMAXDEPTH; valindex++){
- if (valindex)
- printf(", %s", valindex % 5 ? "\0" : "\n");
- printf("%#*x", 3+sizeof(YYSTYPE), yyv[valindex]);
- }
- printf("\n};\n");
- }
+#line 8683 "asmparse.cpp"
+
+ default: break;
+ }
+ /* User semantic actions sometimes alter yychar, and that requires
+ that yytoken be updated with the new translation. We take the
+ approach of translating immediately before every use of yytoken.
+ One alternative is translating here after every semantic action,
+ but that translation would be missed if the semantic action invokes
+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an
+ incorrect destructor might then be invoked immediately. In the
+ case of YYERROR or YYBACKUP, subsequent parser actions might lead
+ to an incorrect destructor call or verbose syntax error message
+ before the lookahead is translated. */
+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
+
+ YYPOPSTACK (yylen);
+ yylen = 0;
+
+ *++yyvsp = yyval;
+
+ /* Now 'shift' the result of the reduction. Determine what state
+ that goes to, based on the state we popped back to and the rule
+ number reduced by. */
+ {
+ const int yylhs = yyr1[yyn] - YYNTOKENS;
+ const int yyi = yypgoto[yylhs] + *yyssp;
+ yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
+ ? yytable[yyi]
+ : yydefgoto[yylhs]);
+ }
+
+ goto yynewstate;
+
+
+/*--------------------------------------.
+| yyerrlab -- here on detecting error. |
+`--------------------------------------*/
+yyerrlab:
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
+ /* If not already recovering from an error, report this error. */
+ if (!yyerrstatus)
+ {
+ ++yynerrs;
+ yyerror (YY_("syntax error"));
+ }
+
+ if (yyerrstatus == 3)
+ {
+ /* If just tried and failed to reuse lookahead token after an
+ error, discard it. */
+
+ if (yychar <= YYEOF)
+ {
+ /* Return failure if at end of input. */
+ if (yychar == YYEOF)
+ YYABORT;
+ }
+ else
+ {
+ yydestruct ("Error: discarding",
+ yytoken, &yylval);
+ yychar = YYEMPTY;
+ }
+ }
+
+ /* Else will try to reuse lookahead token after shifting the error
+ token. */
+ goto yyerrlab1;
+
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR. |
+`---------------------------------------------------*/
+yyerrorlab:
+ /* Pacify compilers when the user code never invokes YYERROR and the
+ label yyerrorlab therefore never appears in user code. */
+ if (0)
+ YYERROR;
+ ++yynerrs;
+
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYERROR. */
+ YYPOPSTACK (yylen);
+ yylen = 0;
+ YY_STACK_PRINT (yyss, yyssp);
+ yystate = *yyssp;
+ goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR. |
+`-------------------------------------------------------------*/
+yyerrlab1:
+ yyerrstatus = 3; /* Each real token shifted decrements this. */
+
+ /* Pop stack until we find a state that shifts the error token. */
+ for (;;)
+ {
+ yyn = yypact[yystate];
+ if (!yypact_value_is_default (yyn))
+ {
+ yyn += YYSYMBOL_YYerror;
+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
+ {
+ yyn = yytable[yyn];
+ if (0 < yyn)
+ break;
+ }
+ }
+
+ /* Pop the current state because it cannot handle the error token. */
+ if (yyssp == yyss)
+ YYABORT;
+
+
+ yydestruct ("Error: popping",
+ YY_ACCESSING_SYMBOL (yystate), yyvsp);
+ YYPOPSTACK (1);
+ yystate = *yyssp;
+ YY_STACK_PRINT (yyss, yyssp);
+ }
+
+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+ *++yyvsp = yylval;
+ YY_IGNORE_MAYBE_UNINITIALIZED_END
+
+
+ /* Shift the error token. */
+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
+
+ yystate = yyn;
+ goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here. |
+`-------------------------------------*/
+yyacceptlab:
+ yyresult = 0;
+ goto yyreturnlab;
+
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here. |
+`-----------------------------------*/
+yyabortlab:
+ yyresult = 1;
+ goto yyreturnlab;
+
+
+/*-----------------------------------------------------------.
+| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. |
+`-----------------------------------------------------------*/
+yyexhaustedlab:
+ yyerror (YY_("memory exhausted"));
+ yyresult = 2;
+ goto yyreturnlab;
+
+
+/*----------------------------------------------------------.
+| yyreturnlab -- parsing is finished, clean up and return. |
+`----------------------------------------------------------*/
+yyreturnlab:
+ if (yychar != YYEMPTY)
+ {
+ /* Make sure we have latest lookahead translation. See comments at
+ user semantic actions for why this is necessary. */
+ yytoken = YYTRANSLATE (yychar);
+ yydestruct ("Cleanup: discarding lookahead",
+ yytoken, &yylval);
+ }
+ /* Do not reclaim the symbols of the rule whose action triggered
+ this YYABORT or YYACCEPT. */
+ YYPOPSTACK (yylen);
+ YY_STACK_PRINT (yyss, yyssp);
+ while (yyssp != yyss)
+ {
+ yydestruct ("Cleanup: popping",
+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp);
+ YYPOPSTACK (1);
+ }
+#ifndef yyoverflow
+ if (yyss != yyssa)
+ YYSTACK_FREE (yyss);
#endif
+
+ return yyresult;
+}
+
+#line 2063 "asmparse.y"
+
+
+#include "grammar_after.cpp"
diff --git a/src/coreclr/ilasm/writer.cpp b/src/coreclr/ilasm/writer.cpp
index 6f96b0bd632f..ca86a0d16ab2 100644
--- a/src/coreclr/ilasm/writer.cpp
+++ b/src/coreclr/ilasm/writer.cpp
@@ -34,6 +34,14 @@ HRESULT Assembler::InitMetaData()
if (FAILED(hr))
goto exit;
+ if(m_wzMetadataVersion)
+ {
+ VARIANT optionValue;
+ V_VT(&optionValue) = VT_BSTR;
+ V_BSTR(&optionValue) = m_wzMetadataVersion; // IMetaDataDispenserEx does not require proper BSTR
+ hr = m_pDisp->SetOption(MetaDataRuntimeVersion, &optionValue);
+ }
+
hr = m_pDisp->DefineScope(CLSID_CorMetaDataRuntime, 0, IID_IMetaDataEmit3,
(IUnknown **)&m_pEmitter);
if (FAILED(hr))
@@ -131,7 +139,7 @@ HRESULT Assembler::CreateTLSDirectory() {
}
else
{
- DWORD sizeofptr = (DWORD)sizeof(__int64);
+ DWORD sizeofptr = (DWORD)sizeof(int64_t);
DWORD sizeofdir = (DWORD)sizeof(IMAGE_TLS_DIRECTORY64);
DWORD offsetofStartAddressOfRawData = (DWORD)offsetof(IMAGE_TLS_DIRECTORY64, StartAddressOfRawData);
DWORD offsetofEndAddressOfRawData = (DWORD)offsetof(IMAGE_TLS_DIRECTORY64, EndAddressOfRawData);
@@ -141,7 +149,7 @@ HRESULT Assembler::CreateTLSDirectory() {
// Get memory for the TLS directory block,as well as a spot for callback chain
IMAGE_TLS_DIRECTORY64* tlsDir;
if(FAILED(hr=m_pCeeFileGen->GetSectionBlock(tlsDirSec, sizeofdir + sizeofptr, sizeofptr, (void**) &tlsDir))) return(hr);
- __int64* callBackChain = (__int64*) &tlsDir[1];
+ int64_t* callBackChain = (int64_t*) &tlsDir[1];
*callBackChain = 0;
// Find out where the tls directory will end up
@@ -530,7 +538,7 @@ DWORD Assembler::EmitExportStub(DWORD dwVTFSlotRVA)
else
{
report->error("Unmanaged exports are not implemented for unknown platform");
- return NULL;
+ return 0;
}
// Addr must be aligned, not the stub!
if (FAILED(m_pCeeFileGen->GetSectionDataLen (m_pILSection, &PEFileOffset))) return 0;
@@ -1212,7 +1220,7 @@ HRESULT Assembler::CreatePEFile(_In_ __nullterminated WCHAR *pwzOutputFilename)
{
#define ELEMENT_TYPE_TYPEDEF (ELEMENT_TYPE_MAX+1)
TypeDefDescr* pTDD;
- unsigned __int8* pb;
+ uint8_t* pb;
unsigned namesize;
while((pTDD = m_TypeDefDList.POP()))
{
diff --git a/src/coreclr/ildasm/dasm.cpp b/src/coreclr/ildasm/dasm.cpp
index da3aa514c0dc..4332ef7f756e 100644
--- a/src/coreclr/ildasm/dasm.cpp
+++ b/src/coreclr/ildasm/dasm.cpp
@@ -56,7 +56,7 @@ PELoader * g_pPELoader;
void * g_pMetaData;
unsigned g_cbMetaData;
IMAGE_COR20_HEADER * g_CORHeader;
-DynamicArray<__int32> *g_pPtrTags = NULL; //to keep track of all "ldptr"
+DynamicArray *g_pPtrTags = NULL; //to keep track of all "ldptr"
DynamicArray *g_pPtrSize= NULL; //to keep track of all "ldptr"
int g_iPtrCount = 0;
mdToken * g_cl_list = NULL;
@@ -899,7 +899,7 @@ void DumpMscorlib(void* GUICookie)
// Retrieve the type def properties as well, so that we can check a few more things about
// the System.Object type
//
- if (SUCCEEDED(g_pPubImport->GetTypeDefProps(tkObjectTypeDef, NULL, NULL, 0, &dwClassAttrs, &tkExtends)))
+ if (SUCCEEDED(g_pPubImport->GetTypeDefProps(tkObjectTypeDef, NULL, 0, NULL, &dwClassAttrs, &tkExtends)))
{
bool bExtends = g_pPubImport->IsValidToken(tkExtends);
bool isClass = ((dwClassAttrs & tdClassSemanticsMask) == tdClass);
@@ -3538,7 +3538,7 @@ BOOL DumpMethod(mdToken FuncToken, const char *pszClassName, DWORD dwEntryPointT
pComSig = NULL;
}
- if (cComSig == NULL)
+ if (cComSig == 0)
{
sprintf_s(szString, SZSTRING_SIZE, "%sERROR: method '%s' has no signature", g_szAsmCodeIndent, pszMemberName);
printError(GUICookie, ERRORMSG(szString));
@@ -4010,7 +4010,7 @@ BOOL DumpField(mdToken FuncToken, const char *pszClassName,void *GUICookie, BOOL
{
pComSig = NULL;
}
- if (cComSig == NULL)
+ if (cComSig == 0)
{
char sz[2048];
sprintf_s(sz,2048,"%sERROR: field '%s' has no signature",g_szAsmCodeIndent,pszMemberName);
@@ -5053,8 +5053,8 @@ void DumpVTables(IMAGE_COR20_HEADER *CORHeader, void* GUICookie)
}
else
{
- sprintf_s(szString,SZSTRING_SIZE,"// [0x%04x] (0x%16llx)", iSlot, VAL64(*(unsigned __int64 *) pSlot));
- pSlot += sizeof(unsigned __int64);
+ sprintf_s(szString,SZSTRING_SIZE,"// [0x%04x] (0x%16llx)", iSlot, VAL64(*(uint64_t *) pSlot));
+ pSlot += sizeof(uint64_t);
}
printLine(GUICookie,szStr);
@@ -5880,7 +5880,7 @@ IMetaDataTables *pITables = NULL;
//ULONG sizeRec, count;
//int size, size2;
int metaSize = 0;
-__int64 fTableSeen;
+int64_t fTableSeen;
inline void TableSeen(unsigned long n) { fTableSeen |= (I64(1) << n); }
inline int IsTableSeen(unsigned long n) { return (fTableSeen & (I64(1) << n)) ? 1 : 0;}
inline void TableSeenReset() { fTableSeen = 0;}
@@ -6904,8 +6904,8 @@ void DumpVtable(void* GUICookie)
}
else
{
- szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," %016I64X", VAL64(*(unsigned __int64 *)pSlot));
- pSlot += sizeof(unsigned __int64);
+ szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr)," %016I64X", VAL64(*(uint64_t *)pSlot));
+ pSlot += sizeof(uint64_t);
}
if (g_prVTableRef == NULL)
{
diff --git a/src/coreclr/ildasm/dis.cpp b/src/coreclr/ildasm/dis.cpp
index 2ad1ecd2d200..91b878e3e19c 100644
--- a/src/coreclr/ildasm/dis.cpp
+++ b/src/coreclr/ildasm/dis.cpp
@@ -29,7 +29,7 @@ extern BOOL g_fInsertSourceLines;
extern BOOL g_fTryInCode;
extern BOOL g_fQuoteAllNames;
extern BOOL g_fDumpTokens;
-extern DynamicArray<__int32> *g_pPtrTags; //to keep track of all "ldptr"
+extern DynamicArray *g_pPtrTags; //to keep track of all "ldptr"
extern DynamicArray *g_pPtrSize; //to keep track of all "ldptr"
extern int g_iPtrCount;
static BOOL ConvToLiteral(__inout __nullterminated char* retBuff, const WCHAR* str, int cbStr);
@@ -527,7 +527,7 @@ char* DumpDataPtr(__inout __nullterminated char* buffer, DWORD ptr, DWORD size)
if(i < dwNumberOfSections)
{ // yes, the pointer points to real data
int j;
- for(j=0; (j < g_iPtrCount)&&((*g_pPtrTags)[j] != (__int32)ptr); j++);
+ for(j=0; (j < g_iPtrCount)&&((*g_pPtrTags)[j] != (int32_t)ptr); j++);
if(j == g_iPtrCount)
{
if (g_pPtrSize == NULL)
@@ -536,7 +536,7 @@ char* DumpDataPtr(__inout __nullterminated char* buffer, DWORD ptr, DWORD size)
}
if (g_pPtrTags == NULL)
{
- g_pPtrTags = new DynamicArray<__int32>;
+ g_pPtrTags = new DynamicArray;
}
(*g_pPtrSize)[g_iPtrCount] = size;
@@ -727,8 +727,7 @@ void OpenScope(ISymUnmanagedScope *pIScope,
char* DumpUnicodeString(void* GUICookie,
__inout __nullterminated char* szString,
_In_reads_(cbString) WCHAR* pszString,
- ULONG cbString,
- bool SwapString )
+ ULONG cbString)
{
unsigned i,L;
char* szStr=NULL, *szRet = NULL;
@@ -750,8 +749,7 @@ char* DumpUnicodeString(void* GUICookie,
#endif
#if BIGENDIAN
- if (SwapString)
- SwapStringLength(pszString, cbString);
+ SwapStringLength(pszString, cbString);
#endif
// first, check for embedded zeros:
@@ -782,7 +780,7 @@ char* DumpUnicodeString(void* GUICookie,
strcat_s(szString,SZSTRING_SIZE," (");
#if BIGENDIAN
- SwapStringLength(pszString, cbString);
+ SwapStringLength(pszString, cbString);
#endif
DumpByteArray(szString,(BYTE*)pszString,cbString*sizeof(WCHAR),GUICookie);
szRet = &szString[strlen(szString)];
@@ -1528,14 +1526,14 @@ BOOL Disassemble(IMDInternalImport *pImport, BYTE *ILHeader, void *GUICookie, md
case InlineI8:
{
- __int64 v = (__int64) pCode[PC] +
- (((__int64) pCode[PC+1]) << 8) +
- (((__int64) pCode[PC+2]) << 16) +
- (((__int64) pCode[PC+3]) << 24) +
- (((__int64) pCode[PC+4]) << 32) +
- (((__int64) pCode[PC+5]) << 40) +
- (((__int64) pCode[PC+6]) << 48) +
- (((__int64) pCode[PC+7]) << 56);
+ int64_t v = (int64_t) pCode[PC] +
+ (((int64_t) pCode[PC+1]) << 8) +
+ (((int64_t) pCode[PC+2]) << 16) +
+ (((int64_t) pCode[PC+3]) << 24) +
+ (((int64_t) pCode[PC+4]) << 32) +
+ (((int64_t) pCode[PC+5]) << 40) +
+ (((int64_t) pCode[PC+6]) << 48) +
+ (((int64_t) pCode[PC+7]) << 56);
if(g_fShowBytes)
{
@@ -1554,10 +1552,10 @@ BOOL Disassemble(IMDInternalImport *pImport, BYTE *ILHeader, void *GUICookie, md
case ShortInlineR:
{
- __int32 v = (__int32) pCode[PC] +
- (((__int32) pCode[PC+1]) << 8) +
- (((__int32) pCode[PC+2]) << 16) +
- (((__int32) pCode[PC+3]) << 24);
+ int32_t v = (int32_t) pCode[PC] +
+ (((int32_t) pCode[PC+1]) << 8) +
+ (((int32_t) pCode[PC+2]) << 16) +
+ (((int32_t) pCode[PC+3]) << 24);
float f = (float&)v;
@@ -1577,7 +1575,7 @@ BOOL Disassemble(IMDInternalImport *pImport, BYTE *ILHeader, void *GUICookie, md
float fd = (float)atof(szf);
// Must compare as underlying bytes, not floating point otherwise optimizer will
// try to enregister and compare 80-bit precision number with 32-bit precision number!!!!
- if(((__int32&)fd == v)&&!IsSpecialNumber(szf))
+ if(((int32_t&)fd == v)&&!IsSpecialNumber(szf))
szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr), "%-10s %s", pszInstrName, szf);
else
szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr), "%-10s (%2.2X %2.2X %2.2X %2.2X)",
@@ -1588,14 +1586,14 @@ BOOL Disassemble(IMDInternalImport *pImport, BYTE *ILHeader, void *GUICookie, md
case InlineR:
{
- __int64 v = (__int64) pCode[PC] +
- (((__int64) pCode[PC+1]) << 8) +
- (((__int64) pCode[PC+2]) << 16) +
- (((__int64) pCode[PC+3]) << 24) +
- (((__int64) pCode[PC+4]) << 32) +
- (((__int64) pCode[PC+5]) << 40) +
- (((__int64) pCode[PC+6]) << 48) +
- (((__int64) pCode[PC+7]) << 56);
+ int64_t v = (int64_t) pCode[PC] +
+ (((int64_t) pCode[PC+1]) << 8) +
+ (((int64_t) pCode[PC+2]) << 16) +
+ (((int64_t) pCode[PC+3]) << 24) +
+ (((int64_t) pCode[PC+4]) << 32) +
+ (((int64_t) pCode[PC+5]) << 40) +
+ (((int64_t) pCode[PC+6]) << 48) +
+ (((int64_t) pCode[PC+7]) << 56);
double d = (double&)v;
@@ -1616,7 +1614,7 @@ BOOL Disassemble(IMDInternalImport *pImport, BYTE *ILHeader, void *GUICookie, md
double df = strtod(szf, &pch); //atof(szf);
// Must compare as underlying bytes, not floating point otherwise optimizer will
// try to enregister and compare 80-bit precision number with 64-bit precision number!!!!
- if (((__int64&)df == v)&&!IsSpecialNumber(szf))
+ if (((int64_t&)df == v)&&!IsSpecialNumber(szf))
szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr), "%-10s %s", pszInstrName, szf);
else
szptr+=sprintf_s(szptr,SZSTRING_REMAINING_SIZE(szptr),
@@ -2546,7 +2544,7 @@ void PrettyPrintToken(__inout __nullterminated char* szString, mdToken tk, IMDIn
}
if (pszString != NULL)
{
- DumpUnicodeString(GUICookie,szString,(WCHAR *)pszString,cbString, true);
+ DumpUnicodeString(GUICookie,szString,(WCHAR *)pszString,cbString);
}
else
{
diff --git a/src/coreclr/ildasm/dis.h b/src/coreclr/ildasm/dis.h
index 6aef96aefcfa..1b60192a60b8 100644
--- a/src/coreclr/ildasm/dis.h
+++ b/src/coreclr/ildasm/dis.h
@@ -78,8 +78,7 @@ void DumpVtable(void* GUICookie);
char* DumpUnicodeString(void* GUICookie,
__inout __nullterminated char* szString,
_In_reads_(cbString) WCHAR* pszString,
- ULONG cbString,
- bool SwapString = false);
+ ULONG cbString);
void TokenSigInit(IMDInternalImport *pImport);
void TokenSigDelete();
diff --git a/src/coreclr/ildasm/windasm.cpp b/src/coreclr/ildasm/windasm.cpp
index 8a4c5d06a7aa..970b0e400d01 100644
--- a/src/coreclr/ildasm/windasm.cpp
+++ b/src/coreclr/ildasm/windasm.cpp
@@ -17,7 +17,9 @@
#include
#include "resource.h"
-#include "new.hpp"
+#include
+
+using std::nothrow;
#define MODE_DUMP_ALL 0
#define MODE_DUMP_CLASS 1
@@ -465,10 +467,6 @@ int main(int argc, char* argv[])
}
#endif
-#ifdef _DEBUG
- DisableThrowCheck();
-#endif
-
int iCommandLineParsed = 0;
WCHAR* wzCommandLine = NULL;
char* szCommandLine = NULL;
diff --git a/src/coreclr/inc/CrstTypes.def b/src/coreclr/inc/CrstTypes.def
index 7f94e9e0996a..c71a65cfa125 100644
--- a/src/coreclr/inc/CrstTypes.def
+++ b/src/coreclr/inc/CrstTypes.def
@@ -193,7 +193,7 @@ Crst DynamicIL
End
Crst DynamicMT
- AcquiredBefore IbcProfile
+ AcquiredBefore IbcProfile CodeVersioning
End
Crst EventStore
diff --git a/src/coreclr/inc/bitposition.h b/src/coreclr/inc/bitposition.h
index aacc50ce15e0..91a89c116126 100644
--- a/src/coreclr/inc/bitposition.h
+++ b/src/coreclr/inc/bitposition.h
@@ -36,7 +36,7 @@ unsigned BitPosition(unsigned value)
// It performs the "TrailingZeroCount" operation using intrinsics.
//
inline
-unsigned BitPosition(unsigned __int64 value)
+unsigned BitPosition(uint64_t value)
{
_ASSERTE((value != 0) && ((value & (value-1)) == 0));
DWORD index;
diff --git a/src/coreclr/inc/bitvector.h b/src/coreclr/inc/bitvector.h
index 0f17697dddce..b957bdadc5a5 100644
--- a/src/coreclr/inc/bitvector.h
+++ b/src/coreclr/inc/bitvector.h
@@ -401,7 +401,7 @@ typedef BitVector ptrArgTP;
#else // !USE_BITVECTOR
-typedef unsigned __int64 ptrArgTP;
+typedef uint64_t ptrArgTP;
// Maximum number of bits in our bitvector
#define MAX_PTRARG_OFS (sizeof(ptrArgTP) * 8)
diff --git a/src/coreclr/inc/cahlpr.h b/src/coreclr/inc/cahlpr.h
index c5b4446b83cd..eef6c79204ff 100644
--- a/src/coreclr/inc/cahlpr.h
+++ b/src/coreclr/inc/cahlpr.h
@@ -18,23 +18,23 @@ struct CaValue
{
union
{
- signed __int8 i1;
- unsigned __int8 u1;
- signed __int16 i2;
- unsigned __int16 u2;
- signed __int32 i4;
- unsigned __int32 u4;
- signed __int64 i8;
- unsigned __int64 u8;
- float r4;
- double r8;
+ int8_t i1;
+ uint8_t u1;
+ int16_t i2;
+ uint16_t u2;
+ int32_t i4;
+ uint32_t u4;
+ int64_t i8;
+ uint64_t u8;
+ float r4;
+ double r8;
struct
{
LPCUTF8 pStr;
ULONG cbStr;
} str;
};
- unsigned __int8 tag;
+ uint8_t tag;
};
#endif // __CAHLPR_H__
diff --git a/src/coreclr/inc/caparser.h b/src/coreclr/inc/caparser.h
index 177e5aa59268..4526495bfb48 100644
--- a/src/coreclr/inc/caparser.h
+++ b/src/coreclr/inc/caparser.h
@@ -28,63 +28,63 @@ class CustomAttributeParser {
}
private:
- signed __int8 GetI1()
+ int8_t GetI1()
{
LIMITED_METHOD_CONTRACT;
- signed __int8 tmp = *reinterpret_cast(m_pbCur);
- m_pbCur += sizeof(signed __int8);
+ int8_t tmp = *reinterpret_cast(m_pbCur);
+ m_pbCur += sizeof(int8_t);
return tmp;
}
- unsigned __int8 GetU1()
+ uint8_t GetU1()
{
LIMITED_METHOD_CONTRACT;
- unsigned __int8 tmp = *reinterpret_cast(m_pbCur);
- m_pbCur += sizeof(unsigned __int8);
+ uint8_t tmp = *reinterpret_cast(m_pbCur);
+ m_pbCur += sizeof(uint8_t);
return tmp;
}
- signed __int16 GetI2()
+ int16_t GetI2()
{
LIMITED_METHOD_CONTRACT;
- signed __int16 tmp = GET_UNALIGNED_VAL16(m_pbCur);
- m_pbCur += sizeof(signed __int16);
+ int16_t tmp = GET_UNALIGNED_VAL16(m_pbCur);
+ m_pbCur += sizeof(int16_t);
return tmp;
}
- unsigned __int16 GetU2()
+ uint16_t GetU2()
{
LIMITED_METHOD_CONTRACT;
- unsigned __int16 tmp = GET_UNALIGNED_VAL16(m_pbCur);
- m_pbCur += sizeof(unsigned __int16 );
+ uint16_t tmp = GET_UNALIGNED_VAL16(m_pbCur);
+ m_pbCur += sizeof(uint16_t );
return tmp;
}
- signed __int32 GetI4()
+ int32_t GetI4()
{
LIMITED_METHOD_CONTRACT;
- signed __int32 tmp = GET_UNALIGNED_VAL32(m_pbCur);
- m_pbCur += sizeof(signed __int32 );
+ int32_t tmp = GET_UNALIGNED_VAL32(m_pbCur);
+ m_pbCur += sizeof(int32_t );
return tmp;
}
- unsigned __int32 GetU4()
+ uint32_t GetU4()
{
LIMITED_METHOD_CONTRACT;
- unsigned __int32 tmp = GET_UNALIGNED_VAL32(m_pbCur);
- m_pbCur += sizeof(unsigned __int32 );
+ uint32_t tmp = GET_UNALIGNED_VAL32(m_pbCur);
+ m_pbCur += sizeof(uint32_t );
return tmp;
}
- signed __int64 GetI8()
+ int64_t GetI8()
{
LIMITED_METHOD_CONTRACT;
- signed __int64 tmp = GET_UNALIGNED_VAL64(m_pbCur);
- m_pbCur += sizeof(signed __int64 );
+ int64_t tmp = GET_UNALIGNED_VAL64(m_pbCur);
+ m_pbCur += sizeof(int64_t );
return tmp;
}
- unsigned __int64 GetU8()
+ uint64_t GetU8()
{
LIMITED_METHOD_CONTRACT;
- unsigned __int64 tmp = GET_UNALIGNED_VAL64(m_pbCur);
- m_pbCur += sizeof(unsigned __int64 );
+ uint64_t tmp = GET_UNALIGNED_VAL64(m_pbCur);
+ m_pbCur += sizeof(uint64_t );
return tmp;
}
@@ -92,8 +92,8 @@ class CustomAttributeParser {
float GetR4()
{
LIMITED_METHOD_CONTRACT;
- __int32 tmp = GET_UNALIGNED_VAL32(m_pbCur);
- _ASSERTE(sizeof(__int32) == sizeof(float));
+ int32_t tmp = GET_UNALIGNED_VAL32(m_pbCur);
+ _ASSERTE(sizeof(int32_t) == sizeof(float));
m_pbCur += sizeof(float);
return (float &)tmp;
}
@@ -101,17 +101,17 @@ class CustomAttributeParser {
double GetR8()
{
LIMITED_METHOD_CONTRACT;
- __int64 tmp = GET_UNALIGNED_VAL64(m_pbCur);
- _ASSERTE(sizeof(__int64) == sizeof(double));
+ int64_t tmp = GET_UNALIGNED_VAL64(m_pbCur);
+ _ASSERTE(sizeof(int64_t) == sizeof(double));
m_pbCur += sizeof(double);
return (double &)tmp;
}
private:
- unsigned __int16 GetProlog()
+ uint16_t GetProlog()
{
WRAPPER_NO_CONTRACT;
- unsigned __int16 val;
+ uint16_t val;
VERIFY(SUCCEEDED(GetProlog(&val)));
return val;
}
@@ -125,11 +125,11 @@ class CustomAttributeParser {
}
public:
- HRESULT GetI1(signed __int8 *pVal)
+ HRESULT GetI1(int8_t *pVal)
{
WRAPPER_NO_CONTRACT;
- if (BytesLeft() < (int) sizeof(signed __int8))
+ if (BytesLeft() < (int) sizeof(int8_t))
return META_E_CA_INVALID_BLOB;
*pVal = GetI1();
return S_OK;
@@ -139,74 +139,74 @@ class CustomAttributeParser {
{
WRAPPER_NO_CONTRACT;
HRESULT hr;
- signed __int8 tmp;
+ int8_t tmp;
IfFailRet(GetI1(&tmp));
- *pVal = (CorSerializationType)((unsigned __int8)tmp);
+ *pVal = (CorSerializationType)((uint8_t)tmp);
return hr;
}
- HRESULT GetU1(unsigned __int8 *pVal)
+ HRESULT GetU1(uint8_t *pVal)
{
WRAPPER_NO_CONTRACT;
- if (BytesLeft() < (int) sizeof(unsigned __int8))
+ if (BytesLeft() < (int) sizeof(uint8_t))
return META_E_CA_INVALID_BLOB;
*pVal = GetU1();
return S_OK;
}
- HRESULT GetI2(signed __int16 *pVal)
+ HRESULT GetI2(int16_t *pVal)
{
WRAPPER_NO_CONTRACT;
- if (BytesLeft() < (int) sizeof(signed __int16))
+ if (BytesLeft() < (int) sizeof(int16_t))
return META_E_CA_INVALID_BLOB;
*pVal = GetI2();
return S_OK;
}
- HRESULT GetU2(unsigned __int16 *pVal)
+ HRESULT GetU2(uint16_t *pVal)
{
WRAPPER_NO_CONTRACT;
- if (BytesLeft() < (int) sizeof(unsigned __int16))
+ if (BytesLeft() < (int) sizeof(uint16_t))
return META_E_CA_INVALID_BLOB;
*pVal = GetU2();
return S_OK;
}
- HRESULT GetI4(signed __int32 *pVal)
+ HRESULT GetI4(int32_t *pVal)
{
WRAPPER_NO_CONTRACT;
- if (BytesLeft() < (int) sizeof(signed __int32))
+ if (BytesLeft() < (int) sizeof(int32_t))
return META_E_CA_INVALID_BLOB;
*pVal = GetI4();
return S_OK;
}
- HRESULT GetU4(unsigned __int32 *pVal)
+ HRESULT GetU4(uint32_t *pVal)
{
WRAPPER_NO_CONTRACT;
- if (BytesLeft() < (int) sizeof(unsigned __int32))
+ if (BytesLeft() < (int) sizeof(uint32_t))
return META_E_CA_INVALID_BLOB;
*pVal = GetU4();
return S_OK;
}
- HRESULT GetI8(signed __int64 *pVal)
+ HRESULT GetI8(int64_t *pVal)
{
WRAPPER_NO_CONTRACT;
- if (BytesLeft() < (int) sizeof(signed __int64))
+ if (BytesLeft() < (int) sizeof(int64_t))
return META_E_CA_INVALID_BLOB;
*pVal = GetI8();
return S_OK;
}
- HRESULT GetU8(unsigned __int64 *pVal)
+ HRESULT GetU8(uint64_t *pVal)
{
WRAPPER_NO_CONTRACT;
- if (BytesLeft() < (int) sizeof(unsigned __int64))
+ if (BytesLeft() < (int) sizeof(uint64_t))
return META_E_CA_INVALID_BLOB;
*pVal = GetU8();
return S_OK;
@@ -231,7 +231,7 @@ class CustomAttributeParser {
return S_OK;
}
- HRESULT GetProlog(unsigned __int16 *pVal)
+ HRESULT GetProlog(uint16_t *pVal)
{
WRAPPER_NO_CONTRACT;
@@ -247,14 +247,14 @@ class CustomAttributeParser {
// blobs where the prolog is the only incorrect data.
HRESULT SkipProlog()
{
- unsigned __int16 val;
+ uint16_t val;
return GetProlog(&val);
}
HRESULT ValidateProlog()
{
HRESULT hr;
- unsigned __int16 val;
+ uint16_t val;
IfFailRet(GetProlog(&val));
if (val != 0x0001)
diff --git a/src/coreclr/inc/clrconfig.h b/src/coreclr/inc/clrconfig.h
index f3e22d7ded16..549f372f4e7a 100644
--- a/src/coreclr/inc/clrconfig.h
+++ b/src/coreclr/inc/clrconfig.h
@@ -147,6 +147,6 @@ inline CLRConfig::LookupOptions operator&(CLRConfig::LookupOptions lhs, CLRConfi
return static_cast(static_cast(lhs) & static_cast(rhs));
}
-typedef Wrapper CLRConfigStringHolder;
+typedef Wrapper CLRConfigStringHolder;
#endif //__CLRConfig_h__
diff --git a/src/coreclr/inc/clrconfigvalues.h b/src/coreclr/inc/clrconfigvalues.h
index ddc7c79506ad..07fa685484f0 100644
--- a/src/coreclr/inc/clrconfigvalues.h
+++ b/src/coreclr/inc/clrconfigvalues.h
@@ -261,7 +261,6 @@ RETAIL_CONFIG_DWORD_INFO(INTERNAL_UseEntryPointFilter, W("UseEntryPointFilter"),
RETAIL_CONFIG_DWORD_INFO(INTERNAL_Corhost_Swallow_Uncaught_Exceptions, W("Corhost_Swallow_Uncaught_Exceptions"), 0, "")
RETAIL_CONFIG_DWORD_INFO(EXTERNAL_LegacyExceptionHandling, W("LegacyExceptionHandling"), 0, "Enable legacy exception handling.");
-
///
/// Garbage collector
///
@@ -284,6 +283,7 @@ CONFIG_DWORD_INFO(INTERNAL_GcStressOnDirectCalls, W("GcStressOnDirectCalls"), 0,
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_HeapVerify, W("HeapVerify"), 0, "When set verifies the integrity of the managed heap on entry and exit of each GC")
RETAIL_CONFIG_DWORD_INFO(EXTERNAL_GCCpuGroup, W("GCCpuGroup"), 0, "Specifies if to enable GC to support CPU groups")
RETAIL_CONFIG_STRING_INFO(EXTERNAL_GCName, W("GCName"), "")
+RETAIL_CONFIG_STRING_INFO(EXTERNAL_GCPath, W("GCPath"), "")
/**
* This flag allows us to force the runtime to use global allocation context on Windows x86/amd64 instead of thread allocation context just for testing purpose.
* The flag is unsafe for a subtle reason. Although the access to the g_global_alloc_context is protected under a lock. The implementation of
@@ -505,6 +505,7 @@ CONFIG_DWORD_INFO(INTERNAL_DiagnosticSuspend, W("DiagnosticSuspend"), 0, "")
CONFIG_DWORD_INFO(INTERNAL_SuspendDeadlockTimeout, W("SuspendDeadlockTimeout"), 40000, "")
CONFIG_DWORD_INFO(INTERNAL_SuspendThreadDeadlockTimeoutMs, W("SuspendThreadDeadlockTimeoutMs"), 2000, "")
RETAIL_CONFIG_DWORD_INFO(INTERNAL_ThreadSuspendInjection, W("INTERNAL_ThreadSuspendInjection"), 1, "Specifies whether to inject activations for thread suspension on Unix")
+RETAIL_CONFIG_DWORD_INFO(INTERNAL_InterruptibleCallSites, W("InterruptibleCallSites"), 1, "Specifies whether to allow asynchronous thread interruptions at call sites (requires GCInfo v3)")
///
/// Thread (miscellaneous)
@@ -686,7 +687,7 @@ RETAIL_CONFIG_STRING_INFO(INTERNAL_EventPipeConfig, W("EventPipeConfig"), "Confi
RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeRundown, W("EventPipeRundown"), 1, "Enable/disable eventpipe rundown.")
RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeCircularMB, W("EventPipeCircularMB"), 1024, "The EventPipe circular buffer size in megabytes.")
RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeProcNumbers, W("EventPipeProcNumbers"), 0, "Enable/disable capturing processor numbers in EventPipe event headers")
-RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeOutputStreaming, W("EventPipeOutputStreaming"), 0, "Enable/disable streaming for trace file set in DOTNET_EventPipeOutputPath. Non-zero values enable streaming.")
+RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeOutputStreaming, W("EventPipeOutputStreaming"), 1, "Enable/disable streaming for trace file set in DOTNET_EventPipeOutputPath. Non-zero values enable streaming.")
RETAIL_CONFIG_DWORD_INFO(INTERNAL_EventPipeEnableStackwalk, W("EventPipeEnableStackwalk"), 1, "Set to 0 to disable collecting stacks for EventPipe events.")
#ifdef FEATURE_AUTO_TRACE
@@ -817,7 +818,6 @@ CONFIG_STRING_INFO(INTERNAL_DumpOnClassLoad, W("DumpOnClassLoad"), "Dumps inform
CONFIG_DWORD_INFO(INTERNAL_ExpandAllOnLoad, W("ExpandAllOnLoad"), 0, "")
CONFIG_DWORD_INFO(INTERNAL_ForceRelocs, W("ForceRelocs"), 0, "")
CONFIG_DWORD_INFO(INTERNAL_GenerateLongJumpDispatchStubRatio, W("GenerateLongJumpDispatchStubRatio"), 0, "Useful for testing VSD on AMD64")
-CONFIG_DWORD_INFO(INTERNAL_HashStack, W("HashStack"), 0, "")
CONFIG_DWORD_INFO(INTERNAL_HostManagerConfig, W("HostManagerConfig"), (DWORD)-1, "")
CONFIG_DWORD_INFO(INTERNAL_HostTestThreadAbort, W("HostTestThreadAbort"), 0, "")
CONFIG_STRING_INFO(INTERNAL_InvokeHalt, W("InvokeHalt"), "Throws an assert when the given method is invoked through reflection.")
diff --git a/src/coreclr/inc/clrhost.h b/src/coreclr/inc/clrhost.h
index 393e6996fe7d..73d17c74e082 100644
--- a/src/coreclr/inc/clrhost.h
+++ b/src/coreclr/inc/clrhost.h
@@ -8,6 +8,8 @@
#ifndef __CLRHOST_H__
#define __CLRHOST_H__
+#include
+
#include "windows.h" // worth to include before mscoree.h so we are guaranteed to pick few definitions
#ifdef CreateSemaphore
#undef CreateSemaphore
@@ -16,7 +18,9 @@
#include "clrinternal.h"
#include "switches.h"
#include "holder.h"
-#include "new.hpp"
+
+using std::nothrow;
+
#include "staticcontract.h"
#include "predeftlsslot.h"
#include "safemath.h"
@@ -65,10 +69,6 @@ BOOL ClrVirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWO
HANDLE ClrGetProcessExecutableHeap();
#endif
-#ifdef FAILPOINTS_ENABLED
-extern int RFS_HashStack();
-#endif
-
// Critical section support for CLR DLLs other than the EE.
// Include the header defining each Crst type and its corresponding level (relative rank). This is
// auto-generated from a tool that takes a high-level description of each Crst type and its dependencies.
@@ -86,11 +86,11 @@ DWORD ClrSleepEx(DWORD dwMilliseconds, BOOL bAlertable);
// be used. This guarantees that the locks will be vacated when the scope is popped,
// either on exception or on return.
-typedef Holder CRITSEC_Holder;
+typedef Holder CRITSEC_Holder;
// Use this holder to manage CRITSEC_COOKIE allocation to ensure it will be released if anything goes wrong
FORCEINLINE void VoidClrDeleteCriticalSection(CRITSEC_COOKIE cs) { if (cs != NULL) ClrDeleteCriticalSection(cs); }
-typedef Wrapper, VoidClrDeleteCriticalSection, NULL> CRITSEC_AllocationHolder;
+typedef Wrapper, VoidClrDeleteCriticalSection, 0> CRITSEC_AllocationHolder;
#ifndef DACCESS_COMPILE
// Suspend/resume APIs that fail-fast on errors
diff --git a/src/coreclr/inc/cordebug.idl b/src/coreclr/inc/cordebug.idl
index 2e06651c9249..077d811cd45b 100644
--- a/src/coreclr/inc/cordebug.idl
+++ b/src/coreclr/inc/cordebug.idl
@@ -7781,6 +7781,17 @@ interface ICorDebugExceptionObjectValue : IUnknown
HRESULT EnumerateExceptionCallStack([out] ICorDebugExceptionObjectCallStackEnum** ppCallStackEnum);
};
+[
+ object,
+ local,
+ uuid(e3b2f332-cc46-4f1e-ab4e-5400e332195e),
+ pointer_default(unique)
+]
+interface ICorDebugExceptionObjectValue2 : IUnknown
+{
+ HRESULT ForceCatchHandlerFoundEvents([in] BOOL enableEvents);
+};
+
/* ------------------------------------------------------------------------- *
* Library definition
* ------------------------------------------------------------------------- */
diff --git a/src/coreclr/inc/corerror.xml b/src/coreclr/inc/corerror.xml
index 1d4129305fa6..68c9a1aa5dfb 100644
--- a/src/coreclr/inc/corerror.xml
+++ b/src/coreclr/inc/corerror.xml
@@ -172,12 +172,6 @@
The located assembly's manifest definition does not match the assembly reference.
-
- FUSION_E_PRIVATE_ASM_DISALLOWED
- "A strongly-named assembly is required."
- A strongly-named assembly is required.
-
-
FUSION_E_INVALID_NAME
"The given assembly name was invalid."
diff --git a/src/coreclr/inc/corhlpr.cpp b/src/coreclr/inc/corhlpr.cpp
index f4dc78d4f37c..61dc050ce52e 100644
--- a/src/coreclr/inc/corhlpr.cpp
+++ b/src/coreclr/inc/corhlpr.cpp
@@ -8,9 +8,7 @@
****************************************************************************/
#ifndef SOS_INCLUDE
-#ifdef _BLD_CLR
#include "utilcode.h"
-#endif
#include "corhlpr.h"
#include
diff --git a/src/coreclr/inc/corhlpr.h b/src/coreclr/inc/corhlpr.h
index 3cc0a36701e7..0bd3b1e1dfe8 100644
--- a/src/coreclr/inc/corhlpr.h
+++ b/src/coreclr/inc/corhlpr.h
@@ -22,14 +22,9 @@
#include "corhdr.h"
#include "corerror.h"
#include "unreachable.h"
+#include
-// This header is consumed both within the runtime and externally. In the former
-// case we need to wrap memory allocations, in the latter there is no
-// infrastructure to support this. Detect which way we're building and provide a
-// very simple abstraction layer (handles allocating bytes only).
-#ifdef _BLD_CLR
-#include "new.hpp"
-
+using std::nothrow;
#define NEW_NOTHROW(_bytes) new (nothrow) BYTE[_bytes]
#define NEW_THROWS(_bytes) new BYTE[_bytes]
@@ -38,27 +33,6 @@ inline void DECLSPEC_NORETURN THROW_OUT_OF_MEMORY()
{
ThrowOutOfMemory();
}
-#else
-#define NEW_NOTHROW(_bytes) new BYTE[_bytes]
-#define NEW_THROWS(_bytes) __CorHlprNewThrows(_bytes)
-static inline void DECLSPEC_NORETURN __CorHlprThrowOOM()
-{
- RaiseException(STATUS_NO_MEMORY, 0, 0, NULL);
- __UNREACHABLE();
-}
-static inline BYTE *__CorHlprNewThrows(size_t bytes)
-{
- BYTE *pbMemory = new BYTE[bytes];
- if (pbMemory == NULL)
- __CorHlprThrowOOM();
- return pbMemory;
-}
-inline void DECLSPEC_NORETURN THROW_OUT_OF_MEMORY()
-{
- __CorHlprThrowOOM();
-}
-#endif
-
//*****************************************************************************
// There are a set of macros commonly used in the helpers which you will want
diff --git a/src/coreclr/inc/corhlprpriv.cpp b/src/coreclr/inc/corhlprpriv.cpp
index c5d26cc6ce86..97c25d3cfb58 100644
--- a/src/coreclr/inc/corhlprpriv.cpp
+++ b/src/coreclr/inc/corhlprpriv.cpp
@@ -8,9 +8,7 @@
****************************************************************************/
#ifndef SOS_INCLUDE
-#ifdef _BLD_CLR
#include "utilcode.h"
-#endif
#include "corhlprpriv.h"
#include
@@ -23,7 +21,6 @@
template
HRESULT CQuickMemoryBase::ReSizeNoThrow(SIZE_T iItems)
{
-#ifdef _BLD_CLR
#ifdef _DEBUG
#ifndef DACCESS_COMPILE
// Exercise heap for OOM-fault injection purposes
@@ -38,7 +35,6 @@ HRESULT CQuickMemoryBase::ReSizeNoThrow(SIZE_T iItems)
delete [] pTmp;
}
#endif
-#endif
#endif
BYTE *pbBuffNew;
if (iItems <= cbTotal)
@@ -47,12 +43,10 @@ HRESULT CQuickMemoryBase::ReSizeNoThrow(SIZE_T iItems)
return NOERROR;
}
-#ifdef _BLD_CLR
#ifndef DACCESS_COMPILE
// not allowed to do allocation if current thread suspends EE
if (IsSuspendEEThread ())
return E_OUTOFMEMORY;
-#endif
#endif
pbBuffNew = NEW_NOTHROW(iItems + INCREMENT);
if (!pbBuffNew)
diff --git a/src/coreclr/inc/corhlprpriv.h b/src/coreclr/inc/corhlprpriv.h
index 62298798d701..9cbdaa4a3ea8 100644
--- a/src/coreclr/inc/corhlprpriv.h
+++ b/src/coreclr/inc/corhlprpriv.h
@@ -81,7 +81,7 @@ class CQuickMemoryBase
template
void *_Alloc(SIZE_T iItems)
{
-#if defined(_BLD_CLR) && defined(_DEBUG)
+#if defined(_DEBUG)
{ // Exercise heap for OOM-fault injection purposes
BYTE * pb = NSQuickBytesHelper::_AllocBytes::Invoke(iItems);
_ASSERTE(!bThrow || pb != NULL); // _AllocBytes would have thrown if bThrow == TRUE
@@ -474,12 +474,12 @@ template class CQuickArrayBase : public CQuickBytesBase
template class CQuickArray : public CQuickArrayBase
{
public:
- CQuickArray()
+ CQuickArray()
{
this->Init();
}
- ~CQuickArray()
+ ~CQuickArray()
{
this->Destroy();
}
diff --git a/src/coreclr/inc/corinfo.h b/src/coreclr/inc/corinfo.h
index be3085aacf9f..645b46ede0f3 100644
--- a/src/coreclr/inc/corinfo.h
+++ b/src/coreclr/inc/corinfo.h
@@ -497,7 +497,7 @@ enum CorInfoHelpFunc
CORINFO_HELP_ASSIGN_REF_ENSURE_NONHEAP, // Do the store, and ensure that the target was not in the heap.
CORINFO_HELP_ASSIGN_BYREF,
- CORINFO_HELP_ASSIGN_STRUCT,
+ CORINFO_HELP_BULK_WRITEBARRIER,
/* Accessing fields */
@@ -1764,6 +1764,9 @@ struct CORINFO_EE_INFO
// Size of the Frame structure
unsigned size;
+ // Size of the Frame structure when it also contains the secret stub arg
+ unsigned sizeWithSecretStubArg;
+
unsigned offsetOfGSCookie;
unsigned offsetOfFrameVptr;
unsigned offsetOfFrameLink;
@@ -1771,6 +1774,7 @@ struct CORINFO_EE_INFO
unsigned offsetOfCalleeSavedFP;
unsigned offsetOfCallTarget;
unsigned offsetOfReturnAddress;
+ unsigned offsetOfSecretStubArg;
// This offset is used only for ARM
unsigned offsetOfSPAfterProlog;
}
@@ -2719,6 +2723,11 @@ class ICorStaticInfo
CORINFO_CLASS_HANDLE cls
) = 0;
+ // Returns whether a class handle represents a Nullable type, if that can be statically determined.
+ virtual TypeCompareState isNullableType(
+ CORINFO_CLASS_HANDLE cls
+ ) = 0;
+
// Returns TypeCompareState::Must if cls is known to be an enum.
// For enums with known exact type returns the underlying
// type in underlyingType when the provided pointer is
diff --git a/src/coreclr/inc/corjit.h b/src/coreclr/inc/corjit.h
index 16116517b68d..a168fff609c5 100644
--- a/src/coreclr/inc/corjit.h
+++ b/src/coreclr/inc/corjit.h
@@ -455,7 +455,8 @@ class ICorJitInfo : public ICorDynamicInfo
uint32_t * pCountSchemaItems, // OUT: pointer to the count of schema items in `pSchema` array.
uint8_t ** pInstrumentationData, // OUT: `*pInstrumentationData` is set to the address of the instrumentation data
// (pointer will not remain valid after jit completes).
- PgoSource * pPgoSource // OUT: value describing source of pgo data
+ PgoSource * pPgoSource, // OUT: value describing source of pgo data
+ bool * pDynamicPgo // OUT: dynamic PGO is enabled (valid even when return value is failure)
) = 0;
// Allocate a profile buffer for use in the current process
diff --git a/src/coreclr/inc/crsttypes_generated.h b/src/coreclr/inc/crsttypes_generated.h
index 79864b97db01..ed317f6d8656 100644
--- a/src/coreclr/inc/crsttypes_generated.h
+++ b/src/coreclr/inc/crsttypes_generated.h
@@ -172,7 +172,7 @@ int g_rgCrstLevelMap[] =
0, // CrstDelegateToFPtrHash
18, // CrstDomainLocalBlock
0, // CrstDynamicIL
- 3, // CrstDynamicMT
+ 10, // CrstDynamicMT
0, // CrstEtwTypeLogHash
20, // CrstEventPipe
0, // CrstEventStore
diff --git a/src/coreclr/inc/cycletimer.h b/src/coreclr/inc/cycletimer.h
index bd81bba043b5..c261d851ff31 100644
--- a/src/coreclr/inc/cycletimer.h
+++ b/src/coreclr/inc/cycletimer.h
@@ -14,7 +14,7 @@
class CycleTimer
{
// This returns the value of the *non-thread-virtualized* cycle counter.
- static unsigned __int64 GetCycleCount64();
+ static uint64_t GetCycleCount64();
// This wraps GetCycleCount64 in the signature of QueryThreadCycleTime -- but note
@@ -39,16 +39,16 @@ class CycleTimer
// Does a large number of queries, and returns the average of their overhead, so other measurements
// can adjust for this.
- static unsigned __int64 QueryOverhead();
+ static uint64_t QueryOverhead();
// There's no "native" atomic add for 64 bit, so we have this convenience function.
- static void InterlockedAddU64(unsigned __int64* loc, unsigned __int64 amount);
+ static void InterlockedAddU64(uint64_t* loc, uint64_t amount);
// Attempts to query the cycle counter of the current thread. If successful, returns "true" and sets
// *cycles to the cycle counter value. Otherwise, returns false. Note that the value returned is (currently)
// virtualized to the current thread only on Windows; on non-windows x86/x64 platforms, directly reads
// the cycle counter and returns that value.
- static bool GetThreadCyclesS(unsigned __int64* cycles);
+ static bool GetThreadCyclesS(uint64_t* cycles);
};
#endif // _CYCLETIMER_H_
diff --git a/src/coreclr/inc/daccess.h b/src/coreclr/inc/daccess.h
index 2d7cd5f34625..936a31950247 100644
--- a/src/coreclr/inc/daccess.h
+++ b/src/coreclr/inc/daccess.h
@@ -856,7 +856,7 @@ inline TADDR DacTAddrOffset( TADDR taBase, TSIZE_T dwIndex, TSIZE_T dwElementSiz
class __TPtrBase
{
public:
- __TPtrBase(void)
+ __TPtrBase()
{
// Make uninitialized pointers obvious.
m_addr = (TADDR)-1;
@@ -866,15 +866,44 @@ class __TPtrBase
m_addr = addr;
}
+ // We use this delayed check to avoid ambiguous overload issues with TADDR
+ // on platforms where NULL is defined as anything other than a uintptr_t constant
+ // or nullptr_t exactly.
+ // Without this, any valid "null pointer constant" that is not directly either type
+ // will be implicitly convertible to both TADDR and std::nullptr_t, causing ambiguity.
+ // With this, this constructor (and all similarly declared operators) drop out of
+ // consideration when used with NULL (and not nullptr_t).
+ // With this workaround, we get identical behavior between the DAC and non-DAC builds for assigning NULL
+ // to DACized pointer types.
+ template::value>::type>
+ __TPtrBase(T)
+ {
+ m_addr = 0;
+ }
+
+ __TPtrBase& operator=(TADDR addr)
+ {
+ m_addr = addr;
+ return *this;
+ }
+
+ template::value>::type>
+ __TPtrBase& operator=(T)
+ {
+ m_addr = 0;
+ return *this;
+ }
+
bool operator!() const
{
return m_addr == 0;
}
- // We'd like to have an implicit conversion to bool here since the C++
+
+ // We'd like to have an explicit conversion to bool here since the C++
// standard says all pointer types are implicitly converted to bool.
// Unfortunately, that would cause ambiguous overload errors for uses
- // of operator== and operator!=. Instead callers will have to compare
- // directly against NULL.
+ // of operator== and operator!= with NULL on MSVC (where NULL is a 32-bit int on all platforms).
+ // Instead callers will have to compare directly against NULL.
bool operator==(TADDR addr) const
{
@@ -884,6 +913,18 @@ class __TPtrBase
{
return m_addr != addr;
}
+
+ template::value>::type>
+ bool operator==(T) const
+ {
+ return m_addr == 0;
+ }
+
+ template::value>::type>
+ bool operator!=(T) const
+ {
+ return m_addr != 0;
+ }
bool operator<(TADDR addr) const
{
return m_addr < addr;
@@ -919,61 +960,55 @@ class __TPtrBase
// This has the common functionality between __DPtr and __ArrayDPtr.
// The DPtrType type parameter is the actual derived type in use. This is necessary so that
// inhereted functions preserve exact return types.
-template
+template class DPtrTemplate>
class __DPtrBase : public __TPtrBase
{
public:
typedef type _Type;
typedef type* _Ptr;
+ using DPtrType = DPtrTemplate;
-protected:
- // Constructors
- // All protected - this type should not be used directly - use one of the derived types instead.
- __DPtrBase< type, DPtrType >(void) : __TPtrBase() {}
- __DPtrBase< type, DPtrType >(TADDR addr) : __TPtrBase(addr) {}
+ using __TPtrBase::__TPtrBase;
- explicit __DPtrBase< type, DPtrType >(__TPtrBase addr)
- {
- m_addr = addr.GetAddr();
- }
- explicit __DPtrBase< type, DPtrType >(type const * host)
+ __DPtrBase() = default;
+
+ explicit __DPtrBase(__TPtrBase ptr) : __TPtrBase(ptr.GetAddr()) {}
+
+ // construct const from non-const
+ __DPtrBase(__DPtrBase::type, DPtrTemplate> const & rhs) : __DPtrBase(rhs.GetAddr()) {}
+
+ explicit __DPtrBase(type const * host)
{
m_addr = DacGetTargetAddrForHostAddr(host, true);
}
public:
+ using __TPtrBase::operator=;
+
DPtrType& operator=(const __TPtrBase& ptr)
{
m_addr = ptr.GetAddr();
return DPtrType(m_addr);
}
- DPtrType& operator=(TADDR addr)
- {
- m_addr = addr;
- return DPtrType(m_addr);
- }
type& operator*(void) const
{
return *(type*)DacInstantiateTypeByAddress(m_addr, sizeof(type), true);
}
+ using __TPtrBase::operator==;
+ using __TPtrBase::operator!=;
+
bool operator==(const DPtrType& ptr) const
{
return m_addr == ptr.GetAddr();
}
- bool operator==(TADDR addr) const
- {
- return m_addr == addr;
- }
+
bool operator!=(const DPtrType& ptr) const
{
return !operator==(ptr);
}
- bool operator!=(TADDR addr) const
- {
- return m_addr != addr;
- }
+
bool operator<(const DPtrType& ptr) const
{
return m_addr < ptr.GetAddr();
@@ -1176,31 +1211,25 @@ class __GlobalPtr;
// Pointer wrapper for objects which are just plain data
// and need no special handling.
template
-class __DPtr : public __DPtrBase >
+class __DPtr : public __DPtrBase
{
public:
- // constructors - all chain to __DPtrBase constructors
- __DPtr< type >(void) : __DPtrBase >() {}
- __DPtr< type >(TADDR addr) : __DPtrBase >(addr) {}
+ using __DPtrBase::__DPtrBase;
- // construct const from non-const
- typedef typename std::remove_const::type mutable_type;
- __DPtr< type >(__DPtr const & rhs) : __DPtrBase >(rhs.GetAddr()) {}
+ __DPtr() = default;
// construct from GlobalPtr
- explicit __DPtr< type >(__GlobalPtr< type*, __DPtr< type > > globalPtr) :
- __DPtrBase