Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:42:58

0001 //===-- StringExtractorGDBRemote.h ------------------------------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 
0009 #ifndef LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
0010 #define LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
0011 
0012 #include "lldb/Utility/Status.h"
0013 #include "lldb/Utility/StringExtractor.h"
0014 #include "llvm/ADT/StringRef.h"
0015 
0016 #include <optional>
0017 #include <string>
0018 
0019 #include <cstddef>
0020 #include <cstdint>
0021 
0022 class StringExtractorGDBRemote : public StringExtractor {
0023 public:
0024   typedef bool (*ResponseValidatorCallback)(
0025       void *baton, const StringExtractorGDBRemote &response);
0026 
0027   StringExtractorGDBRemote() = default;
0028 
0029   StringExtractorGDBRemote(llvm::StringRef str)
0030       : StringExtractor(str), m_validator(nullptr) {}
0031 
0032   StringExtractorGDBRemote(const char *cstr)
0033       : StringExtractor(cstr), m_validator(nullptr) {}
0034 
0035   bool ValidateResponse() const;
0036 
0037   void CopyResponseValidator(const StringExtractorGDBRemote &rhs);
0038 
0039   void SetResponseValidator(ResponseValidatorCallback callback, void *baton);
0040 
0041   void SetResponseValidatorToOKErrorNotSupported();
0042 
0043   void SetResponseValidatorToASCIIHexBytes();
0044 
0045   void SetResponseValidatorToJSON();
0046 
0047   enum ServerPacketType {
0048     eServerPacketType_nack = 0,
0049     eServerPacketType_ack,
0050     eServerPacketType_invalid,
0051     eServerPacketType_unimplemented,
0052     eServerPacketType_interrupt, // CTRL+c packet or "\x03"
0053     eServerPacketType_A,         // Program arguments packet
0054     eServerPacketType_qfProcessInfo,
0055     eServerPacketType_qsProcessInfo,
0056     eServerPacketType_qC,
0057     eServerPacketType_qEcho,
0058     eServerPacketType_qGroupName,
0059     eServerPacketType_qHostInfo,
0060     eServerPacketType_qLaunchGDBServer,
0061     eServerPacketType_qQueryGDBServer,
0062     eServerPacketType_qKillSpawnedProcess,
0063     eServerPacketType_qLaunchSuccess,
0064     eServerPacketType_qModuleInfo,
0065     eServerPacketType_qProcessInfoPID,
0066     eServerPacketType_qSpeedTest,
0067     eServerPacketType_qUserName,
0068     eServerPacketType_qGetWorkingDir,
0069     eServerPacketType_qFileLoadAddress,
0070     eServerPacketType_QEnvironment,
0071     eServerPacketType_QEnableErrorStrings,
0072     eServerPacketType_QLaunchArch,
0073     eServerPacketType_QSetDisableASLR,
0074     eServerPacketType_QSetDetachOnError,
0075     eServerPacketType_QSetSTDIN,
0076     eServerPacketType_QSetSTDOUT,
0077     eServerPacketType_QSetSTDERR,
0078     eServerPacketType_QSetWorkingDir,
0079     eServerPacketType_QStartNoAckMode,
0080     eServerPacketType_qPathComplete,
0081     eServerPacketType_qPlatform_shell,
0082     eServerPacketType_qPlatform_mkdir,
0083     eServerPacketType_qPlatform_chmod,
0084     eServerPacketType_vFile_open,
0085     eServerPacketType_vFile_close,
0086     eServerPacketType_vFile_pread,
0087     eServerPacketType_vFile_pwrite,
0088     eServerPacketType_vFile_size,
0089     eServerPacketType_vFile_mode,
0090     eServerPacketType_vFile_exists,
0091     eServerPacketType_vFile_md5,
0092     eServerPacketType_vFile_fstat,
0093     eServerPacketType_vFile_stat,
0094     eServerPacketType_vFile_symlink,
0095     eServerPacketType_vFile_unlink,
0096     // debug server packages
0097     eServerPacketType_QEnvironmentHexEncoded,
0098     eServerPacketType_QListThreadsInStopReply,
0099     eServerPacketType_QPassSignals,
0100     eServerPacketType_QRestoreRegisterState,
0101     eServerPacketType_QSaveRegisterState,
0102     eServerPacketType_QSetLogging,
0103     eServerPacketType_QSetMaxPacketSize,
0104     eServerPacketType_QSetMaxPayloadSize,
0105     eServerPacketType_QSetEnableAsyncProfiling,
0106     eServerPacketType_QSyncThreadState,
0107     eServerPacketType_QThreadSuffixSupported,
0108 
0109     eServerPacketType_jThreadsInfo,
0110     eServerPacketType_qsThreadInfo,
0111     eServerPacketType_qfThreadInfo,
0112     eServerPacketType_qGetPid,
0113     eServerPacketType_qGetProfileData,
0114     eServerPacketType_qGDBServerVersion,
0115     eServerPacketType_qMemoryRegionInfo,
0116     eServerPacketType_qMemoryRegionInfoSupported,
0117     eServerPacketType_qProcessInfo,
0118     eServerPacketType_qRcmd,
0119     eServerPacketType_qRegisterInfo,
0120     eServerPacketType_qShlibInfoAddr,
0121     eServerPacketType_qStepPacketSupported,
0122     eServerPacketType_qSupported,
0123     eServerPacketType_qSyncThreadStateSupported,
0124     eServerPacketType_qThreadExtraInfo,
0125     eServerPacketType_qThreadStopInfo,
0126     eServerPacketType_qVAttachOrWaitSupported,
0127     eServerPacketType_qWatchpointSupportInfo,
0128     eServerPacketType_qWatchpointSupportInfoSupported,
0129     eServerPacketType_qXfer,
0130 
0131     eServerPacketType_jSignalsInfo,
0132     eServerPacketType_jModulesInfo,
0133 
0134     eServerPacketType_vAttach,
0135     eServerPacketType_vAttachWait,
0136     eServerPacketType_vAttachOrWait,
0137     eServerPacketType_vAttachName,
0138     eServerPacketType_vCont,
0139     eServerPacketType_vCont_actions, // vCont?
0140     eServerPacketType_vKill,
0141     eServerPacketType_vRun,
0142 
0143     eServerPacketType_stop_reason, // '?'
0144 
0145     eServerPacketType_c,
0146     eServerPacketType_C,
0147     eServerPacketType_D,
0148     eServerPacketType_g,
0149     eServerPacketType_G,
0150     eServerPacketType_H,
0151     eServerPacketType_I, // stdin notification
0152     eServerPacketType_k,
0153     eServerPacketType_m,
0154     eServerPacketType_M,
0155     eServerPacketType_p,
0156     eServerPacketType_P,
0157     eServerPacketType_s,
0158     eServerPacketType_S,
0159     eServerPacketType_T,
0160     eServerPacketType_x,
0161     eServerPacketType_X,
0162     eServerPacketType_Z,
0163     eServerPacketType_z,
0164 
0165     eServerPacketType__M,
0166     eServerPacketType__m,
0167     eServerPacketType_notify, // '%' notification
0168 
0169     eServerPacketType_jLLDBTraceSupported,
0170     eServerPacketType_jLLDBTraceStart,
0171     eServerPacketType_jLLDBTraceStop,
0172     eServerPacketType_jLLDBTraceGetState,
0173     eServerPacketType_jLLDBTraceGetBinaryData,
0174 
0175     eServerPacketType_qMemTags, // read memory tags
0176     eServerPacketType_QMemTags, // write memory tags
0177 
0178     eServerPacketType_qLLDBSaveCore,
0179     eServerPacketType_QSetIgnoredExceptions,
0180     eServerPacketType_QNonStop,
0181     eServerPacketType_vStopped,
0182     eServerPacketType_vCtrlC,
0183     eServerPacketType_vStdio,
0184   };
0185 
0186   ServerPacketType GetServerPacketType() const;
0187 
0188   enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse };
0189 
0190   ResponseType GetResponseType() const;
0191 
0192   bool IsOKResponse() const;
0193 
0194   bool IsUnsupportedResponse() const;
0195 
0196   bool IsNormalResponse() const;
0197 
0198   bool IsErrorResponse() const;
0199 
0200   // Returns zero if the packet isn't a EXX packet where XX are two hex digits.
0201   // Otherwise the error encoded in XX is returned.
0202   uint8_t GetError();
0203 
0204   lldb_private::Status GetStatus();
0205 
0206   size_t GetEscapedBinaryData(std::string &str);
0207 
0208   static constexpr lldb::pid_t AllProcesses = UINT64_MAX;
0209   static constexpr lldb::tid_t AllThreads = UINT64_MAX;
0210 
0211   // Read thread-id from the packet.  If the packet is valid, returns
0212   // the pair (PID, TID), otherwise returns std::nullopt.  If the packet
0213   // does not list a PID, default_pid is used.
0214   std::optional<std::pair<lldb::pid_t, lldb::tid_t>>
0215   GetPidTid(lldb::pid_t default_pid);
0216 
0217 protected:
0218   ResponseValidatorCallback m_validator = nullptr;
0219   void *m_validator_baton = nullptr;
0220 };
0221 
0222 #endif // LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H