Commit 8166b2da authored by Russ Cox's avatar Russ Cox

runtime: record full frame size for arm _sfloat2

With preemption, _sfloat2 can show up in stack traces.
Write the function prototype in a way that accurately
shows the frame size and the fact that it might contain
pointers.

R=golang-dev, dvyukov
CC=golang-dev
https://golang.org/cl/11523043
parent 249f807c
...@@ -576,23 +576,44 @@ done: ...@@ -576,23 +576,44 @@ done:
return 0; return 0;
} }
// The ... here is because there are actually 16 registers typedef struct Sfregs Sfregs;
// being passed (r0, r1, and so on) amd we are too lazy
// to list them all. // NOTE: These are all recorded as pointers because they are possibly live registers,
// and we don't know what they contain. Recording them as pointers should be
// safer than not.
struct Sfregs
{
uint32 *r0;
uint32 *r1;
uint32 *r2;
uint32 *r3;
uint32 *r4;
uint32 *r5;
uint32 *r6;
uint32 *r7;
uint32 *r8;
uint32 *r9;
uint32 *r10;
uint32 *r11;
uint32 *r12;
uint32 *r13;
uint32 cspr;
};
#pragma textflag 7 #pragma textflag 7
uint32* uint32*
runtime·_sfloat2(uint32 *lr, uint32 r0, ...) runtime·_sfloat2(uint32 *lr, Sfregs regs)
{ {
uint32 skip; uint32 skip;
skip = stepflt(lr, &r0); skip = stepflt(lr, (uint32*)&regs.r0);
if(skip == 0) { if(skip == 0) {
runtime·printf("sfloat2 %p %x\n", lr, *lr); runtime·printf("sfloat2 %p %x\n", lr, *lr);
fabort(); // not ok to fail first instruction fabort(); // not ok to fail first instruction
} }
lr += skip; lr += skip;
while(skip = stepflt(lr, &r0)) while(skip = stepflt(lr, (uint32*)&regs.r0))
lr += skip; lr += skip;
return lr; return lr;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment