aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/_mkmalloc
diff options
context:
space:
mode:
authorMichael Matloob <matloob@golang.org>2025-08-08 17:35:43 -0400
committerMichael Matloob <matloob@google.com>2025-09-11 14:25:41 -0700
commit73676e322396f6d49b4328456023233a2fe5693e (patch)
tree6462028d4156e1f0663ffb26b6cac1dfb2a8b458 /src/runtime/_mkmalloc
parent0e1b98993ea6574819813cfad89d7fd1d1c47552 (diff)
downloadgo-73676e322396f6d49b4328456023233a2fe5693e.tar.xz
cmd/go: run cgo and cgo compiles in their own actions
This change splits package builds further into even more actions. Between the cache action (and cover action, if present) and the actual build action we insert three layers of actions: Check Cache Action | | | V | Run Cover Action (if cover requested) | | | V New Layer 1 | Run Cgo Action (if package is built with cgo) | | | | (multiple arrows representing fan-out to | V V V multiple actions) New Layer 2 | gcc Compile Action for each C/C++/S/F/M file (if cgo) | |/ (arrow represeting fan-in to single action) | V New Layer 3 | Cgo collect action (if cgo) | | \ V Build action The first run cgo action takes the input source files and runs cgo on them to produce the cgo-processed go files, which are given to the compiler, and to produce additional C files to compile and headers to use in the following compilations. The action also takes care of running SWIG before running cgo if there are swig files. This will produce additional cgo sources that are inputs to cgo. The run cgo action action fans out to multiple actions to do each of the C/C++/Obj-C/assembly/Fortran compilations for the non-Go files in the package, as well as those produced as outputs by the cgo command invocation. These actions then join into a single noop "collect" action which primarily exists so that we don't pollute the build action's dependencies with a bunch of non-go compile actions. (The build action expects its dependencies to mostly be other build actions). All of this work in the new actions was previously being done in the build action itself. There's still a remnant of the original cgo logic left in the build action to run the cgo command with -dynimport to produce a go file to be built with the rest of the package, and do some checks. Most of this CL consists of moving code around. Just like the previous CL breaking out the coverage logic into a separate action, we don't cache the outputs of the cgo actions, and just treat all the actions used to build a single package as one cacheable unit. This makes things a bit simpler. If we decide in a future CL to cache the outputs separately, we could remove the dependency on the cover action on the check cache action (which in turn depends on all the package's dependencies) and could start non-go compilation pretty much as early as we want in the build. The 'cgoAction' function in action.go takes care of creating the layers of cgo action dependencies, which are inserted as dependencies of the build action. It's mostly straightforward, except for the fact that we need to tell each non-go compile action which non-go file to compile, so we need to compute the names of the generated files. (Alternatively we could give each action a number and have it build the nth file produced by the run cgo action, but that seems even more complicated). The actors produced to run the action logic are pretty light wrappers around the execution logic in exec.go. In the 'build' function in exec.go, most of the new code mainly checks for the information from the cgo actions to use instead of running it, and then passes it to the processCgoOutputs function. The only other weird thing in the build functian is that we we call the logic to compute the nonGoOverlay separately just for the C files that are being built with gccgo. We compute the overlay for the non-go files used in a cgo build in the run cgo action. The 'cgo' function that previously ran the cgo logic for the build has now been split into three: the first half, which runs cgo is now in the runCgo function, the center part, which compiles the non-go files is now partly in creating the invididual non-go compile actions, as well as the cgoCompileActor's Act function. And the final part, which runs cgo -dynimport is now in processCgoOutputs. These parts communicate with each other through the providers that are set on the cgo actions. One further improvement we can make to this change in the future is to compile the dynimport file separately from the build action: its output is only needed by the linker. This would remove any dependencies from dependent packages' build actions on the cgo compile actions, allowing more flexibility for scheduling actions. Fixes #9887 Change-Id: Ie3c70bbf985148ba73094cddfc78c39dc6faad6e Reviewed-on: https://go-review.googlesource.com/c/go/+/694475 Reviewed-by: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Matloob <matloob@google.com>
Diffstat (limited to 'src/runtime/_mkmalloc')
0 files changed, 0 insertions, 0 deletions