o
    Z۷iX#                     @   s   d 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ZddlZddl	m
Z ddlZddlmZ ddlmZ ddlmZ ddlmZ dZdZd	ZeejejejZG d
d deZG dd deZedkrne  dS dS )z
Tests for numba.core.codegen.
    N)njit)JITCPUCodegen)global_compiler_lock)TestCasezb
    define i32 @sum(i32 %.1, i32 %.2) {
      %.3 = add i32 %.1, %.2
      ret i32 %.3
    }
    z
    define i32 @"__main__.ising_element_update$1.array(int8,_2d,_C).int64.int64"(i32 %.1, i32 %.2) {
      %.3 = add i32 %.1, %.2
      ret i32 %.3
    }
a  
    declare i32 @"__main__.ising_element_update$1.array(int8,_2d,_C).int64.int64"(i32 %.1, i32 %.2)

    define i32 @sum(i32 %.1, i32 %.2) {
      %.3 = call i32 @"__main__.ising_element_update$1.array(int8,_2d,_C).int64.int64"(i32 %.1, i32 %.2)
      ret i32 %.3
    }
c                   @   s   e Zd ZdZdd Zdd ZdddZed	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zejdd ZdS ) JITCPUCodegenTestCasez'
    Test the JIT code generation.
    c                 C   s   t   td| _d S )Ntest_codegen)r   acquirer   codegenself r   N/home/ubuntu/vllm_env/lib/python3.10/site-packages/numba/tests/test_codegen.pysetUp;   s   zJITCPUCodegenTestCase.setUpc                 C   s   | ` t  d S N)r	   r   releaser
   r   r   r   tearDown?   s   zJITCPUCodegenTestCase.tearDownNc                 C   sb   | j d}t|}|  || |r/| j d}t|}|  || || |S )Ncompiled_modulelinking_module)r	   create_libraryllparse_assemblyverifyadd_llvm_moduleadd_linking_library)r   asmlinking_asmlibrary	ll_modulelinking_libraryr   r   r   compile_moduleC   s   




z$JITCPUCodegenTestCase.compile_modulec                 C   sN   t d}||}|d}|sJ |t|}|dd}|dks%J |d S )Nother_codegensum         )r   unserialize_libraryget_pointer_to_functionctypes_sum_ty)clsstater	   r   ptrcfuncresr   r   r   _check_unserialize_sumP   s   


z,JITCPUCodegenTestCase._check_unserialize_sumc                 C   sz   |  t}|d}| |t t|}| |ddd |  tt}|d}| |t t|}| |ddd d S )Nr!   r"   r#   r$   )	r   asm_sumr&   assertIsInstanceintr'   assertEqualasm_sum_outerasm_sum_inner)r   r   r*   r+   library2r   r   r   test_get_pointer_to_functionZ   s   


z2JITCPUCodegenTestCase.test_get_pointer_to_functionc                 C   s0   | j  }t| td}| | | d S )Nxxx)r	   magic_tuplepickledumpsr   r1   )r   tupcg2r   r   r   test_magic_tuplel   s   

z&JITCPUCodegenTestCase.test_magic_tuplec                 C   s   |  | d S r   )r-   )r   r)   r   r   r   _check_serialize_unserializet   s   z2JITCPUCodegenTestCase._check_serialize_unserializec                 C   s@   t t|d}dt| jjd }tt	j
d|| g d S )Na  if 1:
            import base64
            import pickle
            import sys
            from numba.tests.test_codegen import %(test_class)s

            state = pickle.loads(base64.b64decode(sys.argv[1]))
            %(test_class)s._check_unserialize_sum(state)
            )
test_classz-c)base64	b64encoder8   r9   dict	__class____name__
subprocess
check_callsys
executabledecode)r   r)   argcoder   r   r    _check_unserialize_other_processw   s
   	z6JITCPUCodegenTestCase._check_unserialize_other_processc                 C   "   |  tt}| }| | d S r   )r   r2   r3   serialize_using_bitcoder=   r   r   r)   r   r   r   "test_serialize_unserialize_bitcode      z8JITCPUCodegenTestCase.test_serialize_unserialize_bitcodec                 C   rM   r   )r   r2   r3   rN   rL   rO   r   r   r   &test_unserialize_other_process_bitcode   rQ   z<JITCPUCodegenTestCase.test_unserialize_other_process_bitcodec                 C   *   |  tt}|  | }| | d S r   )r   r2   r3   enable_object_cachingserialize_using_object_coder=   rO   r   r   r   &test_serialize_unserialize_object_code      z<JITCPUCodegenTestCase.test_serialize_unserialize_object_codec                 C   rS   r   )r   r2   r3   rT   rU   rL   rO   r   r   r   *test_unserialize_other_process_object_code   rW   z@JITCPUCodegenTestCase.test_unserialize_other_process_object_codec              	   C   s  |  tt}|  | }tjdd}| }| }|	d W d   n1 s,w   Y  | 
t|d td}||}tjdd}td | ||  W d   n1 s`w   Y  | 
t|d | d	t|d j tjdd}td | | | W d   n1 sw   Y  | 
t|d | d	t|d j tjdd'}td | t}|	d W d   n1 sw   Y  W d   n1 sw   Y  | 
t|d | d	t|d j | dt|j dS )
z	
        T)recordr!   Nr   r    always   zInspection disabled)r   r2   r3   rT   rU   warningscatch_warningsget_llvm_strget_asm_strget_function_cfgr1   lenr   r%   simplefilterassertNotEqualassertInstrmessageassertRaises	NameError	exception)r   r   r)   wold_llvmold_asmr	   raisesr   r   r   test_cache_disabled_inspection   sB   



