
    daf-                     *   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZmZ d dlmZ ej                  s e j                   d       ej"                  ddd      r e j                   d      d	 Z e       s e j                   d
       G d de j&                        Zd Zd Zd Z e j0                   e       d       e j0                   e       d       G d de j&                                      Zedk(  r e j6                          yy)    N)support)make_scriptassert_python_failureassert_python_ok)temp_dirztest module requires subprocessT)addressmemoryubz,test crash randomly on ASAN/MSAN/UBSAN buildc                  N    t        j                  d      } | syt        |       dk(  S )NPY_HAVE_PERF_TRAMPOLINEF   )	sysconfigget_config_varint)perf_trampolines    2/root/Python-3.12.4/Lib/test/test_perf_profiler.pysupports_trampoline_profilingr      s)    ../HIO1$$    z'perf trampoline profiling not supportedc                   N     e Zd Z fdZd	 fdZd Zd Zd Zd Zd Z	d Z
 xZS )
TestPerfTrampolinec                     t         |           t        t        j                  d      j                  d            | _        y Nz/tmp/z
perf-*.mapsupersetUpsetpathlibPathglob
perf_filesself	__class__s    r   r   zTestPerfTrampoline.setUp&   ,    gll7388FGr   c                     t         |           t        t        j                  d      j                  d            | j                  z
  }|D ]  }|j                           y r   r   tearDownr   r   r   r   r    unlinkr"   files_to_deletefiler#   s      r   r'   zTestPerfTrampoline.tearDown*   R    W%**<89DOOK 	 $ 	DKKM	r   c                    d}t               5 }t        |d|      }t        j                  t        j
                  d|gdt        j                  t        j                        5 }|j                         \  }}d d d        d d d        | j                  d       | j                  d       t        j                  dj                   d      }| j                  |j                                |j                         }|j                         }	d	 d
| d| g}
|
D ]  t!        fd|	D        d       }| j#                  |d d       |j%                  d      d   }| j'                  |j)                  d      d       | j                  t+        |      j-                  t.        j0                        d        y # 1 sw Y   FxY w# 1 sw Y   KxY w)Nzif 1:
                def foo():
                    pass

                def bar():
                    foo()

                def baz():
                    bar()

                baz()
                perftest-XperfTtextstderrstdout 
/tmp/perf-.mappy::foo:py::bar:py::baz:c              3   ,   K   | ]  }|v s|  y w)N ).0lineexpected_symbols     r   	<genexpr>z;TestPerfTrampoline.test_trampoline_works.<locals>.<genexpr>R   s     Ut_PT=TdUs   	zCould not find z in perf file r   0xz&Address should not be prefixed with 0xz*Address should contain only hex characters)r   r   
subprocessPopensys
executablePIPEcommunicateassertEqualr   r   pid
assertTrueexists	read_text
splitlinesnextassertIsNotNonesplitassertFalse
startswithr   issubsetstring	hexdigits)r"   code
script_dirscriptprocessr3   r2   	perf_fileperf_file_contents
perf_linesexpected_symbols	perf_line	perf_addrr>   s                @r   test_trampoline_worksz(TestPerfTrampoline.test_trampoline_works2   s    Z 	7: Z>F!!62!!	 7
 !(!4!4!67	7 	$$LL:gkk]$!?@		((*+&002'224
&vh/8F81DQWPXFYZ/ 	uOUzUW[\I  oo=Nm,\]!,Q/IY11$79abOOC	N33F4D4DEGst	u!7 7	7 	7s$   AG"F:6G:G	?GGc                    d}t               5 }t        |d|      }t        j                  t        j
                  d|gdt        j                  t        j                        5 }|j                         \  }}d d d        d d d        | j                  j                  d       | j                  d       t        j                               }t        j                  d|j                   d	      }t        j                  d| d	      }	| j                  |j!                                | j                  |	j!                                |j#                         }
