U
    ¾ÿjg»; ã                   @   s†  d dl Z d dlZd dl mZ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#e
 $¡ dkre# %dd¡Z#dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.d Z/d!Z0d"Z1d#Z2d$d%d&d'd(d)d*d+d,d-d.d/gZ3d$d0d1d'd2d*d+d,d-d.d/gZ4d3d4d/gZ5d5Z6d6Z7d7Z8d8Z9G d9d:„ d:eƒZ:G d;d<„ d<e:ƒZ;G d=d>„ d>e:ƒZ<G d?d@„ d@e:ƒZ=G dAdB„ dBe:ƒZ>G dCdD„ dDe?ƒZ@G dEdF„ dFe@ƒZAG dGdH„ dHe:eAƒZBe Ce
 ¡  DdI¡dJ¡G dKdL„ dLe:ƒƒZEG dMdN„ dNe:ƒZFG dOdP„ dPe:ƒZGG dQdR„ dRe:ƒZHG dSdT„ dTe:ƒZIG dUdV„ dVe:ƒZJG dWdX„ dXe?ƒZKG dYdZ„ dZe:eKƒZLG d[d\„ d\e:eKƒZMG d]d^„ d^e:eKƒZNG d_d`„ d`e:ƒZOG dadb„ dbe:ƒZPG dcdd„ dde:ƒZQG dedf„ dfeBƒZRG dgdh„ dhe:ƒZSe Ce
 ¡  DdI¡di¡G djdk„ dke:ƒƒZTG dldm„ dme:ƒZUG dndo„ doe:ƒZVG dpdq„ dqe:ƒZWeXdrkr‚e Y¡  dS )sé    N)Ú	CFUNCTYPEÚc_intÚc_int32)Ú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k
r<   Y W ¢dS X W ¢dS W 5 t  t j| ¡ X d S )NÚde_DETF)ÚlocaleÚ	setlocaleÚLC_ALLÚError)Úcur© r   ú?/tmp/pip-unpacked-wheel-lnc_7cdn/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}"

    define i64 @sum(i64 %.1, i64 %.2) {{
      %.3 = add i64 %.1, %.2
      %.4 = add i64 5, %.3
      %.5 = add i64 -5, %.4
      ret i64 %.5
    }}
    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
    }}
    a  
    ; ModuleID = '<string>'
    target triple = "{triple}"
    @mul_glob = global i32 0

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

    declare i8* @Py_GetVersion()

    define void @getversion(i32 %.1, i32 %.2) {{
      %1 = call i8* @Py_GetVersion()
      ret void
    }}
    ÚPyPyZPy_GetVersionZPyPy_GetVersionz¡
    ; 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 fp128 0xLF3CB1CCF26FBC178452FB4EC7F91DEAD, 0xL00000000000000000000000000000001
      ret void
    }}
    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}}]
    aƒ  
    ; ModuleID = "<string>"
    target triple = "{triple}"

    @A = external global i32

    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
}
zÆ
    ; ModuleID = '<string>'
    target triple = "{triple}"

    define void @foo(i64* %.1) {{
      ret void
    }}

    define void @bar() {{
      call void @foo(i64* null)
      ret void
    }}
zaddi	sp, sp, -16zsw	a1, 8(sp)zsw	a2, 12(sp)zfld	ft0, 8(sp)zfmv.w.x	ft1, a0zfcvt.d.s	ft1, ft1zfadd.d	ft0, ft1, ft0zfsd	ft0, 8(sp)zlw	a0, 8(sp)zlw	a1, 12(sp)zaddi	sp, sp, 16Úretzsw	a0, 8(sp)zsw	a1, 12(sp)zfcvt.d.s	ft1, fa0zfcvt.d.s	ft0, fa0zfadd.d	fa0, ft0, fa1zc
declare void @a_readonly_func(i8 *) readonly

declare i8* @a_arg0_return_func(i8* returned, i32*)
A@  7f454c4602010100000000000000000001003e000100000000000000000000000000000000000000e0000000000000000000000040000000000040000500010048c1e2204809c24889d048c1c03d4831d048b90120000480001070480fafc8000000000000000000000000000000000000000000000000002f0000000400f1ff00000000000000000000000000000000070000001200020000000000000000001f00000000000000002e74657874005f5f617279626f002e6e6f74652e474e552d737461636b002e737472746162002e73796d746162003c737472696e673e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0000000300000000000000000000000000000000000000a800000000000000380000000000000000000000000000000100000000000000000000000000000001000000010000000600000000000000000000000000000040000000000000001f000000000000000000000000000000100000000000000000000000000000000f00000001000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000100000000000000000000000000000027000000020000000000000000000000000000000000000060000000000000004800000000000000010000000200000008000000000000001800000000000000Z>48c1e2204809c24889d048c1c03d4831d048b90120000480001070480fafc8ay  
; ModuleID = '<lambda>'
source_filename = "<string>"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"

declare float @llvm.exp2.f32(float %casted)

define float @foo(i16 %arg) {
entry:
  %casted = sitofp i16 %arg to float
  %ret = call float @llvm.exp2.f32(float %casted)
  ret float %ret
}
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 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 kr|   ¡ }| |¡S r   )r-   Úget_global_variable)r!   Únamer,   r   r   r   r.   
  s    zBaseTest.globc                C   s   t j ¡ }|j|dS )N©Újit)r   ÚTargetÚfrom_default_tripleÚcreate_target_machine)r!   r2   Útargetr   r   r   Útarget_machine  s    
zBaseTest.target_machine)r.   N)	Ú__name__Ú
__module__Ú__qualname__r"   r$   Úasm_sumr-   r.   r7   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   sR  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|ksØd|krè|  d|f ¡ tdddddddddg	ƒ}t ¡ dkr| d¡ |D ].}
|
 d¡s|
|k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ÚlibcZ
libpthreadz#failed parsing dependencies? got %rZlibrtZlibdlZlibzÚlibmZlibgcc_szld-linuxZld64r   Z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_pathrA   ÚpÚoutÚ_Zlib_patÚdepsÚlineÚpartsÚdepÚmÚallowedr   r   r   Ú
test_linux  s@    
 ÿ

   ÿ
zTestDependencies.test_linuxN)r8   r9   r:   Ú__doc__ÚunittestÚ
skipUnlessÚsysrZ   r\   rH   rI   Úgetrf   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"   E  s    
zTestRISCVABI.setUpc              
   C   sV   zt j | j¡ W n> tk
rP } z dt|ƒkr<|  d¡ n|‚W 5 d }~X Y nX d S )Nz/No available targets are compatible with triplez(RISCV target unsupported by linked LLVM.)r   r3   Úfrom_tripler&   ÚRuntimeErrorÚstrZskipTest)r!   Úer   r   r   Úcheck_riscv_targetJ  s    zTestRISCVABI.check_riscv_targetc                 K   s   t j | j¡}|jf |ŽS r   )r   r3   rp   r&   r5   )r!   ÚkwargZlltargetr   r   r   Úriscv_target_machineS  s    z!TestRISCVABI.riscv_target_machinec                 C   s   t  ¡ }t  ¡ }t  |||f¡}t  ¡ }t j||dd}| ¡ }t  |¡}|j\}}	| 	||¡}
| 
|
|	¡}| |¡ t t|ƒ¡}| ¡  |S )NÚfpadd©r0   )r   Z
DoubleTypeZ	FloatTypeÚFunctionTypeÚModuleÚFunctionÚappend_basic_blockÚ	IRBuilderÚargsZfpextÚfaddr   r   r)   rr   Úverify)r!   Zf64Zf32Zfntyr-   ÚfuncÚblockÚbuilderÚaÚbZarg0ÚresultÚllmodr   r   r   Úfpadd_ll_moduleW  s    


