3
3
#include " lldb/Core/Module.h"
4
4
#include " lldb/Symbol/Function.h"
5
5
#include " lldb/Symbol/SymbolContext.h"
6
+ #include " lldb/Target/Platform.h"
6
7
#include " lldb/Target/Process.h"
7
8
#include " lldb/Target/StackFrameRecognizer.h"
8
9
#include " lldb/Target/Target.h"
9
10
#include " lldb/Target/Thread.h"
10
11
12
+ #include " lldb/Utility/ConstString.h"
13
+ #include " lldb/Utility/FileSpec.h"
11
14
#include " lldb/Utility/LLDBLog.h"
12
15
#include " lldb/Utility/Log.h"
13
16
@@ -220,6 +223,66 @@ class SwiftHiddenFrameRecognizer : public StackFrameRecognizer {
220
223
}
221
224
};
222
225
226
+ // / A frame recognizer for Swift exception breakpoints.
227
+ class SwiftExceptionBreakpointFrameRecognizer : public StackFrameRecognizer {
228
+ public:
229
+ class SwiftExceptionFrame : public RecognizedStackFrame {
230
+ public:
231
+ SwiftExceptionFrame (StackFrameSP frame) : m_frame_sp(frame) {
232
+ m_stop_desc = " Swift exception breakpoint" ;
233
+ }
234
+
235
+ StackFrameSP GetMostRelevantFrame () override {
236
+ if (!m_frame_sp)
237
+ return {};
238
+
239
+ auto thread_sp = m_frame_sp->GetThread ();
240
+ if (!thread_sp)
241
+ return {};
242
+
243
+ StringRef symbol_name;
244
+ {
245
+ const SymbolContext &sc =
246
+ m_frame_sp->GetSymbolContext (eSymbolContextSymbol);
247
+ if (!sc.symbol )
248
+ return {};
249
+ symbol_name = sc.symbol ->GetName ();
250
+ }
251
+
252
+ StackFrameSP relevant_frame_sp;
253
+ if (symbol_name == " swift_willThrow" )
254
+ relevant_frame_sp = thread_sp->GetStackFrameAtIndex (1 );
255
+ else if (symbol_name == " swift_willThrowTypedImpl" )
256
+ relevant_frame_sp = thread_sp->GetStackFrameAtIndex (2 );
257
+ else {
258
+ assert (false && " unexpected frame name" );
259
+ return {};
260
+ }
261
+
262
+ if (relevant_frame_sp) {
263
+ // Select the relevant frame only if source is available.
264
+ const SymbolContext &sc =
265
+ relevant_frame_sp->GetSymbolContext (eSymbolContextCompUnit);
266
+ if (sc.comp_unit )
267
+ return relevant_frame_sp;
268
+ }
269
+
270
+ return {};
271
+ }
272
+
273
+ private:
274
+ StackFrameSP m_frame_sp;
275
+ };
276
+
277
+ RecognizedStackFrameSP RecognizeFrame (StackFrameSP frame) override {
278
+ return std::make_shared<SwiftExceptionFrame>(frame);
279
+ };
280
+
281
+ std::string GetName () override {
282
+ return " Swift exception breakpoint frame recognizer" ;
283
+ }
284
+ };
285
+
223
286
void RegisterSwiftFrameRecognizers (Process &process) {
224
287
RegularExpressionSP module_regex_sp = nullptr ;
225
288
auto &manager = process.GetTarget ().GetFrameRecognizerManager ();
@@ -245,6 +308,16 @@ void RegisterSwiftFrameRecognizers(Process &process) {
245
308
manager.AddRecognizer (srf_sp, module_regex_sp, symbol_regex_sp,
246
309
Mangled::NamePreference::ePreferMangled, false );
247
310
}
311
+ {
312
+ auto srf_sp = std::make_shared<SwiftExceptionBreakpointFrameRecognizer>();
313
+ ConstString module_name = ConstString (" swiftCore" );
314
+ if (auto platform_sp = process.GetTarget ().GetPlatform ())
315
+ module_name = platform_sp->GetFullNameForDylib (module_name);
316
+ manager.AddRecognizer (srf_sp, module_name,
317
+ {ConstString (" swift_willThrow" ),
318
+ ConstString (" swift_willThrowTypedImpl" )},
319
+ Mangled::NamePreference::ePreferMangled, false );
320
+ }
248
321
}
249
322
250
323
} // namespace lldb_private
0 commit comments