a
    þ
þd1  ã                   @   sö  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 d dlmZ d dlmZ d d	lmZ e ¡ d
krÂe d¡ dd„ ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(g d¢Z)g d¢Z*g d¢Z+dZ,dZ-d Z.G d!d"„ d"eƒZ/G d#d$„ d$e/ƒZ0G d%d&„ d&e/ƒZ1G d'd(„ d(e/ƒZ2G d)d*„ d*e/ƒZ3G d+d,„ d,e4ƒZ5G d-d.„ d.e5ƒZ6G d/d0„ d0e/e6ƒZ7G d1d2„ d2e/ƒZ8G d3d4„ d4e/ƒZ9G d5d6„ d6e/ƒZ:G d7d8„ d8e/ƒZ;G d9d:„ d:e/ƒZ<G d;d<„ d<e4ƒZ=G d=d>„ d>e/e=ƒZ>G d?d@„ d@e/e=ƒZ?G dAdB„ dBe/e=ƒZ@G dCdD„ dDe/ƒZAG dEdF„ dFe/ƒZBG dGdH„ dHe/ƒZCG dIdJ„ dJe7ƒZDG dKdL„ dLe/ƒZEe Fe ¡  GdM¡dN¡G dOdP„ dPe/ƒƒZHG dQdR„ dRe/ƒZIG dSdT„ dTe/ƒZJG dUdV„ dVe/ƒZKeLdWkròe M¡  dS )Xé    N)Ú	CFUNCTYPEÚc_int)Úfind_library)Úcontextmanager)Úmkstemp)Úir)Úbinding)Úffi)ÚTestCaseÚarmv7lzlibgcc_s.so.1c               
   C   s‚   t  t j¡} z`zt  t jd¡ W n& t jyF   Y W t  t j| ¡ dS 0 W t  t j| ¡ dS W t  t j| ¡ nt  t j| ¡ 0 d S )NÚde_DETF)ÚlocaleÚ	setlocaleÚLC_ALLÚError)Úcur© r   úd/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/llvmlite/tests/test_binding.pyÚno_de_locale   s    üþr   a±  
    ; ModuleID = '<string>'
    source_filename = "asm_sum.c"
    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}"

    define void @inlineme() {{
        ret void
    }}

    define i32 @caller(i32 %.1, i32 %.2) {{
    entry:
      %stack = alloca i32
      store i32 %.1, i32* %stack
      br label %main
    main:
      %loaded = load i32, i32* %stack
      %.3 = add i32 %loaded, %.2
      %.4 = add i32 0, %.3
      call void @inlineme()
      ret i32 %.4
    }}
aÉ  
; ModuleID = 'test.c'
source_filename = "test.c"
target triple = "{triple}"

; Function Attrs: noinline nounwind optnone ssp uwtable
define void @inlineme() noinline !dbg !15 {{
  ret void, !dbg !18
}}

; Function Attrs: noinline nounwind optnone ssp uwtable
define i32 @foo(i32 %0, i32 %1) !dbg !19 {{
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  store i32 %0, i32* %3, align 4
  call void @llvm.dbg.declare(metadata i32* %3, metadata !23, metadata !DIExpression()), !dbg !24
  store i32 %1, i32* %4, align 4
  call void @llvm.dbg.declare(metadata i32* %4, metadata !25, metadata !DIExpression()), !dbg !26
  call void @inlineme(), !dbg !27
  %5 = load i32, i32* %3, align 4, !dbg !28
  %6 = load i32, i32* %4, align 4, !dbg !29
  %7 = add nsw i32 %5, %6, !dbg !30
  ret i32 %7, !dbg !31
}}

; Function Attrs: nofree nosync nounwind readnone speculatable willreturn
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1

attributes #1 = {{ nofree nosync nounwind readnone speculatable willreturn }}

!llvm.module.flags = !{{!1, !2, !3, !4, !5, !6, !7, !8, !9, !10}}
!llvm.dbg.cu = !{{!11}}
!llvm.ident = !{{!14}}

!0 = !{{i32 2, !"SDK Version", [2 x i32] [i32 12, i32 3]}}
!1 = !{{i32 7, !"Dwarf Version", i32 4}}
!2 = !{{i32 2, !"Debug Info Version", i32 3}}
!3 = !{{i32 1, !"wchar_size", i32 4}}
!4 = !{{i32 1, !"branch-target-enforcement", i32 0}}
!5 = !{{i32 1, !"sign-return-address", i32 0}}
!6 = !{{i32 1, !"sign-return-address-all", i32 0}}
!7 = !{{i32 1, !"sign-return-address-with-bkey", i32 0}}
!8 = !{{i32 7, !"PIC Level", i32 2}}
!9 = !{{i32 7, !"uwtable", i32 1}}
!10 = !{{i32 7, !"frame-pointer", i32 1}}
!11 = distinct !DICompileUnit(language: DW_LANG_C99, file: !12, producer: "Apple clang version 13.1.6 (clang-1316.0.21.2.3)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !13, splitDebugInlining: false, nameTableKind: None, sysroot: "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", sdk: "MacOSX.sdk")
!12 = !DIFile(filename: "test.c", directory: "/")
!13 = !{{}}
!14 = !{{!"Apple clang version 13.1.6 (clang-1316.0.21.2.3)"}}
!15 = distinct !DISubprogram(name: "inlineme", scope: !12, file: !12, line: 1, type: !16, scopeLine: 1, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !11, retainedNodes: !13)
!16 = !DISubroutineType(types: !17)
!17 = !{{null}}
!18 = !DILocation(line: 1, column: 22, scope: !15)
!19 = distinct !DISubprogram(name: "foo", scope: !12, file: !12, line: 3, type: !20, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !11, retainedNodes: !13)
!20 = !DISubroutineType(types: !21)
!21 = !{{!22, !22, !22}}
!22 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!23 = !DILocalVariable(name: "a", arg: 1, scope: !19, file: !12, line: 3, type: !22)
!24 = !DILocation(line: 3, column: 13, scope: !19)
!25 = !DILocalVariable(name: "b", arg: 2, scope: !19, file: !12, line: 3, type: !22)
!26 = !DILocation(line: 3, column: 20, scope: !19)
!27 = !DILocation(line: 4, column: 5, scope: !19)
!28 = !DILocation(line: 5, column: 12, scope: !19)
!29 = !DILocation(line: 5, column: 16, scope: !19)
!30 = !DILocation(line: 5, column: 14, scope: !19)
!31 = !DILocation(line: 5, column: 5, scope: !19)
aN  
; ModuleID = "<string>"
target triple = "{triple}"

define double @licm(i32 %0) {{
  %2 = alloca i32, align 4
  %3 = alloca double, align 8
  %4 = alloca i32, align 4
  %5 = alloca double, align 8
  store i32 %0, i32* %2, align 4
  store double 0.000000e+00, double* %3, align 8
  store i32 0, i32* %4, align 4
  br label %6

6:                                                ; preds = %14, %1
  %7 = load i32, i32* %4, align 4
  %8 = load i32, i32* %2, align 4
  %9 = icmp slt i32 %7, %8
  br i1 %9, label %10, label %17

10:                                               ; preds = %6
  store double 7.000000e+00, double* %5, align 8
  %11 = load double, double* %5, align 8
  %12 = load double, double* %3, align 8
  %13 = fadd double %12, %11
  store double %13, double* %3, align 8
  br label %14

14:                                               ; preds = %10
  %15 = load i32, i32* %4, align 4
  %16 = add nsw i32 %15, 1
  store i32 %16, i32* %4, align 4
  br label %6

17:                                               ; preds = %6
  %18 = load double, double* %3, align 8
  ret double %18
}}
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}}]
    z…; ModuleID = ""
target triple = "unknown-unknown-unknown"
target datalayout = ""

define i32 @"foo"()
{
"<>!*''#":
  ret i32 12345
}
)úaddi	sp, sp, -16zsw	a1, 8(sp)zsw	a2, 12(sp)úfld	ft0, 8(sp)zfmv.w.x	ft1, a0zfcvt.d.s	ft1, ft1úfadd.d	ft0, ft1, ft0úfsd	ft0, 8(sp)úlw	a0, 8(sp)úlw	a1, 12(sp)úaddi	sp, sp, 16Úret)r   zsw	a0, 8(sp)zsw	a1, 12(sp)r   zfcvt.d.s	ft1, fa0r   r   r   r   r   r   )zfcvt.d.s	ft0, fa0zfadd.d	fa0, ft0, fa1r   zc
declare void @a_readonly_func(i8 *) readonly

declare i8* @a_arg0_return_func(i8* returned, i32*)
A@  7f454c4602010100000000000000000001003e000100000000000000000000000000000000000000e0000000000000000000000040000000000040000500010048c1e2204809c24889d048c1c03d4831d048b90120000480001070480fafc8000000000000000000000000000000000000000000000000002f0000000400f1ff00000000000000000000000000000000070000001200020000000000000000001f00000000000000002e74657874005f5f617279626f002e6e6f74652e474e552d737461636b002e737472746162002e73796d746162003c737472696e673e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0000000300000000000000000000000000000000000000a800000000000000380000000000000000000000000000000100000000000000000000000000000001000000010000000600000000000000000000000000000040000000000000001f000000000000000000000000000000100000000000000000000000000000000f00000001000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000100000000000000000000000000000027000000020000000000000000000000000000000000000060000000000000004800000000000000010000000200000008000000000000001800000000000000Z>48c1e2204809c24889d048c1c03d4831d048b90120000480001070480fafc8c                   @   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 r   )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 u r|   ¡ }| |¡S r   )r1   Úget_global_variable)r&   Únamer0   r   r   r   r2   ›  s    zBaseTest.globc                C   s   t j ¡ }|j|dS )N©Újit)r   ÚTargetÚfrom_default_tripleÚcreate_target_machine)r&   r6   Útargetr   r   r   Útarget_machine   s    
zBaseTest.target_machine)r2   N)	Ú__name__Ú
__module__Ú__qualname__r'   r)   Úasm_sumr1   r2   r;   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   sD  t jj}tj ¡ }d|d< tjdd|gtj|d}| 	¡ \}}|  
d|j¡ t d¡}tƒ }| ¡  ¡ D ]^}| ¡ }	|	rh|	d dkrh|	d	 }
| |
¡}t|	ƒd
ks¦|s¶|  d|f ¡ | | d	¡¡ qhd|vsØd|vrè|  d|f ¡ tg d¢ƒ}t ¡ dkr| d¡ |D ].}
|
 d¡s|
|vr|  d|
|f ¡ qd S )NÚCÚLANGZobjdumpz-p)ÚstdoutÚenvr   z$^([-_a-zA-Z0-9]+)\.so(?:\.\d+){0,3}$ZNEEDEDé   é   zinvalid NEEDED line: %rÚlibcÚ
libpthreadz#failed parsing dependencies? got %r)	ZlibrtZlibdlrI   ZlibzÚlibmZlibgcc_srH   zld-linuxZld64ÚPyPyZlibtinfoz	ld-linux-zunexpected dependency %r in %r)r	   ÚlibÚ_nameÚosÚenvironÚcopyÚ
subprocessÚPopenÚPIPEÚcommunicater(   Ú
returncodeÚreÚcompileÚsetÚdecodeÚ
splitlinesÚsplitÚmatchÚlenZfailÚaddÚgroupÚplatformÚpython_implementationÚ
startswith)r&   Zlib_pathrE   ÚpÚoutÚ_Zlib_patÚdepsÚlineÚpartsÚdepÚmÚallowedr   r   r   Ú
test_linuxª  s4    
ÿ


zTestDependencies.test_linuxN)r<   r=   r>   Ú__doc__ÚunittestÚ
skipUnlessÚsysr`   rb   rN   rO   Úgetrl   r   r   r   r   r@   ¥  s   ÿÿr@   c                       s\   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚTestRISCVABIz`
    Test calling convention of floating point arguments of RISC-V
    using different ABI.
    zriscv32-unknown-linuxc                    s   t ƒ  ¡  t ¡  t ¡  d S r   )Úsuperr'   r   Zinitialize_all_targetsZinitialize_all_asmprintersr%   ©Ú	__class__r   r   r'   Ö  s    
zTestRISCVABI.setUpc              
   C   sX   zt j | j¡ W n@ tyR } z(dt|ƒv r:|  d¡ n|‚W Y d }~n
d }~0 0 d S )Nz/No available targets are compatible with triplez(RISCV target unsupported by linked LLVM.)r   r7   Úfrom_tripler*   ÚRuntimeErrorÚstrZskipTest)r&   Úer   r   r   Úcheck_riscv_targetÛ  s    zTestRISCVABI.check_riscv_targetc                 K   s   t j | j¡}|jf i |¤ŽS r   )r   r7   rv   r*   r9   )r&   ÚkwargZlltargetr   r   r   Úriscv_target_machineä  s    z!TestRISCVABI.riscv_target_machinec                 C   s   t  ¡ }t  ¡ }t  |||f¡}t  ¡ }t j||dd}| ¡ }t  |¡}|j\}}	| 	||¡}
| 
|
|	¡}| |¡ t t|ƒ¡}| ¡  |S )NÚfpadd©r4   )r   Z
DoubleTypeZ	FloatTypeÚFunctionTypeÚModuleÚFunctionÚappend_basic_blockÚ	IRBuilderÚargsZfpextZfaddr   r   r-   rx   Úverify)r&   Zf64Zf32Zfntyr1   ÚfuncÚblockZbuilderÚaÚbZarg0ÚresultÚllmodr   r   r   Úfpadd_ll_moduleè  s    


zTestRISCVABI.fpadd_ll_modulec                 C   sD   g }|  ¡ D ]2}| ¡ }| d¡s| d¡s|dks| |¡ q|S )NÚ.r}   Ú )rZ   Ústriprb   Úappend)r&   r.   Zasm_listrg   Zs_liner   r   r   Úbreak_up_asmù  s    ÿzTestRISCVABI.break_up_asmc                 C   s8   |   ¡  |  ¡ }| jdd}|  |  | |¡¡t¡ d S )Nú+f,+d)Úfeatures)rz   rŒ   r|   r(   r‘   Úemit_assemblyÚriscv_asm_ilp32©r&   r‹   r:   r   r   r   Útest_rv32d_ilp32  s    ÿzTestRISCVABI.test_rv32d_ilp32c                 C   s:   |   ¡  |  ¡ }| jddd}|  |  | |¡¡t¡ d S )Nr’   Zilp32f©r“   Zabiname)rz   rŒ   r|   r(   r‘   r”   Úriscv_asm_ilp32fr–   r   r   r   Útest_rv32d_ilp32f	  s    ÿzTestRISCVABI.test_rv32d_ilp32fc                 C   s:   |   ¡  |  ¡ }| jddd}|  |  | |¡¡t¡ d S )Nr’   Zilp32dr˜   )rz   rŒ   r|   r(   r‘   r”   Úriscv_asm_ilp32dr–   r   r   r   Útest_rv32d_ilp32d  s    ÿzTestRISCVABI.test_rv32d_ilp32d)r<   r=   r>   rm   r*   r'   rz   r|   rŒ   r‘   r—   rš   rœ   Ú__classcell__r   r   rt   r   rr   Ï  s   		rr   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dd„ Ze eƒ d¡dd„ ƒZdd „ Zd!S )"ÚTestMiscz7
    Test miscellaneous functions in llvm.binding.
    c                 C   s   |   t¡ d S r   )r1   r?   r%   r   r   r   Útest_parse_assembly  s    zTestMisc.test_parse_assemblyc                 C   sZ   |   t¡}|  t¡ W d   ƒ n1 s*0    Y  t|jƒ}|  d|¡ |  d|¡ d S )Nzparsing errorzinvalid operand type)ÚassertRaisesrw   r1   Úasm_parse_errorrx   Ú	exceptionÚassertIn)r&   ÚcmÚsr   r   r   Útest_parse_assembly_error   s
    (
z"TestMisc.test_parse_assembly_errorc                 C   sj   t  ¡ }t  t  d¡g ¡}t  ||d¡}t  |jdd¡}| t  t  d¡d¡¡ t	|ƒ}|  
|t¡ d S )Né    Úfooz<>!*''#r~   i90  )r   r€   r   ÚIntTyper   rƒ   r‚   r   ÚConstantrx   r(   Úasm_nonalphanum_blocklabel)r&   r0   ÚftÚfnÚbdr.   r   r   r   Útest_nonalphanum_block_name'  s    z$TestMisc.test_nonalphanum_block_namec                 C   s$   t j ¡ }t j ¡ }||ks J ‚d S r   )r   r/   Zget_global_context)r&   Z	gcontext1Z	gcontext2r   r   r   Útest_global_context0  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&   Úaddrr   r   r   Útest_dylib_symbols5  s    

zTestMisc.test_dylib_symbolsc                 C   s"   t  ¡ }|  |t¡ |  |¡ d S r   )r   r,   ÚassertIsInstancerx   Ú
assertTrue)r&   r*   r   r   r   Útest_get_default_triple=  s    z TestMisc.test_get_default_triplec                 C   sb   dd„ }t  ¡ }t  ¡ }|  |t¡ |  |¡ || d¡d ƒ}|| d¡d ƒ}|  ||¡ d S )Nc                 S   s   | dkrdS | S d S )NZpowerpc64leÚppc64ler   )Úarchr   r   r   Únormalize_ppcD  s    z7TestMisc.test_get_process_triple.<locals>.normalize_ppcú-r   )r   Zget_process_tripler,   r´   rx   rµ   r[   r(   )r&   r¹   r*   ÚdefaultZdefault_archZtriple_archr   r   r   Útest_get_process_tripleB  s    
z TestMisc.test_get_process_triplec                 C   sâ   t  ¡ }|  |t¡ |  |t j¡ | ¡ D ]*\}}|  |t¡ |  |¡ |  |t¡ q*|  | 	¡ t¡ d}d 
|¡}|  t |d¡¡ |  t |d¡¡ |  t |d¡¡ t|ƒdkrÈ|  | 	¡ d¡ n|  t || 	¡ ¡¡ d S )Nz[+\-][a-zA-Z0-9\._-]+z^({0}|{0}(,{0})*)?$rŽ   z+aaz+a,-bbr   )r   Zget_host_cpu_featuresr´   ÚdictZ
FeatureMapÚitemsrx   rµ   ÚboolÚflattenr+   ÚassertIsNotNonerV   r\   r]   r(   )r&   r“   ÚkÚvZre_termÚregexr   r   r   Útest_get_host_cpu_featuresT  s     

z#TestMisc.test_get_host_cpu_featuresc                 C   s"   t  ¡ }|  |t¡ |  |¡ d S r   )r   Úget_host_cpu_namer´   rx   rµ   )r&   Úcpur   r   r   Útest_get_host_cpu_namek  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()
            ú-c©rQ   Ú
check_callrp   Ú
executable©r&   Úcoder   r   r   Útest_initfinip  s    
zTestMisc.test_initfinic                 C   s   d}t  tjd|g¡ d S )Nz„if 1:
            from llvmlite import binding as llvm

            llvm.set_option("progname", "-debug-pass=Disabled")
            rÉ   rÊ   rÍ   r   r   r   Útest_set_option}  s    zTestMisc.test_set_optionc                 C   s6   t j\}}}g d¢}|  |f|¡ |  |tdƒ¡ d S )N))é   )é   )é   )é   é
   )r   Úllvm_version_infor£   Úrange)r&   ÚmajorÚminorÚpatchZvalidr   r   r   Útest_version‡  s    zTestMisc.test_versionc                 C   s   t  ¡  d S r   )r   Zcheck_jit_executionr%   r   r   r   Útest_check_jit_executionŽ  s    z!TestMisc.test_check_jit_executionzLocale not availablec                 C   s8   |   t¡}t|ƒ}t tjd¡ t|ƒ}|  ||¡ d S )Nr   )r1   Úasm_double_localerx   r   r   r   r(   )r&   rj   ÚexpectÚgotr   r   r   Útest_print_double_locale‘  s
    
z!TestMisc.test_print_double_localec                 C   s$   d}d}t j|d|g}t |¡ d S )Nzfrom llvmlite import bindingz-WerrorrÉ   )rp   rÌ   rQ   rË   )r&   rÎ   ÚflagsZcmdargsr   r   r   Útest_no_accidental_warnings  s    z$TestMisc.test_no_accidental_warningsN)r<   r=   r>   rm   rŸ   r¦   r¯   r°   r³   r¶   r¼   rÅ   rÈ   rÏ   rÐ   rÛ   rÜ   rn   ZskipIfr   rà   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)d*„ Zd+S ),ÚTestModuleRefc                 C   s*   |   ¡ }t|ƒ ¡ }|  | d¡|¡ d S )Nz; ModuleID =)r1   rx   r   rµ   rb   ©r&   r0   r¥   r   r   r   Útest_str¦  s    zTestModuleRef.test_strc                 C   sX   |   ¡ }t|ƒ | ¡  |  tj¡ t|ƒ W d   ƒ n1 sB0    Y  | ¡  d S r   )r1   rx   Úcloser    ÚctypesÚArgumentError©r&   r0   r   r   r   Ú
test_close«  s    &zTestModuleRef.test_closec              	   C   sÂ   |   ¡ }t|ƒ | t|ƒ W d   ƒ n1 s20    Y  |  tj¡ t|ƒ W d   ƒ n1 sf0    Y  |  t¡4 | W d   ƒ n1 s–0    Y  W d   ƒ n1 s´0    Y  d S r   )r1   rx   r    rç   rè   rw   ré   r   r   r   Ú	test_with³  s    &&zTestModuleRef.test_withc                 C   s4   |   ¡ }d|_|  |jd¡ d|_|  |jd¡ d S )Nr¨   Úbar)r1   r4   r(   ré   r   r   r   Ú	test_name¾  s
    zTestModuleRef.test_namec                 C   s   |   ¡ }|  |jd¡ d S )Nz	asm_sum.c)r1   r(   Zsource_fileré   r   r   r   Útest_source_fileÅ  s    zTestModuleRef.test_source_filec                 C   s2   |   ¡ }|j}|  |t¡ ||_|  ||j¡ d S r   )r1   Zdata_layoutr´   rx   r(   rä   r   r   r   Útest_data_layoutÉ  s
    zTestModuleRef.test_data_layoutc                 C   s6   |   ¡ }|j}|  |t ¡ ¡ d|_|  |jd¡ d S )NrŽ   )r1   r*   r(   r   r,   rä   r   r   r   Útest_tripleÐ  s
    zTestModuleRef.test_triplec                 C   sn   |   ¡ }|  | ¡ d ¡ |   t¡}|  t¡}| ¡  W d   ƒ n1 sJ0    Y  t|jƒ}|  d|¡ d S )Nz%.bug = add i32 1, %.bug)	r1   r±   r…   Úasm_verification_failr    rw   rx   r¢   r£   )r&   r0   r¤   r¥   r   r   r   Útest_verify×  s    
&
zTestModuleRef.test_verifyc                 C   sr   |   ¡ }| d¡}|  |tj¡ |  |jd¡ |  t¡ | d¡ W d   ƒ n1 sX0    Y  ~t	|j ƒ d S )NÚsumr¨   )
r1   Úget_functionr´   r   ÚValueRefr(   r4   r    Ú	NameErrorrx   ©r&   r0   r­   r   r   r   Útest_get_functionâ  s    
(zTestModuleRef.test_get_functionc                 C   sn   |   ¡ }| d¡}|  |jd¡ |  t dt|ƒ¡¡ |  t	¡ | d¡ W d   ƒ n1 s`0    Y  d S )Nzstruct.glob_typeú8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] }zstruct.doesnt_exist)
r1   Zget_struct_typer(   r4   rÁ   rV   r\   rx   r    rö   )r&   r0   Zst_tyr   r   r   Útest_get_struct_typeï  s    
þz"TestModuleRef.test_get_struct_typec                 C   sr   |   ¡ }| d¡}|  |tj¡ |  |jd¡ |  t¡ | d¡ W d   ƒ n1 sX0    Y  ~t	|j ƒ d S )Nr2   rì   )
r1   r3   r´   r   rõ   r(   r4   r    rö   rx   )r&   r0   Úgvr   r   r   Útest_get_global_variableû  s    
(z&TestModuleRef.test_get_global_variablec                 C   sN   |   ¡ }|j}~t|dd„ d}|  t|ƒd¡ |  dd„ |D ƒg d¢¡ d S )Nc                 S   s   | j S r   r~   )Úvaluer   r   r   Ú<lambda>  ó    z5TestModuleRef.test_global_variables.<locals>.<lambda>)Úkeyé   c                 S   s   g | ]
}|j ‘qS r   r~   )Ú.0Úgr   r   r   Ú
<listcomp>  rÿ   z7TestModuleRef.test_global_variables.<locals>.<listcomp>)r2   Úglob_bZglob_fÚglob_struct)r1   Úglobal_variablesÚsortedr(   r]   )r&   r0   ÚitZglobsr   r   r   Útest_global_variables  s    ÿz#TestModuleRef.test_global_variablesc                 C   s>   |   ¡ }|j}~t|ƒ}|  t|ƒd¡ |  |d jd¡ d S ©NrF   r   ró   )r1   Ú	functionsÚlistr(   r]   r4   )r&   r0   r	  Ú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 )NrF   ústruct\.glob_type(\.[\d]+)?r   rù   )
r1   Zstruct_typesr  r(   r]   rÁ   rV   r\   r4   rx   )r&   r0   r	  Ústructsr   r   r   Útest_structs  s    
ÿ
þzTestModuleRef.test_structsc                 C   sˆ   |   ¡ }|   t¡}| |¡ |  tdd„ |jD ƒƒddg¡ | d¡ | ¡  |  t	j
¡ | d¡ W d   ƒ n1 sz0    Y  d S )Nc                 s   s   | ]}|j V  qd S r   r~   ©r  Úfr   r   r   Ú	<genexpr>*  rÿ   z-TestModuleRef.test_link_in.<locals>.<genexpr>Úmulró   )r1   Ú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)Úpreservec                 s   s   | ]}|j V  qd S r   r~   r  r   r   r   r  5  rÿ   z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>r  ró   c                 s   s   | ]}|j V  qd S r   r~   r  r   r   r   r  7  rÿ   )r1   r  r  r(   r  r  ræ   rô   )r&   r  Zsrc2r   r   r   Útest_link_in_preserve0  s    
ÿz#TestModuleRef.test_link_in_preservec                 C   s\   |   ¡ }|   t¡}|  t¡}| |¡ W d   ƒ n1 s<0    Y  |  dt|jƒ¡ d S )Nzsymbol multiply defined)r1   Úasm_sum2r    rw   r  r£   rx   r¢   )r&   r  r  r¤   r   r   r   Útest_link_in_error:  s
    