zTestRISCVABI.fpadd_ll_modulec                 C   sD   g }|  ¡ D ]2}| ¡ }| d¡s| d¡s|dks| |¡ q|S )NÚ.rw   Ú )rT   Ústripr\   Úappend)r!   r*   Zasm_listra   Zs_liner   r   r   Úbreak_up_asmh  s    ÿzTestRISCVABI.break_up_asmc                 C   s8   |   ¡  |  ¡ }| jdd}|  |  | |¡¡t¡ d S )Nú+f,+d)Úfeatures)rt   rˆ   rv   r#   r   Úemit_assemblyÚriscv_asm_ilp32©r!   r‡   r6   r   r   r   Útest_rv32d_ilp32q  s    ÿzTestRISCVABI.test_rv32d_ilp32c                 C   s:   |   ¡  |  ¡ }| jddd}|  |  | |¡¡t¡ d S )NrŽ   Zilp32f©r   Zabiname)rt   rˆ   rv   r#   r   r   Úriscv_asm_ilp32fr’   r   r   r   Útest_rv32d_ilp32fx  s    ÿzTestRISCVABI.test_rv32d_ilp32fc                 C   s:   |   ¡  |  ¡ }| jddd}|  |  | |¡¡t¡ d S )NrŽ   Zilp32dr”   )rt   rˆ   rv   r#   r   r   Úriscv_asm_ilp32dr’   r   r   r   Útest_rv32d_ilp32d  s    ÿzTestRISCVABI.test_rv32d_ilp32d)r8   r9   r:   rg   r&   r"   rt   rv   rˆ   r   r“   r–   r˜   Ú__classcell__r   r   rn   r   rl   >  s   		rl   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   )r-   r;   r    r   r   r   Útest_parse_assemblyŒ  s    zTestMisc.test_parse_assemblyc              	   C   sF   |   t¡}|  t¡ W 5 Q R X t|jƒ}|  d|¡ |  d|¡ d S )Nzparsing errorzinvalid operand type)ÚassertRaisesrq   r-   Úasm_parse_errorrr   Ú	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<>!*''#rx   i90  )r   rz   ry   ÚIntTyper{   r}   r|   r   ÚConstantrr   r#   Úasm_nonalphanum_blocklabel)r!   r,   Ú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 t‚d S r   )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 )NÚ__xyzzyéÒ  i.  Ú__foobar)r   Z
add_symbolZaddress_of_symbolr#   ÚassertIs)r!   Úaddrr   r   r   Útest_dylib_symbols¤  s    

zTestMisc.test_dylib_symbolsc                 C   s"   t  ¡ }|  |t¡ |  |¡ d S r   )r   r(   ÚassertIsInstancerr   Ú
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_ppc³  s    z7TestMisc.test_get_process_triple.<locals>.normalize_ppcú-r   )r   Zget_process_tripler(   r´   rr   rµ   rU   r#   )r!   r¹   r&   ÚdefaultZdefault_archZtriple_archr   r   r   Útest_get_process_triple±  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Úitemsrr   rµ   ÚboolÚflattenr'   ÚassertIsNotNonerP   rV   rW   r#   )r!   r   ÚkÚvZre_termÚregexr   r   r   Útest_get_host_cpu_featuresÃ  s     

z#TestMisc.test_get_host_cpu_featuresc                 C   s"   t  ¡ }|  |t¡ |  |¡ d S r   )r   Úget_host_cpu_namer´   rr   rµ   )r!   Úcpur   r   r   Útest_get_host_cpu_nameÚ  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©rK   Ú
check_callrj   Ú
executable©r!   Úcoder   r   r   Útest_initfiniß  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   s4   t j\}}}dg}|  |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   )r-   Úasm_double_localerr   r   r   r   r#   )r!   rd   Ú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É   )rj   rÌ   rK   rË   )r!   rÎ   ÚflagsZcmdargsr   r   r   Útest_no_accidental_warnings  s    z$TestMisc.test_no_accidental_warningsN)r8   r9   r:   rg   r›   r¢   r«   r­   r³   r¶   r¼   rÅ   rÈ   rÏ   rÐ   rØ   rÙ   rh   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 =)r-   rr   r‹   rµ   r\   ©r!   r,   r¡   r   r   r   Útest_str  s    zTestModuleRef.test_strc              	   C   sD   |   ¡ }t|ƒ | ¡  |  tj¡ t|ƒ W 5 Q R X | ¡  d S r   )r-   rr   Úcloserœ   ÚctypesÚArgumentError©r!   r,   r   r   r   Ú
test_close  s    zTestModuleRef.test_closec              
   C   sr   |   ¡ }t|ƒ | t|ƒ W 5 Q R X |  tj¡ t|ƒ W 5 Q R X |  t¡ | W 5 Q R X W 5 Q R X d S r   )r-   rr   rœ   rä   rå   rq   ræ   r   r   r   Ú	test_with"  s    zTestModuleRef.test_withc                 C   s4   |   ¡ }d|_|  |jd¡ d|_|  |jd¡ d S )Nr¤   Úbar)r-   r0   r#   ræ   r   r   r   Ú	test_name-  s
    zTestModuleRef.test_namec                 C   s   |   ¡ }|  |jd¡ d S )Nz	asm_sum.c)r-   r#   Zsource_fileræ   r   r   r   Útest_source_file4  s    zTestModuleRef.test_source_filec                 C   s2   |   ¡ }|j}|  |t¡ ||_|  ||j¡ d S r   )r-   Zdata_layoutr´   rr   r#   rá   r   r   r   Útest_data_layout8  s
    zTestModuleRef.test_data_layoutc                 C   s6   |   ¡ }|j}|  |t ¡ ¡ d|_|  |jd¡ d S )NrŠ   )r-   r&   r#   r   r(   rá   r   r   r   Útest_triple?  s
    zTestModuleRef.test_triplec              	   C   sZ   |   ¡ }|  | ¡ d ¡ |   t¡}|  t¡}| ¡  W 5 Q R X t|jƒ}|  d|¡ d S )Nz%.bug = add i32 1, %.bug)	r-   r±   r€   Úasm_verification_failrœ   rq   rr   rž   rŸ   )r!   r,   r    r¡   r   r   r   Útest_verifyF  s    

