13#include "clang/Config/config.h"
15#include "llvm/Option/ArgList.h"
16#include "llvm/Support/FileSystem.h"
17#include "llvm/Support/Path.h"
23template <
typename IntTy>
24IntTy getLastArgIntValueImpl(
const ArgList &Args, OptSpecifier Id,
28 if (Arg *A = Args.getLastArg(Id)) {
29 if (StringRef(A->getValue()).getAsInteger(
Base, Res)) {
31 Diags->
Report(diag::err_drv_invalid_int_value)
32 << A->getAsString(Args) << A->getValue();
41 return getLastArgIntValueImpl<int>(Args, Id,
Default, Diags,
Base);
47 return getLastArgIntValueImpl<uint64_t>(Args, Id,
Default, Diags,
Base);
51 const llvm::opt::ArgList &Args) {
52 const Arg *A = Args.getLastArg(options::OPT_mprefer_vector_width_EQ);
56 StringRef
Value = A->getValue();
57 unsigned Width LLVM_ATTRIBUTE_UNINITIALIZED;
61 if (
Value !=
"none" &&
Value.getAsInteger(10, Width)) {
62 Diags.
Report(clang::diag::err_drv_invalid_value)
63 << A->getOption().getName() <<
Value;
75 const Arg &A,
size_t &Position) {
76 const char RefinementStepToken =
':';
77 Position = In.find(RefinementStepToken);
78 if (Position != StringRef::npos) {
79 StringRef Option = A.getOption().getName();
80 StringRef RefStep = In.substr(Position + 1);
88 if (RefStep.size() != 1) {
89 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
92 char RefStepChar = RefStep[0];
93 if (RefStepChar <
'0' || RefStepChar >
'9') {
94 Diags.
Report(diag::err_drv_invalid_value) << Option << RefStep;
102 const ArgList &Args) {
103 StringRef DisabledPrefixIn =
"!";
104 StringRef DisabledPrefixOut =
"!";
105 StringRef EnabledPrefixOut =
"";
108 const Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
112 const unsigned NumOptions = A->getNumValues();
113 if (NumOptions == 0) {
119 if (NumOptions == 1) {
120 StringRef Val = A->getValue(0);
124 StringRef ValBase = Val.slice(0, RefStepLoc);
125 if (ValBase ==
"all" || ValBase ==
"none" || ValBase ==
"default") {
134 llvm::StringMap<bool> OptionStrings;
135 OptionStrings.insert(std::make_pair(
"divd",
false));
136 OptionStrings.insert(std::make_pair(
"divf",
false));
137 OptionStrings.insert(std::make_pair(
"divh",
false));
138 OptionStrings.insert(std::make_pair(
"vec-divd",
false));
139 OptionStrings.insert(std::make_pair(
"vec-divf",
false));
140 OptionStrings.insert(std::make_pair(
"vec-divh",
false));
141 OptionStrings.insert(std::make_pair(
"sqrtd",
false));
142 OptionStrings.insert(std::make_pair(
"sqrtf",
false));
143 OptionStrings.insert(std::make_pair(
"sqrth",
false));
144 OptionStrings.insert(std::make_pair(
"vec-sqrtd",
false));
145 OptionStrings.insert(std::make_pair(
"vec-sqrtf",
false));
146 OptionStrings.insert(std::make_pair(
"vec-sqrth",
false));
148 for (
unsigned i = 0; i != NumOptions; ++i) {
149 StringRef Val = A->getValue(i);
151 bool IsDisabled = Val.starts_with(DisabledPrefixIn);
160 StringRef ValBase = Val.slice(0, RefStep);
161 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
162 if (OptionIter == OptionStrings.end()) {
164 OptionIter = OptionStrings.find(ValBase.str() +
'f');
165 if (OptionIter == OptionStrings.end()) {
167 Diags.
Report(diag::err_drv_unknown_argument) << Val;
173 if (OptionStrings[ValBase.str() +
'd'] ||
174 OptionStrings[ValBase.str() +
'h']) {
175 Diags.
Report(diag::err_drv_invalid_value)
176 << A->getOption().getName() << Val;
181 if (OptionIter->second ==
true) {
183 Diags.
Report(diag::err_drv_invalid_value)
184 << A->getOption().getName() << Val;
189 OptionIter->second =
true;
193 if (ValBase.back() !=
'f' && ValBase.back() !=
'd' &&
194 ValBase.back() !=
'h') {
195 OptionStrings[ValBase.str() +
'd'] =
true;
196 OptionStrings[ValBase.str() +
'h'] =
true;
200 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
201 Out = Args.MakeArgString(Out + Prefix + Val);
202 if (i != NumOptions - 1)
203 Out = Args.MakeArgString(Out +
",");
215 StringRef Dir = llvm::sys::path::parent_path(BinaryPath);
218 StringRef ConfiguredResourceDir(CLANG_RESOURCE_DIR);
219 if (!ConfiguredResourceDir.empty()) {
222 if (llvm::sys::path::is_absolute(ConfiguredResourceDir))
223 P = ConfiguredResourceDir;
225 llvm::sys::path::append(P, ConfiguredResourceDir);
232 P = llvm::sys::path::parent_path(Dir);
235 llvm::sys::path::append(P, CLANG_INSTALL_LIBDIR_BASENAME,
"clang",
236 CLANG_VERSION_MAJOR_STRING);
239 return std::string(P);
243 const std::string ClangExecutable =
244 llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
Defines the Diagnostic-related interfaces.
static bool getRefinementStep(StringRef In, clang::DiagnosticsEngine &Diags, const Arg &A, size_t &Position)
Defines version macros and version-related utility functions for Clang.
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
The JSON file list parser is used to communicate input to InstallAPI.
StringRef parseMPreferVectorWidthOption(clang::DiagnosticsEngine &Diags, const llvm::opt::ArgList &Args)
uint64_t getLastArgUInt64Value(const llvm::opt::ArgList &Args, llvm::opt::OptSpecifier Id, uint64_t Default, DiagnosticsEngine *Diags=nullptr, unsigned Base=0)
std::string GetResourcesPath(StringRef BinaryPath)
Get the directory where the compiler headers reside, relative to the compiler binary path BinaryPath.
int getLastArgIntValue(const llvm::opt::ArgList &Args, llvm::opt::OptSpecifier Id, int Default, DiagnosticsEngine *Diags=nullptr, unsigned Base=0)
Return the value of the last argument as an integer, or a default.
StringRef parseMRecipOption(clang::DiagnosticsEngine &Diags, const llvm::opt::ArgList &Args)