[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:03:41 PDT 2017


> 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