B
    Ꮚ\P                 @   s  d dl mZmZ d dlZd dlmZmZ d dlm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mZ d dlmZmZ d dlmZ d d	lmZ d
dlmZ e dkred dd ZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(G dd deZ)G dd de)Z*G dd de)Z+G dd  d e)Z,G d!d" d"e-Z.G d#d$ d$e.Z/G d%d& d&e)e/Z0G d'd( d(e)Z1G d)d* d*e)Z2G d+d, d,e)Z3G d-d. d.e)Z4G d/d0 d0e)Z5G d1d2 d2e-Z6G d3d4 d4e)e6Z7G d5d6 d6e)e6Z8G d7d8 d8e)e6Z9G d9d: d:e)Z:G d;d< d<e)Z;G d=d> d>e)Z<G d?d@ d@e0Z=G dAdB dBe)Z>e?e @dCdDG dEdF dFe)ZAG dGdH dHe)ZBeCdIkreD  dS )J    )print_functionabsolute_importN)	CFUNCTYPEc_int)find_library)contextmanager)mkstemp)sixir)binding)ffi   )TestCaseZarmv7lzlibgcc_s.so.1c           
   C   sT   t t j} z2yt t jd W n t jk
r6   dS X dS W d t t j|  X d S )Nde_DETF)locale	setlocaleLC_ALLError)Zcur r   :lib/python3.7/site-packages/llvmlite/tests/test_binding.pyno_de_locale   s    r   a  
    ; ModuleID = '<string>'
    target triple = "{triple}"
    %struct.glob_type = type {{ i64, [2 x i64]}}

    @glob = global i32 0
    @glob_b = global i8 0
    @glob_f = global float 1.5
    @glob_struct = global %struct.glob_type {{i64 0, [2 x i64] [i64 0, i64 0]}}

    define i32 @sum(i32 %.1, i32 %.2) {{
      %.3 = add i32 %.1, %.2
      %.4 = add i32 0, %.3
      ret i32 %.4
    }}
    z
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define i32 @sum(i32 %.1, i32 %.2) {{
      %.3 = add i32 %.1, %.2
      ret i32 %.3
    }}
    z
    ; ModuleID = '<string>'
    target triple = "{triple}"
    @mul_glob = global i32 0

    define i32 @mul(i32 %.1, i32 %.2) {{
      %.3 = mul i32 %.1, %.2
      ret i32 %.3
    }}
    z
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define i32 @sum(i32 %.1, i32 %.2) {{
      %.3 = fadd i32 %.1, %.2
      ret i32 %.3
    }}
    z
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define void @sum() {{
      %.bug = add i32 1, %.bug
      ret void
    }}
    zh
    ; ModuleID = '<string>'
    target triple = "{triple}"

    declare i32 @sum(i32 %.1, i32 %.2)
    z
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define void @foo() {{
      %const = fadd double 0.0, 3.14
      ret void
    }}
    z
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define void @foo() {{
      call void asm sideeffect "nop", ""()
      ret void
    }}
    a  
    ; ModuleID = "<string>"
    target triple = "{triple}"

    @A = global i32 undef

    define void @ctor_A()
    {{
      store i32 10, i32* @A
      ret void
    }}

    define void @dtor_A()
    {{
      store i32 20, i32* @A
      ret void
    }}

    define i32 @foo()
    {{
      %.2 = load i32, i32* @A
      %.3 = add i32 %.2, 2
      ret i32 %.3
    }}

    @llvm.global_ctors = appending global [1 x {{i32, void ()*, i8*}}] [{{i32, void ()*, i8*}} {{i32 0, void ()* @ctor_A, i8* null}}]
    @llvm.global_dtors = appending global [1 x {{i32, void ()*, i8*}}] [{{i32, void ()*, i8*}} {{i32 0, void ()* @dtor_A, i8* null}}]
    c               @   s<   e Zd Zdd Zdd ZedfddZdd	d
