Update RegisteredToolchainsFunction and ToolchainUtil to check values for errors even if not all values are present. Fixes #3751. Change-Id: I92fd7527384800beca80b9daac58f3a7760268b2 PiperOrigin-RevId: 169907526
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java index 8bb828c..b7d6492 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunction.java
@@ -93,17 +93,21 @@ Map<SkyKey, ValueOrException<ConfiguredValueCreationException>> values = env.getValuesOrThrow(keys, ConfiguredValueCreationException.class); - if (env.valuesMissing()) { - return null; - } ImmutableList.Builder<DeclaredToolchainInfo> toolchains = new ImmutableList.Builder<>(); + boolean valuesMissing = false; for (SkyKey key : keys) { ConfiguredTargetKey configuredTargetKey = (ConfiguredTargetKey) key.argument(); Label toolchainLabel = configuredTargetKey.getLabel(); try { + ValueOrException<ConfiguredValueCreationException> valueOrException = values.get(key); + if (valueOrException.get() == null) { + valuesMissing = true; + continue; + } ConfiguredTarget target = - ((ConfiguredTargetValue) values.get(key).get()).getConfiguredTarget(); + ((ConfiguredTargetValue) valueOrException.get()).getConfiguredTarget(); DeclaredToolchainInfo toolchainInfo = target.getProvider(DeclaredToolchainInfo.class); + if (toolchainInfo == null) { throw new RegisteredToolchainsFunctionException( new InvalidToolchainLabelException(toolchainLabel), Transience.PERSISTENT); @@ -114,6 +118,10 @@ new InvalidToolchainLabelException(toolchainLabel, e), Transience.PERSISTENT); } } + + if (valuesMissing) { + return null; + } return toolchains.build(); }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java index 13e055b..84c0e25 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java
@@ -82,6 +82,32 @@ } } + /** + * Returns the {@link PlatformInfo} provider from the {@link ConfiguredTarget} in the {@link + * ValueOrException}, or {@code null} if the {@link ConfiguredTarget} is not present. If the + * {@link ConfiguredTarget} does not have a {@link PlatformInfo} provider, a {@link + * InvalidPlatformException} is thrown, wrapped in a {@link ToolchainContextException}. + */ + @Nullable + private static PlatformInfo findPlatformInfo( + ValueOrException<ConfiguredValueCreationException> valueOrException, String platformType) + throws ConfiguredValueCreationException, ToolchainContextException { + + ConfiguredTargetValue ctv = (ConfiguredTargetValue) valueOrException.get(); + if (ctv == null) { + return null; + } + + ConfiguredTarget configuredTarget = ctv.getConfiguredTarget(); + PlatformInfo platformInfo = PlatformProviderUtils.platform(configuredTarget); + if (platformInfo == null) { + throw new ToolchainContextException( + new InvalidPlatformException(platformType, configuredTarget)); + } + + return platformInfo; + } + @Nullable private static PlatformDescriptors loadPlatformDescriptors( Environment env, BuildConfiguration configuration) @@ -104,24 +130,15 @@ env.getValuesOrThrow( ImmutableList.of(executionPlatformKey, targetPlatformKey), ConfiguredValueCreationException.class); - if (env.valuesMissing()) { - return null; - } + boolean valuesMissing = env.valuesMissing(); try { - ConfiguredTarget executionPlatformTarget = - ((ConfiguredTargetValue) values.get(executionPlatformKey).get()).getConfiguredTarget(); - ConfiguredTarget targetPlatformTarget = - ((ConfiguredTargetValue) values.get(targetPlatformKey).get()).getConfiguredTarget(); - PlatformInfo execPlatform = PlatformProviderUtils.platform(executionPlatformTarget); - PlatformInfo targetPlatform = PlatformProviderUtils.platform(targetPlatformTarget); + PlatformInfo execPlatform = + findPlatformInfo(values.get(executionPlatformKey), "execution platform"); + PlatformInfo targetPlatform = + findPlatformInfo(values.get(targetPlatformKey), "target platform"); - if (execPlatform == null) { - throw new ToolchainContextException( - new InvalidPlatformException("execution platform", executionPlatformTarget)); - } - if (targetPlatform == null) { - throw new ToolchainContextException( - new InvalidPlatformException("target platform", targetPlatformTarget)); + if (valuesMissing) { + return null; } return PlatformDescriptors.create(execPlatform, targetPlatform); @@ -166,9 +183,7 @@ ConfiguredValueCreationException.class, InvalidToolchainLabelException.class, EvalException.class); - if (env.valuesMissing()) { - return null; - } + boolean valuesMissing = false; // Load the toolchains. ImmutableBiMap.Builder<Label, Label> builder = new ImmutableBiMap.Builder<>(); @@ -182,8 +197,17 @@ try { Label requiredToolchainType = ((ToolchainResolutionKey) entry.getKey().argument()).toolchainType(); - Label toolchainLabel = ((ToolchainResolutionValue) entry.getValue().get()).toolchainLabel(); - builder.put(requiredToolchainType, toolchainLabel); + ValueOrException4< + NoToolchainFoundException, ConfiguredValueCreationException, + InvalidToolchainLabelException, EvalException> + valueOrException = entry.getValue(); + if (valueOrException.get() == null) { + valuesMissing = true; + } else { + Label toolchainLabel = + ((ToolchainResolutionValue) valueOrException.get()).toolchainLabel(); + builder.put(requiredToolchainType, toolchainLabel); + } } catch (NoToolchainFoundException e) { // Save the missing type and continue looping to check for more. missingToolchains.add(e.missingToolchainType()); @@ -196,6 +220,10 @@ } } + if (valuesMissing) { + return null; + } + if (!missingToolchains.isEmpty()) { throw new ToolchainContextException(new UnresolvedToolchainsException(missingToolchains)); }