GSoC'11: DWARF2 call frame information
Xingxing Pan
panxingxing at mprc.pku.edu.cn
Mon Mar 21 09:36:14 UTC 2011
2011/3/21 Chagin Dmitry <dchagin at freebsd.org>:
> On Sun, Mar 20, 2011 at 11:24:21PM +0800, Xingxing Pan wrote:
>> >>
>> >
>> > hm, you should add the .cfi directive in each .S file by hand:
>> > http://www.logix.cz/michal/devel/gas-cfi/
>> >
>> > --
>> > Have fun!
>> > chd
>> >
>>
>> Thanks for your reply. I think I have got the idea.
>> For the object files generated by the toolchain, there's no need to worry about
>> DWARF call frame information if the DWARF is supported by the toolchain.But
>> the assembly written by hand is an exception.
>> Different architecture has different assembly. That means I have to add DWARF
>> for all these architectures currently supported by FreeBSD. Maybe I need a
>> powerfull script.
>>
>> Xingxing Pan
>
> hmm, which script? I think enough amd64, i386 and amd64/ia32.
>
> I suggest to write a example before continuing the conversation
> about the GSoC. For example (bcopy || bzero) && cpu_switch.
> Is it ok for you?
>
> --
> Have fun!
> chd
>
Hi Chargin,
Thank you for your reply.
The followings shows how I try to add DWARF for bcopy.
--- ../8.2.0/sys/i386/include/asm.h 2011-03-21 14:35:56.111973722 +0800
+++ asm.h 2011-03-21 15:25:31.564636162 +0800
@@ -71,7 +71,7 @@
#define _ENTRY(x) _START_ENTRY; \
.globl CNAME(x); .type CNAME(x), at function; CNAME(x):
-#define END(x) .size x, . - x
+#define END(x) .cfi_endproc; .size x, . - x
#ifdef PROF
#define ALTENTRY(x) _ENTRY(x); \
@@ -80,9 +80,10 @@
popl %ebp; \
jmp 9f
#define ENTRY(x) _ENTRY(x); \
- pushl %ebp; movl %esp,%ebp; \
+ .cfi_startproc; \
+ pushl %ebp; .cfi_adjust_cfa_offset 4; movl
%esp,%ebp; .cfi_def_cfa_register %ebp; \
call PIC_PLT(HIDENAME(mcount)); \
- popl %ebp; \
+ popl %ebp; .cfi_def_cfa %esp, 4; \
--- bcopy.S 2011-03-21 15:51:26.804203809 +0800
+++ ../8.2.0/lib/libc/i386/string/bcopy.S 2011-03-21
14:28:15.023069890 +0800
@@ -51,9 +51,7 @@ ENTRY(bcopy)
#endif
#endif
pushl %esi
- .cfi_adjust_cfa_offset 4;
pushl %edi
- .cfi_adjust_cfa_offset 4;
#if defined(MEMCOPY) || defined(MEMMOVE)
movl 12(%esp),%edi
movl 16(%esp),%esi
@@ -77,9 +75,7 @@ ENTRY(bcopy)
rep
movsb
popl %edi
- .cfi_adjust_cfa_offset -4;
popl %esi
- .cfi_adjust_cfa_offset -4;
ret
1:
addl %ecx,%edi /* copy backwards. */
@@ -98,9 +94,7 @@ ENTRY(bcopy)
rep
movsl
popl %edi
- .cfi_adjust_cfa_offset -4;
popl %esi
- .cfi_adjust_cfa_offset -4;
cld
ret
#ifdef MEMCOPY
But I don't know how to add DWARF for cpu_switch, because I have no
idea about the circumstance when we need to backtrace through this
function. Suppose there's a cpu switch like this,
threadA->kernel->threadB. Then should the expected backtrace has the
following result?
threadB's stack
kernel's stack
threadA's stack
More information about the freebsd-hackers
mailing list