brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · b638367 Raw
137 lines · c
1//===-- NativeProcessFreeBSD.h -------------------------------- -*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef liblldb_NativeProcessFreeBSD_H_10#define liblldb_NativeProcessFreeBSD_H_11 12#include "Plugins/Process/POSIX/NativeProcessELF.h"13#include "Plugins/Process/Utility/NativeProcessSoftwareSingleStep.h"14 15#include "lldb/Target/MemoryRegionInfo.h"16#include "lldb/Utility/ArchSpec.h"17#include "lldb/Utility/FileSpec.h"18 19#include "NativeThreadFreeBSD.h"20 21namespace lldb_private {22namespace process_freebsd {23/// \class NativeProcessFreeBSD24/// Manages communication with the inferior (debugee) process.25///26/// Upon construction, this class prepares and launches an inferior process27/// for debugging.28///29/// Changes in the inferior process state are broadcasted.30class NativeProcessFreeBSD : public NativeProcessELF,31                             private NativeProcessSoftwareSingleStep {32public:33  class Manager : public NativeProcessProtocol::Manager {34  public:35    using NativeProcessProtocol::Manager::Manager;36 37    llvm::Expected<std::unique_ptr<NativeProcessProtocol>>38    Launch(ProcessLaunchInfo &launch_info,39           NativeDelegate &native_delegate) override;40 41    llvm::Expected<std::unique_ptr<NativeProcessProtocol>>42    Attach(lldb::pid_t pid, NativeDelegate &native_delegate) override;43 44    Extension GetSupportedExtensions() const override;45  };46 47  // NativeProcessProtocol Interface48  Status Resume(const ResumeActionList &resume_actions) override;49 50  Status Halt() override;51 52  Status Detach() override;53 54  Status Signal(int signo) override;55 56  Status Interrupt() override;57 58  Status Kill() override;59 60  Status GetMemoryRegionInfo(lldb::addr_t load_addr,61                             MemoryRegionInfo &range_info) override;62 63  Status ReadMemory(lldb::addr_t addr, void *buf, size_t size,64                    size_t &bytes_read) override;65 66  Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size,67                     size_t &bytes_written) override;68 69  size_t UpdateThreads() override;70 71  const ArchSpec &GetArchitecture() const override { return m_arch; }72 73  Status SetBreakpoint(lldb::addr_t addr, uint32_t size,74                       bool hardware) override;75 76  // The two following methods are probably not necessary and probably77  // will never be called.  Nevertheless, we implement them right now78  // to reduce the differences between different platforms and reduce79  // the risk of the lack of implementation actually breaking something,80  // at least for the time being.81  Status GetLoadedModuleFileSpec(const char *module_path,82                                 FileSpec &file_spec) override;83  Status GetFileLoadAddress(const llvm::StringRef &file_name,84                            lldb::addr_t &load_addr) override;85 86  llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>87  GetAuxvData() const override;88 89  // Interface used by NativeRegisterContext-derived classes.90  static Status PtraceWrapper(int req, lldb::pid_t pid, void *addr = nullptr,91                              int data = 0, int *result = nullptr);92 93  bool SupportHardwareSingleStepping() const;94 95  llvm::Expected<std::string> SaveCore(llvm::StringRef path_hint) override;96 97protected:98  llvm::Expected<llvm::ArrayRef<uint8_t>>99  GetSoftwareBreakpointTrapOpcode(size_t size_hint) override;100 101private:102  MainLoop::SignalHandleUP m_sigchld_handle;103  ArchSpec m_arch;104  MainLoop& m_main_loop;105  LazyBool m_supports_mem_region = eLazyBoolCalculate;106  std::vector<std::pair<MemoryRegionInfo, FileSpec>> m_mem_region_cache;107 108  // Private Instance Methods109  NativeProcessFreeBSD(::pid_t pid, int terminal_fd, NativeDelegate &delegate,110                       const ArchSpec &arch, MainLoop &mainloop);111 112  bool HasThreadNoLock(lldb::tid_t thread_id);113 114  NativeThreadFreeBSD &AddThread(lldb::tid_t thread_id);115  void RemoveThread(lldb::tid_t thread_id);116 117  void MonitorCallback(lldb::pid_t pid, int signal);118  void MonitorExited(lldb::pid_t pid, WaitStatus status);119  void MonitorSIGSTOP(lldb::pid_t pid);120  void MonitorSIGTRAP(lldb::pid_t pid);121  void MonitorSignal(lldb::pid_t pid, int signal);122  void MonitorClone(::pid_t child_pid, bool is_vfork,123                    NativeThreadFreeBSD &parent_thread);124 125  Status PopulateMemoryRegionCache();126  void SigchldHandler();127 128  Status Attach();129  Status SetupTrace();130  Status ReinitializeThreads();131};132 133} // namespace process_freebsd134} // namespace lldb_private135 136#endif // #ifndef liblldb_NativeProcessFreeBSD_H_137