xref: /freebsd/contrib/llvm-project/llvm/tools/llvm-xray/llvm-xray.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric //===- llvm-xray.cpp: XRay Tool Main Program ------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the main entry point for the suite of XRay tools. All
100b57cec5SDimitry Andric // additional functionality are implemented as subcommands.
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric //
140b57cec5SDimitry Andric // Basic usage:
150b57cec5SDimitry Andric //
160b57cec5SDimitry Andric //   llvm-xray [options] <subcommand> [subcommand-specific options]
170b57cec5SDimitry Andric //
180b57cec5SDimitry Andric #include "xray-registry.h"
190b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h"
200b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric using namespace llvm;
230b57cec5SDimitry Andric using namespace llvm::xray;
240b57cec5SDimitry Andric 
main(int argc,char * argv[])250b57cec5SDimitry Andric int main(int argc, char *argv[]) {
260b57cec5SDimitry Andric   cl::ParseCommandLineOptions(argc, argv,
270b57cec5SDimitry Andric                               "XRay Tools\n\n"
280b57cec5SDimitry Andric                               "  This program consolidates multiple XRay trace "
290b57cec5SDimitry Andric                               "processing tools for convenient access.\n");
300b57cec5SDimitry Andric   for (auto *SC : cl::getRegisteredSubcommands()) {
310b57cec5SDimitry Andric     if (*SC) {
320b57cec5SDimitry Andric       // If no subcommand was provided, we need to explicitly check if this is
330b57cec5SDimitry Andric       // the top-level subcommand.
34*bdd1243dSDimitry Andric       if (SC == &cl::SubCommand::getTopLevel()) {
350b57cec5SDimitry Andric         cl::PrintHelpMessage(false, true);
360b57cec5SDimitry Andric         return 0;
370b57cec5SDimitry Andric       }
380b57cec5SDimitry Andric       if (auto C = dispatch(SC)) {
390b57cec5SDimitry Andric         ExitOnError("llvm-xray: ")(C());
400b57cec5SDimitry Andric         return 0;
410b57cec5SDimitry Andric       }
420b57cec5SDimitry Andric     }
430b57cec5SDimitry Andric   }
440b57cec5SDimitry Andric 
450b57cec5SDimitry Andric   // If all else fails, we still print the usage message.
460b57cec5SDimitry Andric   cl::PrintHelpMessage(false, true);
470b57cec5SDimitry Andric   return 0;
480b57cec5SDimitry Andric }
49