(z TestModuleRef.test_link_in_errorc                 C   s6   |   ¡ }| ¡ }d}d}|  | |¡p.| |¡¡ d S )Ns   ÞÀs   BC)r1   Ú
as_bitcoderµ   rb   )r&   r0   ÚbcZbitcode_wrapper_magicZbitcode_magicr   r   r   Útest_as_bitcodeC  s    ÿzTestModuleRef.test_as_bitcodec                 C   s~   |   t¡}t d¡ W d   ƒ n1 s*0    Y  |  dt|jƒ¡ tjd dk rh|  dt|jƒ¡ n|  dt|jƒ¡ d S )Nrÿ   zLLVM bitcode parsing errorr   é	   zInvalid bitcode signaturez(file too small to contain bitcode header)r    rw   r   Úparse_bitcoder£   rx   r¢   rÖ   )r&   r¤   r   r   r   Útest_parse_bitcode_errorM  s    (
ÿz&TestModuleRef.test_parse_bitcode_errorc                 C   sT   t  ¡ }| j|d ¡ }t  ¡ }t  ||¡}|  | ¡ |¡ | d¡ | d¡ d S )N)r/   ró   r2   )r   Zcreate_contextr1   r   r$  r(   rô   r3   )r&   Zcontext1r!  Zcontext2r0   r   r   r   Útest_bitcode_roundtripY  s    
z$TestModuleRef.test_bitcode_roundtripc                 C   s4   |   ¡ }| ¡ }|  ||¡ |  | ¡ | ¡ ¡ d S r   )r1   ÚcloneZassertIsNotr(   r   )r&   rj   Zclonedr   r   r   Útest_cloningd  s    zTestModuleRef.test_cloningN)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   r   r   r   rã   ¤  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 r   )Úfinalize_objectÚget_function_addressrµ   r   r   )r&   ÚeeÚ	func_nameZcfptrr   r   r   Úget_sump  s    

zJITTestMixin.get_sumc                 C   sV   |   ¡ }|  |¡0}|  |¡}|ddƒ}|  d|¡ W d   ƒ n1 sH0    Y  d S )NrG   éûÿÿÿéýÿÿÿ)r1   r6   r.  r(   )r&   r0   r,  ÚcfuncÚresr   r   r   Útest_run_codev  s
    

zJITTestMixin.test_run_codec                 C   sV   |   |  ¡ ¡}| ¡  | ¡  |  tj¡ | ¡  W d   ƒ n1 sH0    Y  d S r   )r6   r1   ræ   r    rç   rè   r*  ©r&   r,  r   r   r   rê   }  s
    zJITTestMixin.test_closec              	   C   s¸   |   |  ¡ ¡}| W d   ƒ n1 s(0    Y  |  t¡4 | W d   ƒ n1 sX0    Y  W d   ƒ n1 sv0    Y  |  tj¡ | ¡  W d   ƒ n1 sª0    Y  d S r   )r6   r1   r    rw   rç   rè   r*  r4  r   r   r   rë   „  s    <zJITTestMixin.test_withc                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r   ©r1   r6   ræ   ©r&   r0   r,  r   r   r   Útest_module_lifetimeŽ  s    
z!JITTestMixin.test_module_lifetimec                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r   r5  r6  r   r   r   Útest_module_lifetime2”  s    
z"JITTestMixin.test_module_lifetime2c                 C   sz   |   |  ¡ ¡}|  t¡}| |¡ |  t¡ | |¡ W d   ƒ n1 sL0    Y  |  |j¡ | ¡  |  	|j¡ d S r   )
r6   r1   r  Ú
add_moduler    ÚKeyErrorÚassertFalseÚclosedræ   rµ   ©r&   r,  r0   r   r   r   Útest_add_moduleš  s    

(zJITTestMixin.test_add_modulec                 C   s6   |   |  ¡ ¡}|  t¡}| |¡ | ¡  | ¡  d S r   ©r6   r1   r  r9  ræ   r=  r   r   r   Útest_add_module_lifetime¤  s
    

z%JITTestMixin.test_add_module_lifetimec                 C   s6   |   |  ¡ ¡}|  t¡}| |¡ | ¡  | ¡  d S r   r?  r=  r   r   r   Útest_add_module_lifetime2«  s
    

z&JITTestMixin.test_add_module_lifetime2c                 C   s„   |   |  ¡ ¡}|  t¡}| |¡ | |¡ |  t¡ | |¡ W d   ƒ n1 sV0    Y  |  |j¡ | 	¡  |  |j¡ d S r   )
r6   r1   r  r9  Zremove_moduler    r:  r;  r<  ræ   r=  r   r   r   Útest_remove_module²  s    


(zJITTestMixin.test_remove_modulec                 C   s>   |   ¡ }|  |¡}|j}|  |j|¡ t|ƒ ~~t|ƒ d S r   )r1   r6   Útarget_datar±   rx   )r&   r0   r,  Útdr   r   r   Útest_target_data½  s    
zJITTestMixin.test_target_datac           	      C   sè   |   ¡ }|  |¡}|j}| d¡}| d¡}| d¡}tjdk rDdnd}|||fD ]}|  | |j¡|¡ qR|  | 	|j¡d¡ |  | 
|j¡d¡ |  | 	|j¡d¡ |  | 
|j¡d¡ |  | 	|j¡d	¡ |  | 
|j¡d
¡ d S )Nr2   r  r  ì        r  é   rF   )rF   rG   r  é   )r  rG  )r1   r6   rC  r3   rp   Úmaxsizer(   Úget_abi_sizeÚtypeÚget_pointee_abi_sizeZget_pointee_abi_alignmentr£   )	r&   r0   r,  rD  Ú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 r   ©r   ©r0   Úbuf©Únotifiesr   r   Únotifyß  s    z5JITTestMixin.test_object_cache_notify.<locals>.notifyr   rG   r/  rF   r  )r1   r6   Úset_object_cacher(   r]   r.  r±   r´   Úbytesr  r9  )r&   rU  r0   r,  r1  Zmod2r   rS  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 r   rP  rQ  rS  r   r   rU  û  s    z8JITTestMixin.test_object_cache_getbuffer.<locals>.notifyc                    s   ˆ   | ¡ d S r   rP  ©r0   )Ú
getbuffersr   r   Ú	getbufferþ  s    z;JITTestMixin.test_object_cache_getbuffer.<locals>.getbufferr   rF   c                    s   ˆ   | ¡ ˆS r   rP  rY  )rZ  Ú
sum_bufferr   r   Úgetbuffer_successful  s    
zFJITTestMixin.test_object_cache_getbuffer.<locals>.getbuffer_successfulrG   r/  r0  )r1   r6   rV  r(   r]   r.  r±   r  )r&   rU  r[  r0   r,  r1  r]  r   )rZ  rT  r\  r   Útest_object_cache_getbuffer÷  s4    




z(JITTestMixin.test_object_cache_getbufferN)ró   )r<   r=   r>   rm   r.  r3  rê   rë   r7  r8  r>  r@  rA  rB  rE  rO  rX  r^  r   r   r   r   r)  k  s   



r)  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚJITWithTMTestMixinc                 C   sf   | j dd}|  ¡ }|  ||¡}| |¡}|  d|¡ | d¡ | |¡}|  d|¡ |  ||¡ dS )z%Test TargetMachineRef.emit_assembly()Tr5   ró   N)r;   r1   r6   r”   r£   Zset_asm_verbosityZassertNotEqual)r&   r;   r0   r,  Zraw_asmZraw_asm_verboser   r   r   Útest_emit_assembly&  s    


z%JITWithTMTestMixin.test_emit_assemblyc                 C   sZ   | j dd}|  ¡ }|  ||¡}| |¡}|  |t¡ tj d¡rV|  	d|dd… ¡ dS )z#Test TargetMachineRef.emit_object()Tr5   rA   s   ELFNrÕ   )
r;   r1   r6   Úemit_objectr´   rW  rp   r`   rb   r£   )r&   r;   r0   r,  Úcode_objectr   r   r   Útest_emit_object2  s    
z#JITWithTMTestMixin.test_emit_objectN)r<   r=   r>   r`  rc  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 u r| j dd}t ||¡S )NTr5   )r;   r   Úcreate_mcjit_compiler)r&   r0   r;   r   r   r   r6   C  s    zTestMCJit.jit)N)r<   r=   r>   rm   r6   r   r   r   r   rd  >  s   rd  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)d*„ Zd+S ),ÚTestValueRefc                 C   s&   |   ¡ }| d¡}|  t|ƒd¡ d S )Nr2   z@glob = global i32 0)r1   r3   r(   rx   ©r&   r0   r2   r   r   r   rå   K  s    
zTestValueRef.test_strc                 C   s8   |   ¡ }| d¡}|  |jd¡ d|_|  |jd¡ d S )Nr2   Úfoobar)r1   r3   r(   r4   rg  r   r   r   rí   P  s
    
zTestValueRef.test_namec                 C   sp   |   ¡ }| d¡}|j}|  |jtj¡ ||_|  |j|¡ dD ]*}||_|  |jtj¡ |  |jj|¡ q@d S )Nr2   )ÚinternalÚexternal)r1   r3   Úlinkager´   r   ZLinkager(   r4   )r&   r0   r2   rk  r   r   r   Útest_linkageW  s    
zTestValueRef.test_linkagec                 C   sp   |   ¡ }| d¡}|j}|  |jtj¡ ||_|  |j|¡ dD ]*}||_|  |jtj¡ |  |jj|¡ q@d S )Nr2   )ÚhiddenZ	protectedr»   )r1   r3   Ú
visibilityr´   r   Z
Visibilityr(   r4   )r&   r0   r2   rn  r   r   r   Útest_visibilityc  s    
zTestValueRef.test_visibilityc                 C   sp   |   ¡ }| d¡}|j}|  |jtj¡ ||_|  |j|¡ dD ]*}||_|  |jtj¡ |  |jj|¡ q@d S )Nr2   )Z	dllimportZ	dllexportr»   )r1   r3   Ústorage_classr´   r   ZStorageClassr(   r4   )r&   r0   r2   rp  r   r   r   Útest_storage_classo  s    
zTestValueRef.test_storage_classc                 C   sf   |   ¡ }| d¡}| d¡ |  t¡}| d¡ W d   ƒ n1 sF0    Y  |  t|jƒd¡ d S )Nró   Z	nocaptureZzextzno such attribute 'zext')r1   rô   Zadd_function_attributer    Ú
ValueErrorr(   rx   r¢   )r&   r0   r­   Zraisesr   r   r   Útest_add_function_attribute{  s    

(z(TestValueRef.test_add_function_attributec                 C   s$   |   ¡ }| d¡}|  |j |¡ d S ©Nr2   )r1   r3   r±   rg  r   r   r   Útest_moduleƒ  s    
zTestValueRef.test_modulec                 C   s*   |   ¡ }| d¡}|j}|  |tj¡ d S rt  )r1   r3   rK  r´   r   ZTypeRef©r&   r0   r2   Útpr   r   r   Ú	test_typeˆ  s    
zTestValueRef.test_typec                 C   sL   |   ¡ }| d¡}|j}|  |jd¡ | d¡}|  t d|jjj¡¡ d S )Nr2   rŽ   r  r  )	r1   r3   rK  r(   r4   rÁ   rV   r\   Úelement_type)r&   r0   r2   rw  Ústr   r   r   Útest_type_nameŽ  s    


ÿzTestValueRef.test_type_namec                 C   s,   |   ¡ }| d¡}|j}|  t|ƒd¡ d S )Nr2   zi32*)r1   r3   rK  r(   rx   rv  r   r   r   Útest_type_printing_variable—  s    
z(TestValueRef.test_type_printing_variablec                 C   s(   |   ¡ }| d¡}|  t|jƒd¡ d S )Nró   zi32 (i32, i32)*)r1   rô   r(   rx   rK  r÷   r   r   r   Útest_type_printing_function  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]+)?\*rù   )
r1   r3   rµ   rK  Z
is_pointerrÁ   rV   r\   rx   ry  )r&   r0   rz  r   r   r   Útest_type_printing_struct¢  s    

ÿ
þz&TestValueRef.test_type_printing_structc                 C   s   |   ¡ }| ¡  | ¡  d S r   )r2   ræ   )r&   r2   r   r   r   rê   ¬  s    zTestValueRef.test_closec                 C   s:   |   ¡  d¡}|   t¡ d¡}|  |j¡ |  |j¡ d S )Nró   )r1   rô   Úasm_sum_declarer;  Zis_declarationrµ   )r&   ÚdefinedZdeclaredr   r   r   Útest_is_declaration±  s    z TestValueRef.test_is_declarationc                 C   s>   |   t¡}t|jƒ}|  t|ƒd¡ |D ]}|  |j¡ q(d S ©Nr  )r1   r?   r  r  r(   r]   rµ   Ú	is_global)r&   r0   ÚgvarsrÃ   r   r   r   Útest_module_global_variables·  s
    

z)TestValueRef.test_module_global_variablesc                 C   sØ   |   ¡ }t|jƒ}|  t|ƒd¡ |d }|  |j¡ |  |jd¡ |  t	¡ |j
 W d   ƒ n1 sj0    Y  |  t	¡ |j W d   ƒ n1 sš0    Y  |  t	¡ |j W d   ƒ n1 sÊ0    Y  d S r  )r1   r  r  r(   r]   rµ   Úis_functionr4   r    rr  ÚinstructionsÚoperandsÚopcode)r&   r0   r  r†   r   r   r   Útest_module_functions¾  s    
$$z"TestValueRef.test_module_functionsc                 C   s  |   ¡ }| d¡}|  |j¡ t|jƒ}|  t|ƒd¡ |  |d j¡ |  |d j¡ |  |d j	d¡ |  t
|d jƒd¡ |  |d j	d¡ |  t
|d jƒd¡ |  t¡ |d j W d   ƒ n1 sÒ0    Y  |  t¡ |d j W d   ƒ n1 s0    Y  d S )Nró   rG   r   rF   ú.1Úi32ú.2)r1   rô   rµ   r†  r  Ú	argumentsr(   r]   Úis_argumentr4   rx   rK  r    rr  Úblocks)r&   r0   r†   r„   r   r   r   Útest_function_argumentsÍ  s    

(z$TestValueRef.test_function_argumentsc                 C   s@   |   ¡  d¡}t|jƒ}|  t|ƒd¡ |d }|  |j¡ d S )Nró   rF   r   )r1   rô   r  r  r(   r]   rµ   Zis_block)r&   r†   r  r‡   r   r   r   Útest_function_blocksß  s
    
z!TestValueRef.test_function_blocksc                 C   sœ   |   ¡  d¡}tt|jƒd jƒ}|  t|ƒd¡ |  |d j¡ |  |d j¡ |  |d j¡ |  |d j	d¡ |  |d j	d¡ |  |d j	d¡ d S )Nró   r   é   rF   rG   r^   r   )
r1   rô   r  r  r‡  r(   r]   rµ   Zis_instructionr‰  )r&   r†   Zinstsr   r   r   Útest_block_instructionsæ  s    z$TestValueRef.test_block_instructionsc                 C   sÂ   |   ¡  d¡}tt|jƒd jƒd }|  |jd¡ t|jƒ}|  t|ƒd¡ |  	|d j
¡ |  	|d j
¡ |  |d jd¡ |  t|d jƒd¡ |  |d jd¡ |  t|d jƒd¡ d S )	Nró   r   r^   rG   rF   r‹  rŒ  r  )r1   rô   r  r  r‡  r(   r‰  rˆ  r]   rµ   Z
is_operandr4   rx   rK  )r&   r†   r^   rˆ  r   r   r   Útest_instruction_operandsñ  s    
z&TestValueRef.test_instruction_operandsc                 C   sŒ   |   t¡}|jD ]v}t|jƒ}|jdkr8|  |dg¡ q|jdkr|  |g ¡ t|jƒ}|  t|d jƒdg¡ |  t|d jƒg ¡ qd S )NZa_readonly_funcs   readonlyZa_arg0_return_funcr   s   returnedrF   )r1   Úasm_attributesr  r  Ú
attributesr4   r(   rŽ  )r&   r0   r†   Úattrsr„   r   r   r   Útest_function_attributesþ  s    