zTestModuleRef.test_verifyc              	   C   s^   |   ¡ }| d¡}|  |tj¡ |  |jd¡ |  t¡ | d¡ W 5 Q R X ~t	|j ƒ d S )NÚsumr¤   )
r-   Úget_functionr´   r   ÚValueRefr#   r0   rœ   Ú	NameErrorrr   ©r!   r,   r©   r   r   r   Útest_get_functionQ  s    
zTestModuleRef.test_get_functionc              	   C   sZ   |   ¡ }| d¡}|  |jd¡ |  t dt|ƒ¡¡ |  t	¡ | d¡ W 5 Q R X d S )Nzstruct.glob_typeú8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] }zstruct.doesnt_exist)
r-   Zget_struct_typer#   r0   rÁ   rP   rV   rr   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 5 Q R X ~t	|j ƒ d S )Nr.   ré   )
r-   r/   r´   r   rò   r#   r0   rœ   ró   rr   )r!   r,   Úgvr   r   r   Útest_get_global_variablej  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 r   rx   )Úvaluer   r   r   Ú<lambda>{  ó    z5TestModuleRef.test_global_variables.<locals>.<lambda>)Úkeyé   c                 S   s   g | ]
}|j ‘qS r   rx   )Ú.0Úgr   r   r   Ú
<listcomp>}  s     z7TestModuleRef.test_global_variables.<locals>.<listcomp>r.   Úglob_bZglob_fÚglob_struct)r-   Úglobal_variablesÚsortedr#   rW   )r!   r,   ÚitZglobsr   r   r   Útest_global_variablesw  s    
ÿz#TestModuleRef.test_global_variablesc                 C   s>   |   ¡ }|j}~t|ƒ}|  t|ƒd¡ |  |d jd¡ d S ©NrB   r   rð   )r-   Ú	functionsÚlistr#   rW   r0   )r!   r,   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 )NrB   ústruct\.glob_type(\.[\d]+)?r   rö   )
r-   Zstruct_typesr
  r#   rW   rÁ   rP   rV   r0   rr   )r!   r,   r  Ú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 5 Q R X d S )Nc                 s   s   | ]}|j V  qd S r   rx   ©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)Úpreservec                 s   s   | ]}|j V  qd S r   rx   r  r   r   r   r  ¤  s     z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>r  rð   c                 s   s   | ]}|j V  qd S r   rx   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 5 Q R X |  dt|jƒ¡ d S )Nzsymbol multiply defined)r-   Úasm_sum2rœ   rq   r  rŸ   rr   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)r-   Ú
as_bitcoderµ   r\   )r!   r,   ÚbcZbitcode_wrapper_magicZbitcode_magicr   r   r   Útest_as_bitcode²  s    ÿzTestModuleRef.test_as_bitcodec              	   C   sj   |   t¡}t d¡ W 5 Q R X |  dt|jƒ¡ tjd dk rT|  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œ   rq   r   Úparse_bitcoderŸ   rr   rž   rÓ   )r!   r    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 r   )r-   ÚcloneZassertIsNotr#   r  )r!   rd   Zclonedr   r   r   Útest_cloningÓ  s    zTestModuleRef.test_cloningN)r8   r9   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_nameÚcfptrr   r   r   Úget_sumß  s    

zJITTestMixin.get_sumc              	   C   sB   |   ¡ }|  |¡&}|  |¡}|ddƒ}|  d|¡ W 5 Q R X d S ©NrC   éûÿÿÿéýÿÿÿ)r-   r2   r,  r#   )r!   r,   r)  ÚcfuncÚresr   r   r   Útest_run_codeå  s
    

zJITTestMixin.test_run_codec              	   C   sB   |   |  ¡ ¡}| ¡  | ¡  |  tj¡ | ¡  W 5 Q R X d S r   )r2   r-   rã   rœ   rä   rå   r'  ©r!   r)  r   r   r   rç   ì  s
    zJITTestMixin.test_closec              
   C   sh   |   |  ¡ ¡}| W 5 Q R X |  t¡ | W 5 Q R X W 5 Q R X |  tj¡ | ¡  W 5 Q R X d S r   )r2   r-   rœ   rq   rä   rå   r'  r3  r   r   r   rè   ó  s    
zJITTestMixin.test_withc                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r   ©r-   r2   rã   ©r!   r,   r)  r   r   r   Útest_module_lifetimeý  s    
z!JITTestMixin.test_module_lifetimec                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r   r4  r5  r   r   r   Útest_module_lifetime2  s    
z"JITTestMixin.test_module_lifetime2c              	   C   sf   |   |  ¡ ¡}|  t¡}| |¡ |  t¡ | |¡ W 5 Q R X |  |j¡ | ¡  |  	|j¡ d S r   )
r2   r-   r  Ú
add_modulerœ   ÚKeyErrorÚassertFalseÚclosedrã   rµ   ©r!   r)  r,   r   r   r   Útest_add_module	  s    

zJITTestMixin.test_add_modulec                 C   s6   |   |  ¡ ¡}|  t¡}| |¡ | ¡  | ¡  d S r   ©r2   r-   r  r8  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   sp   |   |  ¡ ¡}|  t¡}| |¡ | |¡ |  t¡ | |¡ W 5 Q R X |  |j¡ | 	¡  |  |j¡ d S r   )
r2   r-   r  r8  Zremove_modulerœ   r9  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   )r-   r2   Útarget_datar±   rr   )r!   r,   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 )Nr.   r  r  ì        rþ   é   rB   )rB   rC   rþ   é   )rþ   rF  )r-   r2   rB  r/   rj   Úmaxsizer#   Úget_abi_sizeÚtypeÚget_pointee_abi_sizeZget_pointee_abi_alignmentrŸ   )	r!   r,   r)  rC  Úgv_i32Zgv_i8Z	gv_structÚpointer_sizer   r   r   r   Útest_target_data_abi_enquiries6  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Œ   ©r,   Úbuf©Únotifiesr   r   ÚnotifyN  s    z5JITTestMixin.test_object_cache_notify.<locals>.notifyr   rC   r.  rB   r  )r-   r2   Úset_object_cacher#   rW   r,  r±   r´   Úbytesr  r8  )r!   rT  r,   r)  r0  Zmod2r   rR  r   Útest_object_cache_notifyK  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   rO  rP  rR  r   r   rT  j  s    z8JITTestMixin.test_object_cache_getbuffer.<locals>.notifyc                    s   ˆ   | ¡ d S r   rO  ©r,   )Ú
getbuffersr   r   Ú	getbufferm  s    z;JITTestMixin.test_object_cache_getbuffer.<locals>.getbufferr   rB   c                    s   ˆ   | ¡ ˆS r   rO  rX  )rY  Ú
sum_bufferr   r   Úgetbuffer_successful€  s    
zFJITTestMixin.test_object_cache_getbuffer.<locals>.getbuffer_successfulrC   r.  r/  )r-   r2   rU  r#   rW   r,  r±   r  )r!   rT  rZ  r,   r)  r0  r\  r   )rY  rS  r[  r   Útest_object_cache_getbufferf  s4    




