1// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#ifndef GDBMI_H
6#define GDBMI_H
7
8#include <QMap>
9#include <QVariantMap>
10
11namespace gdbmi {
12// code is from https://github.com/martinribelotta/gdbfrontend
13struct VariableChange {
14 QString name;
15 bool inScope;
16 bool typeChanged;
17 bool hasMore;
18};
19
20struct Variable {
21 QString name;
22 int numChild = 0;
23 QString value;
24 QString type;
25 QString threadId;
26 bool hasMore = false;
27 bool dynamic = false;
28 QString displayhint;
29
30 bool isValid() const { return !name.isEmpty() && !value.isEmpty(); }
31 bool haveType() const { return !type.isEmpty(); }
32 bool isSimple() const { return isValid() && !haveType(); }
33
34 static Variable parseMap(const QVariantMap &data);
35};
36
37struct Frame {
38 int level = -1;
39 QString func;
40 quint64 addr;
41 QHash<QString, QString> params;
42 QString file;
43 QString fullpath;
44 int line;
45
46 bool isValid() const { return level != -1; }
47
48 static Frame parseMap(const QVariantMap &data);
49};
50
51struct Breakpoint {
52 int number = -1;
53 QString type;
54 enum Disp_t { keep, del } disp;
55 bool enable;
56 quint64 addr;
57 QString func;
58 QString file;
59 QString fullname;
60 int line;
61 QList<QString> threadGroups;
62 int times;
63 QString originalLocation;
64
65 bool isValid() const { return number != -1; }
66
67 static Breakpoint parseMap(const QVariantMap &data);
68};
69
70struct Thread {
71 int id;
72 QString targetId;
73 QString details;
74 QString name;
75 enum State_t { Unknown, Stopped, Running } state;
76 Frame frame;
77 int core;
78
79 static Thread parseMap(const QVariantMap &data);
80};
81
82struct AsyncContext {
83 enum class Reason {
84 Unknown,
85 breakpointHhit, // breakpoint Hit
86 watchpointTrigger,
87 readWatchpointTrigger,
88 accessWatchpointTrigger,
89 functionFinished, // StepOut
90 locationReached,
91 watchpointScope,
92 endSteppingRange, // StepIn
93 exitedSignalled,
94 exited,
95 exitedNormally,
96 signalReceived,
97 solibEvent,
98 fork,
99 vfork,
100 syscallEntry,
101 syscallReturn,
102 exec,
103 };
104
105 Reason reason;
106 QString threadId;
107 int core;
108 Frame frame;
109
110 static Reason textToReason(const QString &s);
111 static QString reasonToText(Reason r);
112};
113
114struct Library {
115 QString id;
116 QString targetName;
117 QString hostName;
118 QString symbolsLoaded;
119 QString threadGroup;
120 struct Ranges {
121 QString fromRange;
122 QString toRange;
123 } ranges;
124
125 static Library parseMap(const QVariantMap& data);
126};
127
128struct Record{
129 enum RecordType {
130 unknown,
131 notify,
132 result,
133 console,
134 log,
135 target,
136 promt,
137 program,
138 disassemble
139 };
140
141 RecordType type;
142 QString message;
143 QVariant payload;
144 int token;
145
146 Record(RecordType t, const QString& msg, const QVariant &p, int tk) {
147 type = t;
148 message= msg;
149 payload = p;
150 token = tk;
151 }
152
153 static Record parseRecord(const QString& outputText);
154};
155
156QString escapedText(const QString& s);
157
158} //namespace gdbmi
159
160#endif // GDBMI_H
161