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