clang 17.0.0git
Multilib.h
Go to the documentation of this file.
1//===- Multilib.h -----------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_DRIVER_MULTILIB_H
10#define LLVM_CLANG_DRIVER_MULTILIB_H
11
12#include "clang/Basic/LLVM.h"
13#include "llvm/ADT/ArrayRef.h"
14#include "llvm/ADT/STLExtras.h"
15#include "llvm/ADT/StringRef.h"
16#include "llvm/Support/Compiler.h"
17#include <cassert>
18#include <functional>
19#include <string>
20#include <utility>
21#include <vector>
22
23namespace clang {
24namespace driver {
25
26/// This corresponds to a single GCC Multilib, or a segment of one controlled
27/// by a command line flag.
28/// See also MultilibBuilder for building a multilib by mutating it
29/// incrementally.
30class Multilib {
31public:
32 using flags_list = std::vector<std::string>;
33
34private:
35 std::string GCCSuffix;
36 std::string OSSuffix;
37 std::string IncludeSuffix;
38 flags_list Flags;
39
40public:
41 /// GCCSuffix, OSSuffix & IncludeSuffix will be appended directly to the
42 /// sysroot string so they must either be empty or begin with a '/' character.
43 /// This is enforced with an assert in the constructor.
44 Multilib(StringRef GCCSuffix = {}, StringRef OSSuffix = {},
45 StringRef IncludeSuffix = {},
46 const flags_list &Flags = flags_list());
47
48 /// Get the detected GCC installation path suffix for the multi-arch
49 /// target variant. Always starts with a '/', unless empty
50 const std::string &gccSuffix() const { return GCCSuffix; }
51
52 /// Get the detected os path suffix for the multi-arch
53 /// target variant. Always starts with a '/', unless empty
54 const std::string &osSuffix() const { return OSSuffix; }
55
56 /// Get the include directory suffix. Always starts with a '/', unless
57 /// empty
58 const std::string &includeSuffix() const { return IncludeSuffix; }
59
60 /// Get the flags that indicate or contraindicate this multilib's use
61 /// All elements begin with either '+' or '-'
62 const flags_list &flags() const { return Flags; }
63
64 LLVM_DUMP_METHOD void dump() const;
65 /// print summary of the Multilib
66 void print(raw_ostream &OS) const;
67
68 /// Check whether the default is selected
69 bool isDefault() const
70 { return GCCSuffix.empty() && OSSuffix.empty() && IncludeSuffix.empty(); }
71
72 bool operator==(const Multilib &Other) const;
73};
74
75raw_ostream &operator<<(raw_ostream &OS, const Multilib &M);
76
77/// See also MultilibSetBuilder for combining multilibs into a set.
79public:
80 using multilib_list = std::vector<Multilib>;
81 using const_iterator = multilib_list::const_iterator;
83 std::function<std::vector<std::string>(const Multilib &M)>;
84 using FilterCallback = llvm::function_ref<bool(const Multilib &)>;
85
86private:
87 multilib_list Multilibs;
88 IncludeDirsFunc IncludeCallback;
89 IncludeDirsFunc FilePathsCallback;
90
91public:
92 MultilibSet() = default;
93 MultilibSet(multilib_list &&Multilibs) : Multilibs(Multilibs) {}
94
95 const multilib_list &getMultilibs() { return Multilibs; }
96
97 /// Filter out some subset of the Multilibs using a user defined callback
99
100 /// Add a completed Multilib to the set
101 void push_back(const Multilib &M);
102
103 const_iterator begin() const { return Multilibs.begin(); }
104 const_iterator end() const { return Multilibs.end(); }
105
106 /// Select compatible variants
107 multilib_list select(const Multilib::flags_list &Flags) const;
108
109 /// Pick the best multilib in the set, \returns false if none are compatible
110 bool select(const Multilib::flags_list &Flags, Multilib &M) const;
111
112 unsigned size() const { return Multilibs.size(); }
113
114 LLVM_DUMP_METHOD void dump() const;
115 void print(raw_ostream &OS) const;
116
118 IncludeCallback = std::move(F);
119 return *this;
120 }
121
122 const IncludeDirsFunc &includeDirsCallback() const { return IncludeCallback; }
123
125 FilePathsCallback = std::move(F);
126 return *this;
127 }
128
129 const IncludeDirsFunc &filePathsCallback() const { return FilePathsCallback; }
130};
131
132raw_ostream &operator<<(raw_ostream &OS, const MultilibSet &MS);
133
134} // namespace driver
135} // namespace clang
136
137#endif // LLVM_CLANG_DRIVER_MULTILIB_H
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
See also MultilibSetBuilder for combining multilibs into a set.
Definition: Multilib.h:78
MultilibSet(multilib_list &&Multilibs)
Definition: Multilib.h:93
MultilibSet & setFilePathsCallback(IncludeDirsFunc F)
Definition: Multilib.h:124
LLVM_DUMP_METHOD void dump() const
Definition: Multilib.cpp:118
llvm::function_ref< bool(const Multilib &)> FilterCallback
Definition: Multilib.h:84
const_iterator end() const
Definition: Multilib.h:104
unsigned size() const
Definition: Multilib.h:112
const multilib_list & getMultilibs()
Definition: Multilib.h:95
void print(raw_ostream &OS) const
Definition: Multilib.cpp:122
MultilibSet & FilterOut(FilterCallback F)
Filter out some subset of the Multilibs using a user defined callback.
Definition: Multilib.cpp:85
multilib_list select(const Multilib::flags_list &Flags) const
Select compatible variants.
Definition: Multilib.cpp:93
std::vector< Multilib > multilib_list
Definition: Multilib.h:80
const IncludeDirsFunc & filePathsCallback() const
Definition: Multilib.h:129
void push_back(const Multilib &M)
Add a completed Multilib to the set.
Definition: Multilib.cpp:90
const IncludeDirsFunc & includeDirsCallback() const
Definition: Multilib.h:122
MultilibSet & setIncludeDirsCallback(IncludeDirsFunc F)
Definition: Multilib.h:117
multilib_list::const_iterator const_iterator
Definition: Multilib.h:81
std::function< std::vector< std::string >(const Multilib &M)> IncludeDirsFunc
Definition: Multilib.h:83
const_iterator begin() const
Definition: Multilib.h:103
This corresponds to a single GCC Multilib, or a segment of one controlled by a command line flag.
Definition: Multilib.h:30
const std::string & gccSuffix() const
Get the detected GCC installation path suffix for the multi-arch target variant.
Definition: Multilib.h:50
const std::string & osSuffix() const
Get the detected os path suffix for the multi-arch target variant.
Definition: Multilib.h:54
const flags_list & flags() const
Get the flags that indicate or contraindicate this multilib's use All elements begin with either '+' ...
Definition: Multilib.h:62
std::vector< std::string > flags_list
Definition: Multilib.h:32
const std::string & includeSuffix() const
Get the include directory suffix.
Definition: Multilib.h:58
LLVM_DUMP_METHOD void dump() const
Definition: Multilib.cpp:40
void print(raw_ostream &OS) const
print summary of the Multilib
Definition: Multilib.cpp:44
bool isDefault() const
Check whether the default is selected.
Definition: Multilib.h:69
bool operator==(const Multilib &Other) const
Definition: Multilib.cpp:57
raw_ostream & operator<<(raw_ostream &OS, const Multilib &M)
Definition: Multilib.cpp:80
#define bool
Definition: stdbool.h:20