z(JITTestMixin.test_object_cache_getbufferN)rð   )r8   r9   r:   rg   r,  r2  rç   rè   r6  r7  r=  r?  r@  rA  rD  rN  rW  r]  r   r   r   r   r&  Ú  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()Tr1   rð   N)r7   r-   r2   r   rŸ   Zset_asm_verbosityÚassertNotEqual)r!   r7   r,   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()Tr1   r=   s   ELFNrÒ   )
r7   r-   r2   Úemit_objectr´   rV  rj   rZ   r\   rŸ   )r!   r7   r,   r)  Úcode_objectr   r   r   Útest_emit_object¡  s    
z#JITWithTMTestMixin.test_emit_objectN)r8   r9   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 kr| j dd}t ||¡S )NTr1   )r7   r   Úcreate_mcjit_compiler)r!   r,   r7   r   r   r   r2   ²  s    zTestMCJit.jit)N)r8   r9   r:   rg   r2   r   r   r   r   rd  ­  s   rd  Úx86úx86 onlyc                   @   sª   e Zd Zedddeeeeƒd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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 )&ÚTestOrcLLJITrð   NFc                 C   sv   t j|d|d}t  ¡ }|r$| ¡  | |jt  ¡ d¡ |¡ ||¡}	|	| }
|  	|
¡ |  
||	j¡ ||	||
ƒfS )NF)Úuse_jit_linkÚsuppress_errorsr%   )r   Úcreate_lljit_compilerÚJITLibraryBuilderZadd_current_processÚadd_irr'   r(   Úexport_symbolÚlinkrµ   r#   r0   )r!   r*   r*  r7   Zadd_processZ	func_typerj  Úlljitrƒ   Úrtr+  r   r   r   r2   ¿  s&    þÿþ ý
zTestOrcLLJIT.jitc                 C   s:   t  ¡ }t  ¡  dd¡ d¡ |d¡}|  |d d¡ d S )Nr®   r¯   r¤   )r   rk  rl  Úimport_symbolrn  ro  r#   ©r!   rp  rq  r   r   r   Útest_define_symbolÒ  s    ÿ ÿzTestOrcLLJIT.test_define_symbolc              	   C   s‚   t  ¡ }|  td¡ | dd¡ W 5 Q R X t  ¡  dd¡ d¡ |d¡}|  	|d d¡ |  td¡ | dd¡ W 5 Q R X d S )NzNo such libraryr¤   r°   r®   r¯   r   zSymbols not found.*__foobar)
r   rk  ÚassertRaisesRegexrq   Úlookuprl  rr  rn  ro  r_  rs  r   r   r   Ú"test_lookup_undefined_symbol_failsØ  s    ÿ ÿÿz/TestOrcLLJIT.test_lookup_undefined_symbol_failsc              	   C   sF   t jdkr0|  td¡ tjdd W 5 Q R X n|  tjdd¡ d S )NÚwin32zJITLink .* WindowsT)ri  )rj   rZ   ru  rq   r   rk  rÁ   r    r   r   r   Útest_jit_linkã  s    
ÿzTestOrcLLJIT.test_jit_linkc              	   C   s8   |   ¡ \}}}| |ddƒ}|  d|¡ W 5 Q R X d S r-  )r2   r#   )r!   rp  rq  r0  r1  r   r   r   r2  ë  s    
zTestOrcLLJIT.test_run_codec              	   C   sD   |   ¡ \}}}| ¡  | ¡  |  t¡ | dd¡ W 5 Q R X d S ©Nr¤   r©   )r2   rã   rœ   r¬   rv  ©r!   rp  rq  r0  r   r   r   rç   ñ  s
    zTestOrcLLJIT.test_closec              
   C   sj   |   ¡ \}}}| W 5 Q R X |  t¡ | W 5 Q R X W 5 Q R X |  t¡ | dd¡ W 5 Q R X d S rz  )r2   rœ   rq   r¬   rv  r{  r   r   r   rè   ø  s    
zTestOrcLLJIT.test_withc              	   C   sÔ   |   ¡ \}}}t ¡  tjt ¡ d¡ d¡ |d¡}t	t
t
t
ƒ|d ƒddƒ}|  d|¡ |  | dd¡d d¡ |  | dd¡d d¡ |  t¡ | dd¡ W 5 Q R X |  t¡ | dd¡ W 5 Q R X d S )Nr%   r  rC   r.  iöÿÿÿrð   r   )r2   r   rl  rm  r  r'   r(   rn  ro  r   r   r#   r_  rv  rœ   rq   ©r!   rp  Úrt_sumZ	cfunc_sumZrt_mulr1  r   r   r   Útest_add_ir_module  s"    ÿþ ýzTestOrcLLJIT.test_add_ir_modulec              	   C   sF   |   ¡ \}}}~t ¡  |  t¡ | dd¡ W 5 Q R X | ¡  d S ©Nrð   )r2   r   r   rœ   rq   rv  rã   )r!   rp  r}  r_   r   r   r   rA    s    zTestOrcLLJIT.test_remove_modulec                 C   sf   |   ¡ \}}}t ¡  tjt ¡ d¡ d¡ d¡ 	|d¡}t
tttƒ|d ƒddƒ}|  d|¡ d S )Nr%   Z
square_sumrð   rC   r.  r   )r2   r   rl  rm  Úasm_square_sumr'   r(   rn  Zadd_jit_libraryro  r   r   r#   r|  r   r   r   Útest_lib_depends  s    ÿþý üzTestOrcLLJIT.test_lib_dependsc                 C   s8   |   ¡ \}}}|j}|  |j|¡ t|ƒ ~t|ƒ d S r   )r2   rB  r±   rr   )r!   rp  rq  r_   rC  r   r   r   rD  #  s    zTestOrcLLJIT.test_target_datac                 C   s†   t dƒ}t ¡ }t ¡ }| tjt ¡ d¡ dt	 
|¡¡ d¡ |d¡}|d }|  |¡ |  ttƒ|ƒƒ d¡ ~|  |jd¡ d S )Nr   r%   ÚAr¤   é   é   )r   r   rk  rl  rm  Úasm_ext_ctorsr'   r(   rr  rä   Ú	addressofrn  ro  rµ   r#   r   r   r_  rú   )r!   Zshared_valuerp  rƒ   rq  r¤   r   r   r   Útest_global_ctors_dtors,  s&    ÿ þý ü
z$TestOrcLLJIT.test_global_ctors_dtorsc              	   C   s0   d}|   t|¡ | jtddd W 5 Q R X d S )Nz*Failed to materialize symbols:.*getversionÚ
getversionT)rj  )ru  rq   r2   Úasm_getversion)r!   Úmsgr   r   r   Ú(test_lookup_current_process_symbol_fails=  s    z5TestOrcLLJIT.test_lookup_current_process_symbol_failsc                 C   s   |   tdd d¡ d S )Nrˆ  T)r2   r‰  r    r   r   r   Ú"test_lookup_current_process_symbolE  s    z/TestOrcLLJIT.test_lookup_current_process_symbolc                    sh   t  ¡ ‰tjt  ¡ d‰‡‡fdd„‰ ‡ fdd„tt ¡ ƒD ƒ}|D ]}| ¡  qD|D ]}| 	¡  qVd S )Nr%   c                    s   ‡ ‡‡fdd„}|S )Nc               
      sD   g } t dƒD ]2}|  t ¡  ˆ¡ d¡ ˆdˆ › d|› ¡¡ qd S )Né2   rð   Zsum_r_   )rÔ   rŒ   r   rl  rm  rn  ro  )ZtrackingÚc)Úirp  Úllvm_irr   r   Údo_workM  s    ÿþ ýzDTestOrcLLJIT.test_thread_safe.<locals>.compile_many.<locals>.do_workr   )r  r‘  )rp  r  )r  r   Úcompile_manyL  s    z3TestOrcLLJIT.test_thread_safe.<locals>.compile_manyc                    s   g | ]}t jˆ |ƒd ‘qS ))r6   )Ú	threadingÚThread)rÿ   r  )r’  r   r   r  W  s   ÿz1TestOrcLLJIT.test_thread_safe.<locals>.<listcomp>)
