When supporting a new architecture, our preferred route is to modify 
lldb-server (a GDB server binary that supports native debugging) to support 
your architecture. Why? Because this gets you remote debugging for free. If you 
go this route, then you will subclass a lldb_private::NativeRegisterContext and 
that will get used by lldb-server (along with 
lldb_private::NativeProcessProtocol and lldb_private::NativeThreadProtocol). If 
you are adding a new architecture to Linux, then you will likely just need to 
subclass NativeRegisterContext.

The other way to go is to subclass lldb_private::Process, lldb_private::Thread 
and lldb_private::RegisterContext. 

The nice thing about the lldb_private::Native* subclasses is that you only need 
to worry about native support. You can use #ifdef and use system header files, 
where as the non native route, those classes need to be able to debug remotely 
and you can't rely on system headers (lldb_private::Process, 
lldb_private::Thread and lldb_private::RegisterContext) since they can be 
compiled on any system for possibly local debugging (if current arch/vendor/os 
matches the current system) and remote (if you use lldb-server or another form 
for RPC).

I would highly suggest getting going the lldb-server route as then you can use 
system header files that contain the definitions of the registers and you only 
need to worry about the native architecture. Linux uses ptrace and has much the 
the common code filtered out into correct classes (posix ptrace, linux 
specifics, and more.

What architecture and os are you looking to support?

Greg Clayton

> On Sep 16, 2017, at 6:28 AM, Ramana <ramana.venka...@gmail.com> wrote:
> 
> Thank you Greg for the detailed response.
> 
> Can you please also shed some light on the NativeRegisterContext. When
> do we need to subclass NativeRegisterContext and (how) are they
> related to RegisterContext<OS>_<Arc
> It appears that not all architectures having
> RegisterContext<OS>_<Arch> have sub classed NativeRegisterContext.
> 
> Regards,
> Ramana
> 
> On Thu, Sep 14, 2017 at 9:02 PM, Greg Clayton <clayb...@gmail.com> wrote:
>> Seems like this class was added for testing. RegisterInfoInterface is a 
>> class that creates a common API for getting lldb_private::RegisterInfo 
>> structures.
>> 
>> A RegisterContext<OS>_<Arch> class uses one of these to be able to create a 
>> buffer large enough to store all registers defined in the 
>> RegisterInfoInterface and will actually read/write there registers to/from 
>> the debugged process. RegisterContext also caches registers values so they 
>> don't get read multiple times when the process hasn't resumed. A 
>> RegisterContext subclass is needed for each architecture so we can 
>> dynamically tell LLDB what the registers look like for a given architecture. 
>> It also provides abstractions by letting each register define its registers 
>> numbers for Compilers, DWARF, and generic register numbers like PC, SP, FP, 
>> return address, and flags registers. This allows the generic part of LLDB to 
>> say "I need you to give me the PC register for this thread" and we don't 
>> need to know that the register is "eip" on x86, "rip" on x86_64, "r15" on 
>> ARM. RegisterContext classes can also determine how registers are 
>> read/written: one at a time, or "get all general purpose regs" and "get all 
>> FPU regs". So if someone asks a RegisterContext to read the PC, it might go 
>> read all GPR regs and then mark them all as valid in the register context 
>> buffer cache, so if someone subsequently asks for SP, it will be already 
>> cached.
>> 
>> So RegisterInfoInterface defines a common way that many RegisterContext 
>> classes can inherit from in order to give out the lldb_private::RegisterInfo 
>> (which is required by all subclasses of RegisterContext) info for a register 
>> context, and RegisterContext is the one that actually will interface with 
>> the debugged process in order to read/write and cache those registers as 
>> efficiently as possible for the current program being debugged.
>> 
>>> On Sep 12, 2017, at 10:59 PM, Ramana via lldb-dev <lldb-dev@lists.llvm.org> 
>>> wrote:
>>> 
>>> Hi,
>>> 
>>> When deriving RegisterContext<OS>_<Arch>, why some platforms (Arch+OS)
>>> are deriving it from lldb_private::RegisterContext while others are
>>> deriving from lldb_private::RegisterInfoInterface or in other words
>>> how to decide on the base class to derive from between those two and
>>> what are the implications?
>>> 
>>> Thanks,
>>> Ramana
>>> _______________________________________________
>>> lldb-dev mailing list
>>> lldb-dev@lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>> 

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to