Skip to content

Commit aeb864a

Browse files
jensjohacommit-bot@chromium.org
authored andcommitted
Allow bazels kernel_worker to output used inputs
This change basically consists of these steps: * Enable the incremental compiler to trace used inputs. * Translate used libraries into used dill inputs. * Output the list of used dills. Bug: #37788 Change-Id: I08cffe299166cf10e990c9e261f190afd25da8b1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/112384 Commit-Queue: Jens Johansen <[email protected]> Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Jake Macdonald <[email protected]>
1 parent 38336d6 commit aeb864a

File tree

3 files changed

+53
-4
lines changed

3 files changed

+53
-4
lines changed

pkg/front_end/lib/src/api_unstable/bazel_worker.dart

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ Future<InitializedCompilerState> initializeIncrementalCompiler(
6363
Target target,
6464
FileSystem fileSystem,
6565
Iterable<String> experiments,
66-
bool outlineOnly) async {
66+
bool outlineOnly,
67+
{bool trackNeededDillLibraries: false}) async {
6768
final List<int> sdkDigest = workerInputDigests[sdkSummary];
6869
if (sdkDigest == null) {
6970
throw new StateError("Expected to get digest for $sdkSummary");
@@ -121,6 +122,7 @@ Future<InitializedCompilerState> initializeIncrementalCompiler(
121122
new CompilerContext(processedOpts),
122123
cachedSdkInput.component,
123124
outlineOnly);
125+
incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
124126
} else {
125127
options = oldState.options;
126128
processedOpts = oldState.processedOpts;
@@ -147,6 +149,7 @@ Future<InitializedCompilerState> initializeIncrementalCompiler(
147149
// Reuse the incremental compiler, but reset as needed.
148150
incrementalCompiler = oldState.incrementalCompiler;
149151
incrementalCompiler.invalidateAllSources();
152+
incrementalCompiler.trackNeededDillLibraries = trackNeededDillLibraries;
150153
options.packagesFileUri = packagesFile;
151154
options.fileSystem = fileSystem;
152155
processedOpts.clearFileSystemCache();
@@ -155,6 +158,10 @@ Future<InitializedCompilerState> initializeIncrementalCompiler(
155158
// Then read all the input summary components.
156159
CanonicalName nameRoot = cachedSdkInput.component.root;
157160
final inputSummaries = <Component>[];
161+
Map<Uri, Uri> libraryToInputDill;
162+
if (trackNeededDillLibraries) {
163+
libraryToInputDill = new Map<Uri, Uri>();
164+
}
158165
List<Uri> loadFromDill = new List<Uri>();
159166
for (Uri summary in summaryInputs) {
160167
var cachedInput = workerInputCache[summary];
@@ -171,6 +178,9 @@ Future<InitializedCompilerState> initializeIncrementalCompiler(
171178
var component = cachedInput.component;
172179
for (var lib in component.libraries) {
173180
lib.isExternal = cachedInput.externalLibs.contains(lib.importUri);
181+
if (trackNeededDillLibraries) {
182+
libraryToInputDill[lib.importUri] = summary;
183+
}
174184
}
175185
inputSummaries.add(component);
176186
}
@@ -189,13 +199,19 @@ Future<InitializedCompilerState> initializeIncrementalCompiler(
189199
alwaysCreateNewNamedNodes: true));
190200
workerInputCache[summary] = cachedInput;
191201
inputSummaries.add(cachedInput.component);
202+
if (trackNeededDillLibraries) {
203+
for (var lib in cachedInput.component.libraries) {
204+
libraryToInputDill[lib.importUri] = summary;
205+
}
206+
}
192207
}
193208

194209
incrementalCompiler.setModulesToLoadOnNextComputeDelta(inputSummaries);
195210

196211
return new InitializedCompilerState(options, processedOpts,
197212
workerInputCache: workerInputCache,
198-
incrementalCompiler: incrementalCompiler);
213+
incrementalCompiler: incrementalCompiler,
214+
libraryToInputDill: libraryToInputDill);
199215
}
200216

201217
Future<InitializedCompilerState> initializeCompiler(

pkg/front_end/lib/src/api_unstable/compiler_state.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@ class InitializedCompilerState {
1616
final ProcessedOptions processedOpts;
1717
final Map<Uri, WorkerInputComponent> workerInputCache;
1818
final IncrementalCompiler incrementalCompiler;
19+
final Map<Uri, Uri> libraryToInputDill;
1920

2021
InitializedCompilerState(this.options, this.processedOpts,
21-
{this.workerInputCache, this.incrementalCompiler});
22+
{this.workerInputCache,
23+
this.incrementalCompiler,
24+
this.libraryToInputDill});
2225
}
2326

2427
/// A cached [Component] for a summary input file.

utils/bazel/kernel_worker.dart

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ final summaryArgsParser = new ArgParser()
139139
..addOption('output')
140140
..addFlag('reuse-compiler-result', defaultsTo: false)
141141
..addFlag('use-incremental-compiler', defaultsTo: false)
142+
..addOption('used-inputs')
142143
..addFlag('track-widget-creation', defaultsTo: false)
143144
..addMultiOption('enable-experiment',
144145
help: 'Enable a language experiment when invoking the CFE.');
@@ -242,6 +243,7 @@ Future<ComputeKernelResult> computeKernel(List<String> args,
242243

243244
fe.InitializedCompilerState state;
244245
bool usingIncrementalCompiler = false;
246+
bool recordUsedInputs = parsedArgs["used-inputs"] != null;
245247
if (parsedArgs['use-incremental-compiler'] &&
246248
linkedInputs.isEmpty &&
247249
isWorker) {
@@ -264,7 +266,8 @@ Future<ComputeKernelResult> computeKernel(List<String> args,
264266
target,
265267
fileSystem,
266268
(parsedArgs['enable-experiment'] as List<String>),
267-
summaryOnly);
269+
summaryOnly,
270+
trackNeededDillLibraries: recordUsedInputs);
268271
} else {
269272
state = await fe.initializeCompiler(
270273
// TODO(sigmund): pass an old state once we can make use of it.
@@ -285,11 +288,29 @@ Future<ComputeKernelResult> computeKernel(List<String> args,
285288
}
286289

287290
List<int> kernel;
291+
bool wroteUsedDills = false;
288292
if (usingIncrementalCompiler) {
289293
state.options.onDiagnostic = onDiagnostic;
290294
Component incrementalComponent = await state.incrementalCompiler
291295
.computeDelta(entryPoints: sources, fullComponent: true);
292296

297+
if (recordUsedInputs) {
298+
Set<Uri> usedOutlines = {};
299+
for (Library lib in state.incrementalCompiler.neededDillLibraries) {
300+
if (lib.importUri.scheme == "dart") continue;
301+
Uri uri = state.libraryToInputDill[lib.importUri];
302+
if (uri == null) {
303+
throw new StateError("Library ${lib.importUri} was recorded as used, "
304+
"but was not in the list of known libraries.");
305+
}
306+
usedOutlines.add(uri);
307+
}
308+
var outputUsedFile = new File(parsedArgs["used-inputs"]);
309+
outputUsedFile.createSync(recursive: true);
310+
outputUsedFile.writeAsStringSync(usedOutlines.join("\n"));
311+
wroteUsedDills = true;
312+
}
313+
293314
kernel = await state.incrementalCompiler.context.runInContext((_) {
294315
if (summaryOnly) {
295316
incrementalComponent.uriToSource.clear();
@@ -316,6 +337,15 @@ Future<ComputeKernelResult> computeKernel(List<String> args,
316337
}
317338
state.options.onDiagnostic = null; // See http://dartbug.com/36983.
318339

340+
if (!wroteUsedDills && recordUsedInputs) {
341+
// The path taken didn't record inputs used: Say we used everything.
342+
var outputUsedFile = new File(parsedArgs["used-inputs"]);
343+
outputUsedFile.createSync(recursive: true);
344+
Set<Uri> allFiles = {...summaryInputs, ...linkedInputs};
345+
outputUsedFile.writeAsStringSync(allFiles.join("\n"));
346+
wroteUsedDills = true;
347+
}
348+
319349
if (kernel != null) {
320350
var outputFile = new File(parsedArgs['output']);
321351
outputFile.createSync(recursive: true);

0 commit comments

Comments
 (0)