z%TestValueRef.test_function_attributesN)r<   r=   r>   rå   rí   rl  ro  rq  rs  ru  rx  r{  r|  r}  r~  rê   r  r…  rŠ  r‘  r’  r”  r•  r™  r   r   r   r   rf  I  s*   	
rf  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   sv   t jj}|  t¡}|dƒ W d   ƒ n1 s00    Y  |  dt|jƒ¡ t  ¡ }||ƒ}|  	|j
|¡ | ¡  d S )Nrh  z(No available targets are compatible with)r   r7   rv   r    rw   r£   rx   r¢   r,   r(   r*   ræ   )r&   r  r¤   r*   r:   r   r   r   Útest_from_triple  s    &ÿzTestTarget.test_from_triplec                 C   s@   t j t  ¡ ¡}| ddddd¡ t  ¡ }| |dddd¡ d S )NrŽ   rF   r»   )r   r7   rv   r,   r9   rÆ   )r&   r:   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 r   )	r   r7   rv   r,   r8   r´   r4   rx   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 r   )	r   r7   rv   r,   r8   r´   Údescriptionrx   r(   r  r   r   r   Útest_description&  s    
zTestTarget.test_descriptionc                 C   s8   t j t  ¡ ¡}t|ƒ}|  |j|¡ |  |j|¡ d S r   )r   r7   rv   r,   rx   r£   r4   r   )r&   r:   r¥   r   r   r   rå   ,  s    zTestTarget.test_strN)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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_datar%   r   r   r   rC  5  s    zTestTargetData.target_datac                 C   s(   |   ¡ }|  ¡ }|  | |j¡d¡ d S )NrG  )rC  r2   r(   rJ  rK  ©r&   rD  r2   r   r   r   Útest_get_abi_size8  s    z TestTargetData.test_get_abi_sizec                 C   sF   |   ¡ }|  ¡ }|  | |j¡d¡ |  d¡}|  | |j¡d¡ d S )Nr  r  rH  )rC  r2   r(   rL  rK  r£  r   r   r   Útest_get_pointee_abi_size=  s
    
z(TestTargetData.test_get_pointee_abi_sizec                 C   s~   |   ¡ }|  d¡}|  t¡ | |jd¡ W d   ƒ n1 s@0    Y  |jj}|  | |d¡d¡ |  | |d¡d¡ d S )Nr  r   rF   rG  )rC  r2   r    rr  Zget_element_offsetrK  ry  r(   )r&   rD  r2   Zstruct_typer   r   r   Útest_get_struct_element_offsetF  s    
,z-TestTargetData.test_get_struct_element_offsetN)r<   r=   r>   rC  r¤  r¥  r¦  r   r   r   r   r¢  3  s   	r¢  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestTargetMachinec                 C   s"   | j dd}t ¡ }| |¡ d S )NFr5   )r;   r   Úcreate_module_pass_managerZadd_analysis_passes)r&   ÚtmÚpmr   r   r   Útest_add_analysis_passesT  s    z*TestTargetMachine.test_add_analysis_passesc                 C   sN   | j dd}|j}|  ¡ }| d¡}tjdk r2dnd}|  | |j¡|¡ d S )NFr5   r2   rF  r  rG  )	r;   rC  r1   r3   rp   rI  r(   rJ  rK  )r&   r©  rD  r0   rM  rN  r   r   r   Útest_target_data_from_tmY  s    
z*TestTargetMachine.test_target_data_from_tmN)r<   r=   r>   r«  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 r   )r   ZPassManagerBuilderr%   r   r   r   Úpmbe  s    zTestPassManagerBuilder.pmbc                 C   s   t  ¡ }d|_d|_d S )NrG   r“  )r   Úcreate_pass_manager_builderÚinlining_thresholdÚ	opt_level©r&   r®  r   r   r   Útest_old_apih  s    z#TestPassManagerBuilder.test_old_apic                 C   s   |   ¡ }| ¡  | ¡  d S r   )r®  ræ   r²  r   r   r   rê   n  s    z!TestPassManagerBuilder.test_closec                 C   s<   |   ¡ }|  |jt¡ tdƒD ]}||_|  |j|¡ qd S r‚  )r®  r´   r±  Úintr×   r(   ©r&   r®  Úir   r   r   Útest_opt_levels  s
    z%TestPassManagerBuilder.test_opt_levelc                 C   s<   |   ¡ }|  |jt¡ tdƒD ]}||_|  |j|¡ qd S r‚  )r®  r´   Z
size_levelr´  r×   r(   rµ  r   r   r   Útest_size_levelz  s
    z&TestPassManagerBuilder.test_size_levelc                 C   sL   |   ¡ }|  t¡ |j W d   ƒ n1 s.0    Y  dD ]
}||_q<d S )N)é   éP   i^  )r®  r    ÚNotImplementedErrorr°  rµ  r   r   r   Útest_inlining_threshold  s
    $z.TestPassManagerBuilder.test_inlining_thresholdc                 C   s8   |   ¡ }|  |jt¡ dD ]}||_|  |j|¡ qd S ©N)TF)r®  r´   Zdisable_unroll_loopsr¿   r(   ©r&   r®  r‰   r   r   r   Útest_disable_unroll_loopsˆ  s
    z0TestPassManagerBuilder.test_disable_unroll_loopsc                 C   s8   |   ¡ }|  |jt¡ dD ]}||_|  |j|¡ qd S r½  )r®  r´   Zloop_vectorizer¿   r(   r¾  r   r   r   Útest_loop_vectorize  s
    z*TestPassManagerBuilder.test_loop_vectorizec                 C   s8   |   ¡ }|  |jt¡ dD ]}||_|  |j|¡ qd S r½  )r®  r´   Zslp_vectorizer¿   r(   r¾  r   r   r   Útest_slp_vectorize–  s
    z)TestPassManagerBuilder.test_slp_vectorizec                 C   s.   |   ¡ }t ¡ }| |¡ | ¡  | ¡  d S r   )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 r   )r1   r®  r   Úcreate_function_pass_managerrÂ  ræ   )r&   r0   r®  rª  r   r   r   Ú#test_populate_function_pass_manager¤  s    

z:TestPassManagerBuilder.test_populate_function_pass_managerN)r<   r=   r>   r®  r³  rê   r·  r¸  r¼  r¿  rÀ  rÁ  rÃ  rÅ  r   r   r   r   r­  c  s   r­  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚPassManagerTestMixinc                 C   s   t  ¡ }d|_d|_|S )NrG   i,  )r   r¯  r±  r°  r²  r   r   r   r®  ¯  s    zPassManagerTestMixin.pmbc                 C   s   |   ¡ }| ¡  | ¡  d S r   )rª  ræ   ©r&   rª  r   r   r   rê   µ  s    zPassManagerTestMixin.test_closeN)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d„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚTestModulePassManagerc                 C   s   t  ¡ S r   ©r   r¨  r%   r   r   r   rª  ½  s    zTestModulePassManager.pmc                 C   s¼   |   ¡ }|  ¡  |¡ |  ¡ }t|ƒ}| |¡ t|ƒ}| ¡ }t|ƒD ]f\}}| ¡  	d¡rHddh}|D ]}	|	|v rj q„qjt
dƒ‚||	hA  ¡ }
|  d|¡ |  |
|¡  q¸qHt
dƒ‚d S )Nzret i32z%.3ú%.4zexpected tokens not foundzexpected IR not found)rª  r®  rÂ  r1   rx   ÚrunrZ   Ú	enumerater   rb   rw   Úpopr£   ÚassertNotIn)r&   rª  r0   Úorig_asmÚopt_asmZopt_asm_splitÚidxÚlÚtoksrž  Z
othertokenr   r   r   Útest_runÀ  s&    
zTestModulePassManager.test_runc                 C   s^   |   ¡ }| d¡ |  ¡  |¡ |  t¡}| |¡\}}|  |¡ |  d|¡ |  d|¡ d S )NéF   ÚPassedÚinlineme©	rª  Úadd_function_inlining_passr®  rÂ  r1   Úasm_inlineasm2Úrun_with_remarksrµ   r£   ©r&   rª  r0   ÚstatusÚremarksr   r   r   Ú'test_run_with_remarks_successful_inlineÞ  s    


z=TestModulePassManager.test_run_with_remarks_successful_inlinec                 C   sj   |   ¡ }| d¡ |  ¡  |¡ |  t¡}| |¡\}}|  |¡ |  d|¡ |  d|¡ |  d|¡ d S )Nr   ZMissedr×  znoinline function attribute)	rª  rÙ  r®  rÂ  r1   Úasm_inlineasm3rÛ  rµ   r£   rÜ  r   r   r   Ú#test_run_with_remarks_failed_inlineé  s    


