[PATCH] D60990: [Driver] Support priority for multilibs

Jon Roelofs via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 22 19:42:42 PDT 2019


LGTM

On Mon, Apr 22, 2019 at 8:34 PM Petr Hosek via Phabricator <
reviews at reviews.llvm.org> wrote:

> phosek created this revision.
> phosek added reviewers: jroelofs, bkramer.
> Herald added subscribers: cfe-commits, mgrang.
> Herald added a project: clang.
>
> When more than one multilib flag matches, try to select the best
> possible match based on priority. When two different multilibs with
> the same same priority match, we still throw an error matching the
> existing behavior.
>
>
> Repository:
>   rC Clang
>
> https://reviews.llvm.org/D60990
>
> Files:
>   clang/include/clang/Driver/Multilib.h
>   clang/lib/Driver/Multilib.cpp
>
>
> Index: clang/lib/Driver/Multilib.cpp
> ===================================================================
> --- clang/lib/Driver/Multilib.cpp
> +++ clang/lib/Driver/Multilib.cpp
> @@ -19,6 +19,7 @@
>  #include "llvm/Support/raw_ostream.h"
>  #include <algorithm>
>  #include <cassert>
> +#include <map>
>  #include <string>
>
>  using namespace clang;
> @@ -51,8 +52,9 @@
>  }
>
>  Multilib::Multilib(StringRef GCCSuffix, StringRef OSSuffix,
> -                   StringRef IncludeSuffix)
> -    : GCCSuffix(GCCSuffix), OSSuffix(OSSuffix),
> IncludeSuffix(IncludeSuffix) {
> +                   StringRef IncludeSuffix, int Priority)
> +    : GCCSuffix(GCCSuffix), OSSuffix(OSSuffix),
> IncludeSuffix(IncludeSuffix),
> +      Priority(Priority) {
>    normalizePathSegment(this->GCCSuffix);
>    normalizePathSegment(this->OSSuffix);
>    normalizePathSegment(this->IncludeSuffix);
> @@ -265,8 +267,19 @@
>      return true;
>    }
>
> -  // TODO: pick the "best" multlib when more than one is suitable
> -  assert(false);
> +  // Sort multilibs by priority and select the one with the highest
> priority.
> +  std::sort(Filtered.begin(), Filtered.end(),
> +            [](const Multilib &a, const Multilib &b) -> bool {
> +              return a.priority() > b.priority();
> +            });
> +
> +  if (Filtered[0].priority() <= Filtered[1].priority()) {
> +    M = Filtered[0];
> +    return true;
> +  }
> +
> +  // TODO: We should consider returning llvm::Error rather than aborting.
> +  assert(false && "More than one multilib with the same priority");
>    return false;
>  }
>
> Index: clang/include/clang/Driver/Multilib.h
> ===================================================================
> --- clang/include/clang/Driver/Multilib.h
> +++ clang/include/clang/Driver/Multilib.h
> @@ -34,10 +34,11 @@
>    std::string OSSuffix;
>    std::string IncludeSuffix;
>    flags_list Flags;
> +  int Priority;
>
>  public:
>    Multilib(StringRef GCCSuffix = {}, StringRef OSSuffix = {},
> -           StringRef IncludeSuffix = {});
> +           StringRef IncludeSuffix = {}, int Priority = 0);
>
>    /// Get the detected GCC installation path suffix for the multi-arch
>    /// target variant. Always starts with a '/', unless empty
> @@ -77,6 +78,9 @@
>    const flags_list &flags() const { return Flags; }
>    flags_list &flags() { return Flags; }
>
> +  /// Returns the multilib priority.
> +  int priority() const { return Priority; }
> +
>    /// Add a flag to the flags list
>    /// \p Flag must be a flag accepted by the driver with its leading '-'
> removed,
>    ///     and replaced with either:
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190422/87bb3fd1/attachment-0001.html>


More information about the cfe-commits mailing list