Skip to content

Commit 5efe7d9

Browse files
justinhorvitzcopybara-github
authored andcommitted
PlatformMappingValue#map returns BuildConfigurationKey instead of just BuildOptions.
The lone caller needs a `BuildConfgurationKey`, so might as well use the cache to spare the cost of interning it. PiperOrigin-RevId: 673379910 Change-Id: I90e4e8823fcab0cbca9f3f71f710c82bc52d0615
1 parent 12d9310 commit 5efe7d9

File tree

4 files changed

+49
-49
lines changed

4 files changed

+49
-49
lines changed

src/main/java/com/google/devtools/build/lib/analysis/producers/BuildConfigurationKeyProducer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ private StateMachine applyPlatformMapping(Tasks tasks) {
140140
return DONE; // Error.
141141
}
142142
try {
143-
BuildOptions updatedOptions = platformMappingValue.map(options);
144-
return finishConfigurationKeyProcessing(BuildConfigurationKey.create(updatedOptions));
143+
BuildConfigurationKey updatedKey = platformMappingValue.map(options);
144+
return finishConfigurationKeyProcessing(updatedKey);
145145
} catch (OptionsParsingException e) {
146146
sink.acceptOptionsParsingError(e);
147147
return runAfter;

src/main/java/com/google/devtools/build/lib/skyframe/config/PlatformMappingValue.java

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
3232
import com.google.devtools.build.lib.cmdline.Label;
3333
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
34+
import com.google.devtools.build.lib.util.HashCodes;
3435
import com.google.devtools.build.skyframe.SkyValue;
3536
import com.google.devtools.common.options.OptionsParsingException;
3637
import java.util.List;
3738
import java.util.Map;
38-
import java.util.Objects;
3939
import java.util.concurrent.CompletionException;
4040

4141
/**
@@ -52,7 +52,7 @@ public final class PlatformMappingValue implements SkyValue {
5252
private final ImmutableMap<Label, ParsedFlagsValue> platformsToFlags;
5353
private final ImmutableMap<ParsedFlagsValue, Label> flagsToPlatforms;
5454
private final ImmutableSet<Class<? extends FragmentOptions>> optionsClasses;
55-
private final LoadingCache<BuildOptions, BuildOptions> mappingCache;
55+
private final LoadingCache<BuildOptions, BuildConfigurationKey> mappingCache;
5656

5757
/**
5858
* Creates a new mapping value which will match on the given platforms (if a target platform is
@@ -75,7 +75,12 @@ public final class PlatformMappingValue implements SkyValue {
7575
}
7676

7777
/**
78-
* Maps one {@link BuildOptions} to another by way of mappings provided in a file.
78+
* Maps one {@link BuildOptions} to another's {@link BuildConfigurationKey} by way of mappings
79+
* provided in a file.
80+
*
81+
* <p>Returns a {@link BuildConfigurationKey} instead of just {@link BuildOptions} so that caching
82+
* of mappings also saves the CPU cost of interning {@link BuildConfigurationKey} (which is what
83+
* callers typically need).
7984
*
8085
* <p>The <a href=https://docs.google.com/document/d/1Vg_tPgiZbSrvXcJ403vZVAGlsWhH9BUDrAxMOYnO0Ls>
8186
* full design</a> contains the details for the mapping logic but in short:
@@ -89,12 +94,12 @@ public final class PlatformMappingValue implements SkyValue {
8994
* </ol>
9095
*
9196
* @param original the key representing the configuration to be mapped
92-
* @return the mapped key if any mapping matched the original or else the original
97+
* @return a {@link BuildConfigurationKey} to request the mapped configuration
9398
* @throws OptionsParsingException if any of the user configured flags cannot be parsed
9499
* @throws IllegalArgumentException if the original does not contain a {@link PlatformOptions}
95100
* fragment
96101
*/
97-
public BuildOptions map(BuildOptions original) throws OptionsParsingException {
102+
public BuildConfigurationKey map(BuildOptions original) throws OptionsParsingException {
98103
try {
99104
return mappingCache.get(original);
100105
} catch (CompletionException e) {
@@ -104,19 +109,18 @@ public BuildOptions map(BuildOptions original) throws OptionsParsingException {
104109
}
105110
}
106111

107-
private BuildOptions computeMapping(BuildOptions originalOptions) throws OptionsParsingException {
112+
private BuildConfigurationKey computeMapping(BuildOptions originalOptions)
113+
throws OptionsParsingException {
108114
if (originalOptions.hasNoConfig()) {
109115
// The empty configuration (produced by NoConfigTransition) is terminal: it'll never change.
110-
return originalOptions;
116+
return BuildConfigurationKey.create(originalOptions);
111117
}
112118

113119
var platformOptions = originalOptions.get(PlatformOptions.class);
114120
checkArgument(
115121
platformOptions != null,
116122
"When using platform mappings, all configurations must contain platform options");
117123

118-
BuildOptions modifiedOptions = null;
119-
120124
if (!platformOptions.platforms.isEmpty()) {
121125
List<Label> platforms = platformOptions.platforms;
122126

@@ -125,32 +129,28 @@ private BuildOptions computeMapping(BuildOptions originalOptions) throws Options
125129
if (!platformsToFlags.containsKey(targetPlatform)) {
126130
// This can happen if the user has set the platform and any other flags that would normally
127131
// be mapped from it on the command line instead of relying on the mapping.
128-
return originalOptions;
132+
return BuildConfigurationKey.create(originalOptions);
129133
}
130134

131135
ParsedFlagsValue parsedFlags = platformsToFlags.get(targetPlatform);
132-
modifiedOptions = parsedFlags.mergeWith(originalOptions);
133-
} else {
134-
boolean mappingFound = false;
135-
for (Map.Entry<ParsedFlagsValue, Label> flagsToPlatform : flagsToPlatforms.entrySet()) {
136-
ParsedFlagsValue parsedFlags = flagsToPlatform.getKey();
137-
Label platformLabel = flagsToPlatform.getValue();
138-
if (originalOptions.matches(parsedFlags.parsingResult())) {
139-
modifiedOptions = originalOptions.clone();
140-
modifiedOptions.get(PlatformOptions.class).platforms = ImmutableList.of(platformLabel);
141-
mappingFound = true;
142-
break;
143-
}
144-
}
136+
return BuildConfigurationKey.create(parsedFlags.mergeWith(originalOptions));
137+
}
145138

146-
if (!mappingFound) {
147-
Label targetPlatform = platformOptions.computeTargetPlatform();
148-
modifiedOptions = originalOptions.clone();
149-
modifiedOptions.get(PlatformOptions.class).platforms = ImmutableList.of(targetPlatform);
139+
for (Map.Entry<ParsedFlagsValue, Label> flagsToPlatform : flagsToPlatforms.entrySet()) {
140+
ParsedFlagsValue parsedFlags = flagsToPlatform.getKey();
141+
Label platformLabel = flagsToPlatform.getValue();
142+
if (originalOptions.matches(parsedFlags.parsingResult())) {
143+
BuildOptions modifiedOptions = originalOptions.clone();
144+
modifiedOptions.get(PlatformOptions.class).platforms = ImmutableList.of(platformLabel);
145+
return BuildConfigurationKey.create(modifiedOptions);
150146
}
151147
}
152148

153-
return modifiedOptions;
149+
// No mapping found.
150+
Label targetPlatform = platformOptions.computeTargetPlatform();
151+
BuildOptions modifiedOptions = originalOptions.clone();
152+
modifiedOptions.get(PlatformOptions.class).platforms = ImmutableList.of(targetPlatform);
153+
return BuildConfigurationKey.create(modifiedOptions);
154154
}
155155

156156
@Override
@@ -168,7 +168,7 @@ public boolean equals(Object obj) {
168168

169169
@Override
170170
public int hashCode() {
171-
return Objects.hash(flagsToPlatforms, platformsToFlags, optionsClasses);
171+
return HashCodes.hashObjects(flagsToPlatforms, platformsToFlags, optionsClasses);
172172
}
173173

174174
@Override

src/test/java/com/google/devtools/build/lib/skyframe/config/PlatformMappingFunctionTest.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public void invalidMappingFile_doesNotExist_customLocation() {
125125
public void invalidMappingFile_doesNotExist_defaultLocation() throws Exception {
126126
PlatformMappingValue platformMappingValue = executeFunction(PlatformMappingKey.DEFAULT);
127127

128-
BuildOptions mapped = platformMappingValue.map(createBuildOptions());
128+
BuildOptions mapped = platformMappingValue.map(createBuildOptions()).getOptions();
129129

130130
assertThat(mapped.get(PlatformOptions.class).platforms)
131131
.containsExactly(Label.parseCanonicalUnchecked("@bazel_tools//tools:host_platform"));
@@ -161,7 +161,7 @@ public void mapFromPlatform() throws Exception {
161161

162162
BuildOptions modifiedOptions = createBuildOptions("--platforms=//platforms:one");
163163

164-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
164+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
165165

166166
assertThat(mapped.get(DummyTestOptions.class).strOption).isEqualTo("one");
167167
}
@@ -185,7 +185,7 @@ public void mapFromPlatform_fromAlternatePackagePath() throws Exception {
185185

186186
BuildOptions modifiedOptions = createBuildOptions("--platforms=//platforms:one");
187187

188-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
188+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
189189

190190
assertThat(mapped.get(DummyTestOptions.class).strOption).isEqualTo("one");
191191
}
@@ -213,7 +213,7 @@ public void mapFromPlatform_noWorkspace() throws Exception {
213213
PlatformMappingKey.createExplicitlySet(PathFragment.create("my_mapping_file")));
214214
BuildOptions modifiedOptions = createBuildOptions("--platforms=//platforms:one");
215215

216-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
216+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
217217

218218
assertThat(mapped.get(DummyTestOptions.class).strOption).isEqualTo("one");
219219
}
@@ -236,7 +236,7 @@ public void multiplePackagePaths() throws Exception {
236236

237237
BuildOptions modifiedOptions = createBuildOptions("--platforms=//platforms:one");
238238

239-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
239+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
240240

241241
assertThat(mapped.get(DummyTestOptions.class).strOption).isEqualTo("one");
242242
}
@@ -266,7 +266,7 @@ public void multiplePackagePathsFirstWins() throws Exception {
266266

267267
BuildOptions modifiedOptions = createBuildOptions("--platforms=//platforms:one");
268268

269-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
269+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
270270

271271
assertThat(mapped.get(DummyTestOptions.class).strOption).isEqualTo("one");
272272
}
@@ -289,7 +289,7 @@ public void mapFromPlatform_internalOption() throws Exception {
289289

290290
BuildOptions modifiedOptions = createBuildOptions("--platforms=//platforms:one");
291291

292-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
292+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
293293

294294
assertThat(mapped.get(DummyTestOptions.class).internalOption).isEqualTo("something_new");
295295
}
@@ -311,7 +311,7 @@ public void mapFromPlatform_starlarkFlag() throws Exception {
311311

312312
BuildOptions modifiedOptions = createBuildOptions("--platforms=//platforms:one");
313313

314-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
314+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
315315

316316
assertThat(mapped.getStarlarkOptions())
317317
.containsExactly(Label.parseCanonical("//flag:my_string_flag"), "mapped_value");
@@ -334,7 +334,7 @@ public void mapFromPlatform_listFlag_overridesConfig() throws Exception {
334334
BuildOptions modifiedOptions =
335335
createBuildOptions("--platforms=//platforms:one", "--list=from_config");
336336

337-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
337+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
338338

339339
// The mapping should completely replace the list, because it is not accumulating.
340340
assertThat(mapped.get(DummyTestOptions.class).list).containsExactly("from_mapping");
@@ -456,7 +456,7 @@ public void mapFromFlag() throws Exception {
456456

457457
BuildOptions modifiedOptions = createBuildOptions("--str_option=one");
458458

459-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
459+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
460460

461461
assertThat(mapped.get(PlatformOptions.class).platforms).containsExactly(PLATFORM1);
462462
}
@@ -478,7 +478,7 @@ public void mapFromFlag_starlarkFlag() throws Exception {
478478

479479
BuildOptions modifiedOptions = createBuildOptions("--//flag:my_string_flag=mapped_value");
480480

481-
BuildOptions mapped = platformMappingValue.map(modifiedOptions);
481+
BuildOptions mapped = platformMappingValue.map(modifiedOptions).getOptions();
482482

483483
assertThat(mapped.get(PlatformOptions.class).platforms).containsExactly(PLATFORM1);
484484
}

src/test/java/com/google/devtools/build/lib/skyframe/config/PlatformMappingValueTest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public static void computeDefaultPlatformOptions() {
147147
public void map_noMappings() throws OptionsParsingException {
148148
PlatformMappingValue mappingValue = builder().build();
149149

150-
BuildOptions mapped = mappingValue.map(createBuildOptions());
150+
BuildOptions mapped = mappingValue.map(createBuildOptions()).getOptions();
151151

152152
assertThat(mapped.get(PlatformOptions.class).platforms)
153153
.containsExactly(DEFAULT_TARGET_PLATFORM);
@@ -160,7 +160,7 @@ public void map_platformToFlags() throws Exception {
160160

161161
BuildOptions modifiedOptions = createBuildOptions("--platforms=//platforms:one");
162162

163-
BuildOptions mapped = mappingValue.map(modifiedOptions);
163+
BuildOptions mapped = mappingValue.map(modifiedOptions).getOptions();
164164

165165
assertThat(mapped.get(DummyTestOptions.class).strOption).isEqualTo("one");
166166
}
@@ -171,7 +171,7 @@ public void map_flagsToPlatform() throws Exception {
171171
builder().addFlags(PLATFORM_ONE, "--str_option=one", "--other_str_option=dbg").build();
172172

173173
BuildOptions modifiedOptions = createBuildOptions("--str_option=one", "--other_str_option=dbg");
174-
BuildOptions mapped = mappingValue.map(modifiedOptions);
174+
BuildOptions mapped = mappingValue.map(modifiedOptions).getOptions();
175175

176176
assertThat(mapped.get(PlatformOptions.class).platforms).containsExactly(PLATFORM_ONE);
177177
}
@@ -186,7 +186,7 @@ public void map_flagsToPlatform_checkPriority() throws Exception {
186186

187187
BuildOptions modifiedOptions = createBuildOptions("--str_option=two");
188188

189-
BuildOptions mapped = mappingValue.map(modifiedOptions);
189+
BuildOptions mapped = mappingValue.map(modifiedOptions).getOptions();
190190

191191
assertThat(mapped.get(PlatformOptions.class).platforms).containsExactly(PLATFORM_TWO);
192192
}
@@ -198,7 +198,7 @@ public void map_flagsToPlatform_noneMatching() throws Exception {
198198

199199
BuildOptions modifiedOptions = createBuildOptions("--str_option=bar");
200200

201-
BuildOptions mapped = mappingValue.map(modifiedOptions);
201+
BuildOptions mapped = mappingValue.map(modifiedOptions).getOptions();
202202

203203
assertThat(mapped.get(PlatformOptions.class).platforms)
204204
.containsExactly(DEFAULT_TARGET_PLATFORM);
@@ -223,7 +223,7 @@ public void map_noMappingIfPlatformIsSetButNotMatching() throws Exception {
223223

224224
BuildOptions modifiedOptions =
225225
createBuildOptions("--str_option=one", "--platforms=//platforms:two");
226-
BuildOptions mapped = mappingValue.map(modifiedOptions);
226+
BuildOptions mapped = mappingValue.map(modifiedOptions).getOptions();
227227

228228
// No change because the platform is not in the mapping.
229229
assertThat(modifiedOptions).isEqualTo(mapped);
@@ -240,7 +240,7 @@ public void map_noMappingIfPlatformIsSetAndNoPlatformMapping() throws Exception
240240
BuildOptions modifiedOptions =
241241
createBuildOptions("--str_option=one", "--platforms=//platforms:two");
242242

243-
BuildOptions mapped = mappingValue.map(modifiedOptions);
243+
BuildOptions mapped = mappingValue.map(modifiedOptions).getOptions();
244244

245245
// No change because the platform is not in the mapping.
246246
assertThat(modifiedOptions).isEqualTo(mapped);

0 commit comments

Comments
 (0)