z9TestModulePassManager.test_run_with_remarks_failed_inlinec                 C   sV   |   ¡ }| d¡ |  ¡  |¡ |  t¡}|j|dd\}}|  |¡ |  d|¡ d S )NrÕ  Únothing©Zremarks_filterrŽ   )	rª  rÙ  r®  rÂ  r1   rÚ  rÛ  rµ   r(   rÜ  r   r   r   Ú'test_run_with_remarks_inline_filter_outö  s    


z=TestModulePassManager.test_run_with_remarks_inline_filter_outc                 C   sb   |   ¡ }| d¡ |  ¡  |¡ |  t¡}|j|dd\}}|  |¡ |  d|¡ |  d|¡ d S )NrÕ  zinlin.*rã  rÖ  r×  rØ  rÜ  r   r   r   Ú&test_run_with_remarks_inline_filter_inÿ  s    


z<TestModulePassManager.test_run_with_remarks_inline_filter_inN)	r<   r=   r>   rª  rÔ  rß  rá  rä  rå  r   r   r   r   rÈ  »  s   	rÈ  c                   @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚTestFunctionPassManagerNc                 C   s   |p
|   ¡ }t |¡S r   )r1   r   rÄ  ré   r   r   r   rª    s    zTestFunctionPassManager.pmc                 C   s   |   ¡ }| ¡  | ¡  d S r   )rª  r    ÚfinalizerÇ  r   r   r   rÏ     s    z%TestFunctionPassManager.test_initfinic                 C   sx   |   ¡ }| d¡}|  |¡}|  ¡  |¡ | ¡  t|ƒ}| ¡  | |¡ | 	¡  t|ƒ}|  
d|¡ |  d|¡ d S )Nró   rÊ  )r1   rô   rª  r®  rÂ  ræ   rx   r    rË  rç  r£   rÎ  )r&   r0   r­   rª  rÏ  rÐ  r   r   r   rÔ    s    


z TestFunctionPassManager.test_runc                 C   s€   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  | 	|¡\}}| 
¡  |  |¡ |  d|¡ |  d|¡ d S )NÚlicmrÖ  ©r1   Úlicm_asmrô   rª  Úadd_licm_passr®  rÂ  ræ   r    rÛ  rç  rµ   r£   ©r&   r0   r­   rª  ÚokrÞ  r   r   r   Útest_run_with_remarks$  s    



z-TestFunctionPassManager.test_run_with_remarksc                 C   sx   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  |j	|dd\}}| 
¡  |  |¡ |  d|¡ d S )Nrè  râ  rã  rŽ   )r1   rê  rô   rª  rë  r®  rÂ  ræ   r    rÛ  rç  rµ   r(   rì  r   r   r   Ú test_run_with_remarks_filter_out3  s    



z8TestFunctionPassManager.test_run_with_remarks_filter_outc                 C   s„   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  |j	|dd\}}| 
¡  |  |¡ |  d|¡ |  d|¡ d S )Nrè  rã  rÖ  ré  rì  r   r   r   Útest_run_with_remarks_filter_inA  s    



z7TestFunctionPassManager.test_run_with_remarks_filter_in)N)	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 )Ú
TestPassesc                 C   s   t  ¡ S r   rÉ  r%   r   r   r   rª  S  s    zTestPasses.pmc                 C   s*  |   ¡ }| ¡  | ¡  | ¡  | d¡ | ¡  | ¡  | ¡  | ¡  | 	¡  | 
¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | d¡ | ¡  | ¡  | ¡  | ¡  | ¡  | d¡ | ¡  | ¡  |  ¡  | !¡  | "¡  | #¡  | $¡  | %¡  | &¡  | '¡  | (¡  | )¡  | *¡  | +¡  | ,¡  | -¡  | .¡  | /¡  | 0¡  | 1¡  | 2¡  | 3¡  | 4¡  | 5¡  | 6¡  | 7¡  | 8¡  | 9¡  | :¡  | ;¡  | <¡  | =¡  | >¡  | ?¡  | @¡  | A¡  | B¡  | C¡  d S )Néá   é*   é   )Drª  Zadd_constant_merge_passZadd_dead_arg_elimination_passZadd_function_attrs_passrÙ  Z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_passrë  Zadd_sccp_passZadd_sroa_passZ"add_type_based_alias_analysis_passZadd_basic_alias_analysis_passZadd_loop_rotate_passZadd_region_info_passZadd_scalar_evolution_aa_passZ)add_aggressive_dead_code_elimination_passZadd_aa_eval_passZadd_always_inliner_passZadd_arg_promotion_passZadd_break_critical_edges_passZadd_dead_store_elimination_passZ*add_reverse_post_order_function_attrs_passZ)add_aggressive_instruction_combining_passZadd_internalize_passZadd_jump_threading_passZadd_lcssa_passZadd_loop_deletion_passZadd_loop_extractor_passZadd_single_loop_extractor_passZadd_loop_strength_reduce_passZadd_loop_simplification_passZadd_loop_unroll_passZadd_loop_unroll_and_jam_passZadd_loop_unswitch_passZadd_lower_atomic_passZadd_lower_invoke_passZadd_lower_switch_passZadd_memcpy_optimization_passZadd_merge_functions_passZadd_merge_returns_passZadd_partial_inlining_passZ!add_prune_exception_handling_passZ add_reassociate_expressions_passZ"add_demote_register_to_memory_passZadd_sink_passZadd_strip_symbols_passZadd_strip_dead_debug_info_passZadd_strip_dead_prototypes_passZadd_strip_debug_declare_passZadd_strip_nondebug_symbols_passZadd_tail_call_elimination_passZadd_basic_aa_passZadd_dependence_analysis_passZadd_dot_call_graph_passZadd_dot_cfg_printer_passZadd_dot_dom_printer_passZadd_dot_postdom_printer_passZadd_globals_mod_ref_aa_passZadd_iv_users_passZadd_lazy_value_info_passZadd_lint_passZadd_module_debug_info_passZadd_refprune_passrÇ  r   r   r   Útest_populateV  sˆ    


