1285101Semaste//===-- lldb-server.cpp -----------------------------------------*- C++ -*-===// 2285101Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6285101Semaste// 7285101Semaste//===----------------------------------------------------------------------===// 8285101Semaste 9341825Sdim#include "SystemInitializerLLGS.h" 10285101Semaste#include "lldb/Initialization/SystemLifetimeManager.h" 11309124Sdim#include "lldb/lldb-private.h" 12285101Semaste 13285101Semaste#include "llvm/ADT/STLExtras.h" 14341825Sdim#include "llvm/ADT/StringRef.h" 15360784Sdim#include "llvm/Support/InitLLVM.h" 16285101Semaste#include "llvm/Support/ManagedStatic.h" 17341825Sdim#include "llvm/Support/PrettyStackTrace.h" 18341825Sdim#include "llvm/Support/Signals.h" 19285101Semaste 20285101Semaste#include <stdio.h> 21285101Semaste#include <stdlib.h> 22285101Semaste 23314564Sdimstatic llvm::ManagedStatic<lldb_private::SystemLifetimeManager> 24314564Sdim g_debugger_lifetime; 25285101Semaste 26314564Sdimstatic void display_usage(const char *progname) { 27314564Sdim fprintf(stderr, "Usage:\n" 28314564Sdim " %s v[ersion]\n" 29314564Sdim " %s g[dbserver] [options]\n" 30314564Sdim " %s p[latform] [options]\n" 31314564Sdim "Invoke subcommand for additional help\n", 32314564Sdim progname, progname, progname); 33314564Sdim exit(0); 34285101Semaste} 35285101Semaste 36285101Semaste// Forward declarations of subcommand main methods. 37314564Sdimint main_gdbserver(int argc, char *argv[]); 38314564Sdimint main_platform(int argc, char *argv[]); 39285101Semaste 40353358Sdimnamespace llgs { 41314564Sdimstatic void initialize() { 42344779Sdim if (auto e = g_debugger_lifetime->Initialize( 43360784Sdim std::make_unique<SystemInitializerLLGS>(), nullptr)) 44344779Sdim llvm::consumeError(std::move(e)); 45285101Semaste} 46285101Semaste 47353358Sdimstatic void terminate_debugger() { g_debugger_lifetime->Terminate(); } 48353358Sdim} // namespace llgs 49285101Semaste 50285101Semaste// main 51314564Sdimint main(int argc, char *argv[]) { 52360784Sdim llvm::InitLLVM IL(argc, argv, /*InstallPipeSignalExitHandler=*/false); 53341825Sdim llvm::StringRef ToolName = argv[0]; 54341825Sdim llvm::sys::PrintStackTraceOnErrorSignal(ToolName); 55341825Sdim llvm::PrettyStackTraceProgram X(argc, argv); 56341825Sdim 57314564Sdim int option_error = 0; 58314564Sdim const char *progname = argv[0]; 59314564Sdim if (argc < 2) { 60314564Sdim display_usage(progname); 61314564Sdim exit(option_error); 62314564Sdim } 63309124Sdim 64314564Sdim switch (argv[1][0]) { 65314564Sdim case 'g': 66353358Sdim llgs::initialize(); 67314564Sdim main_gdbserver(argc, argv); 68353358Sdim llgs::terminate_debugger(); 69314564Sdim break; 70314564Sdim case 'p': 71353358Sdim llgs::initialize(); 72314564Sdim main_platform(argc, argv); 73353358Sdim llgs::terminate_debugger(); 74314564Sdim break; 75314564Sdim case 'v': 76314564Sdim fprintf(stderr, "%s\n", lldb_private::GetVersion()); 77314564Sdim break; 78314564Sdim default: 79314564Sdim display_usage(progname); 80314564Sdim exit(option_error); 81314564Sdim } 82285101Semaste} 83