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);
255 if (*Arg !=
'\\' && *Arg !=
' ')
256 return llvm::createStringError(
257 llvm::inconvertibleErrorCode(),
258 "only escaped backslashes and spaces are supported");
268 while (*CommandLine) {
272 return ArgEnd.takeError();
273 CommandLine = *ArgEnd;
274 if (*CommandLine ==
' ')
Defines the Diagnostic-related interfaces.
static bool getRefinementStep(StringRef In, clang::DiagnosticsEngine &Diags, const Arg &A, size_t &Position)
static bool isSpaceOrNull(char c)
static Expected< const char * > unescapeUntilSpace(const char *Arg, SmallVectorImpl< char > &Res)
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.
Top level wrappers for InstallAPI frontend operations.
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)
@ Default
Set to the current date and time.
llvm::Expected< llvm::SmallVector< llvm::SmallString< 8 > > > parseEscapedCommandLine(const char *CommandLine)
Parse a space-separated command line with escaped spaces and backslashes.
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)