Skip to content

Reopening PR with Baseline for capturing Objs [For include cleanup validation not for merging]#128262

Closed
moyo1997 wants to merge 2 commits into
dotnet:mainfrom
moyo1997:obj-artifacts-baseline
Closed

Reopening PR with Baseline for capturing Objs [For include cleanup validation not for merging]#128262
moyo1997 wants to merge 2 commits into
dotnet:mainfrom
moyo1997:obj-artifacts-baseline

Conversation

@moyo1997
Copy link
Copy Markdown

No description provided.

moyo1997 and others added 2 commits May 14, 2026 16:02
…ine artifacts

Add a post-build step to global-build-job.yml that collects compiled
object files (.obj/.o) for the 102 source files modified in PR dotnet#127295
(Remove Unused Includes) and publishes them as pipeline artifacts.

- New script: eng/pipelines/collect-obj-files.ps1
  Searches artifacts/obj/ for object files matching the 102 source
  basenames and copies them to a staging directory.
- Modified: eng/pipelines/common/global-build-job.yml
  Added pwsh step + PublishBuildArtifacts task after the build step.
  Runs on every build leg, publishes per-leg artifacts named
  ObjFiles_<os>_<arch>_<config>.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings May 15, 2026 16:53
@dotnet-policy-service dotnet-policy-service Bot added the community-contribution Indicates that the PR has been added by a community member label May 15, 2026
@dotnet-policy-service
Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @dotnet/runtime-infrastructure
See info in area-owners.md if you want to be subscribed.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds a build pipeline step and PowerShell helper to collect and publish compiled object files (.obj/.o) for 102 source files modified in PR #127295, to enable analysis of size/content changes per platform.

Changes:

  • New PowerShell script that recursively scans artifacts/obj and copies matching object files (preserving relative paths) to a staging dir.
  • Two new pipeline steps in global-build-job.yml to invoke the script and publish the collected files as a build artifact.
Show a summary per file
File Description
eng/pipelines/collect-obj-files.ps1 New script with hardcoded list of 102 basenames; matches <base>.{c,cpp}.{o,obj} and copies to output dir.
eng/pipelines/common/global-build-job.yml Adds collection + PublishBuildArtifacts@1 steps gated on succeededOrFailed().

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 5

Comment on lines +3 to +120
# the 102 source files modified in PR #127295 ("Remove Unused Includes").
# Usage: pwsh collect-obj-files.ps1 -ArtifactsObjDir <path> -OutputDir <path>

param(
[Parameter(Mandatory)]
[string]$ArtifactsObjDir,

[Parameter(Mandatory)]
[string]$OutputDir
)

Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'

# The 102 source file basenames from PR #127295 (dotnet/runtime).
# We search for object files whose name matches "<basename>.obj" or "<basename>.o".
$sourceBasenames = @(
"assembly"
"dacfn"
"processdescriptor"
"walker"
"dactable"
"debuggermodule"
"funceval"
"ceefilegenwriter"
"arraylist"
"dres"
"windasm"
"interoplib"
"block"
"dllmain"
"ee_il_dll"
"importer"
"loopcloning"
"promotion"
"promotiondecomposition"
"simdcodegenxarch"
"custattr_import"
"regmeta"
"regmeta_compilersupport"
"regmeta_emit"
"regmeta_import"
"regmeta_vm"
"stgtiggerstream"
"mdinternaldisp"
"memory"
"AsmOffsetsVerify"
"Crst"
"DebugHeader"
"EHHelpers"
"FinalizerHelpers"
"GCHelpers"
"GcStressControl"
"HandleTableHelpers"
"MathHelpers"
"MiscHelpers"
"RestrictedCallouts"
"RuntimeInstance"
"SyncClean"
"ThunksMapping"
"TypeManager"
"UniversalTransitionHelpers"
"event"
"ep-rt-aot"
"eventpipeinternal"
"eventtrace"
"eventtrace_gcheap"
"interoplibinterface_java"
"portable"
"rhassert"
"startup"
"stressLog"
"threadstore"
"PalCommon"
"PalMinWin"
"yieldprocessornormalized"
"mcs"
"removedup"
"icorjitinfo_generated"
"jithost"
"superpmi-shim-counter"
"superpmi-shim-simple"
"streamingsuperpmi"
"hostimpl"
"rangelist"
"cgenamd64"
"appdomain"
"callcounting"
"ceeload"
"class"
"classcompat"
"clsload"
"comcallablewrapper"
"cominterfacemarshaler"
"commodule"
"comutilnative"
"corelib"
"dllimport"
"exceptionhandling"
"fieldmarshaler"
"interoplibinterface_comwrappers"
"interoputil"
"jitinterfacegen"
"method"
"methodtable"
"onstackreplacement"
"peassembly"
"prestub"
"qcallentrypoints"
"stdinterfaces"
"stdinterfaces_wrapper"
"stubhelpers"
"stublink"
"threadsuspend"
"tieredcompilation"
"longfile.windows"
)

