[lldb-dev] Linking the lldb C++API/library with other projects

Greg Clayton via lldb-dev lldb-dev at lists.llvm.org
Tue Aug 29 12:05:11 PDT 2017


By the way: "swift" ends up executing:


/Applications/Xcode.app/Contents/Developer/usr/bin/lldb --repl=-enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -color-diagnostics


> On Aug 29, 2017, at 12:03 PM, Greg Clayton <clayborg at gmail.com> wrote:
> 
> 
>> On Aug 29, 2017, at 11:41 AM, meister <chris.schaf at verizon.net> wrote:
>> 
>> Greg,
>> 
>> We are developing a compiler for Common Lisp that uses LLVM as the backend and interoperates with C++ - it has its own REPL and built in compiler.   
>> Our compiler generates llvm-ir that we link directly with llvm-ir generated from the C++ code using LTO.
>> I’ve exposed much of the LLVM C++ API and Clang ASTMatcher C++ API for automatic analysis and refactoring of our C++ code.
>> 
>> The Python API’s are not that useful to us.   
>> Although - maybe launching lldb as a separate process to get the backtrace with a python script may be a reasonable thing to do - if that’s all that I want to do.
>> I’d also like to explore accessing lexical variables and setting breakpoints and watchpoints using the C++ API.
>> The C++ API’s - they are much more straightforward to work with for us.
>> 
>> I am already using ‘backtrace’ - but I don’t get function arguments with that sadly.
> 
> You might think about integrating your REPL directly into LLDB? That is how we did it with Swift. Then you get everything for free:
> - debug your REPL code by setting breakpoints
> - when a REPL code snippet crashes, see the backtrace!
> 
> You might search for a Swift REPL demo and see what you think. 
> 
> 
> Below is an example of the Swift REPL that is built into LLDB:
> 
> $ swift
> Welcome to Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42). Type :help for assistance.
>  1> func foo() -> Int {
>  2.     return 12; 
>  3. } 
>  4. 
>  4> foo()
> $R0: Int = 12
> 
> 
> Any line that starts with ':' is a LLDB command. Below we set a breakpoint on line 2 of our REPL code:
> 
>  5> :b 2
> Breakpoint 1: where = $__lldb_expr3`__lldb_expr_2.foo () -> Swift.Int + 4 at repl.swift:2, address = 0x00000001000c5014
> 
> Now we can call foo() and hit our breakpoint:
> 
> 
>  5> foo()
> Execution stopped at breakpoint.  Enter LLDB commands to investigate (type help for assistance.)
> Process 40238 stopped
> * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
>    frame #0: 0x00000001000c5014 $__lldb_expr3`foo() -> Int at repl.swift:2
>   1   	func foo() -> Int {
> -> 2   	    return 12;
>   3   	}
>   4   	foo()
>   5   	foo()
> 
> 
> Note we drop into the LLDB command prompt. We can view variables, backtrace, etc. Here we just continue:
> 
> (lldb) c
> Process 40238 resuming
> 
> Now we are back in the REPL:
> 
>  6> func bar() -> Int { 
>  7.     return foo() + 23; 
>  8. } 
>  9> bar()
> 
> We are going to call "bar()" which will call "foo()" so we will hit the breakpoint again...
> 
> 
> Execution stopped at breakpoint.  Enter LLDB commands to investigate (type help for assistance.)
> Process 40238 stopped
> * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
>    frame #0: 0x00000001000c5014 $__lldb_expr3`foo() -> Int at repl.swift:2
>   1   	func foo() -> Int {
> -> 2   	    return 12;
>   3   	}
>   4   	foo()
>   5   	foo()
>   6   	func bar() -> Int {
>   7   	    return foo() + 23;
> (lldb) c
> Process 40238 resuming
> 10>  
> 
> 
> 
> 



More information about the lldb-dev mailing list