| j%                  d
 |
       | j%                  d| |
       | j%                  d| |
       |	j#                         }| j%                  d| |       | j%                  d| |       | j%                  d| |       y # 1 sw Y   rxY w# 1 sw Y   wxY w)Na  if 1:
                import os, sys

                def foo_fork():
                    pass

                def bar_fork():
                    foo_fork()

                def baz_fork():
                    bar_fork()

                def foo():
                    pid = os.fork()
                    if pid == 0:
                        print(os.getpid())
                        baz_fork()
                    else:
                        _, status = os.waitpid(-1, 0)
                        sys.exit(status)

                def bar():
                    foo()

                def baz():
                    bar()

                baz()
                r.   r/   Tr0   r   r4   r5   r6   r7   r8   r9   zpy::foo_fork:zpy::bar_fork:zpy::baz_fork:)r   r   rB   rC   rD   rE   rF   rG   rH   
returncoder   stripr   r   rI   rJ   rK   rL   assertIn)r"   rV   rW   rX   rY   r3   r2   	child_pidrZ   perf_child_filer[   child_perf_file_contentss               r    test_trampoline_works_with_forksz3TestPerfTrampoline.test_trampoline_works_with_forksX   s   : Z 	7: Z>F!!62!!	 7
 !(!4!4!67	7 	++Q/$'	LL:gkk]$!?@	!,,I;d'CD	((*+..01&002)+=>)+=>)+=>#2#<#<#> fX.0HIfX.0HIfX.0HI17 7	7 	7s$   AG2!G%5G2%G/	*G22G<c                    d}t               5 }t        |d|      }t        j                  t        j
                  |gdt        j                  t        j                        5 }|j                         \  }}d d d        d d d        | j                  d       | j                  d       t        j                  dj                   d      }| j                  |j                                |j                         }| j                  d |       | j!                  d	| |       | j!                  d
| |       | j!                  d| |       y # 1 sw Y   xY w# 1 sw Y   xY w)Na  if 1:
                import sys
                def foo():
                    pass

                def spam():
                    pass

                def bar():
                    sys.deactivate_stack_trampoline()
                    foo()
                    sys.activate_stack_trampoline("perf")
                    spam()

                def baz():
                    bar()

                sys.activate_stack_trampoline("perf")
                baz()
                r.   Tr0   r4   r5   r6   r7   z	py::spam:r8   r9   )r   r   rB   rC   rD   rE   rF   rG   rH   r   r   rI   rJ   rK   rL   assertNotInrd   )	r"   rV   rW   rX   rY   r3   r2   rZ   r[   s	            r   test_sys_apizTestPerfTrampoline.test_sys_api   sG   ( Z 	7: Z>F!!(!!	 7
 !(!4!4!67	7 	$$LL:gkk]$!?@		((*+&0028F8,.@A	&*,>?)+=>)+=>#7 7	7 	7s$   AE E4EE	EE$c                      d}t        d|       y )Nzif 1:
                import sys
                sys.activate_stack_trampoline("perf")
                sys.activate_stack_trampoline("perf")
                -cr   r"   rV   s     r   %test_sys_api_with_existing_trampolinez8TestPerfTrampoline.test_sys_api_with_existing_trampoline   s    
 	t$r   c                 h    d}t        d|      \  }}}| j                  d|j                                y )Nzjif 1:
                import sys
                sys.activate_stack_trampoline("invalid")
                rm   zinvalid backend: invalid)r   rd   decode)r"   rV   rcouterrs        r   $test_sys_api_with_invalid_trampolinez7TestPerfTrampoline.test_sys_api_with_invalid_trampoline   s2     -T48C0#**,?r   c                      d}t        d|       y )Na  if 1:
                import sys
                sys.activate_stack_trampoline("perf")
                assert sys.is_stack_trampoline_active() is True
                sys.deactivate_stack_trampoline()
                assert sys.is_stack_trampoline_active() is False
                rm   rn   ro   s     r   test_sys_api_get_statusz*TestPerfTrampoline.test_sys_api_get_status   s     	t$r   returnN)__name__