Comment on lines +142 to +180
# Search for .obj and .o files recursively
$extensions = @('*.obj', '*.o')
foreach ($ext in $extensions) {
$files = Get-ChildItem -Path $ArtifactsObjDir -Filter $ext -Recurse -File -ErrorAction SilentlyContinue
foreach ($file in $files) {
# Extract the source basename: e.g., "assembly.cpp.obj" -> "assembly"
# CMake names obj files as <sourcename>.cpp.obj (or .c.obj) on Windows,
# and <sourcename>.cpp.o (or .c.o) on Linux/macOS.
$objName = $file.Name
# Remove the object extension first
$withoutObjExt = $objName
if ($objName.EndsWith('.obj')) {
$withoutObjExt = $objName.Substring(0, $objName.Length - 4)
}
elseif ($objName.EndsWith('.o')) {
$withoutObjExt = $objName.Substring(0, $objName.Length - 2)
}

# Remove the source extension (.cpp, .c)
$baseName = $withoutObjExt
if ($withoutObjExt.EndsWith('.cpp')) {
$baseName = $withoutObjExt.Substring(0, $withoutObjExt.Length - 4)
}
elseif ($withoutObjExt.EndsWith('.c')) {
$baseName = $withoutObjExt.Substring(0, $withoutObjExt.Length - 2)
}

if ($basenameSet.Contains($baseName)) {
# Preserve relative path from artifacts/obj
$relativePath = $file.FullName.Substring($ArtifactsObjDir.TrimEnd([IO.Path]::DirectorySeparatorChar, '/').Length + 1)
$destPath = Join-Path $OutputDir $relativePath
$destDir = Split-Path $destPath -Parent
if (-not (Test-Path $destDir)) {
New-Item -ItemType Directory -Path $destDir -Force | Out-Null
}
Copy-Item -Path $file.FullName -Destination $destPath -Force
Write-Host "Copied: $relativePath ($($file.Length) bytes)"
$totalCopied++
}
Comment on lines +246 to +250
- task: PublishBuildArtifacts@1
displayName: Publish object files
inputs:
PathtoPublish: '$(Build.StagingDirectory)/obj-artifacts'
ArtifactName: 'ObjFiles_${{ parameters.osGroup }}${{ parameters.osSubgroup }}_${{ parameters.archType }}_${{ parameters.buildConfig }}'
Comment on lines +237 to +241
# Collect and publish .obj/.o files for the 102 source files from PR #127295
- pwsh: |
$(Build.SourcesDirectory)/eng/pipelines/collect-obj-files.ps1 `
-ArtifactsObjDir "$(Build.SourcesDirectory)/artifacts/obj" `
-OutputDir "$(Build.StagingDirectory)/obj-artifacts"

if ($basenameSet.Contains($baseName)) {
# Preserve relative path from artifacts/obj
$relativePath = $file.FullName.Substring($ArtifactsObjDir.TrimEnd([IO.Path]::DirectorySeparatorChar, '/').Length + 1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-Infrastructure community-contribution Indicates that the PR has been added by a community member

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants