//===-- NativeProcessLinux.h ---------------------------------- -*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_NativeProcessLinux_H_
#define liblldb_NativeProcessLinux_H_

#include "Plugins/Process/Linux/IntelPTCollector.h"
#include "Plugins/Process/Linux/NativeThreadLinux.h"
#include "Plugins/Process/POSIX/NativeProcessELF.h"
#include "Plugins/Process/Utility/NativeProcessSoftwareSingleStep.h"
#include "lldb/Host/Debug.h"
#include "lldb/Host/HostThread.h"
#include "lldb/Host/linux/Support.h"
#include "lldb/Host/posix/Support.h"
#include "lldb/Target/MemoryRegionInfo.h"
#include "lldb/Utility/ArchSpec.h"
#include "lldb/Utility/FileSpec.h"
#include "lldb/lldb-types.h"
#include "llvm/ADT/SmallPtrSet.h"

#include <csignal>
#include <unordered_set>

namespace lldb_private {
class Status;
class Scalar;

namespace process_linux {
/// \class NativeProcessLinux
/// Manages communication with the inferior (debugee) process.
///
/// Upon construction, this class prepares and launches an inferior process
/// for debugging.
///
/// Changes in the inferior process state are broadcasted.
class NativeProcessLinux : public NativeProcessELF,
                           private NativeProcessSoftwareSingleStep {
public:
  class Manager : public NativeProcessProtocol::Manager {
  public:
    Manager(MainLoop &mainloop);

    llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
    Launch(ProcessLaunchInfo &launch_info,
           NativeDelegate &native_delegate) override;

    llvm::Expected<std::unique_ptr<NativeProcessProtocol>>
    Attach(lldb::pid_t pid, NativeDelegate &native_delegate) override;

    Extension GetSupportedExtensions() const override;

    void AddProcess(NativeProcessLinux &process) {
      m_processes.insert(&process);
    }

    void RemoveProcess(NativeProcessLinux &process) {
      m_processes.erase(&process);
    }

    // Collect an event for the given tid, waiting for it if necessary.
    void CollectThread(::pid_t tid);

  private:
    MainLoop::SignalHandleUP m_sigchld_handle;

    llvm::SmallPtrSet<NativeProcessLinux *, 2> m_processes;

    // Threads (events) which haven't been claimed by any process.
    llvm::DenseSet<::pid_t> m_unowned_threads;

    void SigchldHandler();
  };

  // NativeProcessProtocol Interface

  ~NativeProcessLinux() override { m_manager.RemoveProcess(*this); }

  Status Resume(const ResumeActionList &resume_actions) override;

  Status Halt() override;

  Status Detach() override;

  Status Signal(int signo) override;

  Status Interrupt() override;

  Status Kill() override;

  Status GetMemoryRegionInfo(lldb::addr_t load_addr,
                             MemoryRegionInfo &range_info) override;

  Status ReadMemory(const ProcessAddress &addr, void *buf, size_t size,
                    size_t &bytes_read) override;

  Status DoWriteMemory(lldb::addr_t addr, const void *buf, size_t size,
                       size_t &bytes_written) override;

  llvm::Expected<lldb::addr_t> AllocateMemory(size_t size,
                                              uint32_t permissions) override;

  llvm::Error DeallocateMemory(lldb::addr_t addr) override;

  Status ReadMemoryTags(int32_t type, lldb::addr_t addr, size_t len,
                        std::vector<uint8_t> &tags) override;

  Status WriteMemoryTags(int32_t type, lldb::addr_t addr, size_t len,
                         const std::vector<uint8_t> &tags) override;

  size_t UpdateThreads() override;

  const ArchSpec &GetArchitecture() const override { return m_arch; }

  Status SetBreakpoint(lldb::addr_t addr, uint32_t size,
                       bool hardware) override;

  Status RemoveBreakpoint(lldb::addr_t addr, bool hardware = false) override;

  Status GetLoadedModuleFileSpec(const char *module_path,
                                 FileSpec &file_spec) override;

  Status GetFileLoadAddress(const llvm::StringRef &file_name,
                            lldb::addr_t &load_addr) override;

  NativeThreadLinux *GetThreadByID(lldb::tid_t id);
  NativeThreadLinux *GetCurrentThread();

  llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>
  GetAuxvData() const override {
    return getProcFile(GetID(), "auxv");
  }

  /// Tracing
  /// These methods implement the jLLDBTrace packets
  /// \{
  llvm::Error TraceStart(llvm::StringRef json_request,
                         llvm::StringRef type) override;

  llvm::Error TraceStop(const TraceStopRequest &request) override;

  llvm::Expected<llvm::json::Value>
  TraceGetState(llvm::StringRef type) override;

  llvm::Expected<std::vector<uint8_t>>
  TraceGetBinaryData(const TraceGetBinaryDataRequest &request) override;

  llvm::Expected<TraceSupportedResponse> TraceSupported() override;
  /// }

  // Interface used by NativeRegisterContext-derived classes.
  static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr,
                              void *data = nullptr, size_t data_size = 0,
                              long *result = nullptr);

  bool SupportHardwareSingleStepping() const;

  /// Writes a siginfo_t structure corresponding to the given thread ID to the
  /// memory region pointed to by \p siginfo.
  Status GetSignalInfo(lldb::tid_t tid, void *siginfo) const;

protected:
  llvm::Expected<llvm::ArrayRef<uint8_t>>
  GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;

  llvm::Expected<uint64_t> Syscall(llvm::ArrayRef<uint64_t> args);

private:
  Manager &m_manager;
  ArchSpec m_arch;

  LazyBool m_supports_mem_region = eLazyBoolCalculate;

  lldb::tid_t m_pending_notification_tid = LLDB_INVALID_THREAD_ID;

  /// Inferior memory (allocated by us) and its size.
  llvm::DenseMap<lldb::addr_t, lldb::addr_t> m_allocated_memory;

  // Private Instance Methods
  NativeProcessLinux(::pid_t pid, int terminal_fd, NativeDelegate &delegate,
                     const ArchSpec &arch, Manager &manager,
                     llvm::ArrayRef<::pid_t> tids);

  // Returns a list of process threads that we have attached to.
  static llvm::Expected<std::vector<::pid_t>> Attach(::pid_t pid);

  static Status SetDefaultPtraceOpts(const lldb::pid_t);

  bool TryHandleWaitStatus(lldb::pid_t pid, WaitStatus status);

  void MonitorCallback(NativeThreadLinux &thread, WaitStatus status);

  void MonitorSIGTRAP(const siginfo_t &info, NativeThreadLinux &thread);

  void MonitorTrace(NativeThreadLinux &thread);

  void MonitorBreakpoint(NativeThreadLinux &thread);

  void MonitorWatchpoint(NativeThreadLinux &thread, uint32_t wp_index);

  void MonitorSignal(const siginfo_t &info, NativeThreadLinux &thread);

  bool HasThreadNoLock(lldb::tid_t thread_id);

  void StopTrackingThread(NativeThreadLinux &thread);

  /// Create a new thread.
  ///
  /// If process tracing is enabled and the thread can't be traced, then the
  /// thread is left stopped with a \a eStopReasonProcessorTrace status, and
  /// then the process is stopped.
  ///
  /// \param[in] resume
  ///     If a tracing error didn't happen, then resume the thread after
  ///     creation if \b true, or leave it stopped with SIGSTOP if \b false.
  NativeThreadLinux &AddThread(lldb::tid_t thread_id, bool resume);

  /// Start tracing a new thread if process tracing is enabled.
  ///
  /// Trace mechanisms should modify this method to provide automatic tracing
  /// for new threads.
  Status NotifyTracersOfNewThread(lldb::tid_t tid);

  /// Stop tracing threads upon a destroy event.
  ///
  /// Trace mechanisms should modify this method to provide automatic trace
  /// stopping for threads being destroyed.
  Status NotifyTracersOfThreadDestroyed(lldb::tid_t tid);

  void NotifyTracersProcessWillResume() override;

  void NotifyTracersProcessDidStop() override;

  /// Writes the raw event message code (vis-a-vis PTRACE_GETEVENTMSG)
  /// corresponding to the given thread ID to the memory pointed to by @p
  /// message.
  Status GetEventMessage(lldb::tid_t tid, unsigned long *message);

  void NotifyThreadDeath(lldb::tid_t tid);

  Status Detach(lldb::tid_t tid);

  // This method is requests a stop on all threads which are still running. It
  // sets up a
  // deferred delegate notification, which will fire once threads report as
  // stopped. The
  // triggerring_tid will be set as the current thread (main stop reason).
  void StopRunningThreads(lldb::tid_t triggering_tid);

  // Notify the delegate if all threads have stopped.
  void SignalIfAllThreadsStopped();

  // Resume the given thread, optionally passing it the given signal. The type
  // of resume
  // operation (continue, single-step) depends on the state parameter.
  Status ResumeThread(NativeThreadLinux &thread, lldb::StateType state,
                      int signo);

  void ThreadWasCreated(NativeThreadLinux &thread);

  void SigchldHandler();

  Status PopulateMemoryRegionCache();

  /// Manages Intel PT process and thread traces.
  IntelPTCollector m_intel_pt_collector;

  // Handle a clone()-like event.
  bool MonitorClone(NativeThreadLinux &parent, lldb::pid_t child_pid,
                    int event);
};

} // namespace process_linux
} // namespace lldb_private

#endif // #ifndef liblldb_NativeProcessLinux_H_