Zdd ZdS )BaseTestc             C   sB   t   t   t   t  tjd d  | _g tjd d < d S )N)llvm
initializeZinitialize_native_targetZinitialize_native_asmprintergccollectgarbageold_garbage)selfr   r   r   setUp   s    zBaseTest.setUpc             C   s   t   | t jg  | `d S )N)r   r   assertEqualr   r   )r   r   r   r   tearDown   s    zBaseTest.tearDownNc             C   s    |j t d}t||}|S )N)triple)formatr   get_default_tripleparse_assembly)r   asmcontextmodr   r   r   module   s    zBaseTest.moduleglobc             C   s   |d kr|   }||S )N)r)   get_global_variable)r   namer(   r   r   r   r*      s    zBaseTest.globc             C   s   t j }| S )N)r   Targetfrom_default_triplecreate_target_machine)r   targetr   r   r   target_machine   s    
zBaseTest.target_machine)r*   N)	__name__
__module____qualname__r   r!   asm_sumr)   r*   r1   r   r   r   r   r      s
   	
r   c               @   s@   e Zd ZdZeejddee	j
dddd ZdS )	TestDependencieszB
    Test DLL dependencies are within a certain expected set.
    linuxzLinux-specific testZLLVMLITE_DIST_TESTzDistribution-specific testc          
   C   sZ  t jj}tj }d|d< tjdd|gtj|d}|	 \}}| 
d|j td}t }xn|  D ]^}| }	|	rj|	d dkrj|	d	 }
||
}t|	d
ks|s| d|f  ||d	 qjW d|ksd|kr| d|f  tdddddddddg	}t dkr|d x6|D ].}
|
ds$|
|kr$| d|
|f  q$W d S )NCZLANGZobjdumpz-p)stdoutenvr   z$^([-_a-zA-Z0-9]+)\.so(?:\.\d+){0,3}$ZNEEDEDr      zinvalid NEEDED line: %rZlibcZ
libpthreadz#failed parsing dependencies? got %rZlibrtZlibdlZlibzlibmZlibgcc_szld-linuxZld64ZPyPyZlibtinfoz	ld-linux-zunexpected dependency %r in %r)r   lib_nameosenvironcopy
subprocessPopenPIPEZcommunicater    
returncoderecompilesetdecode
splitlinessplitmatchlenZfailaddgroupplatformZpython_implementation
startswith)r   Zlib_pathr:   pout_Zlib_patZdepslinepartsZdepmZallowedr   r   r   
test_linux   s4    




zTestDependencies.test_linuxN)r2   r3   r4   __doc__unittest
skipUnlesssysrP   rQ   r?   r@   getrX   r   r   r   r   r6      s   r6   c               @   s   e Zd Z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dd Zdd Zdd Zee ddd ZdS )TestMiscz7
    Test miscellaneous functions in llvm.binding.
    c             C   s   |  t d S )N)r)   r5   )r   r   r   r   test_parse_assembly   s    zTestMisc.test_parse_assemblyc          	   C   sF   |  t}| t W d Q R X t|j}| d| | d| d S )Nzparsing errorzinvalid operand type)assertRaisesRuntimeErrorr)   asm_parse_errorstr	exceptionassertIn)r   cmsr   r   r   test_parse_assembly_error   s
    
z"TestMisc.test_parse_assembly_errorc             C   s$   t j }t j }||ks td S )N)r   r'   Zget_global_contextAssertionError)r   Z	gcontext1Z	gcontext2r   r   r   test_global_context   s    

zTestMisc.test_global_contextc             C   sH   t dd t dd t d}| |d t d}| |d  d S )NZ__xyzzyi  i.  Z__foobar)r   Z
add_symbolZaddress_of_symbolr    assertIs)r   Zaddrr   r   r   test_dylib_symbols   s    

zTestMisc.test_dylib_symbolsc             C   s"   t  }| |t | | d S )N)r   r$   assertIsInstancerc   
assertTrue)r   r"   r   r   r   test_get_default_triple  s    z TestMisc.test_get_default_triplec             C   sR   t  }t  }| |t | | |d}|d}| |d |d  d S )N-r   )r   get_process_tripler$   rm   rc   rn   rK   r    )r   r"   defaultZdefault_partsZtriple_partsr   r   r   test_get_process_triple
  s    


z TestMisc.test_get_process_triplec             C   s  yt  }W n4 tk
r@   t  }|d}| j|dd d S X | |t | |t j x6|	 D ]*\}}| |t
 | | | |t qfW | | t
 d}d|}| t|d | t|d | t|d | t||  d S )	Nx86z(get_host_cpu_features() should not raise)msgz[+\-][a-zA-Z0-9\._-]+z^({0}|{0}(,{0})*)?$ z+aaz+a,-bb)r   Zget_host_cpu_featuresra   rq   rQ   assertFalserm   dictZ
FeatureMapitemsrc   rn   boolZflattenr#   assertIsNotNonerF   rL   )r   Zfeaturesr"   Zis_x86kvZre_termZregexr   r   r   test_get_host_cpu_features  s*    


z#TestMisc.test_get_host_cpu_featuresc             C   s"   t  }| |t | | d S )N)r   get_host_cpu_namerm   rc   rn   )r   cpur   r   r   test_get_host_cpu_name3  s    zTestMisc.test_get_host_cpu_namec             C   s   d}t tjd|g d S )Na2  if 1:
            from llvmlite import binding as llvm

            llvm.initialize()
            llvm.initialize_native_target()
            llvm.initialize_native_asmprinter()
            llvm.initialize_all_targets()
            llvm.initialize_all_asmprinters()
            llvm.shutdown()
            z-c)rB   
check_callr\   
executable)r   coder   r   r   test_initfini8  s    
zTestMisc.test_initfinic             C   s   d}t tjd|g d S )Nzif 1:
            from llvmlite import binding as llvm

            llvm.set_option("progname", "-debug-pass=Disabled")
            z-c)rB   r   r\   r   )r   r   r   r   r   test_set_optionE  s    zTestMisc.test_set_optionc             C   s0   t j\}}}| ||fd | |td d S )N)   r   
   )r   Zllvm_version_infor    re   range)r   majorminorZpatchr   r   r   test_versionO  s    zTestMisc.test_versionc             C   s   t   d S )N)r   Zcheck_jit_execution)r   r   r   r   test_check_jit_executionT  s    z!TestMisc.test_check_jit_executionzLocale not availablec             C   s8   |  t}t|}ttjd t|}| || d S )Nr   )r)   asm_double_localerc   r   r   r   r    )r   rW   ZexpectZgotr   r   r   test_print_double_localeW  s
    
z!TestMisc.test_print_double_localeN)r2   r3   r4   rY   r_   rh   rj   rl   ro   rs   r~   r   r   r   r   r   rZ   ZskipIfr   r   r   r   r   r   r^      s   
r^   c               @   s   e Z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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d'd( Zd)S )*TestModuleRefc             C   s*   |   }t| }| |d| d S )Nz; ModuleID =)r)   rc   striprn   rQ   )r   r(   rg   r   r   r   test_strf  s    zTestModuleRef.test_strc          	   C   sD   |   }t| |  | tj t| W d Q R X |  d S )N)r)   rc   closer`   ctypesArgumentError)r   r(   r   r   r   
test_closek  s    zTestModuleRef.test_closec          
   C   sr   |   }t| | t| W d Q R X | tj t| W d Q R X | t | W d Q R X W d Q R X d S )N)r)   rc   r`   r   r   ra   )r   r(   r   r   r   	test_withs  s    zTestModuleRef.test_withc             C   s4   |   }d|_| |jd d|_| |jd d S )Nfoobar)r)   r,   r    )r   r(   r   r   r   	test_name~  s
    zTestModuleRef.test_namec             C   s2   |   }|j}| |t ||_| ||j d S )N)r)   Zdata_layoutrm   rc   r    )r   r(   rg   r   r   r   test_data_layout  s
    zTestModuleRef.test_data_layoutc             C   s6   |   }|j}| |t  d|_| |jd d S )Nrv   )r)   r"   r    r   r$   )r   r(   rg   r   r   r   test_triple  s
    zTestModuleRef.test_triplec          	   C   sZ   |   }| | d  |  t}| t}|  W d Q R X t|j}| d| d S )Nz%.bug = add i32 1, %.bug)	r)   rk   Zverifyasm_verification_failr`   ra   rc   rd   re   )r   r(   rf   rg   r   r   r   test_verify  s    

zTestModuleRef.test_verifyc          	   C   s^   |   }|d}| |tj | |jd | t |d W d Q R X ~t	|j  d S )Nsumr   )
r)   get_functionrm   r   ValueRefr    r,   r`   	NameErrorrc   )r   r(   fnr   r   r   test_get_function  s    
zTestModuleRef.test_get_functionc          	   C   sZ   |   }|d}| |jd | tdt| | t	 |d W d Q R X d S )Nzstruct.glob_typez8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] }zstruct.doesnt_exist)
r)   Zget_struct_typeZassertEqualsr,   r{   rF   rL   rc   r`   r   )r   r(   Zst_tyr   r   r   test_get_struct_type  s    
z"TestModuleRef.test_get_struct_typec          	   C   s^   |   }|d}| |tj | |jd | t |d W d Q R X ~t	|j  d S )Nr*   r   )
r)   r+   rm   r   r   r    r,   r`   r   rc   )r   r(   gvr   r   r   test_get_global_variable  s    
z&TestModuleRef.test_get_global_variablec             C   sR   |   }|j}~t|dd d}| t|d | dd |D ddd	d
g d S )Nc             S   s   | j S )N)r,   )valuer   r   r   <lambda>  s    z5TestModuleRef.test_global_variables.<locals>.<lambda>)key   c             S   s   g | ]
}|j qS r   )r,   ).0gr   r   r   
<listcomp>  s    z7TestModuleRef.test_global_variables.<locals>.<listcomp>r*   glob_bZglob_fglob_struct)r)   Zglobal_variablessortedr    rM   )r   r(   itZglobsr   r   r   test_global_variables  s    z#TestModuleRef.test_global_variablesc             C   s>   |   }|j}~t|}| t|d | |d jd d S )Nr   r   r   )r)   	functionslistr    rM   r,   )r   r(   r   Zfuncsr   r   r   test_functions  s    zTestModuleRef.test_functionsc             C   s^   |   }|j}~t|}| t|d | td|d j | tdt	|d  d S )Nr   zstruct\.glob_type(\.[\d]+)?r   z8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] })
r)   Zstruct_typesr   r    rM   r{   rF   rL   r,   rc   )r   r(   r   Zstructsr   r   r   test_structs  s    
zTestModuleRef.test_structsc          	   C   st   |   }|  t}|| | tdd |jD ddg |d |  | t	j
 |d W d Q R X d S )Nc             s   s   | ]}|j V  qd S )N)r,   )r   fr   r   r   	<genexpr>  s    z-TestModuleRef.test_link_in.<locals>.<genexpr>mulr   )r)   asm_mullink_inr    r   r   r   r   r`   r   r   )r   destsrcr   r   r   test_link_in  s    