zTestPasses.test_populateN)r<   r=   r>   rª  rõ  r   r   r   r   rñ  Q  s   rñ  c                   @   s0   e Zd Zdd„ Ze e ¡ dv d¡dd„ ƒZdS )Ú	TestDylibc                 C   s8   |   t¡ t d¡ W d   ƒ n1 s*0    Y  d S )Nzzzzasdkf;jasd;l)r    rw   r   Úload_library_permanentlyr%   r   r   r   Útest_bad_libraryŸ  s    zTestDylib.test_bad_library)ÚLinuxztest only works on Linuxc                 C   s   t dƒ}t |¡ d S )Nrj   )r   r   r÷  )r&   rJ   r   r   r   Ú	test_libm£  s    zTestDylib.test_libmN)	r<   r=   r>   rø  rn   ro   r`   Úsystemrú  r   r   r   r   rö    s
   ÿrö  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 )Nr§   r¨   )
r   r€   r   r©   r   rƒ   r‚   r„   r^   r   )r&   rj   r¬   r­   r®   Ú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©Z	show_instz%.5 = add i32 %.1, %.2)r   Z
get_globalr   Úget_function_cfgr£   rÎ  )r&   r0   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ó   Tr  FZdigraphzCFG for 'sum' functionz%.3 = add i32 %.1, %.2)r1   rô   r   r  r£   rÎ  )r&   r€  r  r  ÚprefixÚfnamer  r   r   r   Útest_function_cfg_on_llvm_value¾  s    z,TestAnalysis.test_function_cfg_on_llvm_valueN)r<   r=   r>   r   r  r	  r   r   r   r   rü  ª  s   
	rü  c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚTestTypeParsingc                 c   s$   t  ¡ }|V  t|ƒ}t |¡ d S r   )r   r€   rx   r   r-   )r&   r0   r.   r   r   r   Úcheck_parsingÑ  s    zTestTypeParsing.check_parsingc                 C   s¸   |   ¡ @}t t d¡g¡}t ||d¡}t |dg¡|_W d   ƒ n1 sN0    Y  |   ¡ D}tjt d¡gdd}t ||d¡}t |dg¡|_W d   ƒ n1 sª0    Y  d S )Nr§   r¨   rF   T)Úpacked)r  r   ZLiteralStructTyper©   ÚGlobalVariablerª   Zinitializer)r&   r0   Útyprû   r   r   r   Útest_literal_structÛ  s    
.
ÿz#TestTypeParsing.test_literal_structN)r<   r=   r>   r   r  r  r   r   r   r   r
  Ð  s   
	r
  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Ò   é   )r1   Úasm_global_ctorsr6   r*  Zrun_static_constructorsZget_global_value_addressrç   ÚPOINTERÚc_int32Úcastr(   Úcontentsrý   r+  r   Zrun_static_destructors)r&   r0   r,  Zptr_addrZptr_tÚptrZfoo_addrr¨   r   r   r   Útest_global_ctors_dtorsí  s    



z.TestGlobalConstructors.test_global_ctors_dtorsN)r<   r=   r>   r  r   r   r   r   r  ì  s   r  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 )Nr§   r¨   Zundef)	r   r€   r©   r  rk  rx   r£   rÎ  r1   )r&   rk  Ú	has_undefr0   r  rû   r.   r   r   r   Úcheck_global_variable_linkage  s    
z1TestGlobalVariables.check_global_variable_linkagec                 C   s   |   d¡ d S )Nri  ©r  r%   r   r   r   Útest_internal_linkage  s    z)TestGlobalVariables.test_internal_linkagec                 C   s   |   d¡ d S )NÚcommonr  r%   r   r   r   Útest_common_linkage  s    z'TestGlobalVariables.test_common_linkagec                 C   s   | j ddd d S )Nrj  F©r  r  r%   r   r   r   Útest_external_linkage!  s    z)TestGlobalVariables.test_external_linkagec                 C   s   |   d¡ d S )NZavailable_externallyr  r%   r   r   r   Ú!test_available_externally_linkage$  s    z5TestGlobalVariables.test_available_externally_linkagec                 C   s   |   d¡ d S )NÚprivater  r%   r   r   r   Útest_private_linkage'  s    z(TestGlobalVariables.test_private_linkagec                 C   s   |   d¡ d S )NZlinkoncer  r%   r   r   r   Útest_linkonce_linkage*  s    z)TestGlobalVariables.test_linkonce_linkagec                 C   s   |   d¡ d S )NZweakr  r%   r   r   r   Útest_weak_linkage-  s    z%TestGlobalVariables.test_weak_linkagec                 C   s   |   d¡ d S )NZ	appendingr  r%   r   r   r   Útest_appending_linkage0  s    z*TestGlobalVariables.test_appending_linkagec                 C   s   | j ddd d S )NZextern_weakFr!  r  r%   r   r   r   Útest_extern_weak_linkage3  s    z,TestGlobalVariables.test_extern_weak_linkagec                 C   s   |   d¡ d S )NZlinkonce_odrr  r%   r   r   r   Útest_linkonce_odr_linkage6  s    z-TestGlobalVariables.test_linkonce_odr_linkagec                 C   s   |   d¡ d S )NZweak_odrr  r%   r   r   r   Útest_weak_odr_linkage9  s    z)TestGlobalVariables.test_weak_odr_linkageN)T)r<   r=   r>   r  r  r   r"  r#  r%  r&  r'  r(  r)  r*  r+  r   r   r   r   r    s   
r  Úx86zonly on x86c                   @   s   e Zd Zdd„ ZdS )ÚTestInlineAsmc                 C   s:   t  ¡  | jtd}| jdd}| |¡}|  d|¡ d S )N)r.   Fr5   Znop)r   Zinitialize_native_asmparserr1   Úasm_inlineasmr;   r”   r£   )r&   rj   r©  r.   r   r   r   Útest_inlineasm?  s
    
zTestInlineAsm.test_inlineasmN)r<   r=   r>   r/  r   r   r   r   r-  =  s   r-  c                   @   s0   e Zd ZdZd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¼   | j dd}|  ¡ }| |¡}tj |¡}d}d}| ¡ D ]r}| ¡ r:d}|  | 	¡ ¡ |  
| ¡ dk¡ |  
t| ¡ ƒdk¡ |  | ¡ ¡ |  
|| ¡ k ¡ | ¡ } q®q:|  
|¡ d S )NFr5   éÿÿÿÿTr   )r;   r1   ra  r   ÚObjectFileRefÚ	from_dataÚsectionsÚis_textrÁ   r4   rµ   Úsizer]   ÚdataÚaddress)r&   r;   r0   Úobj_binÚobjZhas_textZlast_addressr¥   r   r   r   Útest_object_fileV  s"    
zTestObjectFile.test_object_filec                 C   st   | j dd}|  ¡ }| |¡}tj |¡}t |  | j¡|¡}| |¡ t	t
t
t
ƒ| d¡ƒ}|  |ddƒd¡ d S )NFr5   Ú	sum_twicerG   r“  rÕ   )r;   r1   ra  r   r2  r3  re  Úmod_asmÚadd_object_filer   r   r+  r(   )r&   r;   r0   r9  r:  r6   r<  r   r   r   Útest_add_object_filej  s    
ÿ

ÿz#TestObjectFile.test_add_object_filec           	   	   C   sÄ   | j dd}|  ¡ }| |¡}tƒ \}}zbz*t |d¡}| |¡ | ¡  W | ¡  n
| ¡  0 t	 
|  | j¡|¡}| |¡ W t |¡ nt |¡ 0 ttttƒ| d¡ƒ}|  |ddƒd¡ d S )NFr5   Úwbr<  rG   r“  rÕ   )r;   r1   ra  r   rN   ÚfdopenÚwriteÚflushræ   r   re  r=  r>  Úunlinkr   r   r+  r(   )	r&   r;   r0   r9  Z	temp_descZ	temp_pathr  r6   r<  r   r   r   Ú$test_add_object_file_from_filesystemz  s&    



ÿ
ÿz3TestObjectFile.test_add_object_file_from_filesystemc                 C   sX   t  t¡}tj |¡}| ¡ D ]4}| ¡ r|  t	| 
¡ ƒd¡ |  | 
¡  ¡ t¡ qd S )Né   )rW  ÚfromhexÚissue_632_elfr   r2  r3  r4  r5  r(   r]   r7  ÚhexÚissue_632_text)r&   Zelfr:  r¥   r   r   r   Útest_get_section_content”  s    
z'TestObjectFile.test_get_section_contentN)r<   r=   r>   r=  r;  r?  rE  rK  r   r   r   r   r0  G  s
   r0  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚTestTimePassesc              	   C   s¢   t  ¡ }t  ¡ }d|_| |¡ zJt  d¡ | |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ W t  ¡ }t  d¡ nt  ¡ }t  d¡ 0 |  	|t
¡ |  | d¡d¡ d S )Nr“  TFzPass execution timing reportrF   )r   r¨  r¯  r±  rÂ  Zset_time_passesrË  r1   Úreport_and_reset_timingsr´   rx   r(   Úcount)r&   Úmpr®  Úreportr   r   r   Útest_reporting   s    

ÿzTestTimePasses.test_reportingc                 C   s   |   t ¡ ¡ d S r   )r;  r   rM  r%   r   r   r   Útest_empty_report³  s    z TestTimePasses.test_empty_reportN)r<   r=   r>   rQ  rR  r   r   r   r   rL  Ÿ  s   rL  c                   @   s   e Zd Zdd„ ZdS )ÚTestLLVMLockCallbacksc                    sž   g ‰ ‡ fdd„}‡ fdd„}t j ||¡ |  ˆ ¡ t  ¡  |  dˆ ¡ |  dˆ ¡ t j ||¡ |  t¡ t j ||¡ W d   ƒ n1 s0    Y  d S )Nc                      s   ˆ   d¡ d S )NÚacqrP  r   ©Úeventsr   r   rT  ¼  s    z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.acqc                      s   ˆ   d¡ d S )NÚrelrP  r   rU  r   r   rW  ¿  s    z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.relrT  rW  )	r   r	   Zregister_lock_callbackr;  r¨  r£   Zunregister_lock_callbackr    rr  )r&   rT  rW  r   rU  r   Útest_lock_callbacks¹  s    
z)TestLLVMLockCallbacks.test_lock_callbacksN)r<   r=   r>   rX  r   r   r   r   rS  ¸  s   rS  Ú__main__)Nrç   r   r   Zctypes.utilr   r!   r   rN   r`   rV   rQ   rp   rn   Ú
contextlibr   Útempfiler   Zllvmliter   r   r   Zllvmlite.bindingr	   Zllvmlite.testsr
   Úmachiner÷  r   r?   r  r  r¡   rñ   r  rÝ   r.  rÚ  rà  rê  r  r«   r•   r™   r›   r–  rH  rJ  r   r@   rr   rž   rã   Úobjectr)  r_  rd  rf  rš  r¢  r§  r­  rÆ  rÈ  ræ  rñ  rö  rü  r
  r  r  ro   rb   r-  r0  rL  rS  r<   Úmainr   r   r   r   Ú<module>   s’   



D(ÿÿ"*I  H : C(JOGL&7	X
