[FFmpeg-devel] [PATCH 7/7] x86inc: Add debug symbols indicating sizes of compiled functions

Henrik Gramner henrik at gramner.com
Sun Jan 17 23:59:14 CET 2016


From: Geza Lore <gezalore at gmail.com>

Some debuggers/profilers use this metadata to determine which function a
given instruction is in; without it they get can confused by local labels
(if you haven't stripped those). On the other hand, some tools are still
confused even with this metadata. e.g. this fixes `gdb`, but not `perf`.

Currently only implemented for ELF.
---
 libavcodec/x86/proresdsp.asm     |  2 +-
 libavcodec/x86/simple_idct10.asm |  2 +-
 libavutil/x86/x86inc.asm         | 23 +++++++++++++++++++++++
 tests/checkasm/x86/checkasm.asm  |  8 ++++----
 4 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/libavcodec/x86/proresdsp.asm b/libavcodec/x86/proresdsp.asm
index edfd2f7..16fc262 100644
--- a/libavcodec/x86/proresdsp.asm
+++ b/libavcodec/x86/proresdsp.asm
@@ -48,7 +48,7 @@ cextern w7_min_w5
 
 %include "libavcodec/x86/simple_idct10_template.asm"
 
-section .text align=16
+SECTION .text
 
 %macro idct_fn 0
 cglobal prores_idct_put_10, 4, 4, 15
diff --git a/libavcodec/x86/simple_idct10.asm b/libavcodec/x86/simple_idct10.asm
index cd83d61..5dee533 100644
--- a/libavcodec/x86/simple_idct10.asm
+++ b/libavcodec/x86/simple_idct10.asm
@@ -65,7 +65,7 @@ CONST_DEC  w7_min_w5,    W7sh2, -W5sh2
 
 %include "libavcodec/x86/simple_idct10_template.asm"
 
-section .text align=16
+SECTION .text
 
 %macro idct_fn 0
 cglobal simple_idct10, 1, 1, 16
diff --git a/libavutil/x86/x86inc.asm b/libavutil/x86/x86inc.asm
index be73f0e..207580b 100644
--- a/libavutil/x86/x86inc.asm
+++ b/libavutil/x86/x86inc.asm
@@ -633,6 +633,7 @@ DECLARE_ARG 7, 8, 9, 10, 11, 12, 13, 14
     %else
         rep ret
     %endif
+    annotate_function_size
 %endmacro
 
 %define last_branch_adr $$
@@ -641,6 +642,7 @@ DECLARE_ARG 7, 8, 9, 10, 11, 12, 13, 14
         times ((last_branch_adr-$)>>31)+1 rep ; times 1 iff $ == last_branch_adr.
     %endif
     ret
+    annotate_function_size
 %endmacro
 
 %macro BRANCH_INSTR 0-*
@@ -665,6 +667,7 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, jnl, jnle, jg, jge, jng, jnge, ja, jae,
     %elif %2
         jmp %1
     %endif
+    annotate_function_size
 %endmacro
 
 ;=============================================================================
@@ -686,6 +689,7 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, jnl, jnle, jg, jge, jng, jnge, ja, jae,
     cglobal_internal 0, %1 %+ SUFFIX, %2
 %endmacro
 %macro cglobal_internal 2-3+
+    annotate_function_size
     %if %1
         %xdefine %%FUNCTION_PREFIX private_prefix
         %xdefine %%VISIBILITY hidden
@@ -699,6 +703,7 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, jnl, jnle, jg, jge, jng, jnge, ja, jae,
         CAT_XDEFINE cglobaled_, %2, 1
     %endif
     %xdefine current_function %2
+    %xdefine current_function_section __SECT__
     %if FORMAT_ELF
         global %2:function %%VISIBILITY
     %else
@@ -747,6 +752,24 @@ BRANCH_INSTR jz, je, jnz, jne, jl, jle, jnl, jnle, jg, jge, jng, jnge, ja, jae,
     [SECTION .note.GNU-stack noalloc noexec nowrite progbits]
 %endif
 
+; Tell debuggers how large the function was.
+; This may be invoked multiple times per function; we rely on later instances overriding earlier ones.
+; This is invoked by RET and similar macros, and also cglobal does it for the previous function,
+; but if the last function in a source file doesn't use any of the standard macros for its epilogue,
+; then its size might be unspecified.
+%macro annotate_function_size 0
+    %ifdef __YASM_VER__
+        %ifdef current_function
+            %if FORMAT_ELF
+                current_function_section
+                %%ecf equ $
+                size current_function %%ecf - current_function
+                __SECT__
+            %endif
+        %endif
+    %endif
+%endmacro
+
 ; cpuflags
 
 %assign cpuflags_mmx      (1<<0)
diff --git a/tests/checkasm/x86/checkasm.asm b/tests/checkasm/x86/checkasm.asm
index e1dde6e..d12333b 100644
--- a/tests/checkasm/x86/checkasm.asm
+++ b/tests/checkasm/x86/checkasm.asm
@@ -66,14 +66,14 @@ cextern fail_func
 ;-----------------------------------------------------------------------------
 cglobal stack_clobber, 1,2
     ; Clobber the stack with junk below the stack pointer
-    %define size (max_args+6)*8
-    SUB  rsp, size
-    mov   r1, size-8
+    %define argsize (max_args+6)*8
+    SUB  rsp, argsize
+    mov   r1, argsize-8
 .loop:
     mov [rsp+r1], r0
     sub   r1, 8
     jge .loop
-    ADD  rsp, size
+    ADD  rsp, argsize
     RET
 
 %if WIN64
-- 
1.9.1



More information about the ffmpeg-devel mailing list