r   rk  r;   r'   r(   rÔ   rH   Ú	cpu_countÚstartÚjoin)r!   ZthsÚthr   )r’  rp  r  r   Útest_thread_safeH  s    

ÿ
zTestOrcLLJIT.test_thread_safec                 C   sj   | j dd}|  ¡ }t |¡}t ¡  | |¡¡ d¡ |d¡}t	t
t
t
ƒ|d ƒ}|  |ddƒd¡ d S )NFr1   rð   rC   é   é   )r7   r-   r   rk  rl  Zadd_object_imgra  rn  ro  r   r   r#   )r!   r7   r,   rp  rq  rð   r   r   r   Útest_add_object_file^  s    
ÿþ ýz!TestOrcLLJIT.test_add_object_filec           
   	   C   s¬   | j dd}|  ¡ }| |¡}tƒ \}}zrt |d¡}| |¡ W 5 Q R X t 	|¡}t 
¡  |¡ d¡ |d¡}ttttƒ|d ƒ}	|  |	ddƒd¡ W 5 t |¡ X d S )NFr1   Úwbrð   rC   rš  r›  )r7   r-   ra  r   rH   ÚunlinkÚfdopenÚwriter   rk  rl  Úadd_object_filern  ro  r   r   r#   )
r!   r7   r,   Úobj_binÚ	temp_descÚ	temp_pathr  rp  rq  rð   r   r   r   Ú$test_add_object_file_from_filesystemi  s&    


ÿþ ýz1TestOrcLLJIT.test_add_object_file_from_filesystem)r8   r9   r:   r;   r   r   r2   rt  rw  ry  r2  rç   rè   r~  rA  r  rD  r‡  r‹  rŒ  r™  rœ  r¥  r   r   r   r   rh  ¼  s*    
þ


	rh  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+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5S )6ÚTestValueRefc                 C   s&   |   ¡ }| d¡}|  t|ƒd¡ d S )Nr.   z@glob = global i32 0)r-   r/   r#   rr   ©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#   r0   r§  r   r   r   rê   „  s
    
zTestValueRef.test_namec                 C   sp   |   ¡ }| d¡}|j}|  |jtj¡ ||_|  |j|¡ dD ]*}||_|  |jtj¡ |  |jj|¡ q@d S )Nr.   )ÚinternalÚexternal)r-   r/   Úlinkager´   r   ZLinkager#   r0   )r!   r,   r.   r«  r   r   r   Útest_linkage‹  s    
zTestValueRef.test_linkagec                 C   sp   |   ¡ }| d¡}|j}|  |jtj¡ ||_|  |j|¡ dD ]*}||_|  |jtj¡ |  |jj|¡ q@d S )Nr.   )ÚhiddenZ	protectedr»   )r-   r/   Ú
visibilityr´   r   Z
Visibilityr#   r0   )r!   r,   r.   r®  r   r   r   Útest_visibility—  s    
zTestValueRef.test_visibilityc                 C   sp   |   ¡ }| d¡}|j}|  |jtj¡ ||_|  |j|¡ dD ]*}||_|  |jtj¡ |  |jj|¡ q@d S )Nr.   )Z	dllimportZ	dllexportr»   )r-   r/   Ústorage_classr´   r   ZStorageClassr#   r0   )r!   r,   r.   r°  r   r   r   Útest_storage_class£  s    
zTestValueRef.test_storage_classc              	   C   sR   |   ¡ }| d¡}| d¡ |  t¡}| d¡ W 5 Q R X |  t|jƒd¡ d S )Nrð   Z	nocaptureZzextzno such attribute 'zext')r-   rñ   Zadd_function_attributerœ   Ú
ValueErrorr#   rr   rž   )r!   r,   r©   Zraisesr   r   r   Útest_add_function_attribute¯  s    

z(TestValueRef.test_add_function_attributec                 C   s$   |   ¡ }| d¡}|  |j |¡ d S ©Nr.   )r-   r/   r±   r§  r   r   r   Útest_module·  s    
zTestValueRef.test_modulec                 C   s*   |   ¡ }| d¡}|j}|  |tj¡ d S r´  )r-   r/   rJ  r´   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.   rŠ   r  r  )	r-   r/   rJ  r#   r0   rÁ   rP   rV   Úelement_type)r!   r,   r.   r·  Ústr   r   r   Útest_type_nameÂ  s    


ÿzTestValueRef.test_type_namec                 C   s,   |   ¡ }| d¡}|j}|  t|ƒd¡ d S )Nr.   zi32*)r-   r/   rJ  r#   rr   r¶  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)*)r-   rñ   r#   rr   rJ  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ö   )
r-   r/   rµ   rJ  Z
is_pointerrÁ   rP   rV   rr   r¹  )r!   r,   rº  r   r   r   Útest_type_printing_structÖ  s    

ÿ
þz&TestValueRef.test_type_printing_structc                 C   s   |   ¡ }| ¡  | ¡  d S r   )r.   rã   )r!   r.   r   r   r   rç   à  s    zTestValueRef.test_closec                 C   s:   |   ¡  d¡}|   t¡ d¡}|  |j¡ |  |j¡ d S r  )r-   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þ   )r-   r;   r
  r  r#   rW   rµ   Ú	is_global)r!   r,   Ú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 5 Q R X |  t	¡ |j W 5 Q R X |  t	¡ |j W 5 Q R X d S r  )r-   r
  r	  r#   rW   rµ   Úis_functionr0   rœ   r²  ÚinstructionsÚoperandsÚopcode)r!   r,   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 5 Q R X |  t¡ |d j W 5 Q R X d S )Nrð   rC   r   rB   ú.1Úi32ú.2)r-   rñ   rµ   rÆ  r
  Ú	argumentsr#   rW   Úis_argumentr0   rr   rJ  rœ   r²  Úblocks)r!   r,   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ð   rB   r   )r-   rñ   r
  rÐ  r#   rW   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   rš  rB   rC   rX   r   )
r-   rñ   r
  rÐ  rÇ  r#   rW   rµ   Zis_instructionrÉ  )r!   r   Ú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   rX   rC   rB   rË  rÌ  rÍ  )r-   rñ   r
  rÐ  rÇ  r#   rÉ  rÈ  rW   rµ   Z
is_operandr0   rr   rJ  )r!   r   rX   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   returnedrB   )r-   Úasm_attributesr	  r
  Ú
attributesr0   r#   rÎ  )r!   r,   r   Úattrsr~   r   r   r   Útest_function_attributes2  s    





z%TestValueRef.test_function_attributesc                 C   sü   |   ¡ }|  | d¡jtjj¡ | d¡}|  |jtjj¡ t	|j
ƒd }|  |jtjj¡ t	|jƒd }|  |jtjj¡ |  t	|jƒd jtjj¡ |  t	|jƒd jtjj¡ |   t¡ d¡}t	t	|j
ƒd jƒd }|  t	|jƒd jtjj¡ d S )Nr.   rð   r   rB   r¤   )r-   r#   r/   Z
value_kindr   Z	ValueKindZglobal_variablerñ   Úfunctionr
  rÐ  Zbasic_blockrÇ  ZinstructionrÈ  Zconstant_intÚasm_inlineasmZ