zTestModuleRef.test_link_inc             C   st   |   }|  t}|j|dd | tdd |jD ddg |  | tdd |jD dg |d d S )NT)Zpreservec             s   s   | ]}|j V  qd S )N)r,   )r   r   r   r   r   r     s    z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>r   r   c             s   s   | ]}|j V  qd S )N)r,   )r   r   r   r   r   r     s    )r)   r   r   r    r   r   r   r   )r   r   Zsrc2r   r   r   test_link_in_preserve  s    
z#TestModuleRef.test_link_in_preservec          	   C   sH   |   }|  t}| t}|| W d Q R X | dt|j d S )Nzsymbol multiply defined)r)   asm_sum2r`   ra   r   re   rc   rd   )r   r   r   rf   r   r   r   test_link_in_error  s
    
z TestModuleRef.test_link_in_errorc             C   s6   |   }| }d}d}| ||p.|| d S )Ns   s   BC)r)   
as_bitcodern   rQ   )r   r(   bcZbitcode_wrapper_magicZbitcode_magicr   r   r   test_as_bitcode  s    zTestModuleRef.test_as_bitcodec          	   C   sH   |  t}td W d Q R X | dt|j | dt|j d S )N    zLLVM bitcode parsing errorzInvalid bitcode signature)r`   ra   r   parse_bitcodere   rc   rd   )r   rf   r   r   r   test_parse_bitcode_error	  s    z&TestModuleRef.test_parse_bitcode_errorc             C   sT   t  }| j|d }t  }t ||}| | | |d |d d S )N)r'   r   r*   )r   Zcreate_contextr)   r   r   r    r   r+   )r   Zcontext1r   Zcontext2r(   r   r   r   test_bitcode_roundtrip  s    
z$TestModuleRef.test_bitcode_roundtripc             C   s4   |   }| }| || | | |  d S )N)r)   ZcloneZassertIsNotr    r   )r   rW   Zclonedr   r   r   test_cloning  s    zTestModuleRef.test_cloningN)r2   r3   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   d  s(   	
	
r   c               @   s   e Zd ZdZd 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dd Zdd Zdd Zdd ZdS )!JITTestMixinz*
    Mixin for ExecutionEngine tests.
    r   c             C   s,   |   ||}| | tttt|S )N)finalize_objectget_function_addressrn   r   r   )r   eeZ	func_nameZcfptrr   r   r   get_sum&  s    

zJITTestMixin.get_sumc          	   C   sB   |   }| |&}| |}|dd}| d| W d Q R X d S )Nr;   )r)   jitr   r    )r   r(   r   cfuncZresr   r   r   test_run_code,  s
    

zJITTestMixin.test_run_codec          	   C   sB   |  |  }|  |  | tj |  W d Q R X d S )N)r   r)   r   r`   r   r   r   )r   r   r   r   r   r   3  s
    zJITTestMixin.test_closec          
   C   sh   |  |  }| W d Q R X | t | W d Q R X W d Q R X | tj |  W d Q R X d S )N)r   r)   r`   ra   r   r   r   )r   r   r   r   r   r   :  s    
zJITTestMixin.test_withc             C   s&   |   }| |}|  |  d S )N)r)   r   r   )r   r(   r   r   r   r   test_module_lifetimeD  s    
z!JITTestMixin.test_module_lifetimec             C   s&   |   }| |}|  |  d S )N)r)   r   r   )r   r(   r   r   r   r   test_module_lifetime2J  s    
z"JITTestMixin.test_module_lifetime2c          	   C   sf   |  |  }| t}|| | t || W d Q R X | |j |  | 	|j d S )N)
r   r)   r   
add_moduler`   KeyErrorrw   closedr   rn   )r   r   r(   r   r   r   test_add_moduleP  s    

zJITTestMixin.test_add_modulec             C   s6   |  |  }| t}|| |  |  d S )N)r   r)   r   r   r   )r   r   r(   r   r   r   test_add_module_lifetimeZ  s
    

z%JITTestMixin.test_add_module_lifetimec             C   s6   |  |  }| t}|| |  |  d S )N)r   r)   r   r   r   )r   r   r(   r   r   r   test_add_module_lifetime2a  s
    

z&JITTestMixin.test_add_module_lifetime2c          	   C   sp   |  |  }| t}|| || | t || W d Q R X | |j |	  | |j d S )N)
r   r)   r   r   Zremove_moduler`   r   rw   r   r   )r   r   r(   r   r   r   test_remove_moduleh  s    


zJITTestMixin.test_remove_modulec             C   s>   |   }| |}|j}| |j| t| ~~t| d S )N)r)   r   target_datark   rc   )r   r(   r   tdr   r   r   test_target_datas  s    
zJITTestMixin.test_target_datac       	      C   s   |   }| |}|j}|d}|d}|d}tjdk rDdnd}x&|||fD ]}| ||j| qTW | |	|jd | |
|jd | |	|jd | |
|jd | |	|jd	 | |
|jd
 d S )Nr*   r   r   l        r      r   )r   r;   r      )r   r   )r)   r   r   r+   r\   maxsizer    get_abi_sizetypeget_pointee_abi_sizeZget_pointee_abi_alignmentre   )	r   r(   r   r   gv_i32Zgv_i8Z	gv_structpointer_sizer   r   r   r   test_target_data_abi_enquiries}  s    



z+JITTestMixin.test_target_data_abi_enquiriesc                s   g   fdd}|   }| |}|| | t d | |}|dd | t d |  d d | |  d d t g  d d < |  t	}|
| | |d}| t d |  d d | |  d d t d S )Nc                s     | |f d S )N)append)r(   buf)notifiesr   r   notify  s    z5JITTestMixin.test_object_cache_notify.<locals>.notifyr   r;   r   r   r   )r)   r   set_object_cacher    rM   r   rk   rm   bytesr   r   )r   r   r(   r   r   Zmod2r   )r   r   test_object_cache_notify  s$    





z%JITTestMixin.test_object_cache_notifyc                sJ  g g  fdd} fdd}|   }| |}||| | td | t d | |}| td | t d |  d | d d  fdd}g d d < g  d d < |  t}| |}||| | td | t d | |}| |d	d
d | td | t d d S )Nc                s     | |f d S )N)r   )r(   r   )r   r   r   r     s    z8JITTestMixin.test_object_cache_getbuffer.<locals>.notifyc                s     |  d S )N)r   )r(   )
getbuffersr   r   	getbuffer  s    z;JITTestMixin.test_object_cache_getbuffer.<locals>.getbufferr   r   c                s     |  S )N)r   )r(   )r   
sum_bufferr   r   getbuffer_successful  s    
zFJITTestMixin.test_object_cache_getbuffer.<locals>.getbuffer_successfulr;   r   r   )r)   r   r   r    rM   r   rk   r   )r   r   r   r(   r   r   r   r   )r   r   r   r   test_object_cache_getbuffer  s4    




z(JITTestMixin.test_object_cache_getbufferN)r   )r2   r3   r4   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   !  s   



r   c               @   s   e Zd Zdd Zdd ZdS )JITWithTMTestMixinc             C   sb   |   }|  }| ||}||}| d| |d ||}| d| | || dS )z%Test TargetMachineRef.emit_assembly()r   TN)r1   r)   r   emit_assemblyre   Zset_asm_verbosityZassertNotEqual)r   r1   r(   r   Zraw_asmZraw_asm_verboser   r   r   test_emit_assembly  s    


z%JITWithTMTestMixin.test_emit_assemblyc             C   sX   |   }|  }| ||}||}| |tj tj	drT| 
d|dd  dS )z#Test TargetMachineRef.emit_object()r7   s   ELFNr   )r1   r)   r   emit_objectrm   r	   Zbinary_typer\   rP   rQ   re   )r   r1   r(   r   code_objectr   r   r   test_emit_object  s    
z#JITWithTMTestMixin.test_emit_objectN)r2   r3   r4   r   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdddZdS )	TestMCJitz@
    Test JIT engines created with create_mcjit_compiler().
    Nc             C   s   |d kr|   }t||S )N)r1   r   create_mcjit_compiler)r   r(   r1   r   r   r   r     s    zTestMCJit.jit)N)r2   r3   r4   rY   r   r   r   r   r   r     s   r   c               @   s|   e Z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dd Zdd Zdd Zdd Zdd ZdS )TestValueRefc             C   s&   |   }|d}| t|d d S )Nr*   z@glob = global i32 0)r)   r+   r    rc   )r   r(   r*   r   r   r   r     s    
zTestValueRef.test_strc             C   s8   |   }|d}| |jd d|_| |jd d S )Nr*   foobar)r)   r+   r    r,   )r   r(   r*   r   r   r   r     s
    
zTestValueRef.test_namec             C   st   |   }|d}|j}| |jtj ||_| |j| x2dD ]*}||_| |jtj | |jj| qBW d S )Nr*   )internalexternal)r)   r+   linkagerm   r   ZLinkager    r,   )r   r(   r*   r  r   r   r   test_linkage  s    

zTestValueRef.test_linkagec             C   st   |   }|d}|j}| |jtj ||_| |j| x2dD ]*}||_| |jtj | |jj| qBW d S )Nr*   )ZhiddenZ	protectedrr   )r)   r+   
visibilityrm   r   Z
Visibilityr    r,   )r   r(   r*   r  r   r   r   test_visibility  s    

zTestValueRef.test_visibilityc             C   st   |   }|d}|j}| |jtj ||_| |j| x2dD ]*}||_| |jtj | |jj| qBW d S )Nr*   )Z	dllimportZ	dllexportrr   )r)   r+   storage_classrm   r   ZStorageClassr    r,   )r   r(   r*   r  r   r   r   test_storage_class%  s    

zTestValueRef.test_storage_classc          	   C   sR   |   }|d}|d | t}|d W d Q R X | t|jd d S )Nr   Z	nocaptureZzextzno such attribute 'zext')r)   r   Zadd_function_attributer`   
ValueErrorr    rc   rd   )r   r(   r   Zraisesr   r   r   test_add_function_attribute1  s    

z(TestValueRef.test_add_function_attributec             C   s$   |   }|d}| |j | d S )Nr*   )r)   r+   rk   )r   r(   r*   r   r   r   test_module9  s    
zTestValueRef.test_modulec             C   s*   |   }|d}|j}| |tj d S )Nr*   )r)   r+   r   rm   r   ZTypeRef)r   r(   r*   tpr   r   r   	test_type>  s    
zTestValueRef.test_typec             C   sL   |   }|d}|j}| |jd |d}| td|jjj d S )Nr*   rv   r   zstruct\.glob_type(\.[\d]+)?)	r)   r+   r   r    r,   r{   rF   rL   element_type)r   r(   r*   r  str   r   r   test_type_nameD  s    


zTestValueRef.test_type_namec             C   s,   |   }|d}|j}| t|d d S )Nr*   zi32*)r)   r+   r   r    rc   )r   r(   r*   r  r   r   r   test_type_printing_variableM  s    
z(TestValueRef.test_type_printing_variablec             C   s(   |   }|d}| t|jd d S )Nr   zi32 (i32, i32)*)r)   r   r    rc   r   )r   r(   r   r   r   r   test_type_printing_functionS  s    
z(TestValueRef.test_type_printing_functionc             C   sV   |   }|d}| |jj | tdt|j | tdt|jj	 d S )Nr   z%struct\.glob_type(\.[\d]+)?\*z8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] })
r)   r+   rn   r   Z
is_pointerr{   rF   rL   rc   r  )r   r(   r  r   r   r   test_type_printing_structX  s    

z&TestValueRef.test_type_printing_structc             C   s   |   }|  |  d S )N)r*   r   )r   r*   r   r   r   r   b  s    zTestValueRef.test_closec             C   s:   |   d}|  td}| |j | |j d S )Nr   )r)   r   asm_sum_declarerw   Zis_declarationrn   )r   definedZdeclaredr   r   r   test_is_declarationg  s    z TestValueRef.test_is_declarationN)r2   r3   r4   r   r   r  r  r  r	  r
  r  r  r  r  r  r   r  r   r   r   r   r     s   	
