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,55 @@ 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
+ StackFrameSP frame_sp;
244
+ StringRef name = m_frame_sp->GetFunctionName ();
245
+ if (name == " swift_willThrow" )
246
+ frame_sp = thread_sp->GetStackFrameAtIndex (1 );
247
+ else if (name == " swift_willThrowTypedImpl" )
248
+ frame_sp = thread_sp->GetStackFrameAtIndex (2 );
249
+ else {
250
+ assert (false && " unexpected frame name" );
251
+ return {};
252
+ }
253
+
254
+ // Check if source is available for the identified frame.
255
+ SymbolContext sc = frame_sp->GetSymbolContext (eSymbolContextCompUnit);
256
+ if (!sc.comp_unit )
257
+ return {};
258
+
259
+ return frame_sp;
260
+ }
261
+
262
+ private:
263
+ StackFrameSP m_frame_sp;
264
+ };
265
+
266
+ RecognizedStackFrameSP RecognizeFrame (StackFrameSP frame) override {
267
+ return std::make_shared<SwiftExceptionFrame>(frame);
268
+ };
269
+
270
+ std::string GetName () override {
271
+ return " Swift exception breakpoint frame recognizer" ;
272
+ }
273
+ };
274
+
223
275
void RegisterSwiftFrameRecognizers (Process &process) {
224
276
RegularExpressionSP module_regex_sp = nullptr ;
225
277
auto &manager = process.GetTarget ().GetFrameRecognizerManager ();
@@ -245,6 +297,16 @@ void RegisterSwiftFrameRecognizers(Process &process) {
245
297
manager.AddRecognizer (srf_sp, module_regex_sp, symbol_regex_sp,
246
298
Mangled::NamePreference::ePreferMangled, false );
247
299
}
300
+ {
301
+ auto srf_sp = std::make_shared<SwiftExceptionBreakpointFrameRecognizer>();
302
+ ConstString module_name = ConstString (" swiftCore" );
303
+ if (auto platform_sp = process.GetTarget ().GetPlatform ())
304
+ module_name = platform_sp->GetFullNameForDylib (module_name);
305
+ manager.AddRecognizer (srf_sp, module_name,
306
+ {ConstString (" swift_willThrow" ),
307
+ ConstString (" swift_willThrowTypedImpl" )},
308
+ Mangled::NamePreference::ePreferMangled, false );
309
+ }
248
310
}
249
311
250
312
} // namespace lldb_private
0 commit comments