From 3c9bac5861c97032a20a5a488c2d3d55f117f843 Mon Sep 17 00:00:00 2001 From: Kayla Butler Date: Fri, 20 Oct 2023 12:00:05 -0700 Subject: [PATCH] Create a separate file for compiler flag propagation --- lib/spack/spack/solver/asp.py | 14 ++++++++++++ lib/spack/spack/solver/propagation.lp | 32 +++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 lib/spack/spack/solver/propagation.lp diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index ac4b69a3d11..11340d61e5b 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -862,6 +862,13 @@ def visit(node): self.control.load(os.path.join(parent_dir, "display.lp")) if not setup.concretize_everything: self.control.load(os.path.join(parent_dir, "when_possible.lp")) + flags = [] + for spec in specs: + flags.append(spec.compiler_flags) + + if self._compiler_flag_has_propagation(flags): + self.control.load(os.path.join(parent_dir, "propagation.lp")) + timer.stop("load") # Grounding is the first step in the solve -- it turns our facts @@ -970,6 +977,13 @@ def _model_has_cycles(self, models): return cycle_result.unsatisfiable + def _compiler_flag_has_propagation(self, flags): + for flag in flags: + for flag_type, flag_vals in flag.items(): + if any(val.propagate for val in flag_vals): + return True + return False + class SpackSolverSetup: """Class to set up and run a Spack concretization solve.""" diff --git a/lib/spack/spack/solver/propagation.lp b/lib/spack/spack/solver/propagation.lp new file mode 100644 index 00000000000..63ccf8c62c2 --- /dev/null +++ b/lib/spack/spack/solver/propagation.lp @@ -0,0 +1,32 @@ +% Copyright 2013-2023 Lawrence Livermore National Security, LLC and other +% Spack Project Developers. See the top-level COPYRIGHT file for details. +% +% SPDX-License-Identifier: (Apache-2.0 OR MIT) + +%============================================================================= +% TODO: Later +%============================================================================= + +#program propagate_node_flag. +% propagate flags when compiler match +attr("node_flag_propagate", PackageNode, FlagType, Flag, Source) :- % source is a node() attribute + attr("node_flag_possible_prop", PackageNode, FlagType, Flag, Source), + not attr("node_flag_set", PackageNode, FlagType, _). + +attr("node_flag_possible_prop", PackageNode, FlagType, Flag, Source) :- % source is a node() attribute + same_compiler(ParentNode, PackageNode), + attr("node_flag_possible_prop", ParentNode, FlagType, _, Source), + attr("node_flag", Source, FlagType, Flag), + flag_type(FlagType). + +error(100, "{0} and {1} cannot both propagate compiler flags '{2}' to {3}", Source1, Source2, PackageNode, FlagType) :- + same_compiler(Source1, PackageNode), + same_compiler(Source2, PackageNode), + attr("node_flag_propagate", _, FlagType, _, Source1), + attr("node_flag_propagate", _, FlagType, _, Source2), + Source1 < Source2. + +attr("node_flag_source", PackageNode, FlagType, Q) + :- attr("node_flag_propagate", PackageNode, FlagType, _, Q). + +attr("node_flag", PackageNode, FlagType, Flag) :- attr("node_flag_propagate", PackageNode, FlagType, Flag, _).