1
0
mirror of https://github.com/golang/go synced 2024-11-26 07:47:57 -07:00

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
This commit is contained in:
Russ Cox 2013-07-18 12:23:38 -04:00
parent 249f807c39
commit 8166b2da19

View File

@ -576,23 +576,44 @@ done:
return 0;
}
// The ... here is because there are actually 16 registers
// being passed (r0, r1, and so on) amd we are too lazy
// to list them all.
typedef struct Sfregs Sfregs;
// 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
uint32*
runtime·_sfloat2(uint32 *lr, uint32 r0, ...)
runtime·_sfloat2(uint32 *lr, Sfregs regs)
{
uint32 skip;
skip = stepflt(lr, &r0);
skip = stepflt(lr, (uint32*)&regs.r0);
if(skip == 0) {
runtime·printf("sfloat2 %p %x\n", lr, *lr);
fabort(); // not ok to fail first instruction
}
lr += skip;
while(skip = stepflt(lr, &r0))
while(skip = stepflt(lr, (uint32*)&regs.r0))
lr += skip;
return lr;
}