z4JITCPUCodegenTestCase.test_cache_disabled_inspectionc                 C   s\   |  tt}|  |  |  t|}t|j}~| 	| d  | 	| d  d S r   )
r   r2   r3   rT   rN   rU   weakrefref_final_moduleassertIs)r   r   uvr   r   r   test_library_lifetime   s   
z+JITCPUCodegenTestCase.test_library_lifetimer   )rD   
__module____qualname____doc__r   r   r   classmethodr-   r5   r<   r=   rL   rP   rR   rV   rX   rn   unittestexpectedFailureru   r   r   r   r   r   6   s$    

	)r   c                   @   s   e Zd Zdd ZdS )TestWrappersc                 C   s.  t dd }|  |jd }|j| }|jjdd}d|}d}t|| }|	|
 }g }	|D ]}
||
}|rF|	| d  q4| t|	d | |	d |	d	  d
|	d }d}t|| }t|D ]$}
||
}|r| d }| d}|D ]
}d|v r  d S qqmqm| dS )Nc                   S   s
   t dgS )Nr[   )listr   r   r   r   foo   s   
z4TestWrappers.test_noinline_on_main_call.<locals>.foor   $z\$z
.*call.*{}z.*(#[0-9]+).*r"   r[   z^attributes\s+{}z\s+=\s+{(.*)}.*$ noinlinez!Metadata did not match 'noinline')r   
signatures	overloadsfndescmangled_namereplaceformatrecompileinspect_llvm
splitlinesmatchappendgroupsr1   ra   reversedstripsplitfail)r   r~   sigolnamep1p2	call_sitelinesmeta_data_idxlmatched	attr_site	meta_datalmetaxr   r   r   test_noinline_on_main_call   sD   







z'TestWrappers.test_noinline_on_main_callN)rD   rv   rw   r   r   r   r   r   r|      s    r|   __main__)rx   r\   r@   ctypesr8   r   rE   rG   ro   llvmlite.bindingbindingr   rz   numbar   numba.core.codegenr   numba.core.compiler_lockr   numba.tests.supportr   r.   r3   r2   	CFUNCTYPEc_intr'   r   r|   rD   mainr   r   r   r   <module>   s2    

 5