o
    'ѹgX#                     @   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 )NZtest_codegen)r   acquirer   codegenself r   \/Users/admin/.pyenv/versions/3.10.0/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 )NZcompiled_moduleZlinking_module)r   Zcreate_libraryllZparse_assemblyverifyZadd_llvm_moduleZadd_linking_library)r
   ZasmZlinking_asmlibraryZ	ll_moduleZ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   ZassertIsInstanceintr   assertEqualasm_sum_outerasm_sum_inner)r
   r   r   r    Zlibrary2r   r   r   test_get_pointer_to_functionZ   s   


z2JITCPUCodegenTestCase.test_get_pointer_to_functionc                 C   s0   | j  }t| td}| | | d S )NZxxx)r   Zmagic_tuplepickledumpsr   r%   )r
   tupZ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)
            )Z
test_classz-c)base64	b64encoder)   r*   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   r&   r'   serialize_using_bitcoder-   r
   r   r   r   r   r   "test_serialize_unserialize_bitcode      z8JITCPUCodegenTestCase.test_serialize_unserialize_bitcodec                 C   r<   r   )r   r&   r'   r=   r;   r>   r   r   r   &test_unserialize_other_process_bitcode   r@   z<JITCPUCodegenTestCase.test_unserialize_other_process_bitcodec                 C   *   |  tt}|  | }| | d S r   )r   r&   r'   enable_object_cachingserialize_using_object_coder-   r>   r   r   r   &test_serialize_unserialize_object_code      z<JITCPUCodegenTestCase.test_serialize_unserialize_object_codec                 C   rB   r   )r   r&   r'   rC   rD   r;   r>   r   r   r   *test_unserialize_other_process_object_code   rF   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   r&   r'   rC   rD   warningscatch_warningsZget_llvm_strZget_asm_strZget_function_cfgr%   lenr   r   simplefilterZassertNotEqualZassertInstrmessageassertRaises	NameError	exception)r
   r   r   wZold_llvmZold_asmr   Z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   r&   r'   rC   r=   rD   weakrefrefZ_final_moduleZassertIs)r
   r   uvr   r   r   test_library_lifetime   s   
z+JITCPUCodegenTestCase.test_library_lifetimer   )r3   
__module____qualname____doc__r   r   r   classmethodr"   r(   r,   r-   r;   r?   rA   rE   rG   rU   unittestZexpectedFailurerZ   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 )NrJ   )listr   r   r   r   foo   s   
z4TestWrappers.test_noinline_on_main_call.<locals>.foor   $z\$z
.*call.*{}z.*(#[0-9]+).*r   rJ   z^attributes\s+{}z\s+=\s+{(.*)}.*$ Znoinlinez!Metadata did not match 'noinline')r   Z
signaturesZ	overloadsZfndescZmangled_namereplaceformatrecompileZinspect_llvm
splitlinesmatchappendgroupsr%   rM   reversedstripsplitZfail)r
   rb   sigolnamep1p2Z	call_sitelinesZmeta_data_idxlmatchedZ	attr_siteZ	meta_dataZlmetaxr   r   r   test_noinline_on_main_call   sD   







z'TestWrappers.test_noinline_on_main_callN)r3   r[   r\   ry   r   r   r   r   r`      s    r`   __main__)r]   rK   r/   ctypesr)   rg   r4   r6   rV   Zllvmlite.bindingZbindingr   r_   Znumbar   Znumba.core.codegenr   Znumba.core.compiler_lockr   Znumba.tests.supportr   r#   r'   r&   	CFUNCTYPEc_intr   r   r`   r3   mainr   r   r   r   <module>   s2    

 5