r   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )
TestTargetc          	   C   sb   t jj}| t}|d W d Q R X | dt|j t  }||}| 	|j
| |  d S )Nr   z4No available targets are compatible with this triple)r   r-   from_tripler`   ra   re   rc   rd   r$   r    r"   r   )r   r   rf   r"   r0   r   r   r   test_from_triplep  s    zTestTarget.test_from_triplec             C   s@   t jt  }|ddddd t  }||dddd d S )Nrv   r   rr   )r   r-   r  r$   r/   r   )r   r0   r   r   r   r   test_create_target_machine{  s    z%TestTarget.test_create_target_machinec             C   s<   t jt  }t j }| |jt | |j|j d S )N)	r   r-   r  r$   r.   rm   r,   rc   r    )r   tur   r   r   r     s    
zTestTarget.test_namec             C   s<   t jt  }t j }| |jt | |j|j d S )N)	r   r-   r  r$   r.   rm   descriptionrc   r    )r   r  r  r   r   r   test_description  s    
zTestTarget.test_descriptionc             C   s8   t jt  }t|}| |j| | |j| d S )N)r   r-   r  r$   rc   re   r,   r  )r   r0   rg   r   r   r   r     s    zTestTarget.test_strN)r2   r3   r4   r  r  r   r  r   r   r   r   r   r  n  s
   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestTargetDatac             C   s
   t dS )Nz%e-m:e-i64:64-f80:128-n8:16:32:64-S128)r   Zcreate_target_data)r   r   r   r   r     s    zTestTargetData.target_datac             C   s(   |   }|  }| ||jd d S )Nr   )r   r*   r    r   r   )r   r   r*   r   r   r   test_get_abi_size  s    z TestTargetData.test_get_abi_sizec             C   sF   |   }|  }| ||jd | d}| ||jd d S )Nr   r   r   )r   r*   r    r   r   )r   r   r*   r   r   r   test_get_pointee_abi_size  s
    
z(TestTargetData.test_get_pointee_abi_sizec          	   C   sj   |   }| d}| t ||jd W d Q R X |jj}| ||dd | ||dd d S )Nr   r   r   r   )r   r*   r`   r  Zget_element_offsetr   r  r    )r   r   r*   Zstruct_typer   r   r   test_get_struct_element_offset  s    
z-TestTargetData.test_get_struct_element_offsetN)r2   r3   r4   r   r  r   r!  r   r   r   r   r    s   	r  c               @   s   e Zd Zdd Zdd ZdS )TestTargetMachinec             C   s   |   }t }|| d S )N)r1   r   create_module_pass_managerZadd_analysis_passes)r   tmpmr   r   r   test_add_analysis_passes  s    z*TestTargetMachine.test_add_analysis_passesc             C   sJ   |   }|j}|  }|d}tjdk r.dnd}| ||j| d S )Nr*   l        r   r   )	r1   r   r)   r+   r\   r   r    r   r   )r   r$  r   r(   r   r   r   r   r   test_target_data_from_tm  s    
z*TestTargetMachine.test_target_data_from_tmN)r2   r3   r4   r&  r'  r   r   r   r   r"    s   r"  c               @   sd   e Z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dd Zdd ZdS )TestPassManagerBuilderc             C   s   t  S )N)r   ZPassManagerBuilder)r   r   r   r   pmb  s    zTestPassManagerBuilder.pmbc             C   s   t  }d|_d|_d S )Nr;      )r   create_pass_manager_builderinlining_threshold	opt_level)r   r)  r   r   r   test_old_api  s    z#TestPassManagerBuilder.test_old_apic             C   s   |   }|  |  d S )N)r)  r   )r   r)  r   r   r   r     s    z!TestPassManagerBuilder.test_closec             C   sB   |   }| |jtj x$tdD ]}||_| |j| q"W d S )Nr   )r)  rm   r-  r	   integer_typesr   r    )r   r)  ir   r   r   test_opt_level  s
    z%TestPassManagerBuilder.test_opt_levelc             C   sB   |   }| |jtj x$tdD ]}||_| |j| q"W d S )Nr   )r)  rm   Z
