xref: /freebsd-src/contrib/llvm-project/lldb/tools/lldb-server/lldb-server.cpp (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
10b57cec5SDimitry Andric //===-- lldb-server.cpp -----------------------------------------*- C++ -*-===//
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 #include "SystemInitializerLLGS.h"
10*7a6dacacSDimitry Andric #include "lldb/Host/Config.h"
110b57cec5SDimitry Andric #include "lldb/Initialization/SystemLifetimeManager.h"
120eae32dcSDimitry Andric #include "lldb/Version/Version.h"
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
150b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
169dba64beSDimitry Andric #include "llvm/Support/InitLLVM.h"
170b57cec5SDimitry Andric #include "llvm/Support/ManagedStatic.h"
180b57cec5SDimitry Andric #include "llvm/Support/PrettyStackTrace.h"
190b57cec5SDimitry Andric #include "llvm/Support/Signals.h"
200b57cec5SDimitry Andric 
21fe6060f1SDimitry Andric #include <cstdio>
22fe6060f1SDimitry Andric #include <cstdlib>
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric static llvm::ManagedStatic<lldb_private::SystemLifetimeManager>
250b57cec5SDimitry Andric     g_debugger_lifetime;
260b57cec5SDimitry Andric 
display_usage(const char * progname)270b57cec5SDimitry Andric static void display_usage(const char *progname) {
280b57cec5SDimitry Andric   fprintf(stderr, "Usage:\n"
290b57cec5SDimitry Andric                   "  %s v[ersion]\n"
300b57cec5SDimitry Andric                   "  %s g[dbserver] [options]\n"
310b57cec5SDimitry Andric                   "  %s p[latform] [options]\n"
320b57cec5SDimitry Andric                   "Invoke subcommand for additional help\n",
330b57cec5SDimitry Andric           progname, progname, progname);
340b57cec5SDimitry Andric   exit(0);
350b57cec5SDimitry Andric }
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric // Forward declarations of subcommand main methods.
380b57cec5SDimitry Andric int main_gdbserver(int argc, char *argv[]);
390b57cec5SDimitry Andric int main_platform(int argc, char *argv[]);
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric namespace llgs {
initialize()420b57cec5SDimitry Andric static void initialize() {
430b57cec5SDimitry Andric   if (auto e = g_debugger_lifetime->Initialize(
449dba64beSDimitry Andric           std::make_unique<SystemInitializerLLGS>(), nullptr))
450b57cec5SDimitry Andric     llvm::consumeError(std::move(e));
460b57cec5SDimitry Andric }
470b57cec5SDimitry Andric 
terminate_debugger()480b57cec5SDimitry Andric static void terminate_debugger() { g_debugger_lifetime->Terminate(); }
490b57cec5SDimitry Andric } // namespace llgs
500b57cec5SDimitry Andric 
510b57cec5SDimitry Andric // main
main(int argc,char * argv[])520b57cec5SDimitry Andric int main(int argc, char *argv[]) {
53480093f4SDimitry Andric   llvm::InitLLVM IL(argc, argv, /*InstallPipeSignalExitHandler=*/false);
54*7a6dacacSDimitry Andric   llvm::setBugReportMsg("PLEASE submit a bug report to " LLDB_BUG_REPORT_URL
55*7a6dacacSDimitry Andric                         " and include the crash backtrace.\n");
560b57cec5SDimitry Andric 
570b57cec5SDimitry Andric   int option_error = 0;
580b57cec5SDimitry Andric   const char *progname = argv[0];
590b57cec5SDimitry Andric   if (argc < 2) {
600b57cec5SDimitry Andric     display_usage(progname);
610b57cec5SDimitry Andric     exit(option_error);
620b57cec5SDimitry Andric   }
630b57cec5SDimitry Andric 
640b57cec5SDimitry Andric   switch (argv[1][0]) {
650b57cec5SDimitry Andric   case 'g':
660b57cec5SDimitry Andric     llgs::initialize();
670b57cec5SDimitry Andric     main_gdbserver(argc, argv);
680b57cec5SDimitry Andric     llgs::terminate_debugger();
690b57cec5SDimitry Andric     break;
700b57cec5SDimitry Andric   case 'p':
710b57cec5SDimitry Andric     llgs::initialize();
720b57cec5SDimitry Andric     main_platform(argc, argv);
730b57cec5SDimitry Andric     llgs::terminate_debugger();
740b57cec5SDimitry Andric     break;
750b57cec5SDimitry Andric   case 'v':
760b57cec5SDimitry Andric     fprintf(stderr, "%s\n", lldb_private::GetVersion());
770b57cec5SDimitry Andric     break;
780b57cec5SDimitry Andric   default:
790b57cec5SDimitry Andric     display_usage(progname);
800b57cec5SDimitry Andric     exit(option_error);
810b57cec5SDimitry Andric   }
820b57cec5SDimitry Andric }
83