forked from OSchip/llvm-project
Allow VersionPrinter to print to arbitrary raw_ostreams
Summary: I would like to add printing of registered targets to clang's version information. For this to work correctly, the VersionPrinter logic in CommandLine.cpp should support printing to arbitrary raw_ostreams, instead of always defaulting to outs(). Add a raw_ostream& parameter to the function pointer type used for VersionPrinter, and while doing so, introduce a typedef for convenience. Note that VersionPrinter::print() will still default to using outs(), the clang part will necessarily go into a separate review. Reviewers: beanz, chandlerc, dberris, mehdi_amini, zturner Reviewed By: mehdi_amini Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D33899 llvm-svn: 304835
This commit is contained in:
parent
ff9d80cc7a
commit
bc3feaaa88
|
@ -64,12 +64,15 @@ bool ParseCommandLineOptions(int argc, const char *const *argv,
|
|||
void ParseEnvironmentOptions(const char *progName, const char *envvar,
|
||||
const char *Overview = "");
|
||||
|
||||
// Function pointer type for printing version information.
|
||||
typedef std::function<void(raw_ostream &)> VersionPrinterTy;
|
||||
|
||||
///===---------------------------------------------------------------------===//
|
||||
/// SetVersionPrinter - Override the default (LLVM specific) version printer
|
||||
/// used to print out the version when --version is given
|
||||
/// on the command line. This allows other systems using the
|
||||
/// CommandLine utilities to print their own version string.
|
||||
void SetVersionPrinter(void (*func)());
|
||||
void SetVersionPrinter(VersionPrinterTy func);
|
||||
|
||||
///===---------------------------------------------------------------------===//
|
||||
/// AddExtraVersionPrinter - Add an extra printer to use in addition to the
|
||||
|
@ -78,7 +81,7 @@ void SetVersionPrinter(void (*func)());
|
|||
/// which will be called after the basic LLVM version
|
||||
/// printing is complete. Each can then add additional
|
||||
/// information specific to the tool.
|
||||
void AddExtraVersionPrinter(void (*func)());
|
||||
void AddExtraVersionPrinter(VersionPrinterTy func);
|
||||
|
||||
// PrintOptionValues - Print option values.
|
||||
// With -print-options print the difference between option values and defaults.
|
||||
|
|
|
@ -598,7 +598,7 @@ struct TargetRegistry {
|
|||
|
||||
/// printRegisteredTargetsForVersion - Print the registered targets
|
||||
/// appropriately for inclusion in a tool's version output.
|
||||
static void printRegisteredTargetsForVersion();
|
||||
static void printRegisteredTargetsForVersion(raw_ostream &OS);
|
||||
|
||||
/// @name Registry Access
|
||||
/// @{
|
||||
|
|
|
@ -2042,9 +2042,9 @@ void CommandLineParser::printOptionValues() {
|
|||
Opts[i].second->printOptionValue(MaxArgLen, PrintAllOptions);
|
||||
}
|
||||
|
||||
static void (*OverrideVersionPrinter)() = nullptr;
|
||||
static VersionPrinterTy OverrideVersionPrinter = nullptr;
|
||||
|
||||
static std::vector<void (*)()> *ExtraVersionPrinters = nullptr;
|
||||
static std::vector<VersionPrinterTy> *ExtraVersionPrinters = nullptr;
|
||||
|
||||
namespace {
|
||||
class VersionPrinter {
|
||||
|
@ -2084,7 +2084,7 @@ public:
|
|||
return;
|
||||
|
||||
if (OverrideVersionPrinter != nullptr) {
|
||||
(*OverrideVersionPrinter)();
|
||||
OverrideVersionPrinter(outs());
|
||||
exit(0);
|
||||
}
|
||||
print();
|
||||
|
@ -2093,10 +2093,8 @@ public:
|
|||
// information.
|
||||
if (ExtraVersionPrinters != nullptr) {
|
||||
outs() << '\n';
|
||||
for (std::vector<void (*)()>::iterator I = ExtraVersionPrinters->begin(),
|
||||
E = ExtraVersionPrinters->end();
|
||||
I != E; ++I)
|
||||
(*I)();
|
||||
for (auto I : *ExtraVersionPrinters)
|
||||
I(outs());
|
||||
}
|
||||
|
||||
exit(0);
|
||||
|
@ -2134,11 +2132,11 @@ void cl::PrintHelpMessage(bool Hidden, bool Categorized) {
|
|||
/// Utility function for printing version number.
|
||||
void cl::PrintVersionMessage() { VersionPrinterInstance.print(); }
|
||||
|
||||
void cl::SetVersionPrinter(void (*func)()) { OverrideVersionPrinter = func; }
|
||||
void cl::SetVersionPrinter(VersionPrinterTy func) { OverrideVersionPrinter = func; }
|
||||
|
||||
void cl::AddExtraVersionPrinter(void (*func)()) {
|
||||
void cl::AddExtraVersionPrinter(VersionPrinterTy func) {
|
||||
if (!ExtraVersionPrinters)
|
||||
ExtraVersionPrinters = new std::vector<void (*)()>;
|
||||
ExtraVersionPrinters = new std::vector<VersionPrinterTy>;
|
||||
|
||||
ExtraVersionPrinters->push_back(func);
|
||||
}
|
||||
|
|
|
@ -114,7 +114,7 @@ static int TargetArraySortFn(const std::pair<StringRef, const Target *> *LHS,
|
|||
return LHS->first.compare(RHS->first);
|
||||
}
|
||||
|
||||
void TargetRegistry::printRegisteredTargetsForVersion() {
|
||||
void TargetRegistry::printRegisteredTargetsForVersion(raw_ostream &OS) {
|
||||
std::vector<std::pair<StringRef, const Target*> > Targets;
|
||||
size_t Width = 0;
|
||||
for (const auto &T : TargetRegistry::targets()) {
|
||||
|
@ -123,7 +123,6 @@ void TargetRegistry::printRegisteredTargetsForVersion() {
|
|||
}
|
||||
array_pod_sort(Targets.begin(), Targets.end(), TargetArraySortFn);
|
||||
|
||||
raw_ostream &OS = outs();
|
||||
OS << " Registered Targets:\n";
|
||||
for (unsigned i = 0, e = Targets.size(); i != e; ++i) {
|
||||
OS << " " << Targets[i].first;
|
||||
|
|
Loading…
Reference in New Issue