size_levelr	   r/  r   r    )r   r)  r0  r   r   r   test_size_level  s
    z&TestPassManagerBuilder.test_size_levelc          	   C   s<   |   }| t |j W d Q R X xdD ]
}||_q*W d S )N)   P   i^  )r)  r`   NotImplementedErrorr,  )r   r)  r0  r   r   r   test_inlining_threshold  s
    
z.TestPassManagerBuilder.test_inlining_thresholdc             C   s<   |   }| |jt x dD ]}||_| |j| qW d S )N)TF)r)  rm   Zdisable_unroll_loopsrz   r    )r   r)  br   r   r   test_disable_unroll_loops  s
    
z0TestPassManagerBuilder.test_disable_unroll_loopsc             C   s<   |   }| |jt x dD ]}||_| |j| qW d S )N)TF)r)  rm   Zloop_vectorizerz   r    )r   r)  r7  r   r   r   test_loop_vectorize  s
    
z*TestPassManagerBuilder.test_loop_vectorizec             C   s<   |   }| |jt x dD ]}||_| |j| qW d S )N)TF)r)  rm   Zslp_vectorizerz   r    )r   r)  r7  r   r   r   test_slp_vectorize  s
    
z)TestPassManagerBuilder.test_slp_vectorizec             C   s.   |   }t }|| |  |  d S )N)r)  r   r#  populater   )r   r)  r%  r   r   r   !test_populate_module_pass_manager   s
    
z8TestPassManagerBuilder.test_populate_module_pass_managerc             C   s8   |   }|  }t|}|| |  |  d S )N)r)   r)  r   create_function_pass_managerr;  r   )r   r(   r)  r%  r   r   r   #test_populate_function_pass_manager  s    

z:TestPassManagerBuilder.test_populate_function_pass_managerN)r2   r3   r4   r)  r.  r   r1  r2  r6  r8  r9  r:  r<  r>  r   r   r   r   r(    s   r(  c               @   s   e Zd Zdd Zdd ZdS )PassManagerTestMixinc             C   s   t  }d|_|S )Nr;   )r   r+  r-  )r   r)  r   r   r   r)    s    zPassManagerTestMixin.pmbc             C   s   |   }|  |  d S )N)r%  r   )r   r%  r   r   r   r     s    zPassManagerTestMixin.test_closeN)r2   r3   r4   r)  r   r   r   r   r   r?    s   r?  c               @   s   e Zd Zdd Zdd ZdS )TestModulePassManagerc             C   s   t  S )N)r   r#  )r   r   r   r   r%    s    zTestModulePassManager.pmc             C   s   |   }|  | |  }t|}|| t|}| }xt|D ]n\}}| 	drJddh}x|D ]}	|	|krnP qnW t
d|| }
||	hA  }| d| | || P qJW t
dd S )Nzret i32z%.3z%.4zexpected tokens not foundzexpected IR not found)r%  r)  r;  r)   rc   runrJ   	enumerater   rQ   ra   popre   assertNotIn)r   r%  r(   orig_asmopt_asmZopt_asm_splitidxlZtoksr  Zadd_lineZ
othertokenr   r   r   test_run"  s(    

zTestModulePassManager.test_runN)r2   r3   r4   r%  rI  r   r   r   r   r@    s   r@  c               @   s&   e Zd ZdddZdd Zdd ZdS )	TestFunctionPassManagerNc             C   s   |p
|   }t|S )N)r)   r   r=  )r   r(   r   r   r   r%  D  s    zTestFunctionPassManager.pmc             C   s   |   }|  |  d S )N)r%  r   finalize)r   r%  r   r   r   r   H  s    z%TestFunctionPassManager.test_initfinic             C   sx   |   }|d}| |}|  | |  t|}|  || |	  t|}| 
d| | d| d S )Nr   z%.4)r)   r   r%  r)  r;  r   rc   r   rA  rK  re   rD  )r   r(   r   r%  rE  rF  r   r   r   rI  M  s    


z TestFunctionPassManager.test_run)N)r2   r3   r4   r%  r   rI  r   r   r   r   rJ  B  s   
rJ  c               @   s   e Zd Zdd Zdd ZdS )
TestPassesc             C   s   t  S )N)r   r#  )r   r   r   r   r%  _  s    zTestPasses.pmc             C   s   |   }|  |  |  |d |  |  |  |  |	  |
  |  |  |  |  |  |  d S )N   )r%  Zadd_constant_merge_passZadd_dead_arg_elimination_passZadd_function_attrs_passZadd_function_inlining_passZadd_global_dce_passZadd_global_optimizer_passZadd_ipsccp_passZadd_dead_code_elimination_passZadd_cfg_simplification_passZadd_gvn_passZadd_instruction_combining_passZadd_licm_passZadd_sccp_passZadd_sroa_passZ"add_type_based_alias_analysis_passZadd_basic_alias_analysis_pass)r   r%  r   r   r   test_populateb  s"    
zTestPasses.test_populateN)r2   r3   r4   r%  rN  r   r   r   r   rL  ]  s   rL  c               @   s0   e Zd Zdd Zee dkddd ZdS )	TestDylibc          	   C   s$   |  t td W d Q R X d S )Nzzzzasdkf;jasd;l)r`   ra   r   load_library_permanently)r   r   r   r   test_bad_libraryx  s    zTestDylib.test_bad_library)LinuxDarwinz#test only works on Linux and Darwinc             C   s8   t  }|dkrtd}n|dkr*td}t| d S )NrR  rW   rS  r<   )rP   systemr   r   rP  )r   rT  r<   r   r   r   	test_libm|  s    
zTestDylib.test_libmN)	r2   r3   r4   rQ  rZ   r[   rP   rT  rU  r   r   r   r   rO  v  s   rO  c               @   s$   e Zd Zdd Zdd Zdd ZdS )TestAnalysisc             C   sj   t  }t t dt dt dg}t ||d}t | }|j\}}|||}|	| |S )N    r   )
r
   ModuleFunctionTypeIntTypeZFunctionZ	IRBuilderZappend_basic_blockargsrN   Zret)r   rW   Zftr   Zbdxyzr   r   r   build_ir_module  s    "