inline_asm)r!   r,   r   r‚   ÚinstZ	iasm_funcZ	iasm_instr   r   r   Útest_value_kind>  s*    ÿ
ÿÿÿzTestValueRef.test_value_kindc                 C   s   |   ¡ }|  | d¡j¡ d}|jD ]Z}|  |j¡ |jD ]B}|  |j¡ |jD ]*}|  |j¡ |jD ]}|jrf|d7 }qfqPq:q$|  	|d¡ d S )Nr.   r   rB   )
r-   rµ   r/   Úis_constantr	  rÐ  r:  rÇ  rÈ  r#   )r!   r,   Zconstant_operandsr   r‚   rÜ  Úopr   r   r   Útest_is_constantR  s    



zTestValueRef.test_is_constantc           	   	   C   s@  |   ¡ }| d¡}tt|jƒd jƒ}|  |d jd¡ t|d jƒ}|  |d j	¡ |  
|d j	¡ |  |d  ¡ d¡ |  t¡ |d  ¡  W 5 Q R X |   t¡}| d¡}tt|jƒd jƒ}t|d jƒd }t|d jƒd }|  | ¡ d¡ |  |jddd	¡ |jd
d}tj| dd¡ddd}|  |d	¡ d S )Nrð   r   rB   rX   rC   r›  T)Z
signed_intr.  FrF  Úlittle)Úsigned)r-   rñ   r
  rÐ  rÇ  r#   rÉ  rÈ  rµ   rÞ  r:  Úget_constant_valuerœ   r²  Úasm_sum3ÚintÚ
from_bytesÚto_bytes)	r!   r,   r   rÓ  rÈ  Zposint64Znegint64Zas_u64Zas_i64r   r   r   Útest_constant_intb  s,    


ÿzTestValueRef.test_constant_intc              	   C   s  |   t¡}| d¡}tt|jƒd jƒ}|  t|ƒd¡ |  |d jd¡ t|d j	ƒ}|  
|d j¡ |  |d  ¡ d¡ |  
|d j¡ |  |d  ¡ d¡ |   t¡}| d¡}tt|jƒd jƒd }t|j	ƒ}|  t¡ |d  ¡  W 5 Q R X |  |d jdd	d¡ d S )
Nr¤   r   rC   r   g        rB   g…ëQ¸	@T)Zround_fp)r-   rÚ   rñ   r
  rÐ  rÇ  r#   rW   rÉ  rÈ  rµ   rÞ  ZassertAlmostEqualrã  Úasm_double_inaccuraterœ   r²  )r!   r,   r   rÓ  rÈ  rÜ  r   r   r   Útest_constant_fp|  s"    




zTestValueRef.test_constant_fpc                 C   sZ   |   t¡}| d¡}tt|jƒd jƒd }t|jƒd }|  |j¡ |  	| 
¡ d¡ d S )Nré   r   z	i64* null)r-   Úasm_null_constantrñ   r
  rÐ  rÇ  rÈ  rµ   rÞ  r#   rã  )r!   r,   r   rÜ  Úargr   r   r   Útest_constant_as_string  s    

z$TestValueRef.test_constant_as_stringN)r8   r9   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   r   r   r¦  }  s4   	
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 5 Q R X |  dt|jƒ¡ t  ¡ }||ƒ}|  	|j
|¡ | ¡  d S )Nr¨  z(No available targets are compatible with)r   r3   rp   rœ   rq   rŸ   rr   rž   r(   r#   r&   rã   )r!   r  r    r&   r6   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Š   rB   r»   )r   r3   rp   r(   r5   rÆ   )r!   r6   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   r3   rp   r(   r4   r´   r0   rr   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   r3   rp   r(   r4   r´   Údescriptionrr   r#   rñ  r   r   r   Útest_description´  s    
zTestTarget.test_descriptionc                 C   s8   t j t  ¡ ¡}t|ƒ}|  |j|¡ |  |j|¡ d S r   )r   r3   rp   r(   rr   rŸ   r0   rô  )r!   r6   r¡   r   r   r   râ   º  s    zTestTarget.test_strN)r8   r9   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   rB  Ã  s    zTestTargetData.target_datac                 C   s(   |   ¡ }|  ¡ }|  | |j¡d¡ d S )NrF  )rB  r.   r#   rI  rJ  ©r!   rC  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  rG  )rB  r.   r#   rK  rJ  r÷  r   r   r   Útest_get_pointee_abi_sizeË  s
    
z(TestTargetData.test_get_pointee_abi_sizec              	   C   sj   |   ¡ }|  d¡}|  t¡ | |jd¡ W 5 Q R X |jj}|  | |d¡d¡ |  | |d¡d¡ d S )Nr  r   rB   rF  )rB  r.   rœ   r²  Zget_element_offsetrJ  r¹  r#   )r!   rC  r.   Zstruct_typer   r   r   Útest_get_struct_element_offsetÔ  s    
z-TestTargetData.test_get_struct_element_offsetN)r8   r9   r:   rB  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"   | j dd}t ¡ }| |¡ d S )NFr1   )r7   r   Úcreate_module_pass_managerÚadd_analysis_passes)r!   ÚtmÚpmr   r   r   Útest_add_analysis_passesâ  s    z*TestTargetMachine.test_add_analysis_passesc                 C   sN   | j dd}|j}|  ¡ }| d¡}tjdk r2dnd}|  | |j¡|¡ d S )NFr1   r.   rE  rþ   rF  )	r7   rB  r-   r/   rj   rH  r#   rI  rJ  )r!   rþ  rC  r,   rL  rM  r   r   r   Útest_target_data_from_tmç  s    
z*TestTargetMachine.test_target_data_from_tmN)r8   r9   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   Úpmbó  s    zTestPassManagerBuilder.pmbc                 C   s   t  ¡ }d|_d|_d S )NrC   rš  )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 r   )r  rã   r  r   r   r   rç   ü  s    z!TestPassManagerBuilder.test_closec                 C   s<   |   ¡ }|  |jt¡ tdƒD ]}||_|  |j|¡ qd S rÂ  )r  r´   r  rå  rÔ   r#   ©r!   r  r  r   r   r   Útest_opt_level  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_level  s
    z&TestPassManagerBuilder.test_size_levelc              	   C   s8   |   ¡ }|  t¡ |j W 5 Q R X 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   )r-   r  r   Úcreate_function_pass_managerr  rã   )r!   r,   r  rÿ  r   r   r   Ú#test_populate_function_pass_manager2  s    