__module____qualname__r   r'   r`   rh   rk   rp   rv   rx   __classcell__r#   s   @r   r   r   %   s2    H$uL8Jt(?T%@%r   r   c                  :    t        j                  d      } | syd| v S )NPY_CORE_CFLAGSFzno-omit-frame-pointer)r   r   )cflagss    r   is_unwinding_reliabler      s$    %%&67F"f,,r   c                     	 ddg} t        j                  | d      }d|vryt	               5 }	 |dz   }ddd	d
d|dt
        j                  ddf
} t        j                  | |dt         j                        }d|vr
	 d d d        y	 d d d        y# t         j                  t        f$ r Y yw xY w# t         j                  t        f$ r Y d d d        yw xY w# 1 sw Y   yxY w)Nperfz--helpT)r1   Fz	perf.data/perf_output.perfrecord-g--call-graph=fp-o--rm   zprint("hello"))cwdr1   r2   hello)rB   check_outputSubprocessErrorOSErrorr   rD   rE   STDOUT)cmdr3   rW   output_files       r   perf_command_worksr      s   x ((48 &  
 z	$'::K! C  ,,$z7H7HF & - * !+0 C &&0 6 **G4 	' $	%0 s@   B CAB+4CB('B(+CCCCCc                 P   |r0t         j                  j                         }|j                  |       nd }| dz   }ddddd|df}t	        j
                  ||z   t        j                  t        j                  |      }|j                  r-t        |j                         t        d	|j                         d
}t	        j
                  ddd|ft        j                  t        j                  |d      }|j                  j                  dd      |j                  j                  dd      fS )Nr   r   r   r   r   r   r   )r3   r2   envzPerf failed with return code )r   rX   rX   z-iT)r3   r2   r   checkzutf-8replace)osenvironcopyupdaterB   runrF   rb   printr2   
ValueErrorr3   rr   )r   argsenv_varsr   r   base_cmdprocs          r   run_perfr     s   jjoo

8++K$(94dSH>>4	D dkk88IJKK!H>>	4-D ;;gy14;;3E3E4  r   zperf command doesn't workzUnwinding is unreliablec                   6     e Zd Z fdZd fdZd Zd Z xZS )TestPerfProfilerc                     t         |           t        t        j                  d      j                  d            | _        y r   r   r!   s    r   r   zTestPerfProfiler.setUp(  r$   r   c                     t         |           t        t        j                  d      j                  d            | j                  z
  }|D ]  }|j                           y r   r&   r)   s      r   r'   zTestPerfProfiler.tearDown,  r,   r   c                 @   t               5 }d}t        |d|      }t        |t        j                  d|      \  }}| j                  |d       | j                  d| |       | j                  d| |       | j                  d| |       d d d        y # 1 sw Y   y xY w)N!  if 1:
                def foo(n):
                    x = 0
                    for i in range(n):
                        x += i

                def bar(n):
                    foo(n)

                def baz(n):
                    bar(n)

                baz(10000000)
                r.   r/   r4   r7   r8   r9   )r   r   r   rD   rE   rH   rd   r"   rW   rV   rX   r3   r2   s         r   7test_python_calls_appear_in_the_stack_if_perf_activatedzHTestPerfProfiler.test_python_calls_appear_in_the_stack_if_perf_activated4  s    Z 	7:D !Z>F%j#..(FSNFFVR(MMHVH-v6MMHVH-v6MMHVH-v6+	7 	7 	7s   B BBc                 >   t               5 }d}t        |d|      }t        |t        j                  |      \  }}| j                  |d       | j                  d| |       | j                  d| |       | j                  d| |       d d d        y # 1 sw Y   y xY w)Nr   r.   r4   r7   r8   r9   )r   r   r   rD   rE   rH   rj   r   s         r   >test_python_calls_do_not_appear_in_the_stack_if_perf_activatedzOTestPerfProfiler.test_python_calls_do_not_appear_in_the_stack_if_perf_activatedL  s    Z 	::D !Z>F%j#..&INFFVR(xx0&9xx0&9xx0&9+	: 	: 	:s   A?BBry   )r{   r|   r}   r   r'   r   r   r~   r   s   @r   r   r   %  s    H70:r   r   __main__)unittestrT   rB   rD   r   r   r   testr   test.support.script_helperr   r   r   test.support.os_helperr   has_subprocess_supportSkipTestcheck_sanitizerr   TestCaser   r   r   r   
skipUnlessr   r{   mainr;   r   r   <module>r      s)      
  	   
 , %%
(

=
>>74> (

J
KK% %&
(

E
FFo%** o%d-%P> ')+FG*,.GH;:x(( ;: I H;:| zHMMO r   