zTestAnalysis.build_ir_modulec             C   sJ   |   }|d}t|}tj|dd}d}| || | || d S )Nr   F)	show_instz%.5 = add i32 %.1, %.2)r_  Z
get_globalr   get_function_cfgre   rD  )r   r(   r   dot_showing_instdot_without_instinstr   r   r   test_get_function_cfg_on_ir  s    

z(TestAnalysis.test_get_function_cfg_on_irc             C   s   |   d}tj|dd}tj|dd}d}| || | || d}| || | || d}| || | || d S )Nr   T)r`  FZdigraphzCFG for 'sum' functionz%.3 = add i32 %.1, %.2)r)   r   r   ra  re   rD  )r   r  rb  rc  prefixfnamerd  r   r   r   test_function_cfg_on_llvm_value  s    z,TestAnalysis.test_function_cfg_on_llvm_valueN)r2   r3   r4   r_  re  rh  r   r   r   r   rV    s   
	rV  c               @   s    e Zd Zedd Zdd ZdS )TestTypeParsingc             c   s$   t  }|V  t|}t| d S )N)r
   rX  rc   r   r%   )r   r(   r&   r   r   r   check_parsing  s    zTestTypeParsing.check_parsingc          	   C   s   |   6}ttdg}t||d}t|dg|_W d Q R X |   :}tjtdgdd}t||d}t|dg|_W d Q R X d S )NrW  r   r   T)Zpacked)rj  r
   ZLiteralStructTyperZ  GlobalVariableZConstantZinitializer)r   r(   typr   r   r   r   test_literal_struct  s    

z#TestTypeParsing.test_literal_structN)r2   r3   r4   r   rj  rm  r   r   r   r   ri    s   
ri  c               @   s   e Zd Zdd ZdS )TestGlobalConstructorsc             C   s   |  t}| |}|  |  |d}ttj}t	||}| 
|jjd |d}ttj|}| 
| d |  | 
|jjd d S )NAr   r         )r)   asm_global_ctorsr   r   Zrun_static_constructorsZget_global_value_addressr   ZPOINTERZc_int32castr    contentsr   r   r   Zrun_static_destructors)r   r(   r   Zptr_addrZptr_tZptrZfoo_addrr   r   r   r   test_global_ctors_dtors  s    



z.TestGlobalConstructors.test_global_ctors_dtorsN)r2   r3   r4   ru  r   r   r   r   rn    s   rn  c               @   sn   e Zd Zd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dd Zdd ZdS )TestGlobalVariablesTc             C   sZ   t  }t d}t ||d}||_t|}|r@| d| n| d| | | d S )NrW  r   Zundef)	r
   rX  rZ  rk  r  rc   re   rD  r)   )r   r  	has_undefr(   rl  r   r&   r   r   r   check_global_variable_linkage  s    
z1TestGlobalVariables.check_global_variable_linkagec             C   s   |  d d S )Nr   )rx  )r   r   r   r   test_internal_linkage  s    z)TestGlobalVariables.test_internal_linkagec             C   s   |  d d S )Ncommon)rx  )r   r   r   r   test_common_linkage  s    z'TestGlobalVariables.test_common_linkagec             C   s   | j ddd d S )Nr  F)rw  )rx  )r   r   r   r   test_external_linkage  s    z)TestGlobalVariables.test_external_linkagec             C   s   |  d d S )NZavailable_externally)rx  )r   r   r   r   !test_available_externally_linkage  s    z5TestGlobalVariables.test_available_externally_linkagec             C   s   |  d d S )NZprivate)rx  )r   r   r   r   test_private_linkage  s    z(TestGlobalVariables.test_private_linkagec             C   s   |  d d S )NZlinkonce)rx  )r   r   r   r   test_linkonce_linkage  s    z)TestGlobalVariables.test_linkonce_linkagec             C   s   |  d d S )NZweak)rx  )r   r   r   r   test_weak_linkage
  s    z%TestGlobalVariables.test_weak_linkagec             C   s   |  d d S )NZ	appending)rx  )r   r   r   r   test_appending_linkage  s    z*TestGlobalVariables.test_appending_linkagec             C   s   | j ddd d S )NZextern_weakF)rw  )rx  )r   r   r   r   test_extern_weak_linkage  s    z,TestGlobalVariables.test_extern_weak_linkagec             C   s   |  d d S )NZlinkonce_odr)rx  )r   r   r   r   test_linkonce_odr_linkage  s    z-TestGlobalVariables.test_linkonce_odr_linkagec             C   s   |  d d S )NZweak_odr)rx  )r   r   r   r   test_weak_odr_linkage  s    z)TestGlobalVariables.test_weak_odr_linkageN)T)r2   r3   r4   rx  ry  r{  r|  r}  r~  r  r  r  r  r  r  r   r   r   r   rv    s   
rv  rt   zonly on x86c               @   s   e Zd Zdd ZdS )TestInlineAsmc             C   s6   t   | jtd}|  }||}| d| d S )N)r&   Znop)r   Zinitialize_native_asmparserr)   asm_inlineasmr1   r   re   )r   rW   r$  r&   r   r   r   test_inlineasm  s
    
zTestInlineAsm.test_inlineasmN)r2   r3   r4   r  r   r   r   r   r    s   r  c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TestObjectFilea,  
        ;ModuleID = <string>
        target triple = "{triple}"

        declare i32 @sum(i32 %.1, i32 %.2)

        define i32 @sum_twice(i32 %.1, i32 %.2) {{
            %.3 = call i32 @sum(i32 %.1, i32 %.2)
            %.4 = call i32 @sum(i32 %.3, i32 %.3)
            ret i32 %.4
        }}
    c             C   s   |   }|  }||}tj|}d}d}x|| D ]p}| r8d}| |	  | 
| dk | 
t| dk | |  | 
|| k  | }P q8W | 
| d S )NFTr   )r1   r)   r   r   ObjectFileRef	from_dataZsectionsZis_textr{   r,   rn   sizerM   dataZaddress)r   r1   r(   obj_binobjZhas_textZlast_addressrg   r   r   r   test_object_file3  s"    
zTestObjectFile.test_object_filec             C   sp   |   }|  }||}tj|}t| | j|}|| t	t
t
t
|d}| |ddd d S )N	sum_twicer;   r*  r   )r1   r)   r   r   r  r  r   mod_asmadd_object_filer   r   r   r    )r   r1   r(   r  r  r   r  r   r   r   test_add_object_fileG  s    


z#TestObjectFile.test_add_object_filec       	   	   C   s   |   }|  }||}t \}}zPz"t|d}|| |  W d |  X t	
| | j|}|| W d t| X tttt|d}| |ddd d S )Nwbr  r;   r*  r   )r1   r)   r   r   r?   fdopenwriteflushr   r   r   r  r  unlinkr   r   r   r    )	r   r1   r(   r  Z	temp_descZ	temp_pathr   r   r  r   r   r   $test_add_object_file_from_filesystemW  s"    




z3TestObjectFile.test_add_object_file_from_filesystemN)r2   r3   r4   r  r  r  r  r   r   r   r   r  $  s   r  __main__)EZ
__future__r   r   r   r   r   Zctypes.utilr   r   r   r?   rP   rF   rB   r\   rZ   
contextlibr   Ztempfiler   Zllvmliter	   r
   r   r   Zllvmlite.bindingr   rv   r   machinerP  r   r5   r   r   rb   r   r  r   r  rr  r   r6   r^   r   objectr   r   r   r   r  r  r"  r(  r?  r@  rJ  rL  rO  rV  ri  rn  rv  r[   rQ   r  r  r2   mainr   r   r   r   <module>   sr   

"({ > :o(J%&7	N