z:TestPassManagerBuilder.test_populate_function_pass_managerN)r8   r9   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 )ÚPassManagerTestMixinc                 C   s   t  ¡ }d|_d|_|S )NrC   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ç   C  s    zPassManagerTestMixin.test_closeN)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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ÿ  K  s    zTestModulePassManager.pmc                 C   s¼   |   ¡ }|  ¡  |¡ |  ¡ }t|ƒ}| |¡ t|ƒ}| ¡ }t|ƒD ]f\}}| ¡  	d¡rHddh}|D ]}	|	|k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  r-   rr   ÚrunrT   Ú	enumerater‹   r\   rq   ÚpoprŸ   ÚassertNotIn)r!   rÿ  r,   Úorig_asmÚopt_asmZopt_asm_splitÚidxÚlÚtoksrò  Z
othertokenr   r   r   Útest_runN  s&    
zTestModulePassManager.test_runc                 C   s^   |   ¡ }| d¡ |  ¡  |¡ |  t¡}| |¡\}}|  |¡ |  d|¡ |  d|¡ d S )NéF   ÚPassedÚinlineme©	rÿ  Úadd_function_inlining_passr  r  r-   Úasm_inlineasm2Úrun_with_remarksrµ   rŸ   ©r!   rÿ  r,   ÚstatusÚremarksr   r   r   Ú'test_run_with_remarks_successful_inlinel  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  r-   Úasm_inlineasm3r.  rµ   rŸ   r/  r   r   r   Ú#test_run_with_remarks_failed_inlinew  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  r-   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.*r6  r)  r*  r+  r/  r   r   r   Ú&test_run_with_remarks_inline_filter_in  s    


z<TestModulePassManager.test_run_with_remarks_inline_filter_inN)	r8   r9   r:   rÿ  r'  r2  r4  r7  r8  r   r   r   r   r  I  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   )r-   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  )r-   rñ   rÿ  r  r  rã   rr   r   r  r:  rŸ   r!  )r!   r,   r©   rÿ  r"  r#  r   r   r   r'  £  s    


z TestFunctionPassManager.test_runc                 C   s€   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  | 	|¡\}}| 
¡  |  |¡ |  d|¡ |  d|¡ d S )NÚlicmr)  ©r-   Úlicm_asmrñ   rÿ  Úadd_licm_passr  r  rã   r   r.  r:  rµ   rŸ   ©r!   r,   r©   rÿ  Úokr1  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;  r5  r6  rŠ   )r-   r=  rñ   rÿ  r>  r  r  rã   r   r.  r:  rµ   r#   r?  r   r   r   Ú test_run_with_remarks_filter_outÁ  s    



z8TestFunctionPassManager.test_run_with_remarks_filter_outc                 C   s„   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  |j	|dd\}}| 
¡  |  |¡ |  d|¡ |  d|¡ d S )Nr;  r6  r)  r<  r?  r   r   r   Útest_run_with_remarks_filter_inÏ  s    



z7TestFunctionPassManager.test_run_with_remarks_filter_in)N)	r8   r9   r:   rÿ  rÏ   r'  rA  rB  rC  r   r   r   r   r9  ˜  s   
r9  c                   @   s:   e Zd Zdd„ Zdd„ Ze e ¡  	d¡d¡dd„ ƒZ
d	S )
Ú
TestPassesc                 C   s   t  ¡ S r   r  r    r   r   r   rÿ  á  s    zTestPasses.pmc                 C   s4  |   ¡ }| d¡ | ¡  | ¡  | ¡  | d¡ | ¡  | ¡  | ¡  | 	¡  | 
¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | d¡ | ¡  | ¡  | ¡  | ¡  | ¡  | d¡ | ¡  |  ¡  | !¡  | "¡  | #¡  | $¡  | %¡  | &¡  | '¡  | (¡  | )¡  | *¡  | +¡  | ,¡  | -¡  | .¡  | /¡  | 0¡  | 1¡  | 2¡  | 3¡  | 4¡  | 5¡  | 6¡  | 7¡  | 8¡  | 9¡  | :¡  | ;¡  | <¡  | =¡  | >¡  | ?¡  | @¡  | A¡  | B¡  | C¡  | D¡  d S )NrŠ   éá   é*   é   )Erÿ  Úadd_target_library_infoZ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_passÚ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_populateä  sŠ    



zTestPasses.test_populaterf  rg  c                 C   sP   dd„ }|dd}|   dt|ƒ¡ |dd}|  dt|ƒ¡ |   dt|ƒ¡ dS )	zŠTest a specific situation that demonstrate TLI is affecting
        optimization. See https://github.com/numba/numba/issues/8898.
        c                 S   sX   t  t¡}t j |j¡}| ¡ }t  ¡ }| |¡ | rB| 	|j¡ | 
¡  | |¡ |S r   )r   r)   Úasm_tli_exp2r3   rp   r&   r5   ZModulePassManagerrý  rH  rI  r  )Úuse_tlir,   r6   rþ  rÿ  r   r   r   r  0  s    


z9TestPasses.test_target_library_info_behavior.<locals>.runT)rL  zcall float @llvm.exp2.f32Fzcall float @ldexpfN)rŸ   rr   r!  )r!   r  r,   r   r   r   Ú!test_target_library_info_behavior+  s    

z,TestPasses.test_target_library_info_behaviorN)r8   r9   r:   rÿ  rJ  rh   ri   rZ   Úmachiner\   rM  r   r   r   r   rD  ß  s   GrD  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 5 Q R X d S )Nzzzzasdkf;jasd;l)rœ   rq   r   Úload_library_permanentlyr    r   r   r   Útest_bad_libraryH  s    zTestDylib.test_bad_library)ÚLinuxztest only works on Linuxc                 C   s   t dƒ}t |¡ d S )Nrd   )r   r   rP  )r!   rE   r   r   r   Ú	test_libmL  s    zTestDylib.test_libmN)	r8   r9   r:   rQ  rh   ri   rZ   ÚsystemrS  r   r   r   r   rO  F  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 )Nr£   r¤   )
r   rz   ry   r¥   r{   r}   r|   r~   rX   r   )r!   rd   r¨   r©   rª   ÚxÚyÚzr   r   r   Úbuild_ir_moduleT  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)rY  Z
get_globalr   Úget_function_cfgrŸ   r!  )r!   r,   r¤   Údot_showing_instÚdot_without_instrÜ  r   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ð   TrZ  FZdigraphzCFG for 'sum' functionz%.3 = add i32 %.1, %.2)r-   rñ   r   r[  rŸ   r!  )r!   rÀ  r\  r]  ÚprefixÚfnamerÜ  r   r   r   Útest_function_cfg_on_llvm_valueg  s    z,TestAnalysis.test_function_cfg_on_llvm_valueN)r8   r9   r:   rY  r^  ra  r   r   r   r   rU  S  s   
	rU  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   rz   rr   r   r)   )r!   r,   r*   r   r   r   Úcheck_parsingz  s    zTestTypeParsing.check_parsingc              	   C   s   |   ¡ 6}t t d¡g¡}t ||d¡}t |dg¡|_W 5 Q R X |   ¡ :}tjt d¡gdd}t ||d¡}t |dg¡|_W 5 Q R X d S )Nr£   r¤   rB   T)Úpacked)rc  r   ZLiteralStructTyper¥   ÚGlobalVariabler¦   Zinitializer)r!   r,   Útyprø   r   r   r   Útest_literal_struct„  s    

ÿz#TestTypeParsing.test_literal_structN)r8   r9   r:   r   rc  rg  r   r   r   r   rb  y  s   
	rb  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 )Nr‚  rÒ   r¤   rƒ  r„  )r-   Úasm_global_ctorsr2   r'  Zrun_static_constructorsZget_global_value_addressrä   ÚPOINTERr   Úcastr#   Úcontentsrú   r(  r   Zrun_static_destructors)r!   r,   r)  Zptr_addrZptr_tÚptrZfoo_addrr¤   r   r   r   r‡  –  s    



