Thank you so much Greg for your comments. > What architecture and os are you looking to support?
The OS is Linux and the primary use scenario is remote debugging. Basically http://lists.llvm.org/pipermail/lldb-dev/2017-June/012445.html is what I am trying to achieve and unfortunately that query did not get much attention of the members. Thanks, Ramana On Mon, Sep 18, 2017 at 8:46 PM, Greg Clayton <clayb...@gmail.com> wrote: > 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