[lldb-dev] RegisterContextLLDB::ReadGPRValue isn't endian-aware

Félix Cloutier felixcca at yahoo.ca
Wed Aug 28 20:26:01 PDT 2013

Hello people,

I'm using lldb on an Intel Mac (little endian), and working on a stub for a program that emulates a PowerPC (big endian).

The GDB protocol says this about commands for reading registers:

> `XX...'
> Each byte of register data is described by two hex digits. The bytes with the register are transmitted in target byte order. The size of each register and their position within the `g' packet are determined by the GDB internal macros REGISTER_RAW_SIZE and REGISTER_NAME macros. The specification of several standard g packets is specified below.

So I'm doing just that, replying in big endian. However, RegisterContextLLDB::ReadGPRValue isn't endian-aware: GetRegisterContext()->ReadRegister (where RegisterContext is a GDBRemoteRegisterContext) reads my big endian response and writes it one byte at a time in the register values buffer, effectively swapping it.

From my analysis, GDBRemoteRegisterContext::ReadRegister could do the swapping transparently, but GetRegisterSet (among others?) would still return swapped values; otherwise, using the register metadata, it should be possible to do the swapping when the values are read.

How hard would it be to fix lldb? Would I be better off doing a quick hack in my own stub to throw little endian values at lldb in the short term?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20130828/e2ae275f/attachment.html>

More information about the lldb-dev mailing list