z.TestGlobalConstructors.test_global_ctors_dtorsN)r8   r9   r:   r‡  r   r   r   r   rh  •  s   rh  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   rz   r¥   re  r«  rr   rŸ   r!  r-   )r!   r«  Ú	has_undefr,   rf  rø   r*   r   r   r   Úcheck_global_variable_linkage°  s    
z1TestGlobalVariables.check_global_variable_linkagec                 C   s   |   d¡ d S )Nr©  ©rp  r    r   r   r   Útest_internal_linkageÄ  s    z)TestGlobalVariables.test_internal_linkagec                 C   s   |   d¡ d S )NÚcommonrq  r    r   r   r   Útest_common_linkageÇ  s    z'TestGlobalVariables.test_common_linkagec                 C   s   | j ddd d S )Nrª  F©ro  rq  r    r   r   r   Útest_external_linkageÊ  s    z)TestGlobalVariables.test_external_linkagec                 C   s   |   d¡ d S )NZavailable_externallyrq  r    r   r   r   Ú!test_available_externally_linkageÍ  s    z5TestGlobalVariables.test_available_externally_linkagec                 C   s   |   d¡ d S )NÚprivaterq  r    r   r   r   Útest_private_linkageÐ  s    z(TestGlobalVariables.test_private_linkagec                 C   s   |   d¡ d S )NZlinkoncerq  r    r   r   r   Útest_linkonce_linkageÓ  s    z)TestGlobalVariables.test_linkonce_linkagec                 C   s   |   d¡ d S )NZweakrq  r    r   r   r   Útest_weak_linkageÖ  s    z%TestGlobalVariables.test_weak_linkagec                 C   s   |   d¡ d S )NZ	appendingrq  r    r   r   r   Útest_appending_linkageÙ  s    z*TestGlobalVariables.test_appending_linkagec                 C   s   | j ddd d S )NZextern_weakFru  rq  r    r   r   r   Útest_extern_weak_linkageÜ  s    z,TestGlobalVariables.test_extern_weak_linkagec                 C   s   |   d¡ d S )NZlinkonce_odrrq  r    r   r   r   Útest_linkonce_odr_linkageß  s    z-TestGlobalVariables.test_linkonce_odr_linkagec                 C   s   |   d¡ d S )NZweak_odrrq  r    r   r   r   Útest_weak_odr_linkageâ  s    z)TestGlobalVariables.test_weak_odr_linkageN)T)r8   r9   r:   rp  rr  rt  rv  rw  ry  rz  r{  r|  r}  r~  r  r   r   r   r   rn  ¯  s   
rn  z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*   Fr1   Znop)r   Zinitialize_native_asmparserr-   rÛ  r7   r   rŸ   )r!   rd   rþ  r*   r   r   r   Útest_inlineasmè  s
    
zTestInlineAsm.test_inlineasmN)r8   r9   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 )NFr1   éÿÿÿÿTr   )r7   r-   ra  r   ÚObjectFileRefÚ	from_dataÚsectionsÚis_textrÁ   r0   rµ   ÚsizerW   ÚdataÚaddress)r!   r7   r,   r¢  ÚobjZhas_textZlast_addressr¡   r   r   r   Útest_object_fileÿ  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 )NFr1   Ú	sum_twicerC   rš  rÒ   )r7   r-   ra  r   r„  r…  re  Úmod_asmr¡  r   r   r(  r#   )r!   r7   r,   r¢  r‹  r2   r  r   r   r   rœ  	  s    
ÿ

ÿz#TestObjectFile.test_add_object_filec           	   	   C   s²   | j dd}|  ¡ }| |¡}tƒ \}}zPz"t |d¡}| |¡ | 	¡  W 5 | ¡  X t
 |  | j¡|¡}| |¡ W 5 t |¡ X ttttƒ| d¡ƒ}|  |ddƒd¡ d S )NFr1   r  r  rC   rš  rÒ   )r7   r-   ra  r   rH   rž  rã   rŸ  r   Úflushr   re  rŽ  r¡  r   r   r(  r#   )	r!   r7   r,   r¢  r£  r¤  r  r2   r  r   r   r   r¥  #	  s&    



ÿ
ÿz3TestObjectFile.test_add_object_file_from_filesystemc                 C   sX   t  t¡}tj |¡}| ¡ D ]4}| ¡ r|  t	| 
¡ ƒd¡ |  | 
¡  ¡ t¡ qd S )Né   )rV  ÚfromhexÚissue_632_elfr   r„  r…  r†  r‡  r#   rW   r‰  ÚhexÚissue_632_text)r!   Zelfr‹  r¡   r   r   r   Útest_get_section_content=	  s    
z'TestObjectFile.test_get_section_contentN)r8   r9   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 )ÚTestTimePassesc              	   C   s   t  ¡ }t  ¡ }d|_| |¡ z8t  d¡ | |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ W 5 t  ¡ }t  d¡ X |  	|t
¡ |  | d¡d¡ d S )Nrš  FTzPass execution timing reportrB   )r   rü  r  r  r  Úreport_and_reset_timingsZset_time_passesr  r-   r´   rr   r#   Úcount)r!   Úmpr  Úreportr   r   r   Útest_reportingI	  s    

zTestTimePasses.test_reportingc                 C   s   |   t ¡ ¡ d S r   )r:  r   r—  r    r   r   r   Útest_empty_report\	  s    z TestTimePasses.test_empty_reportN)r8   r9   r:   r›  rœ  r   r   r   r   r–  H	  s   r–  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 5 Q R X d S )Nc                      s   ˆ   d¡ d S )NÚacqrO  r   ©Úeventsr   r   rž  e	  s    z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.acqc                      s   ˆ   d¡ d S )NÚrelrO  r   rŸ  r   r   r¡  h	  s    z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.relrž  r¡  )	r   r
   Zregister_lock_callbackr:  rü  rŸ   Zunregister_lock_callbackrœ   r²  )r!   rž  r¡  r   rŸ  r   Útest_lock_callbacksb	  s    
z)TestLLVMLockCallbacks.test_lock_callbacksN)r8   r9   r:   r¢  r   r   r   r   r  a	  s   r  Ú__main__)Zrä   r“  r   r   r   Zctypes.utilr   r   r   rH   rZ   rP   rK   rj   rh   Ú
contextlibr   Útempfiler   Zllvmliter   r	   r   Zllvmlite.bindingr
   Zllvmlite.testsr   rN  rP  r   r;   r  rä  r  r€  r‰  r[   Úreplacer   rî   r¿  ré  rÚ   rÛ  r-  r3  r=  ri  r…  r§   rë  r‘   r•   r—   rÖ  r’  r”  rK  r   r<   rl   rš   rà   Úobjectr&  r^  rd  ri   r\   rh  r¦  rî  rö  rû  r  r  r  r9  rD  rO  rU  rb  rh  rn  r€  r‚  r–  r  r8   Úmainr   r   r   r   Ú<module>   sâ   




D(ôõýÿÿ"*I  H : A  (JOGg&7	X
