Re: Remote query for structure layout

David Blaikie via Gdb <[email protected]>
Newsgroups gmane.comp.gdb.devel
Message-ID <CAENS6EuJwV4sxM6NwdffQ5bpPqkPrdk62qD_PNo0Jiy3pQqv=Q@mail.gmail.com>
(let me know if I'm just being an unhelpful bystander here - I clearly
don't have a lot of context)

On Tue, Mar 30, 2021 at 5:16 PM Simon Marchi <[email protected]> wrote:
>
> On 2021-03-30 6:44 p.m., David Blaikie wrote:
> > If it's "just" some user-code, is there a variable of the desired type being declared around the function call?
>
> AFAIK, this type wouldn't be used by the FreeRTOS code at all, so no.
> Again, here's my understanding, hopefully it's close enough to the
> reality.
>
> When a trap occurs, FreeRTOS saves the current task's register values on
> the task's stack, using some arch-specific assembly code.  For example,
> for RISC-V:
>
>     https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/534eba66ce4a5bda45d5edeeb81ac5a3cf6d0df8/portable/GCC/RISC-V/portASM.S#L121

Ah, OK. So this is part of signal handling - so it's not part of the
code that's compiled into the user's program, for instance... not even
in some system library linked in, necessarily, I guess?

> The way these registers are pushed is an implementation detail of
> FreeRTOS.  And we can imagine that it can vary depending on the
> compile-time FreeRTOS configuration,

I guess in the worst case it could be totally dynamic - it could pick
a different layout each time.

(guess a side question: How's this different from other systems? I
don't know how other/more common systems handle registers during
signals)

> which OpenOCD doesn't know about.
>
> To get register values of scheduled out tasks, OpenOCD needs to
> interpret these register values from the tasks' stacks.
>
> So Tim's suggestion is: have FreeRTOS declare a structure that has the
> exact layout as the saved registers on the stack:
>
> struct freertos_saved_regs {
>   int x1;
>   int x5;
>   int x6;
>   ...
> };
>
> Consumers could read that structure's layout from the DWARF info, and
> read the register values based on that.  That would be a lot more robust
> than hard-coding in the consumers how FreeRTOS stores things.

If practical experience has shown the hard-coding is not
stable/reliable (than FreeRTOS does change its strategy from time to
time - but it's always constant for any given build of the FreeRTOS) I
guess.

But I'm not sure where FreeRTOS would expose this structure to user
code - it's not like there's a system library header that user code
must include...

> However, since that struct would never actually be used by FreeRTOS'
> code, the compiler won't emit it.  Hence the need to find a way to force
> the compiler to include it in the DWARF.
>
> Does that clarify the situation?

Somewhat - any lack of understanding is just my ignorance in this
field/area in general, to be clear. (I'm also not a core gdb
developer, so I'm not the sort of person you have to convince of
anything - just a curious bystander trying to understand/maybe offer
some insightful suggestions (I predominantly work on LLVM's debug info
emission, so that's my background/connection))

- Dave
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.