forked from OSchip/llvm-project
[Options] Make Option non clang specific.
llvm-svn: 166348
This commit is contained in:
parent
fc790901d2
commit
66e2b20d39
|
@ -21,15 +21,20 @@ namespace driver {
|
|||
class ArgList;
|
||||
|
||||
namespace options {
|
||||
/// Base flags for all options. Custom flags may be added after.
|
||||
enum DriverFlag {
|
||||
DriverOption = (1 << 0),
|
||||
HelpHidden = (1 << 1),
|
||||
LinkerInput = (1 << 2),
|
||||
NoArgumentUnused = (1 << 3),
|
||||
NoForward = (1 << 4),
|
||||
RenderAsInput = (1 << 5),
|
||||
RenderJoined = (1 << 6),
|
||||
RenderSeparate = (1 << 7),
|
||||
HelpHidden = (1 << 0),
|
||||
RenderAsInput = (1 << 1),
|
||||
RenderJoined = (1 << 2),
|
||||
RenderSeparate = (1 << 3)
|
||||
};
|
||||
|
||||
/// Flags specifically for clang options.
|
||||
enum ClangFlags {
|
||||
DriverOption = (1 << 4),
|
||||
LinkerInput = (1 << 5),
|
||||
NoArgumentUnused = (1 << 6),
|
||||
NoForward = (1 << 7),
|
||||
Unsupported = (1 << 8),
|
||||
CC1Option = (1 << 9)
|
||||
};
|
||||
|
@ -68,7 +73,7 @@ namespace options {
|
|||
RenderValuesStyle
|
||||
};
|
||||
|
||||
private:
|
||||
protected:
|
||||
const OptTable::Info *Info;
|
||||
const OptTable *Owner;
|
||||
|
||||
|
@ -84,23 +89,23 @@ namespace options {
|
|||
assert(Info && "Must have a valid info!");
|
||||
return Info->ID;
|
||||
}
|
||||
|
||||
|
||||
OptionClass getKind() const {
|
||||
assert(Info && "Must have a valid info!");
|
||||
return OptionClass(Info->Kind);
|
||||
}
|
||||
|
||||
|
||||
StringRef getName() const {
|
||||
assert(Info && "Must have a valid info!");
|
||||
return Info->Name;
|
||||
}
|
||||
|
||||
|
||||
const Option getGroup() const {
|
||||
assert(Info && "Must have a valid info!");
|
||||
assert(Owner && "Must have a valid owner!");
|
||||
return Owner->getOption(Info->GroupID);
|
||||
}
|
||||
|
||||
|
||||
const Option getAlias() const {
|
||||
assert(Info && "Must have a valid info!");
|
||||
assert(Owner && "Must have a valid owner!");
|
||||
|
@ -109,10 +114,6 @@ namespace options {
|
|||
|
||||
unsigned getNumArgs() const { return Info->Param; }
|
||||
|
||||
bool isUnsupported() const { return Info->Flags & options::Unsupported; }
|
||||
|
||||
bool isLinkerInput() const { return Info->Flags & options::LinkerInput; }
|
||||
|
||||
bool hasNoOptAsInput() const { return Info->Flags & options::RenderAsInput;}
|
||||
|
||||
RenderStyleKind getRenderStyle() const {
|
||||
|
@ -139,18 +140,9 @@ namespace options {
|
|||
llvm_unreachable("Unexpected kind!");
|
||||
}
|
||||
|
||||
bool isDriverOption() const { return Info->Flags & options::DriverOption; }
|
||||
|
||||
bool hasNoArgumentUnused() const {
|
||||
return Info->Flags & options::NoArgumentUnused;
|
||||
}
|
||||
|
||||
bool hasNoForward() const { return Info->Flags & options::NoForward; }
|
||||
|
||||
bool isCC1Option() const { return Info->Flags & options::CC1Option; }
|
||||
|
||||
bool hasForwardToGCC() const {
|
||||
return !hasNoForward() && !isDriverOption() && !isLinkerInput();
|
||||
/// Test if this option has the flag \a Val.
|
||||
bool hasFlag(unsigned Val) const {
|
||||
return Info->Flags & Val;
|
||||
}
|
||||
|
||||
/// getUnaliasedOption - Return the final option this option
|
||||
|
|
|
@ -98,7 +98,7 @@ InputArgList *Driver::ParseArgStrings(ArrayRef<const char *> ArgList) {
|
|||
for (ArgList::const_iterator it = Args->begin(), ie = Args->end();
|
||||
it != ie; ++it) {
|
||||
Arg *A = *it;
|
||||
if (A->getOption().isUnsupported()) {
|
||||
if (A->getOption().hasFlag(options::Unsupported)) {
|
||||
Diag(clang::diag::err_drv_unsupported_opt) << A->getAsString(*Args);
|
||||
continue;
|
||||
}
|
||||
|
@ -1033,7 +1033,7 @@ void Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args,
|
|||
} else
|
||||
Inputs.push_back(std::make_pair(Ty, A));
|
||||
|
||||
} else if (A->getOption().isLinkerInput()) {
|
||||
} else if (A->getOption().hasFlag(options::LinkerInput)) {
|
||||
// Just treat as object type, we could make a special type for this if
|
||||
// necessary.
|
||||
Inputs.push_back(std::make_pair(types::TY_Object, A));
|
||||
|
@ -1300,7 +1300,7 @@ void Driver::BuildJobs(Compilation &C) const {
|
|||
// DiagnosticsEngine, so that extra values, position, and so on could be
|
||||
// printed.
|
||||
if (!A->isClaimed()) {
|
||||
if (A->getOption().hasNoArgumentUnused())
|
||||
if (A->getOption().hasFlag(options::NoArgumentUnused))
|
||||
continue;
|
||||
|
||||
// Suppress the warning automatically if this is just a flag, and it is an
|
||||
|
|
|
@ -737,7 +737,7 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
|
|||
getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
|
||||
<< A->getAsString(Args);
|
||||
continue;
|
||||
} else if (XarchArg->getOption().isDriverOption()) {
|
||||
} else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
|
||||
getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
|
||||
<< A->getAsString(Args);
|
||||
continue;
|
||||
|
@ -751,7 +751,7 @@ DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
|
|||
// Linker input arguments require custom handling. The problem is that we
|
||||
// have already constructed the phase actions, so we can not treat them as
|
||||
// "input arguments".
|
||||
if (A->getOption().isLinkerInput()) {
|
||||
if (A->getOption().hasFlag(options::LinkerInput)) {
|
||||
// Convert the argument into individual Zlinker_input_args.
|
||||
for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
|
||||
DAL->AddSeparateArg(OriginalArg,
|
||||
|
|
|
@ -200,6 +200,12 @@ static void addProfileRT(const ToolChain &TC, const ArgList &Args,
|
|||
CmdArgs.push_back(Args.MakeArgString(ProfileRT));
|
||||
}
|
||||
|
||||
static bool forwardToGCC(const Option &O) {
|
||||
return !O.hasFlag(options::NoForward) &&
|
||||
!O.hasFlag(options::DriverOption) &&
|
||||
!O.hasFlag(options::LinkerInput);
|
||||
}
|
||||
|
||||
void Clang::AddPreprocessingOptions(Compilation &C,
|
||||
const Driver &D,
|
||||
const ArgList &Args,
|
||||
|
@ -3195,7 +3201,7 @@ void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
for (ArgList::const_iterator
|
||||
it = Args.begin(), ie = Args.end(); it != ie; ++it) {
|
||||
Arg *A = *it;
|
||||
if (A->getOption().hasForwardToGCC()) {
|
||||
if (forwardToGCC(A->getOption())) {
|
||||
// Don't forward any -g arguments to assembly steps.
|
||||
if (isa<AssembleJobAction>(JA) &&
|
||||
A->getOption().matches(options::OPT_g_Group))
|
||||
|
@ -3420,7 +3426,7 @@ void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
for (ArgList::const_iterator
|
||||
it = Args.begin(), ie = Args.end(); it != ie; ++it) {
|
||||
Arg *A = *it;
|
||||
if (A->getOption().hasForwardToGCC()) {
|
||||
if (forwardToGCC(A->getOption())) {
|
||||
// Don't forward any -g arguments to assembly steps.
|
||||
if (isa<AssembleJobAction>(JA) &&
|
||||
A->getOption().matches(options::OPT_g_Group))
|
||||
|
|
|
@ -2330,7 +2330,7 @@ bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
|
|||
// Issue errors on arguments that are not valid for CC1.
|
||||
for (ArgList::iterator I = Args->begin(), E = Args->end();
|
||||
I != E; ++I) {
|
||||
if (!(*I)->getOption().isCC1Option()) {
|
||||
if (!(*I)->getOption().hasFlag(options::CC1Option)) {
|
||||
Diags.Report(diag::err_drv_unknown_argument) << (*I)->getAsString(*Args);
|
||||
Success = false;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue