lld-link: Add --color-diagnostics(={always,never,auto})?, --no-color-diagnostics flags.

This is most useful when using lld-link on a non-Win host (but it might become
useful on Windows too if lld also grows a fansi-escape-codes flag).

Also make the help for --color-diagnostic mention the valid values in ELF and
wasm, and print the flag name with two dashes in diags, since the one-dash form
is seen as a list of many one-letter flags in some contexts.

https://reviews.llvm.org/D46693

llvm-svn: 332012
This commit is contained in:
Nico Weber 2018-05-10 18:19:02 +00:00
parent d6beb320b4
commit cac2b3349e
6 changed files with 43 additions and 13 deletions

View File

@ -756,6 +756,28 @@ static const llvm::opt::OptTable::Info InfoTable[] = {
COFFOptTable::COFFOptTable() : OptTable(InfoTable, true) {} COFFOptTable::COFFOptTable() : OptTable(InfoTable, true) {}
// Set color diagnostics according to --color-diagnostics={auto,always,never}
// or --no-color-diagnostics flags.
static void handleColorDiagnostics(opt::InputArgList &Args) {
auto *Arg = Args.getLastArg(OPT_color_diagnostics, OPT_color_diagnostics_eq,
OPT_no_color_diagnostics);
if (!Arg)
return;
if (Arg->getOption().getID() == OPT_color_diagnostics) {
errorHandler().ColorDiagnostics = true;
} else if (Arg->getOption().getID() == OPT_no_color_diagnostics) {
errorHandler().ColorDiagnostics = false;
} else {
StringRef S = Arg->getValue();
if (S == "always")
errorHandler().ColorDiagnostics = true;
else if (S == "never")
errorHandler().ColorDiagnostics = false;
else if (S != "auto")
error("unknown option: --color-diagnostics=" + S);
}
}
static cl::TokenizerCallback getQuotingStyle(opt::InputArgList &Args) { static cl::TokenizerCallback getQuotingStyle(opt::InputArgList &Args) {
if (auto *Arg = Args.getLastArg(OPT_rsp_quoting)) { if (auto *Arg = Args.getLastArg(OPT_rsp_quoting)) {
StringRef S = Arg->getValue(); StringRef S = Arg->getValue();
@ -799,6 +821,9 @@ opt::InputArgList ArgParser::parse(ArrayRef<const char *> Argv) {
if (MissingCount) if (MissingCount)
fatal(Twine(Args.getArgString(MissingIndex)) + ": missing argument"); fatal(Twine(Args.getArgString(MissingIndex)) + ": missing argument");
handleColorDiagnostics(Args);
for (auto *Arg : Args.filtered(OPT_UNKNOWN)) for (auto *Arg : Args.filtered(OPT_UNKNOWN))
warn("ignoring unknown argument: " + Arg->getSpelling()); warn("ignoring unknown argument: " + Arg->getSpelling());
return Args; return Args;

View File

@ -20,6 +20,10 @@ def align : P<"align", "Section alignment">;
def aligncomm : P<"aligncomm", "Set common symbol alignment">; def aligncomm : P<"aligncomm", "Set common symbol alignment">;
def alternatename : P<"alternatename", "Define weak alias">; def alternatename : P<"alternatename", "Define weak alias">;
def base : P<"base", "Base address of the program">; def base : P<"base", "Base address of the program">;
def color_diagnostics: Flag<["--"], "color-diagnostics">,
HelpText<"Use colors in diagnostics">;
def color_diagnostics_eq: Joined<["--"], "color-diagnostics=">,
HelpText<"Use colors in diagnostics; one of 'always', 'never', 'auto'">;
def defaultlib : P<"defaultlib", "Add the library to the list of input files">; def defaultlib : P<"defaultlib", "Add the library to the list of input files">;
def delayload : P<"delayload", "Delay loaded DLL name">; def delayload : P<"delayload", "Delay loaded DLL name">;
def entry : P<"entry", "Name of entry point symbol">; def entry : P<"entry", "Name of entry point symbol">;
@ -46,6 +50,8 @@ def opt : P<"opt", "Control optimizations">;
def order : P<"order", "Put functions in order">; def order : P<"order", "Put functions in order">;
def out : P<"out", "Path to file to write output">; def out : P<"out", "Path to file to write output">;
def natvis : P<"natvis", "Path to natvis file to embed in the PDB">; def natvis : P<"natvis", "Path to natvis file to embed in the PDB">;
def no_color_diagnostics: F<"no-color-diagnostics">,
HelpText<"Do not use colors in diagnostics">;
def pdb : P<"pdb", "PDB file path">; def pdb : P<"pdb", "PDB file path">;
def pdbaltpath : P<"pdbaltpath", "PDB file path to embed in the image">; def pdbaltpath : P<"pdbaltpath", "PDB file path to embed in the image">;
def section : P<"section", "Specify section attributes">; def section : P<"section", "Specify section attributes">;

View File

@ -59,18 +59,18 @@ static void handleColorDiagnostics(opt::InputArgList &Args) {
OPT_no_color_diagnostics); OPT_no_color_diagnostics);
if (!Arg) if (!Arg)
return; return;
else if (Arg->getOption().getID() == OPT_color_diagnostics) if (Arg->getOption().getID() == OPT_color_diagnostics) {
errorHandler().ColorDiagnostics = true; errorHandler().ColorDiagnostics = true;
else if (Arg->getOption().getID() == OPT_no_color_diagnostics) } else if (Arg->getOption().getID() == OPT_no_color_diagnostics) {
errorHandler().ColorDiagnostics = false; errorHandler().ColorDiagnostics = false;
else { } else {
StringRef S = Arg->getValue(); StringRef S = Arg->getValue();
if (S == "always") if (S == "always")
errorHandler().ColorDiagnostics = true; errorHandler().ColorDiagnostics = true;
else if (S == "never") else if (S == "never")
errorHandler().ColorDiagnostics = false; errorHandler().ColorDiagnostics = false;
else if (S != "auto") else if (S != "auto")
error("unknown option: -color-diagnostics=" + S); error("unknown option: --color-diagnostics=" + S);
} }
} }

View File

@ -76,7 +76,7 @@ def color_diagnostics: F<"color-diagnostics">,
HelpText<"Use colors in diagnostics">; HelpText<"Use colors in diagnostics">;
def color_diagnostics_eq: J<"color-diagnostics=">, def color_diagnostics_eq: J<"color-diagnostics=">,
HelpText<"Use colors in diagnostics">; HelpText<"Use colors in diagnostics; one of 'always', 'never', 'auto'">;
defm cref: B<"cref", defm cref: B<"cref",
"Output cross reference table", "Output cross reference table",

View File

@ -111,19 +111,18 @@ static void handleColorDiagnostics(opt::InputArgList &Args) {
OPT_no_color_diagnostics); OPT_no_color_diagnostics);
if (!Arg) if (!Arg)
return; return;
if (Arg->getOption().getID() == OPT_color_diagnostics) {
if (Arg->getOption().getID() == OPT_color_diagnostics)
errorHandler().ColorDiagnostics = true; errorHandler().ColorDiagnostics = true;
else if (Arg->getOption().getID() == OPT_no_color_diagnostics) } else if (Arg->getOption().getID() == OPT_no_color_diagnostics) {
errorHandler().ColorDiagnostics = false; errorHandler().ColorDiagnostics = false;
else { } else {
StringRef S = Arg->getValue(); StringRef S = Arg->getValue();
if (S == "always") if (S == "always")
errorHandler().ColorDiagnostics = true; errorHandler().ColorDiagnostics = true;
if (S == "never") else if (S == "never")
errorHandler().ColorDiagnostics = false; errorHandler().ColorDiagnostics = false;
if (S != "auto") else if (S != "auto")
error("unknown option: -color-diagnostics=" + S); error("unknown option: --color-diagnostics=" + S);
} }
} }

View File

@ -21,7 +21,7 @@ def color_diagnostics: F<"color-diagnostics">,
HelpText<"Use colors in diagnostics">; HelpText<"Use colors in diagnostics">;
def color_diagnostics_eq: J<"color-diagnostics=">, def color_diagnostics_eq: J<"color-diagnostics=">,
HelpText<"Use colors in diagnostics">; HelpText<"Use colors in diagnostics; one of 'always', 'never', 'auto'">;
defm demangle: B<"demangle", defm demangle: B<"demangle",
"Demangle symbol names", "Demangle symbol names",