o
    "Æ&i’Ã ã                   @   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rge d¡ e ejdkdej› ¡Ze ejdkdej› ¡Z dZ!zd dl"Z"dZ!W n	 e#y”   Y nw e e!d¡Z$dd„ Z%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 Z0d!Z1d"Z2d#Z3d$Z4d%Z5d&Z6d'Z7d(Z8d)Z9d*Z:d+Z;d,Z<g d-¢Z=g d.¢Z>g d/¢Z?d0Z@d1ZAd2ZBd3ZCd4ZDd5ZEd6ZFd7ZGd8ZHG d9d:„ d:eƒZIG d;d<„ d<eIƒZJG d=d>„ d>eIƒZKG d?d@„ d@eIƒZLG dAdB„ dBeIƒZMG dCdD„ dDeNƒZOG dEdF„ dFeOƒZPG dGdH„ dHeIePƒZQe RdI¡G dJdK„ dKeIƒƒZSG dLdM„ dMeIƒZTG dNdO„ dOeIƒZUG dPdQ„ dQeIƒZVG dRdS„ dSeIƒZWG dTdU„ dUeIƒZXG dVdW„ dWeIƒZYG dXdY„ dYeIƒZZG dZd[„ d[eIƒZ[G d\d]„ d]eQƒZ\G d^d_„ d_eIƒZ]e e
 ¡  ^d`¡da¡G dbdc„ dceIƒƒZ_G ddde„ deeIƒZ`G dfdg„ dgeIƒZaG dhdi„ dieIƒZbG djdk„ dkeNƒZcG dldm„ dmeIecƒZdG dndo„ doeIecƒZeG dpdq„ dqeIecƒZfe e	jg hdr¡ds¡e$G dtdu„ dueƒƒƒZiejdvkrþe k¡  dS dS )wé    N)Ú	CFUNCTYPEÚc_intÚc_int32)Úfind_library)Úcontextmanager)Úmkstemp)Úir)Úbinding)Úffi)ÚTestCaseÚarmv7lzlibgcc_s.so.1Úcondazconda package test only, have Úwheelzwheel package test only, have FTztest needs py-lief packagec               
   C   sl   t  t j¡} z'z	t  t jd¡ W n t jy#   Y W t  t j| ¡ dS w W t  t j| ¡ dS t  t j| ¡ w )NÚde_DETF)ÚlocaleÚ	setlocaleÚLC_ALLÚError)Úcur© r   úFC:\wamp64\www\opt\env\Lib\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]}}
    %struct.glob_type_vec = 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}"

    define i32 @sum(i32 %.1, i32 %.2) {{
        %.3 = add i32 %.1, %.2
        ret i32 0
    }}
    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)
    zg
    ; ModuleID = '<string>'
    target triple = "{triple}"

    declare i32 @vararg(i32 %.1, ...)
    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
    }}
)úaddi	sp, sp, -16zsw	a1, 8(sp)zsw	a2, 12(sp)úfld	fa5, 8(sp)zfmv.w.x	fa4, a0zfcvt.d.s	fa4, fa4úfadd.d	fa5, fa4, fa5úfsd	fa5, 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	fa4, fa0r   r   r   r   r   r    )zfcvt.d.s	fa5, fa0zfadd.d	fa0, fa5, fa1r    zc
declare void @a_readonly_func(i8 *) readonly

declare i8* @a_arg0_return_func(i8* returned, i32*)
a*  
define double @foo(i32 %i, double %j) optnone noinline {
    %I = alloca i32		; <i32*> [#uses=4]
    %J = alloca double		; <double*> [#uses=2]
    store i32 %i, i32* %I
    store double %j, double* %J
    %t1 = load i32, i32* %I		; <i32> [#uses=1]
    %t2 = add i32 %t1, 1		; <i32> [#uses=1]
    store i32 %t2, i32* %I
    %t3 = load i32, i32* %I		; <i32> [#uses=1]
    %t4 = sitofp i32 %t3 to double		; <double> [#uses=1]
    %t5 = load double, double* %J		; <double> [#uses=1]
    %t6 = fmul double %t4, %t5		; <double> [#uses=1]
    ret double %t6
}
z#
declare void @test_declare(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
}
aª  
; ModuleID = '<string>'
target triple = "{triple}"

define void @foo(i32 %N) {{
  ; unnamed block for testing
  %cmp4 = icmp sgt i32 %N, 0
  br i1 %cmp4, label %for.body, label %for.cond.cleanup

for.cond.cleanup:
  ret void

for.body:
  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %0 ]
  %inc = add nuw nsw i32 %i.05, 1
  %exitcond.not = icmp eq i32 %inc, %N
  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
}}
aw  
; Source C++
;-----------------------------------------
; class MyClass;
;
; class MyClassDefined{
;     MyClass *member;
;     MyClass *m2;
;     MyClass *m3;
; };
;
; void foo(MyClass *c, MyClassDefined){ }
;-----------------------------------------
; LLVM-IR by: clang -arch arm64 -S -emit-llvm file.cpp
; ModuleID = 'file.cpp'
source_filename = "class.cpp"
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
target triple = "arm64-apple-macosx13.3.0"

%class.MyClass = type opaque
%class.MyClassDefined = type { %class.MyClass*, %class.MyClass*, %class.MyClass* }

; Function Attrs: noinline nounwind optnone ssp uwtable(sync)
define void @_Z3fooP7MyClass14MyClassDefined(%class.MyClass* noundef %0, %class.MyClassDefined* noundef %1) {
  %3 = alloca %class.MyClass*, align 8
  store %class.MyClass* %0, %class.MyClass** %3, align 8
  ret void
}

!llvm.module.flags = !{!0, !1, !2, !3, !4, !5, !6, !7, !8}
!llvm.ident = !{!9}

!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 13, i32 3]}
!1 = !{i32 1, !"wchar_size", i32 4}
!2 = !{i32 8, !"branch-target-enforcement", i32 0}
!3 = !{i32 8, !"sign-return-address", i32 0}
!4 = !{i32 8, !"sign-return-address-all", i32 0}
!5 = !{i32 8, !"sign-return-address-with-bkey", i32 0}
!6 = !{i32 7, !"PIC Level", i32 2}
!7 = !{i32 7, !"uwtable", i32 1}
!8 = !{i32 7, !"frame-pointer", i32 1}
!9 = !{!"Apple clang version 14.0.3 (clang-1403.0.22.14.1)"}

a  ; Source C++
;-----------------------------------------

; struct Vector2D{
;     float x, y;
; };
;
; void foo(Vector2D vec, Vector2D *out) {
;     *out = vec;
; }
;-----------------------------------------
; LLVM-IR by: clang -arch x86_64 -S -emit-llvm file.cpp
; ModuleID = 'file.cpp'
source_filename = "class.cpp"
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx13.3.0"

%struct.Vector2D = type { float, float }

; Function Attrs: noinline nounwind optnone ssp uwtable
define void @_Z3foo8Vector2DPS_(<2 x float> %0, %struct.Vector2D* noundef %1) #0 {
  %3 = alloca %struct.Vector2D, align 4
  %4 = alloca %struct.Vector2D*, align 8
  %5 = bitcast %struct.Vector2D* %3 to <2 x float>*
  store <2 x float> %0, <2 x float>* %5, align 4
  store %struct.Vector2D* %1, %struct.Vector2D** %4, align 8
  %6 = load %struct.Vector2D*, %struct.Vector2D** %4, align 8
  %7 = bitcast %struct.Vector2D* %6 to i8*
  %8 = bitcast %struct.Vector2D* %3 to i8*
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %7, i8* align 4 %8, i64 8, i1 false)
  ret void
}

; Function Attrs: argmemonly nofree nounwind willreturn
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #1

attributes #0 = { noinline nounwind optnone ssp uwtable "darwin-stkchk-strong-link" "frame-pointer"="all" "min-legal-vector-width"="64" "no-trapping-math"="true" "probe-stack"="___chkstk_darwin" "stack-protector-buffer-size"="8" "target-cpu"="penryn" "target-features"="+cx16,+cx8,+fxsr,+mmx,+sahf,+sse,+sse2,+sse3,+sse4.1,+ssse3,+x87" "tune-cpu"="generic" }
attributes #1 = { argmemonly nofree nounwind willreturn }

!llvm.module.flags = !{!0, !1, !2, !3, !4}
!llvm.ident = !{!5}

!0 = !{i32 2, !"SDK Version", [2 x i32] [i32 13, i32 3]}
!1 = !{i32 1, !"wchar_size", i32 4}
!2 = !{i32 7, !"PIC Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{i32 7, !"frame-pointer", i32 2}
!5 = !{!"Apple clang version 14.0.3 (clang-1403.0.22.14.1)"}

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   s:   t  ¡  t  ¡  t ¡  tjd d … | _g tjd d …< d S ©N)ÚllvmZ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"   )r5   Úget_global_variable)r)   Únamer4   r   r   r   r6   ´  s   
zBaseTest.globc                C   s   t j ¡ }|j|dS )N©Újit)r#   ÚTargetÚfrom_default_tripleÚcreate_target_machine)r)   r:   Útargetr   r   r   Útarget_machine¹  s   
zBaseTest.target_machine)r6   N)	Ú__name__Ú
__module__Ú__qualname__r*   r,   Úasm_sumr5   r6   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 testÚLLVMLITE_DIST_TESTúDistribution-specific testc                 C   s‚  t jj}tj ¡ }d|d< tjdd|gtj|d}| 	¡ \}}|  
d|j¡ t d¡}tƒ }| ¡  ¡ D ]/}| ¡ }	|	rc|	d dkrc|	d	 }
| |
¡}t|	ƒd
ksS|s[|  d|f ¡ | | d	¡¡ q4d|vsld|vrt|  d|f ¡ tg d¢ƒ}t ¡ dkr…| d¡ g }|D ]}
|
 d¡s™|
|vr™| |
¡ q‰t|ƒd	kr­|  d|d |f ¡ d S t|ƒd	kr¾|  d||f ¡ d S 	 d S )NÚCÚLANGÚ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libdlrP   ZlibzÚlibmZlibgcc_srO   zld-linuxZld64Zlibzstdz	libstdc++r   Zlibtinfoz	ld-linux-zunexpected dependency %r in %rz unexpected dependencies %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Úappend)r)   Zlib_pathrL   ÚpÚoutÚ_Zlib_patÚdepsÚlineÚpartsÚdepÚmÚallowedZfailsr   r   r   Ú
test_linuxÃ  sD   
ÿ

€

€zTestDependencies.test_linuxN)r@   rA   rB   Ú__doc__ÚunittestÚ
skipUnlessÚsysrf   rh   rT   rU   Úgetrs   r   r   r   r   rD   ¾  s    ÿÿrD   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 d S  ty+ } zdt|ƒv r|  d¡ n|‚W Y d }~d S d }~ww )Nz/No available targets are compatible with triplez(RISCV target unsupported by linked LLVM.)r#   r;   Úfrom_tripler.   ÚRuntimeErrorÚstrZskipTest)r)   Úer   r   r   Úcheck_riscv_targetü  s   þ€þzTestRISCVABI.check_riscv_targetc                 K   s   t j | j¡}|jdi |¤ŽS )Nr   )r#   r;   r}   r.   r=   )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©r8   )r   Ú
DoubleTypeÚ	FloatTypeÚFunctionTypeÚModuleÚFunctionÚappend_basic_blockÚ	IRBuilderÚargsZfpextÚfaddr    r#   r1   r   Úverify)r)   Zf64Zf32Úfntyr5   ÚfuncÚblockÚbuilderÚaÚbZarg0ÚresultÚllmodr   r   r   Úfpadd_ll_module	  s   


zTestRISCVABI.fpadd_ll_modulec                 C   sD   g }|  ¡ D ]}| ¡ }| d¡s| d¡s|dks| |¡ q|S )NÚ.r„   Ú )r`   Ústriprh   ri   )r)   r2   Zasm_listrn   Zs_liner   r   r   Úbreak_up_asm  s   
€zTestRISCVABI.break_up_asmc                 C   ó:   |   ¡  |  ¡ }| jddd}|  |  | |¡¡t¡ d S )Nú+f,+dZilp32©ÚfeaturesZabiname)r   r˜   rƒ   r+   rœ   Úemit_assemblyÚriscv_asm_ilp32©r)   r—   r>   r   r   r   Útest_rv32d_ilp32#  ó   ÿzTestRISCVABI.test_rv32d_ilp32c                 C   r   )Nrž   Zilp32frŸ   )r   r˜   rƒ   r+   rœ   r¡   Úriscv_asm_ilp32fr£   r   r   r   Útest_rv32d_ilp32f*  r¥   zTestRISCVABI.test_rv32d_ilp32fc                 C   r   )Nrž   Zilp32drŸ   )r   r˜   rƒ   r+   rœ   r¡   Úriscv_asm_ilp32dr£   r   r   r   Útest_rv32d_ilp32d1  r¥   zTestRISCVABI.test_rv32d_ilp32d)r@   rA   rB   rt   r.   r*   r   rƒ   r˜   rœ   r¤   r§   r©   Ú__classcell__r   r   r{   r   ry   ð  s    		ry   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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"   )r5   rC   r(   r   r   r   Útest_parse_assembly>  ó   zTestMisc.test_parse_assemblyc                 C   sZ   |   t¡}|  t¡ W d   ƒ n1 sw   Y  t|jƒ}|  d|¡ |  d|¡ d S )Nzparsing errorzinvalid operand type)ÚassertRaisesr~   r5   Úasm_parse_errorr   Ú	exceptionÚassertIn)r)   ÚcmÚsr   r   r   Útest_parse_assembly_errorA  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    ÚConstantr   r+   Úasm_nonalphanum_blocklabel)r)   r4   ÚftÚfnÚbdr2   r   r   r   Útest_nonalphanum_block_nameH  s   z$TestMisc.test_nonalphanum_block_namec                 C   s$   t j ¡ }t j ¡ }||ksJ ‚d S r"   )r#   r3   Zget_global_context)r)   Z	gcontext1Z	gcontext2r   r   r   Útest_global_contextQ  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_symbolsV  s   

zTestMisc.test_dylib_symbolsc                 C   ó"   t  ¡ }|  |t¡ |  |¡ d S r"   )r#   r0   ÚassertIsInstancer   Ú
assertTrue)r)   r.   r   r   r   Útest_get_default_triple^  ó   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 )NZpowerpc64leÚppc64ler   )Úarchr   r   r   Únormalize_ppce  s   z7TestMisc.test_get_process_triple.<locals>.normalize_ppcú-r   )r#   Zget_process_tripler0   rÆ   r   rÇ   ra   r+   )r)   rÌ   r.   ÚdefaultZdefault_archZtriple_archr   r   r   Útest_get_process_triplec  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re|  | 	¡ d¡ d S |  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Úitemsr   rÇ   ÚboolÚflattenr/   ÚassertIsNotNoner\   rb   rc   r+   )r)   r    ÚkÚvZre_termÚregexr   r   r   Útest_get_host_cpu_featuresu  s    

z#TestMisc.test_get_host_cpu_featuresc                 C   rÅ   r"   )r#   Úget_host_cpu_namerÆ   r   rÇ   )r)   Úcpur   r   r   Útest_get_host_cpu_nameŒ  rÉ   zTestMisc.test_get_host_cpu_namec                 C   ó   d}t  tjd|g¡ d S )Na  if 1:
            from llvmlite import binding as llvm

            llvm.initialize_native_target()
            llvm.initialize_native_asmprinter()
            llvm.initialize_all_targets()
            llvm.initialize_all_asmprinters()
            llvm.shutdown()
            ú-c©rW   Ú
check_callrw   Ú
executable©r)   Úcoder   r   r   Útest_initfini‘  s   	zTestMisc.test_initfinic                 C   s@   d}| j t|d t ¡  W d   ƒ d S 1 sw   Y  d S )Nz-llvmlite.binding.initialize\(\) is deprecated)Zexpected_regex)ÚassertRaisesRegexr~   r#   Z
initialize)r)   r×   r   r   r   Útest_deprecated_init  s   
"ÿzTestMisc.test_deprecated_initc                 C   rÜ   )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   s0   t j\}}}d}|  ||¡ |  |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   )r5   Úasm_double_localer   r   r   r   r+   )r)   rq   Ú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Ý   )rw   rà   rW   rß   )r)   râ   ÚflagsZcmdargsr   r   r   Útest_no_accidental_warningsÂ  s   z$TestMisc.test_no_accidental_warningsN)r@   rA   rB   rt   r¬   r´   r½   r¾   rÄ   rÈ   rÏ   rØ   rÛ   rã   rå   ræ   rî   rï   ru   ÚskipIfr   ró   rõ   r   r   r   r   r«   9  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 =)r5   r   r›   rÇ   rh   ©r)   r4   r³   r   r   r   Útest_strË  s   zTestModuleRef.test_strc                 C   sX   |   ¡ }t|ƒ | ¡  |  tj¡ t|ƒ W d   ƒ n1 s!w   Y  | ¡  d S r"   )r5   r   Úcloser®   ÚctypesÚArgumentError©r)   r4   r   r   r   Ú
test_closeÐ  s   
ÿzTestModuleRef.test_closec              	   C   sÔ   |   ¡ }t|ƒ | t|ƒ W d   ƒ n1 sw   Y  |  tj¡ t|ƒ W d   ƒ n1 s3w   Y  |  t¡# | W d   ƒ n1 sKw   Y  W d   ƒ d S W d   ƒ d S 1 scw   Y  d S r"   )r5   r   r®   rû   rü   r~   rý   r   r   r   Ú	test_withØ  s   
ÿ
ÿÿÿ"ÿzTestModuleRef.test_withc                 C   s4   |   ¡ }d|_|  |jd¡ d|_|  |jd¡ d S )Nr¶   Úbar)r5   r8   r+   rý   r   r   r   Ú	test_nameã  s
   zTestModuleRef.test_namec                 C   s   |   ¡ }|  |jd¡ d S )Nz	asm_sum.c)r5   r+   Zsource_filerý   r   r   r   Útest_source_fileê  s   zTestModuleRef.test_source_filec                 C   s2   |   ¡ }|j}|  |t¡ ||_|  ||j¡ d S r"   )r5   Zdata_layoutrÆ   r   r+   rø   r   r   r   Útest_data_layoutî  s
   zTestModuleRef.test_data_layoutc                 C   s6   |   ¡ }|j}|  |t ¡ ¡ d|_|  |jd¡ d S )Nrš   )r5   r.   r+   r#   r0   rø   r   r   r   Útest_tripleõ  s
   zTestModuleRef.test_triplec                 C   sn   |   ¡ }|  | ¡ d ¡ |   t¡}|  t¡}| ¡  W d   ƒ n1 s%w   Y  t|jƒ}|  d|¡ d S )Nz%.bug = add i32 1, %.bug)	r5   rÂ   r   Úasm_verification_failr®   r~   r   r°   r±   )r)   r4   r²   r³   r   r   r   Útest_verifyü  s   

ÿ
zTestModuleRef.test_verifyc                 C   ór   |   ¡ }| d¡}|  |tj¡ |  |jd¡ |  t¡ | d¡ W d   ƒ n1 s,w   Y  ~t	|j ƒ d S )NÚsumr¶   )
r5   Úget_functionrÆ   r#   ÚValueRefr+   r8   r®   Ú	NameErrorr   ©r)   r4   r»   r   r   r   Útest_get_function  ó   
ÿzTestModuleRef.test_get_functionc                 C   sp   |   ¡ }| d¡}|  |jd¡ |  t dt|ƒ¡¡ |  t	¡ | d¡ W d   ƒ d S 1 s1w   Y  d S )Nústruct.glob_typeú8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] }zstruct.doesnt_exist)
r5   Úget_struct_typer+   r8   rÔ   r\   rb   r   r®   r  )r)   r4   Zst_tyr   r   r   Útest_get_struct_type  s   
þ"ÿz"TestModuleRef.test_get_struct_typec                 C   r  )Nr6   r   )
r5   r7   rÆ   r#   r
  r+   r8   r®   r  r   )r)   r4   Úgvr   r   r   Útest_get_global_variable   r  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>1  s    z5TestModuleRef.test_global_variables.<locals>.<lambda>)Úkeyé   c                 S   s   g | ]}|j ‘qS r   r…   )Ú.0Úgr   r   r   Ú
<listcomp>3  ó    z7TestModuleRef.test_global_variables.<locals>.<listcomp>)r6   Úglob_bZglob_fÚglob_struct)r5   Úglobal_variablesÚsortedr+   rc   )r)   r4   ÚitZglobsr   r   r   Útest_global_variables-  s   ÿz#TestModuleRef.test_global_variablesc                 C   s>   |   ¡ }|j}~t|ƒ}|  t|ƒd¡ |  |d jd¡ d S ©NrM   r   r  )r5   Ú	functionsÚlistr+   rc   r8   )r)   r4   r!  Úfuncsr   r   r   Útest_functions6  s   zTestModuleRef.test_functionsc                 C   s^   |   ¡ }|j}~t|ƒ}|  t|ƒd¡ |  t d|d j¡¡ |  t dt	|d ƒ¡¡ d S )NrM   ústruct\.glob_type(\.[\d]+)?r   r  )
r5   Zstruct_typesr%  r+   rc   rÔ   r\   rb   r8   r   )r)   r4   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   ƒ d S 1 s>w   Y  d S )Nc                 s   ó    | ]}|j V  qd S r"   r…   ©r  Úfr   r   r   Ú	<genexpr>O  ó   € z-TestModuleRef.test_link_in.<locals>.<genexpr>Úmulr  )r5   Úasm_mulÚlink_inr+   r   r$  r	  rú   r®   rû   rü   )r)   ÚdestÚsrcr   r   r   Útest_link_inJ  s   

ÿ
"ÿzTestModuleRef.test_link_inc                 C   st   |   ¡ }|   t¡}|j|dd |  tdd„ |jD ƒƒddg¡ | ¡  |  tdd„ |jD ƒƒdg¡ | d¡ d S )NT©Zpreservec                 s   r+  r"   r…   r,  r   r   r   r.  Z  r/  z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>r0  r  c                 s   r+  r"   r…   r,  r   r   r   r.  \  r/  )r5   r1  r2  r+   r   r$  rú   r	  )r)   r3  Zsrc2r   r   r   Útest_link_in_preserveU  s   
ÿz#TestModuleRef.test_link_in_preservec                 C   s\   |   ¡ }|   t¡}|  t¡}| |¡ W d   ƒ n1 sw   Y  |  dt|jƒ¡ d S )Nzsymbol multiply defined)r5   Úasm_sum2r®   r~   r2  r±   r   r°   )r)   r3  r4  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)r5   Ú
as_bitcoderÇ   rh   )r)   r4   ÚbcZbitcode_wrapper_magicZbitcode_magicr   r   r   Útest_as_bitcodeh  s   ÿzTestModuleRef.test_as_bitcodec                 C   s\   |   t¡}t d¡ W d   ƒ n1 sw   Y  |  dt|jƒ¡ |  dt|jƒ¡ d S )Nó    zLLVM bitcode parsing errorz(file too small to contain bitcode header)r®   r~   r#   Úparse_bitcoder±   r   r°   )r)   r²   r   r   r   Útest_parse_bitcode_errorr  s   ÿ
ÿz&TestModuleRef.test_parse_bitcode_errorc                 C   sT   t  ¡ }| j|d ¡ }t  ¡ }t  ||¡}|  | ¡ |¡ | d¡ | d¡ d S )N©r3   r  r6   )r#   Zcreate_contextr5   r:  r>  r+   r	  r7   )r)   Zcontext1r;  Zcontext2r4   r   r   r   Útest_bitcode_roundtripz  s   
z$TestModuleRef.test_bitcode_roundtripc                 C   s4   |   ¡ }| ¡ }|  ||¡ |  | ¡ | ¡ ¡ d S r"   )r5   ÚcloneZassertIsNotr+   r:  )r)   rq   Zclonedr   r   r   Útest_cloning…  s   zTestModuleRef.test_cloningN)r@   rA   rB   rù   rþ   rÿ   r  r  r  r  r  r  r  r  r"  r'  r*  r5  r7  r9  r<  r?  rA  rC  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   sX   |   ¡ }|  |¡}|  |¡}|ddƒ}|  d|¡ W d   ƒ d S 1 s%w   Y  d S ©NrN   éûÿÿÿéýÿÿÿ)r5   r:   rJ  r+   )r)   r4   rG  ÚcfuncÚresr   r   r   Útest_run_code—  s   

"ýzJITTestMixin.test_run_codec                 C   sX   |   |  ¡ ¡}| ¡  | ¡  |  tj¡ | ¡  W d   ƒ d S 1 s%w   Y  d S r"   )r:   r5   rú   r®   rû   rü   rE  ©r)   rG  r   r   r   rþ   ž  s   
"ÿzJITTestMixin.test_closec              	   C   sº   |   |  ¡ ¡}| W d   ƒ n1 sw   Y  |  t¡ | W d   ƒ n1 s,w   Y  W d   ƒ n1 s;w   Y  |  tj¡ | ¡  W d   ƒ d S 1 sVw   Y  d S r"   )r:   r5   r®   r~   rû   rü   rE  rQ  r   r   r   rÿ   ¥  s   ÿÿ€ÿ
"ÿzJITTestMixin.test_withc                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r"   ©r5   r:   rú   ©r)   r4   rG  r   r   r   Útest_module_lifetime¯  ó   
z!JITTestMixin.test_module_lifetimec                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r"   rR  rS  r   r   r   Útest_module_lifetime2µ  rU  z"JITTestMixin.test_module_lifetime2c                 C   sz   |   |  ¡ ¡}|  t¡}| |¡ |  t¡ | |¡ W d   ƒ n1 s&w   Y  |  |j¡ | ¡  |  	|j¡ d S r"   )
r:   r5   r1  Ú
add_moduler®   ÚKeyErrorÚassertFalseÚclosedrú   rÇ   ©r)   rG  r4   r   r   r   Útest_add_module»  s   

ÿzJITTestMixin.test_add_modulec                 C   s6   |   |  ¡ ¡}|  t¡}| |¡ | ¡  | ¡  d S r"   ©r:   r5   r1  rW  rú   r[  r   r   r   Útest_add_module_lifetimeÅ  ó
   

z%JITTestMixin.test_add_module_lifetimec                 C   s6   |   |  ¡ ¡}|  t¡}| |¡ | ¡  | ¡  d S r"   r]  r[  r   r   r   Útest_add_module_lifetime2Ì  r_  z&JITTestMixin.test_add_module_lifetime2c                 C   s„   |   |  ¡ ¡}|  t¡}| |¡ | |¡ |  t¡ | |¡ W d   ƒ n1 s+w   Y  |  |j¡ | 	¡  |  |j¡ d S r"   )
r:   r5   r1  rW  Zremove_moduler®   rX  rY  rZ  rú   r[  r   r   r   Útest_remove_moduleÓ  s   


ÿzJITTestMixin.test_remove_modulec                 C   s>   |   ¡ }|  |¡}|j}|  |j|¡ t|ƒ ~~t|ƒ d S r"   )r5   r:   Útarget_datarÂ   r   )r)   r4   rG  Útdr   r   r   Útest_target_dataÞ  s   
zJITTestMixin.test_target_datac           	      C   sè   |   ¡ }|  |¡}|j}| d¡}| d¡}| d¡}tjdk r"dnd}|||fD ]}|  | |j¡|¡ q)|  | |j	¡d¡ |  | 
|j	¡d¡ |  | |j	¡d¡ |  | 
|j	¡d¡ |  | |j	¡d	¡ |  | 
|j	¡d
¡ d S )Nr6   r  r  ì        r  é   rM   )rM   rN   r  é   )r  rf  )r5   r:   rb  r7   rw   Úmaxsizer+   Úget_abi_sizeÚtypeÚglobal_value_typeZget_abi_alignmentr±   )	r)   r4   rG  rc  Ú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                    ó   ˆ   | |f¡ d S r"   ©ri   ©r4   Úbuf©Únotifiesr   r   Únotify   ó   z5JITTestMixin.test_object_cache_notify.<locals>.notifyr   rN   rL  rM   r0  )r5   r:   Úset_object_cacher+   rc   rJ  rÂ   rÆ   Úbytesr1  rW  )r)   ru  r4   rG  rN  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                    ro  r"   rp  rq  rs  r   r   ru    rv  z8JITTestMixin.test_object_cache_getbuffer.<locals>.notifyc                    s   ˆ   | ¡ d S r"   rp  ©r4   )Ú
getbuffersr   r   Ú	getbuffer  r­   z;JITTestMixin.test_object_cache_getbuffer.<locals>.getbufferr   rM   c                    s   ˆ   | ¡ ˆS r"   rp  rz  )r{  Ú
sum_bufferr   r   Úgetbuffer_successful2  s   
zFJITTestMixin.test_object_cache_getbuffer.<locals>.getbuffer_successfulrN   rL  rM  )r5   r:   rw  r+   rc   rJ  rÂ   r1  )r)   ru  r|  r4   rG  rN  r~  r   )r{  rt  r}  r   Útest_object_cache_getbuffer  s4   




z(JITTestMixin.test_object_cache_getbufferN)r  )r@   rA   rB   rt   rJ  rP  rþ   rÿ   rT  rV  r\  r^  r`  ra  rd  rn  ry  r  r   r   r   r   rD  Œ  s     



rD  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()Tr9   r  N)r?   r5   r:   r¡   r±   Zset_asm_verbosityÚassertNotEqual)r)   r?   r4   rG  Zraw_asmZraw_asm_verboser   r   r   Útest_emit_assemblyG  s   


z%JITWithTMTestMixin.test_emit_assemblyc                 C   s^   | j dd}|  ¡ }|  ||¡}| |¡}|  |t¡ tj d¡r-|  	d|dd… ¡ dS dS )z#Test TargetMachineRef.emit_object()Tr9   rE   s   ELFNé
   )
r?   r5   r:   Úemit_objectrÆ   rx  rw   rf   rh   r±   )r)   r?   r4   rG  Úcode_objectr   r   r   Útest_emit_objectS  s   
þz#JITWithTMTestMixin.test_emit_objectN)r@   rA   rB   r‚  r†  r   r   r   r   r€  E  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 )NTr9   )r?   r#   Úcreate_mcjit_compiler)r)   r4   r?   r   r   r   r:   d  s   zTestMCJit.jitr"   )r@   rA   rB   rt   r:   r   r   r   r   r‡  _  s    r‡  zOrcJIT support is experimentalc                   @   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/   r0   Úexport_symbolÚlinkrÇ   r+   r8   )r)   r2   rH  r?   Zadd_processÚ	func_typer‹  Úlljitr“   ÚrtrI  r   r   r   r:   t  s    þý
zTestOrcLLJIT.jitc                 C   s:   t  ¡ }t  ¡  dd¡ d¡ |d¡}|  |d d¡ d S )Nr¿   rÀ   r¶   )r#   rŒ  r  Úimport_symbolr  r  r+   ©r)   r’  r“  r   r   r   Útest_define_symbol‡  s
   ÿzTestOrcLLJIT.test_define_symbolc                 C   s¬   t  ¡ }|  td¡ | dd¡ W d   ƒ n1 sw   Y  t  ¡  dd¡ d¡ |d¡}|  	|d d¡ |  td¡ | dd¡ W d   ƒ d S 1 sOw   Y  d S )NzNo such libraryr¶   rÁ   r¿   rÀ   r   zSymbols not found.*__foobar)
r#   rŒ  rä   r~   Úlookupr  r”  r  r  r  r•  r   r   r   Ú"test_lookup_undefined_symbol_fails  s   ÿÿÿ"þz/TestOrcLLJIT.test_lookup_undefined_symbol_failsc                 C   s^   t jdkr$|  td¡ tjdd W d   ƒ d S 1 sw   Y  d S |  tjdd¡ d S )NÚwin32zJITLink .* WindowsT)rŠ  )rw   rf   rä   r~   r#   rŒ  rÔ   r(   r   r   r   Útest_jit_link˜  s   
ÿ"þzTestOrcLLJIT.test_jit_linkc                 C   sN   |   ¡ \}}}| |ddƒ}|  d|¡ W d   ƒ d S 1 s w   Y  d S rK  )r:   r+   )r)   r’  r“  rN  rO  r   r   r   rP     s
   
"þzTestOrcLLJIT.test_run_codec                 C   sZ   |   ¡ \}}}| ¡  | ¡  |  t¡ | dd¡ W d   ƒ d S 1 s&w   Y  d S ©Nr¶   r»   )r:   rú   r®   ÚAssertionErrorr—  ©r)   r’  r“  rN  r   r   r   rþ   ¦  s   "ÿzTestOrcLLJIT.test_closec              	   C   s¼   |   ¡ \}}}| W d   ƒ n1 sw   Y  |  t¡ | W d   ƒ n1 s,w   Y  W d   ƒ n1 s;w   Y  |  t¡ | dd¡ W d   ƒ d S 1 sWw   Y  d S r›  )r:   r®   r~   rœ  r—  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 d   ƒ n1 s\w   Y  |  t¡ | dd¡ W d   ƒ d S 1 sxw   Y  d S )Nr-   r0  rN   rL  iöÿÿÿr  r   )r:   r#   r  rŽ  r1  r/   r0   r  r  r   r   r+   r  r—  r®   r~   ©r)   r’  Úrt_sumZ	cfunc_sumZrt_mulrO  r   r   r   Útest_add_ir_module·  s    ýÿ"ÿzTestOrcLLJIT.test_add_ir_modulec                 C   sZ   |   ¡ \}}}~t ¡  |  t¡ | dd¡ W d   ƒ n1 s"w   Y  | ¡  d S ©Nr  )r:   r$   r%   r®   r~   r—  rú   )r)   r’  rŸ  rl   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  rN   rL  rè   )r:   r#   r  rŽ  Úasm_square_sumr/   r0   r  Zadd_jit_libraryr  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"   )r:   rb  rÂ   r   )r)   r’  r“  rl   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   r#   rŒ  r  rŽ  Úasm_ext_ctorsr/   r0   r”  rû   Ú	addressofr  r  rÇ   r+   r   r   r  r  )r)   Zshared_valuer’  r“   r“  r¶   r   r   r   Útest_global_ctors_dtorsá  s   ü
z$TestOrcLLJIT.test_global_ctors_dtorsc                 C   sF   d}|   t|¡ | jtddd W d   ƒ d S 1 sw   Y  d S )Nz*Failed to materialize symbols:.*getversionÚ
getversionT)r‹  )rä   r~   r:   Ú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)r:   rª  r(   r   r   r   Ú"test_lookup_current_process_symbolú  s   z/TestOrcLLJIT.test_lookup_current_process_symbolc                    sh   t  ¡ ‰tjt  ¡ d‰‡‡fdd„‰ ‡ fdd„tt ¡ ƒD ƒ}|D ]}| ¡  q"|D ]}| 	¡  q+d S )Nr-   c                    s   ‡ ‡‡fdd„}|S )Nc               
      sD   g } t dƒD ]}|  t ¡  ˆ¡ d¡ ˆdˆ › d|› ¡¡ qd S )Né2   r  Zsum_rl   )rê   ri   r#   r  rŽ  r  r  )ZtrackingÚc)Úir’  Úllvm_irr   r   Údo_work  s   
ýÿzDTestOrcLLJIT.test_thread_safe.<locals>.compile_many.<locals>.do_workr   )r°  r²  )r’  r±  )r°  r   Úcompile_many  s   z3TestOrcLLJIT.test_thread_safe.<locals>.compile_manyc                    s   g | ]
}t jˆ |ƒd ‘qS ))r>   )Ú	threadingÚThread)r  r°  )r³  r   r   r    s    ÿz1TestOrcLLJIT.test_thread_safe.<locals>.<listcomp>)
r#   rŒ  rC   r/   r0   rê   rT   Ú	cpu_countÚstartÚjoin)r)   ZthsÚthr   )r³  r’  r±  r   Útest_thread_safeý  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 )NFr9   r  rN   é   é   )r?   r5   r#   rŒ  r  Zadd_object_imgr„  r  r  r   r   r+   )r)   r?   r4   r’  r“  r  r   r   r   Útest_add_object_file  s   
ýz!TestOrcLLJIT.test_add_object_filec           
   	   C   sÈ   | j dd}|  ¡ }| |¡}tƒ \}}zIt |d¡}| |¡ W d   ƒ n1 s+w   Y  t |¡}t 	¡  
|¡ d¡ |d¡}ttttƒ|d ƒ}	|  |	ddƒd¡ W t |¡ d S t |¡ w )NFr9   Úwbr  rN   r»  r¼  )r?   r5   r„  r   rT   ÚfdopenÚwriter#   rŒ  r  Úadd_object_filer  r  r   r   r+   Úunlink)
r)   r?   r4   Úobj_binÚ	temp_descÚ	temp_pathr-  r’  r“  r  r   r   r   Ú$test_add_object_file_from_filesystem  s"   

ÿ
ýz1TestOrcLLJIT.test_add_object_file_from_filesystem)r@   rA   rB   rC   r   r   r:   r–  r˜  rš  rP  rþ   rÿ   r   ra  r£  rd  r¨  r¬  r­  rº  r½  rÆ  r   r   r   r   r‰  q  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+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7S )8ÚTestValueRefc                 C   s&   |   ¡ }| d¡}|  t|ƒd¡ d S )Nr6   z@glob = global i32 0)r5   r7   r+   r   ©r)   r4   r6   r   r   r   rù   4  s   
zTestValueRef.test_strc                 C   s8   |   ¡ }| d¡}|  |jd¡ d|_|  |jd¡ d S )Nr6   Úfoobar)r5   r7   r+   r8   rÈ  r   r   r   r  9  s
   
zTestValueRef.test_namec                 C   óp   |   ¡ }| d¡}|j}|  |jtj¡ ||_|  |j|¡ dD ]}||_|  |jtj¡ |  |jj|¡ q d S )Nr6   )ÚinternalÚexternal)r5   r7   ÚlinkagerÆ   r#   ZLinkager+   r8   )r)   r4   r6   rÍ  r   r   r   Útest_linkage@  ó   
ýzTestValueRef.test_linkagec                 C   rÊ  )Nr6   )ZhiddenZ	protectedrÎ   )r5   r7   Ú
visibilityrÆ   r#   Z
Visibilityr+   r8   )r)   r4   r6   rÐ  r   r   r   Útest_visibilityL  rÏ  zTestValueRef.test_visibilityc                 C   rÊ  )Nr6   )Z	dllimportZ	dllexportrÎ   )r5   r7   Ústorage_classrÆ   r#   ZStorageClassr+   r8   )r)   r4   r6   rÒ  r   r   r   Útest_storage_classX  rÏ  zTestValueRef.test_storage_classc                 C   sf   |   ¡ }| d¡}| d¡ |  t¡}| d¡ W d   ƒ n1 s#w   Y  |  t|jƒd¡ d S )Nr  Z	nocaptureZzextzno such attribute 'zext')r5   r	  Zadd_function_attributer®   Ú
ValueErrorr+   r   r°   )r)   r4   r»   Úraisesr   r   r   Útest_add_function_attributed  s   

ÿz(TestValueRef.test_add_function_attributec                 C   s$   |   ¡ }| d¡}|  |j |¡ d S ©Nr6   )r5   r7   rÂ   rÈ  r   r   r   Útest_modulel  s   
zTestValueRef.test_modulec                 C   s*   |   ¡ }| d¡}|j}|  |tj¡ d S r×  )r5   r7   rj  rÆ   r#   ZTypeRef©r)   r4   r6   Útpr   r   r   Ú	test_typeq  s   
zTestValueRef.test_typec                 C   sJ   |   ¡ }| d¡}|j}|  |jd¡ | d¡}|  t d|jj¡¡ d S )Nr6   rš   r  r(  )	r5   r7   rj  r+   r8   rÔ   r\   rb   rk  )r)   r4   r6   rÚ  Ústr   r   r   Útest_type_namew  s   



ÿzTestValueRef.test_type_namec                 C   s,   |   ¡ }| d¡}|j}|  t|ƒd¡ d S )Nr6   Úi32)r5   r7   rk  r+   r   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))r5   r	  r+   r   rk  r  r   r   r   Útest_type_printing_function†  s   
z(TestValueRef.test_type_printing_functionc                 C   sT   |   ¡ }| d¡}|  |jj¡ |  t dt|jƒ¡¡ |  t dt|j	ƒ¡¡ d S )Nr  Úptrr  )
r5   r7   rÇ   rj  Ú
is_pointerrÔ   r\   rb   r   rk  )r)   r4   rÜ  r   r   r   Útest_type_printing_struct‹  s   

þz&TestValueRef.test_type_printing_structc                 C   s   |   ¡ }| ¡  | ¡  d S r"   )r6   rú   )r)   r6   r   r   r   rþ   ”  s   zTestValueRef.test_closec                 C   s:   |   ¡  d¡}|   t¡ d¡}|  |j¡ |  |j¡ d S r¡  )r5   r	  Úasm_sum_declarerY  Ú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  )r5   rC   r%  r  r+   rc   rÇ   Ú	is_global)r)   r4   Ú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 s5w   Y  |  t	¡ |j W d   ƒ n1 sMw   Y  |  t	¡ |j W d   ƒ d S 1 sfw   Y  d S r#  )r5   r%  r$  r+   rc   rÇ   Úis_functionr8   r®   rÔ  ÚinstructionsÚoperandsÚopcode)r)   r4   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 siw   Y  |  t¡ |d j W d   ƒ d S 1 s„w   Y  d S )Nr  rN   r   rM   ú.1rÞ  ú.2)r5   r	  rÇ   rì  r%  Ú	argumentsr+   rc   Úis_argumentr8   r   rj  r®   rÔ  Úblocks)r)   r4   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  rM   r   )r5   r	  r%  rõ  r+   rc   rÇ   Ú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»  rM   rN   rd   r    )
r5   r	  r%  rõ  rí  r+   rc   rÇ   Ú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   rd   rN   rM   rñ  rÞ  rò  )r5   r	  r%  rõ  rí  r+   rï  rî  rc   rÇ   Z
is_operandr8   r   rj  )r)   r‘   rd   rî  r   r   r   Útest_instruction_operandsÙ  s   
z&TestValueRef.test_instruction_operandsc                 C   s¦   t jd }|dkrdndg}|  t¡}|jD ]:}t|jƒ}|jdkr)|  ||¡ q|jdkrP|  |g ¡ t|j	ƒ}|  t|d jƒdg¡ |  t|d jƒg ¡ qd S )	Nr   é   s   memory(read)s   readonlyZa_readonly_funcZa_arg0_return_funcs   returnedrM   )
r#   ré   r5   Úasm_attributesr$  r%  Ú
attributesr8   r+   ró  )r)   ÚverZreadonly_attrsr4   r‘   Úattrsr   r   r   r   Útest_function_attributesæ  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 )Nr6   r  r   rM   r¶   )r5   r+   r7   Z
value_kindr#   Z	ValueKindZglobal_variabler	  Úfunctionr%  rõ  Zbasic_blockrí  Zinstructionrî  Zconstant_intÚasm_inlineasmZ
inline_asm)r)   r4   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 ]-}|  |j¡ |jD ]!}|  |j¡ |jD ]}|  |j¡ |jD ]	}|jr<|d7 }q3q(qq|  	|d¡ d S )Nr6   r   rM   )
r5   rÇ   r7   Úis_constantr$  rõ  rY  rí  rî  r+   )r)   r4   Zconstant_operandsr‘   r’   r  Úopr   r   r   Útest_is_constant  s"   



€þþþzTestValueRef.test_is_constantc           	      C   sT  |   ¡ }| d¡}tt|jƒd jƒ}|  |d jd¡ t|d jƒ}|  |d j	¡ |  
|d j	¡ |  |d  ¡ d¡ |  t¡ |d  ¡  W d   ƒ n1 sSw   Y  |   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   rM   rd   rN   r¼  T)Z
signed_intrL  Frf  Úlittle)Úsigned)r5   r	  r%  rõ  rí  r+   rï  rî  rÇ   r  rY  Úget_constant_valuer®   rÔ  Úasm_sum3ÚintÚ
from_bytesÚto_bytes)	r)   r4   r‘   rú  rî  Zposint64Znegint64Zas_u64Zas_i64r   r   r   Útest_constant_int  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 d   ƒ n1 sw   Y  |  |d jdd	d¡ d S )
Nr¶   r   rN   rŽ   g        rM   g…ëQ¸	@T)Zround_fp)r5   rð   r	  r%  rõ  rí  r+   rc   rï  rî  rÇ   r  ZassertAlmostEqualr  Úasm_double_inaccurater®   rÔ  )r)   r4   r‘   rú  rî  r  r   r   r   Útest_constant_fp2  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ptr null)r5   Úasm_null_constantr	  r%  rõ  rí  rî  rÇ   r  r+   r  )r)   r4   r‘   r  Úargr   r   r   Útest_constant_as_stringF  s   

z$TestValueRef.test_constant_as_stringc                 C   s   |   t¡}| d¡}t|jƒ}t|d jƒ}|  |d j¡ |  |d j	d¡ t|d j
ƒ}|  t|ƒd¡ |  |d j¡ |  |d j¡ |  |d |d ¡ |  |d |d ¡ |  |d j	d¡ |  t¡ |d j
 W d   ƒ d S 1 syw   Y  d S )Nr¶   éÿÿÿÿr   ÚphirN   rM   )r5   Úasm_phi_blocksr	  r%  rõ  rí  rÇ   rù  r+   rï  Úincoming_blocksrc   r÷  r  r®   rÔ  )r)   r4   r‘   rõ  rí  r  r   r   r   Útest_incoming_phi_blocksN  s    


"ÿz%TestValueRef.test_incoming_phi_blocksN)r@   rA   rB   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Ç  2  s8    		rÇ  c                   @   ód   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 )ÚTestTypeRefc                 C   s„   |   ¡ }| d¡}|  t|jƒd¡ | d¡}|  t|ƒd¡ t|jƒ}|  t|ƒd¡ |  t|d ƒd¡ |  t|d ƒd	¡ d S )
Nr6   rÞ  r  z+%struct.glob_type = type { i64, [2 x i64] }rN   r   Zi64rM   z	[2 x i64])	r5   r7   r+   r   rk  r  r%  Úelementsrc   )r)   r4   r6   Úglob_struct_typer  r   r   r   rù   f  s   


ÿ
zTestTypeRef.test_strc                 C   s0  |   ¡ }| d¡}|  |jjtjj¡ |  |jj	¡ | d¡}|  |jjtjj¡ |  |jj	¡ |j
}|  |jtjj¡ |  |j¡ |j\}}|  |jtjj¡ |  |jtjj¡ |  |j¡ | d¡}|j\}}	|  |	jtjj¡ |  |	j¡ | d¡j}
|  |
jtjj¡ | d¡j
}|  |jtjj¡ d S )Nr6   r  ústruct.glob_type_vecr  )r5   r7   r+   rj  Ú	type_kindr#   ÚTypeKindÚpointerrÇ   râ  rk  ÚstructZ	is_structr  ÚintegerÚarrayZis_arrayr  ÚvectorZ	is_vectorr	  r  )r)   r4   r6   r  ÚstypeZstype_aZstype_bÚglob_vec_struct_typerl   Úvector_typeZfuncptrZfunctyper   r   r   Útest_type_kinds  s,   




zTestTypeRef.test_type_kindc                 C   s`   |   ¡ }| d¡}|j\}}|  |jd¡ |  t¡ |j W d   ƒ d S 1 s)w   Y  d S )Nr  rN   )r5   r  r  r+   Zelement_countr®   rÔ  )r)   r4   r  rl   Ú
array_typer   r   r   Útest_element_count  s   

"ÿzTestTypeRef.test_element_countc                 C   sl   |   ¡ }| d¡}| d¡}|j\}}|j\}}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ d S )Nr  r   é@   é€   r   )r5   r  r  r+   Z
type_width)r)   r4   r  r)  Zinteger_typer,  rl   r*  r   r   r   Útest_type_width˜  s   



zTestTypeRef.test_type_widthc                 C   s¢   |   t¡}| d¡}|j}|  |j¡ |   t¡}| d¡}|j}|  |j¡ |  |jj	¡ |  
t¡}|jj W d   ƒ n1 sAw   Y  |  dt|jƒ¡ d S )NÚvarargr  zType ptr is not a function)r5   Úasm_vararg_declarer	  rk  rÇ   Zis_function_varargrä  rY  rj  râ  r®   rÔ  r±   r   r°   )r)   r4   r‘   ÚdecltyperÕ  r   r   r   Útest_vararg_function¥  s   




ÿz TestTypeRef.test_vararg_functionc                 C   sª   |   ¡ }t|jƒ\}|  |jjtjj¡ |  	|jj
¡ |j}|  |jtjj¡ |  |j
¡ | tj¡}|  |tj¡ |  |jt d¡t d¡f¡ |  |jt d¡¡ d S ©Nrµ   )r5   r%  r$  r+   rj  r!  r#   r"  r#  rY  rì  rk  r  rÇ   Úas_irr   Úglobal_contextrÆ   rˆ   r   r·   Úreturn_type)r)   r4   r»   r   Ztyirr   r   r   Útest_function_typeref_as_ir·  s   z'TestTypeRef.test_function_typeref_as_irc                 C   s`   t  t  ¡ d¡}t  ¡ }t  ||d¡}|  t|ƒ¡}| d¡}|j}|  	|j
| t j¡j
¡ d S )Nr   r¶   )r   rˆ   ZVoidTyper‰   rŠ   r5   r   r	  rk  r+   r8  r6  r7  )r)   r   Úirmodr»   r4   Úgvtyr   r   r   Útest_void_typeref_as_irÈ  s   
ÿz#TestTypeRef.test_void_typeref_as_irc              
      sš  ddl m} t ¡ ‰ ddh}i }dd„ }||d< dd	„ }||d
< dd„ }||d< dd„ }||d< ‡ fdd„}||d< dd„ }	|	|d< dd„ }
|
|d< dd„ }||d< |  dd„ | ¡ D ƒt| ¡ ƒt|ƒB ¡ | ¡ D ]_\}}|j|v ruqk||j ƒ D ]N}|  	|›d|› ¡: tj
ˆ d }tj||d!d" t|ƒ}t |¡}| d!¡}|j}| t ¡ ¡}|  ||¡ |  ||¡ W d   ƒ n1 sÄw   Y  q{qkd S )#Nr   )Ú_TypeKindToIRTyper  Zvoidc                   s   ó    t  ¡ V  d S r"   )r   ZHalfTyper   r   r   r   Ú
maker_halfÞ  ó   €z9TestTypeRef.test_global_typeref_as_ir.<locals>.maker_halfZhalfc                   s   r>  r"   )r   r‡   r   r   r   r   Úmaker_floatã  r@  z:TestTypeRef.test_global_typeref_as_ir.<locals>.maker_floatÚfloatc                   s   r>  r"   )r   r†   r   r   r   r   Úmaker_doubleè  r@  z;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_doubleÚdoublec                   s   s    t  d¡V  d S r5  )r   r·   r   r   r   r   Úmaker_integerí  s   €z<TestTypeRef.test_global_typeref_as_ir.<locals>.maker_integerr%  c                  3   sL    t  t  d¡¡V  ˆ  d¡ ¡ V  ˆ  d¡} |  t  d¡¡ |  ¡ V  d S )Nrf  ZmyclassÚmyclass2)r   ZPointerTyper·   Zget_identified_typeZ
as_pointerÚset_body)rF  ©Úctxr   r   Úmaker_pointerò  s   €
z<TestTypeRef.test_global_typeref_as_ir.<locals>.maker_pointerr#  c                   s   s    t  t  d¡d¡V  d S )Nrf  é{   )r   Ú	ArrayTyper·   r   r   r   r   Úmaker_arrayý  s   €z:TestTypeRef.test_global_typeref_as_ir.<locals>.maker_arrayr&  c                   s   s    t  t  ¡ d¡V  d S )NrN   )r   Z
VectorTyper‡   r   r   r   r   Úmaker_vector  s   €z;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_vectorr'  c                   s   s>    t  t  ¡ t  d¡g¡V  t jt  ¡ t  d¡gddV  d S )Nr.  T©Úpacked)r   ÚLiteralStructTyper‡   r·   r   r   r   r   Úmaker_struct  s
   €ÿz;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_structr$  c                 S   s   h | ]}|j ’qS r   r…   )r  Úxr   r   r   Ú	<setcomp>  r  z8TestTypeRef.test_global_typeref_as_ir.<locals>.<setcomp>z -> r@  r  r…   )Zllvmlite.binding.typerefr=  r   ÚContextr+   Úkeysr^   rÑ   r8   ZsubTestr‰   ÚGlobalVariabler   r#   r1   r7   rk  r6  rÆ   )r)   r=  ZskippedZmakersr?  rA  rC  rE  rJ  rM  rN  rR  r!  ZirtypeÚtyr:  r2   r4   r  r;  rò   r   rH  r   Útest_global_typeref_as_irÓ  sV   þ	ÿ


÷€ÿýz%TestTypeRef.test_global_typeref_as_irc                 C   s  t  |¡}| |¡}|j}t ¡ }|j|d}tj|d}tj|||j	d}	tj||dd}
t 
|
 ¡ ¡}| |	|
j¡ | ¡  t  t|ƒ¡}| j| |	j	¡jdd |j|dd | jtt|jƒƒtt|jƒƒd	 d
d | j| |	j	¡jdd | j| |	j	¡j| |
j	¡jdd d S )N)Zir_ctxr@  r…   Úwrapperzdeclfn must not have a body)r«  Tr6  rM   z$the only new function is the wrapperzdeclfn must have a body nowz.declfn and wrapfn must have the same llvm Type)r#   r1   r	  rk  r   rU  r6  r‰   rŠ   r8   rŒ   r‹   Úcallr   Zret_voidr   rÇ   rå  r2  r+   rc   r%  r$  rY  )r)   r2   Ztarget_symbolr4   ZcppfnZ	cppfntypeZ
my_contextrX  Zwrapper_modZdeclfnZwrapfnr“   Únew_modr   r   r   Ú!_check_typeref_as_ir_for_wrappers"  s6   

ÿþÿ
þz-TestTypeRef._check_typeref_as_ir_for_wrappersc                 C   ó   |   td¡ dS )ztExercise extracting C++ defined class types.
        Contains both opaque and non-opaque class definitions.
        Z_Z3fooP7MyClass14MyClassDefinedN)r]  Úasm_cpp_classr(   r   r   r   Ú,test_typeref_as_ir_for_wrappers_of_cpp_classE  s   þz8TestTypeRef.test_typeref_as_ir_for_wrappers_of_cpp_classc                 C   r^  )z¨Exercise extracting C++ struct types that are passed as vectors.

        IA64 ABI on x86_64 will put struct with two floats as
        a vector of two floats.
        Z_Z3foo8Vector2DPS_N)r]  Úasm_cpp_vectorr(   r   r   r   Ú4test_typeref_as_ir_for_wrappers_of_cpp_vector_structN  s   þz@TestTypeRef.test_typeref_as_ir_for_wrappers_of_cpp_vector_structN)r@   rA   rB   rù   r+  r-  r0  r4  r9  r<  rY  r]  r`  rb  r   r   r   r   r  d  s    O#	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 )Ú
TestTargetc                 C   sv   t jj}|  t¡}|dƒ W d   ƒ n1 sw   Y  |  dt|jƒ¡ t  ¡ }||ƒ}|  	|j
|¡ | ¡  d S )NrÉ  z(No available targets are compatible with)r#   r;   r}   r®   r~   r±   r   r°   r0   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š   rM   rÎ   )r#   r;   r}   r0   r=   rÙ   )r)   r>   rÚ   r   r   r   Útest_create_target_machineg  s   z%TestTarget.test_create_target_machinec                 C   ó<   t j t  ¡ ¡}t j ¡ }|  |jt¡ |  |j|j¡ d S r"   )	r#   r;   r}   r0   r<   rÆ   r8   r   r+   ©r)   ÚtÚur   r   r   r  o  ó   
zTestTarget.test_namec                 C   rf  r"   )	r#   r;   r}   r0   r<   rÆ   Údescriptionr   r+   rg  r   r   r   Útest_descriptionu  rj  zTestTarget.test_descriptionc                 C   s8   t j t  ¡ ¡}t|ƒ}|  |j|¡ |  |j|¡ d S r"   )r#   r;   r}   r0   r   r±   r8   rk  )r)   r>   r³   r   r   r   rù   {  s   zTestTarget.test_strc                 C   s4  dt jjdddddddfd	t jjdddddddfd
t jjdddddddfdt jjdddddddfdt jjdddddddfdt jjdddddddfdt jjdddddddfdt jjdddddddfdt jjd dd!d"dd#dfd$t jjd%ddd&dd'dfg
}|D ]}|\}}t  |¡}|  ||¡ q†d S )(Nzx86_64-scei-ps4Úx86_64rš   ZsceiZps4ÚunknownÚELF)ZArchZSubArchZVendorZOSZEnvZObjectFormatzx86_64-sie-ps4zpowerpc-dunno-notsureZpowerpczpowerpcspe-unknown-freebsdZspeZfreebsdzarmv6hl-none-linux-gnueabiÚarmZv6hlrE   Zgnueabizi686-unknown-linux-gnuÚi386Zgnuzi686-apple-macosxÚappleÚmacosxZMachOzi686-dunno-win32ÚwindowsZmsvcÚCOFFzs390x-ibm-zosÚs390xZibmZzosZGOFFzwasm64-wasiZwasm64ZwasiZWasm)r#   ÚtargetsÚTripleZget_triple_partsr+   )r)   ÚcasesÚcaseZ
triple_strZ
triple_objrO  r   r   r   Útest_get_parts_from_triple  s„   
þÿ
þÿ
þÿ
þÿ
þÿ
þÿ
þÿ
þÿ
þÿ
þÿÛ+
üz%TestTarget.test_get_parts_from_tripleN)	r@   rA   rB   rd  re  r  rl  rù   r{  r   r   r   r   rc  Z  s    rc  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  r6   r+   ri  rj  ©r)   rc  r6   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  r6   r+   ri  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 w   Y  |j}|  | |d¡d¡ |  | |d¡d¡ d S )Nr  r   rM   rf  )rb  r6   r®   rÔ  Zget_element_offsetrj  rk  r+   )r)   rc  r6   Zstruct_typer   r   r   Útest_get_struct_element_offsetÈ  s   
ÿz-TestTargetData.test_get_struct_element_offsetN)r@   rA   rB   rb  r~  r  r€  r   r   r   r   r|  µ  s
    	r|  c                   @   ó   e Zd Zdd„ ZdS )ÚTestTargetMachinec                 C   sN   | j dd}|j}|  ¡ }| d¡}tjdk rdnd}|  | |j¡|¡ d S )NFr9   r6   re  r  rf  )	r?   rb  r5   r7   rw   rh  r+   ri  rj  )r)   Útmrc  r4   rl  rm  r   r   r   Útest_target_data_from_tmÖ  s   
z*TestTargetMachine.test_target_data_from_tmN)r@   rA   rB   r„  r   r   r   r   r‚  Ô  ó    r‚  c                   @   s0   e Zd Zdd„ Ze e ¡ dv d¡dd„ ƒZdS )Ú	TestDylibc                 C   s:   |   t¡ t d¡ W d   ƒ d S 1 sw   Y  d S )Nzzzzasdkf;jasd;l)r®   r~   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 )Nrq   )r   r#   r‡  )r)   rQ   r   r   r   Ú	test_libmæ  s   zTestDylib.test_libmN)	r@   rA   rB   rˆ  ru   rv   rf   Ú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   rd   r    )r)   rq   rº   r»   r¼   rS  Ú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±   ÚassertNotIn)r)   r4   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  Tr  FZdigraphzCFG for 'sum' functionz%.3 = add i32 %.1, %.2)r5   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@   rA   rB   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‰   r   r#   r1   )r)   r4   r2   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 s'w   Y  |   ¡ "}tjt d¡gdd}t ||d¡}t |dg¡|_W d   ƒ n1 sUw   Y  |   ¡ (}tjjt d¡dƒt d¡dƒgdd}t ||jd¡}||_W d   ƒ d S 1 s‰w   Y  d S )Nrµ   r¶   rM   TrO  rN   )	rš  r   rQ  r·   rW  r¸   ZinitializerZliteral_structrj  )r)   r4   Útypr  Úconstr   r   r   Útest_literal_struct	  s*   
ü
ÿû
ÿþ"ûz#TestTypeParsing.test_literal_structN)r@   rA   rB   r   rš  r  r   r   r   r   r™  	  s    
	r™  c                   @   s(   e Zd Ze e ¡ dkd¡dd„ ƒZdS )ÚTestGlobalConstructorsÚDarwinz&__cxa_atexit is broken on OSX in MCJITc                 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ç   )r5   Úasm_global_ctorsr:   rE  Zrun_static_constructorsZget_global_value_addressrû   ÚPOINTERr   Úcastr+   Úcontentsr  rF  r   Zrun_static_destructors)r)   r4   rG  Zptr_addrZptr_trá  Zfoo_addrr¶   r   r   r   r¨  8	  s   



z.TestGlobalConstructors.test_global_ctors_dtorsN)r@   rA   rB   ru   rö   rf   r‹  r¨  r   r   r   r   rž  7	  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·   rW  rÍ  r   r±   r’  r5   )r)   rÍ  Ú	has_undefr4   r›  r  r2   r   r   r   Úcheck_global_variable_linkageT	  s   
z1TestGlobalVariables.check_global_variable_linkagec                 C   ó   |   d¡ d S )NrË  ©r¦  r(   r   r   r   Útest_internal_linkageh	  r­   z)TestGlobalVariables.test_internal_linkagec                 C   r§  )NÚcommonr¨  r(   r   r   r   Útest_common_linkagek	  r­   z'TestGlobalVariables.test_common_linkagec                 C   ó   | j ddd d S )NrÌ  F©r¥  r¨  r(   r   r   r   Útest_external_linkagen	  rv  z)TestGlobalVariables.test_external_linkagec                 C   r§  )NZavailable_externallyr¨  r(   r   r   r   Ú!test_available_externally_linkageq	  r­   z5TestGlobalVariables.test_available_externally_linkagec                 C   r§  )NÚprivater¨  r(   r   r   r   Útest_private_linkaget	  r­   z(TestGlobalVariables.test_private_linkagec                 C   r§  )NZlinkoncer¨  r(   r   r   r   Útest_linkonce_linkagew	  r­   z)TestGlobalVariables.test_linkonce_linkagec                 C   r§  )NZweakr¨  r(   r   r   r   Útest_weak_linkagez	  r­   z%TestGlobalVariables.test_weak_linkagec                 C   r§  )NZ	appendingr¨  r(   r   r   r   Útest_appending_linkage}	  r­   z*TestGlobalVariables.test_appending_linkagec                 C   r¬  )NZextern_weakFr­  r¨  r(   r   r   r   Útest_extern_weak_linkage€	  rv  z,TestGlobalVariables.test_extern_weak_linkagec                 C   r§  )NZlinkonce_odrr¨  r(   r   r   r   Útest_linkonce_odr_linkageƒ	  r­   z-TestGlobalVariables.test_linkonce_odr_linkagec                 C   r§  )NZweak_odrr¨  r(   r   r   r   Útest_weak_odr_linkage†	  r­   z)TestGlobalVariables.test_weak_odr_linkageN)T)r@   rA   rB   r¦  r©  r«  r®  r¯  r±  r²  r³  r´  rµ  r¶  r·  r   r   r   r   r¤  S	  s    
r¤  Úx86zonly on x86c                   @   r  )ÚTestInlineAsmc                 C   s:   t  ¡  | jtd}| jdd}| |¡}|  d|¡ d S )N)r2   Fr9   Znop)r#   Zinitialize_native_asmparserr5   r  r?   r¡   r±   )r)   rq   rƒ  r2   r   r   r   Útest_inlineasmŒ	  s
   
zTestInlineAsm.test_inlineasmN)r@   rA   rB   rº  r   r   r   r   r¹  Š	  r…  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?t| 	¡ ƒdkr?| 
¡ d ur?|| 
¡ k r?d}| 
¡ } nq|  |¡ d S )NFr9   r  r   T)r?   r5   r„  r#   ÚObjectFileRefÚ	from_dataÚsectionsÚis_textrc   ÚdataÚaddressrÇ   )r)   r?   r4   rÃ  ÚobjZhas_text_and_dataZ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 )NFr9   Ú	sum_twicerN   r»  rƒ  )r?   r5   r„  r#   r¼  r½  rˆ  Úmod_asmrÁ  r   r   rF  r+   )r)   r?   r4   rÃ  rÂ  r:   rÄ  r   r   r   r½  ·	  s   
ÿ

ÿz#TestObjectFile.test_add_object_filec           	   	   C   sÄ   | j dd}|  ¡ }| |¡}tƒ \}}z1zt |d¡}| |¡ | ¡  W | ¡  n| ¡  w t	 
|  | j¡|¡}| |¡ W t |¡ nt |¡ w ttttƒ| d¡ƒ}|  |ddƒd¡ d S )NFr9   r¾  rÄ  rN   r»  rƒ  )r?   r5   r„  r   rT   r¿  rÀ  Úflushrú   r#   rˆ  rÅ  rÁ  rÂ  r   r   rF  r+   )	r)   r?   r4   rÃ  rÄ  rÅ  r-  r:   rÄ  r   r   r   rÆ  Ç	  s&   



ÿ
ÿz3TestObjectFile.test_add_object_file_from_filesystemc                 C   sX   t  t¡}tj |¡}| ¡ D ]}| ¡ r)|  t	| 
¡ ƒd¡ |  | 
¡  ¡ t¡ qd S )Né   )rx  ÚfromhexÚissue_632_elfr#   r¼  r½  r¾  r¿  r+   rc   rÀ  ÚhexÚissue_632_text)r)   ÚelfrÂ  r³   r   r   r   Útest_get_section_contentá	  s   
€ýz'TestObjectFile.test_get_section_contentN)r@   rA   rB   rÅ  rÃ  r½  rÆ  rÍ  r   r   r   r   r»  ”	  s    r»  c                   @   r  )ÚTestLLVMLockCallbacksc                    s    g ‰ ‡ fdd„}‡ fdd„}t j ||¡ |  ˆ ¡ t  ¡  |  dˆ ¡ |  dˆ ¡ t j ||¡ |  t¡ t j ||¡ W d   ƒ d S 1 sIw   Y  d S )Nc                      ó   ˆ   d¡ d S )NÚacqrp  r   ©Úeventsr   r   rÐ  ð	  r­   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.acqc                      rÏ  )NÚrelrp  r   rÑ  r   r   rÓ  ó	  r­   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.relrÐ  rÓ  )	r#   r
   Zregister_lock_callbackrY  Úcreate_new_module_pass_managerr±   Zunregister_lock_callbackr®   rÔ  )r)   rÐ  rÓ  r   rÑ  r   Útest_lock_callbacksí	  s   
"ÿz)TestLLVMLockCallbacks.test_lock_callbacksN)r@   rA   rB   rÕ  r   r   r   r   rÎ  ì	  s    rÎ  c                   @   r  )ÚTestPipelineTuningOptionsc                 C   ó   t  ¡ S r"   )r#   Úcreate_pipeline_tuning_optionsr(   r   r   r   Úpto
  ó   zTestPipelineTuningOptions.ptoc                 C   ó   |   ¡ }| ¡  d S r"   )rÙ  rú   ©r)   rÙ  r   r   r   rþ   
  ó   z$TestPipelineTuningOptions.test_closec                 C   ó<   |   ¡ }|  |jt¡ tdƒD ]}||_|  |j|¡ qd S rè  )rÙ  rÆ   Úspeed_levelr  rê   r+   ©r)   rÙ  r°  r   r   r   Útest_speed_level
  ó   þz*TestPipelineTuningOptions.test_speed_levelc                 C   rÞ  ©Nr»  )rÙ  rÆ   Ú
size_levelr  rê   r+   rà  r   r   r   Útest_size_level
  râ  z)TestPipelineTuningOptions.test_size_levelc                 C   s*   |   ¡ }|  |jt¡ dD ]}||_qd S )N)é   éP   i^  )rÙ  rÆ   Úinlining_thresholdr  rà  r   r   r   Útest_inlining_threshold 
  s
   ÿz1TestPipelineTuningOptions.test_inlining_thresholdc                 C   ó8   |   ¡ }|  |jt¡ dD ]}||_|  |j|¡ qd S ©N)TF)rÙ  rÆ   Úloop_interleavingrÒ   r+   ©r)   rÙ  r•   r   r   r   Útest_loop_interleaving&
  ó   þz0TestPipelineTuningOptions.test_loop_interleavingc                 C   rê  rë  )rÙ  rÆ   Úloop_vectorizationrÒ   r+   rí  r   r   r   Útest_loop_vectorization-
  rï  z1TestPipelineTuningOptions.test_loop_vectorizationc                 C   rê  rë  )rÙ  rÆ   Úslp_vectorizationrÒ   r+   rí  r   r   r   Útest_slp_vectorization4
  rï  z0TestPipelineTuningOptions.test_slp_vectorizationc                 C   rê  rë  )rÙ  rÆ   Úloop_unrollingrÒ   r+   rí  r   r   r   Útest_loop_unrolling;
  rï  z-TestPipelineTuningOptions.test_loop_unrollingc                 C   sn   |   ¡ }|  t¡ d|_W d   ƒ n1 sw   Y  |  t¡ d|_W d   ƒ d S 1 s0w   Y  d S )Nr  r  )rÙ  r®   rÔ  rß  rÜ  r   r   r   Útest_speed_level_constraintsB
  s   ÿ"ÿz6TestPipelineTuningOptions.test_speed_level_constraintsc                 C   s¤   |   ¡ }|  t¡ d|_W d   ƒ n1 sw   Y  |  t¡ d|_W d   ƒ n1 s/w   Y  |  t¡ d|_d|_W d   ƒ d S 1 sKw   Y  d S )Nr»  r  rN   )rÙ  r®   rÔ  rä  rß  rÜ  r   r   r   Útest_size_level_constraintsI
  s   ÿÿ"þz5TestPipelineTuningOptions.test_size_level_constraintsN)r@   rA   rB   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d„ZdS )ÚNewPassManagerMixinr   c                 C   s(   | j dd}t ||¡}t ||¡}|S )NFr9   )r?   r#   rØ  Úcreate_pass_builder)r)   rß  rä  rƒ  rÙ  Úpbr   r   r   rú  V
  s   zNewPassManagerMixin.pbN)r   r   )r@   rA   rB   rú  r   r   r   r   rø  T
  s    rø  c                   @   óL   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S )ÚTestPassBuilderc                 C   rÛ  r"   )rú  rú   )r)   rú  r   r   r   rþ   _
  rÝ  zTestPassBuilder.test_closec                 C   sN   | j dd}t dd¡}d|_d|_d|_d|_d|_t ||¡}| 	¡  d S )NFr9   r»  r   rN   T)
r?   r#   rØ  rè  rì  rð  rò  rô  rù  rú   )r)   rƒ  rÙ  rú  r   r   r   Útest_ptoc
  s   zTestPassBuilder.test_ptoc                 C   s,   |   ¡ }| ¡ }| |  ¡ |¡ | ¡  d S r"   )rú  ÚgetModulePassManagerÚrunr5   rú   )r)   rú  Úmpmr   r   r   Útest_get_module_pass_managern
  s   z,TestPassBuilder.test_get_module_pass_managerc                 C   s2   |   ¡ }| ¡ }| |  ¡  d¡|¡ | ¡  d S r¡  )rú  ÚgetFunctionPassManagerrÿ  r5   r	  rú   )r)   rú  Úfpmr   r   r   Útest_get_function_pass_managert
  s   z.TestPassBuilder.test_get_function_pass_managerc                    s\   ‡ fdd„}|dƒ}|dƒ}ˆ   |t¡ ˆ   |t¡ ˆ  | d¡d¡ ˆ  | d¡d¡ dS )z:Test pass timing reports for O3 and O0 optimization levelsc                    sF   ˆ   ¡ }ˆ j| dd}| ¡  | ¡ }| ||¡ | ¡ }| ¡  |S ©Nr   ©rß  rä  )r5   rú  Ústart_pass_timingrþ  rÿ  Úfinish_pass_timingrú   )rß  r4   rú  r   Úreportr(   r   r   Úrun_with_timing|
  s   z9TestPassBuilder.test_time_passes.<locals>.run_with_timingr»  r   zPass execution timing reportrM   N)rÆ   r   r+   Úcount)r)   r
  Z	report_O3Z	report_O0r   r(   r   Útest_time_passesz
  s   
z TestPassBuilder.test_time_passesc                 C   sJ   |   ¡ }|  ¡ }| ¡ }| ||¡ | ¡  | ¡ }| ¡  |  |¡ d S r"   )r5   rú  rþ  rÿ  r  r  rú   rY  )r)   r4   rú  r   r	  r   r   r   Útest_empty_reportŽ
  s   z!TestPassBuilder.test_empty_reportc                 C   st   |   ¡ }|  ¡ }| ¡  | ¡ }| ||¡ | ¡  |  td¡ | ¡  W d   ƒ n1 s/w   Y  | ¡  d S )Nzonly be done once)	r5   rú  r  rþ  rÿ  r  rä   r~   rú   ©r)   r4   rú  r   r   r   r   Útest_multiple_timers_error˜
  s   
ÿz*TestPassBuilder.test_multiple_timers_errorc                 C   sd   |   ¡ }|  ¡ }| ¡ }| ||¡ |  td¡ | ¡  W d   ƒ n1 s'w   Y  | ¡  d S )Nznot enabled)r5   rú  rþ  rÿ  rä   r~   r  rú   r  r   r   r   Útest_empty_report_error£
  s   
ÿz'TestPassBuilder.test_empty_report_errorN)r@   rA   rB   rþ   rý  r  r  r  r  r  r  r   r   r   r   rü  ]
  s    
rü  c                   @   rû  )ÚTestNewModulePassManagerc                 C   r×  r"   )r#   rÔ  r(   r   r   r   Úpm®
  rÚ  zTestNewModulePassManager.pmc                 C   sB   |   ¡ }t|ƒ}| j|dd}| ¡ }| ||¡ t|ƒ}||fS r  )r5   r   rú  rþ  rÿ  )r)   Úlevelr4   Úorig_asmrú  r   Úoptimized_asmr   r   r   Úrun_o_n±
  s   z TestNewModulePassManager.run_o_nc                 C   rÛ  r"   ©r  rú   ©r)   r   r   r   r   rþ   º
  rÝ  z#TestNewModulePassManager.test_closec                 C   ó*   |   d¡\}}|  d|¡ |  d|¡ d S ©Nr»  ú%.4©r  r±   r’  ©r)   r  r  r   r   r   Útest_run_o3¾
  ó   z$TestNewModulePassManager.test_run_o3c                 C   ó*   |   d¡\}}|  d|¡ |  d|¡ d S ©Nr   r  ©r  r±   r  r   r   r   Útest_run_o0Ã
  r  z$TestNewModulePassManager.test_run_o0c                 C   sZ   |   ¡ }|  ¡ }| ¡  |  t¡}t|ƒ}| ||¡ t|ƒ}|  d|¡ |  d|¡ d S )Nú%.3)	rú  r  Úadd_instruction_combine_passr5   Úasm_sum4r   rÿ  r±   r’  )r)   rú  r   r4   r  r  r   r   r   Útest_instcombineÈ
  s   
z)TestNewModulePassManager.test_instcombinec                 C   s¦   | j ddd}tt dd¡ƒ}t |¡}| ¡ }| ||¡ t|ƒ}|  d|¡ |  	d|¡ ttƒ}| ¡ }t |¡}| ||¡ t|ƒ}|  d|¡ |  d|¡ d S )Nr»  r   r  úoptnone rš   Úalloca)
rú  r   Úasm_alloca_optnoneÚreplacer#   r1   rþ  rÿ  r±   r’  )r)   rú  r  r4   r   r  Úorig_asm_optnoneÚoptimized_asm_optnoner   r   r   Útest_optnoneÓ
  s   

z%TestNewModulePassManager.test_optnonec                 C   sô  |   ¡ }| ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | 	¡  | 
¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  |  ¡  | ¡  | !¡  | "¡  | #¡  | $¡  | %¡  | &¡  | '¡  | (¡  | )¡  | *¡  | +¡  | ,¡  | -¡  | .¡  | /¡  | 0¡  | 1¡  | 2¡  | 3¡  | 4¡  | 5¡  | 6¡  | 7¡  | 8¡  | 9¡  | :¡  | ;¡  | <¡  d S r"   )=r  Zadd_argument_promotion_passZ'add_post_order_function_attributes_passZadd_verifierZadd_constant_merge_passZadd_dead_arg_elimination_passZadd_dot_call_graph_printer_passZadd_always_inliner_passZadd_rpo_function_attrs_passZ#add_global_dead_code_eliminate_passZadd_global_opt_passZadd_ipsccp_passZadd_internalize_passZadd_loop_extract_passZadd_merge_functions_passZadd_partial_inliner_passZadd_strip_symbols_passZadd_strip_dead_debug_info_passZadd_strip_dead_prototype_passZadd_strip_debug_declare_passZ add_strip_non_debug_symbols_passÚadd_aa_eval_passÚadd_simplify_cfg_passÚadd_loop_unroll_passr%  Úadd_jump_threading_passÚadd_cfg_printer_passÚadd_cfg_only_printer_passÚadd_dom_printer_passÚadd_dom_only_printer_passÚadd_post_dom_printer_passÚadd_post_dom_only_printer_passÚadd_dom_viewer_passÚadd_post_dom_viewer_passÚadd_post_dom_only_viewer_passÚadd_lint_passÚadd_aggressive_dce_passÚadd_break_critical_edges_passÚadd_dead_store_elimination_passÚadd_dead_code_elimination_passÚadd_aggressive_instcombine_passÚadd_lcssa_passÚadd_new_gvn_passÚadd_loop_simplify_passÚadd_loop_unroll_and_jam_passÚadd_sccp_passÚadd_lower_atomic_passÚadd_lower_invoke_passÚadd_lower_switch_passÚadd_mem_copy_opt_passÚ"add_unify_function_exit_nodes_passÚadd_reassociate_passÚadd_register_to_memory_passÚadd_sroa_passÚadd_sinking_passÚadd_tail_call_elimination_passÚadd_instruction_namer_passÚadd_loop_deletion_passÚadd_loop_strength_reduce_passÚadd_loop_rotate_passÚadd_refprune_passr  r   r   r   Útest_add_passesæ
  s|   z(TestNewModulePassManager.test_add_passesN)r@   rA   rB   r  r  rþ   r  r#  r'  r.  rV  r   r   r   r   r  ­
  s    	r  c                   @   sT   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S )ÚTestNewFunctionPassManagerc                 C   r×  r"   )r#   Z create_new_function_pass_managerr(   r   r   r   r  (  rÚ  zTestNewFunctionPassManager.pmc                 C   rÛ  r"   r  ©r)   r  r   r   r   rþ   +  rÝ  z%TestNewFunctionPassManager.test_closec                 C   sL   |   ¡ }| d¡}t|ƒ}| j|dd}| ¡ }| ||¡ t|ƒ}||fS )Nr  r   r  )r5   r	  r   rú  r  rÿ  )r)   r  r4   Úfunr  rú  r  r  r   r   r   r  /  s   
z"TestNewFunctionPassManager.run_o_nc                 C   r  r  r  r  r   r   r   r  9  r  z&TestNewFunctionPassManager.test_run_o3c                 C   r   r!  r"  r  r   r   r   r#  >  r  z&TestNewFunctionPassManager.test_run_o0c                 C   s²   | j ddd}tt dd¡ƒ}t |¡ d¡}| ¡ }| ||¡ t|ƒ}|  	d|¡ |  
d|¡ ttƒ}t |¡ d¡}| ¡ }| ||¡ t|ƒ}|  	d|¡ |  	d|¡ d S )Nr»  r   r  r(  rš   r¶   r)  )rú  r   r*  r+  r#   r1   r	  r  rÿ  r±   r’  )r)   rú  r  rY  r  r  r,  r-  r   r   r   r.  C  s   z'TestNewFunctionPassManager.test_optnonec                 C   s`   |   ¡ }|  ¡ }|  t¡ d¡}| ¡  t|ƒ}| ||¡ t|ƒ}|  d|¡ |  	d|¡ d S )Nr  r$  )
rú  r  r5   r&  r	  r%  r   rÿ  r±   r’  )r)   rú  r  rY  r  r  r   r   r   r'  V  s   z+TestNewFunctionPassManager.test_instcombinec                 C   s4   |   d¡}| ¡ }t t¡jD ]}| ||¡ qd S rã  )rú  r  r#   r1   Úasm_declarationr$  rÿ  )r)   rú  r  rY  r   r   r   Útest_declarationsb  s
   
ÿz,TestNewFunctionPassManager.test_declarationsc                 C   sT  |   ¡ }| ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | 	¡  | 
¡  | ¡  | ¡  | 	¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  |  ¡  | !¡  | "¡  | #¡  | $¡  | %¡  | &¡  | '¡  | (¡  d S r"   ))r  r/  r0  r1  r%  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rX  r   r   r   rV  h  sT   z*TestNewFunctionPassManager.test_add_passesN)r@   rA   rB   r  rþ   r  r  r#  r.  r'  r[  rV  r   r   r   r   rW  '  s    
rW  rF   rG   c                   @   s´   e Zd Zeg d¢ƒeg d¢ƒdœdeg d¢ƒieg d¢ƒeg d¢ƒdœd	œZeg d
¢ƒeg d¢ƒdœdeg d¢ƒieg d¢ƒeg d¢ƒdœd	œZdd„ Zedd„ ƒZe	dd„ ƒZ
dS )Ú	TestBuild)	ÚpthreadrŽ  Údlrq   Úgcc_sr¯  r“  ústdc++úld-linux-x86-64)r]  rŽ  r^  rq   r_  r¯  r“  r`  )rm  Úaarch64Úamd64)Úadvapi32Úkernel32ÚntdllÚmsvcp140Úvcruntime140Úvcruntime140_1úapi-ms-win-crt-convert-l1-1-0ú!api-ms-win-crt-environment-l1-1-0úapi-ms-win-crt-heap-l1-1-0úapi-ms-win-crt-locale-l1-1-0úapi-ms-win-crt-math-l1-1-0úapi-ms-win-crt-runtime-l1-1-0úapi-ms-win-crt-stdio-l1-1-0úapi-ms-win-crt-string-l1-1-0úapi-ms-win-crt-time-l1-1-0úapi-ms-win-crt-utility-l1-1-0Úshell32Úole32)Úllvmliter‹  rŽ  Úcorefoundationúc++)rv  r‹  rŽ  rx  )rm  Úarm64)rE   rt  Údarwin)r]  rŽ  Úzstdr^  rq   r_  r¯  ra  )r]  rŽ  r{  r^  rq   r_  r¯  zld-linux-aarch64)rŽ  r{  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  )rv  r‹  rŽ  r{  rw  rx  )rv  r‹  rŽ  r{  rx  c           	      C   sê   t  ¡  ¡ }t  ¡  ¡ }|dkr| j| | }n|dkr$| j| | }ntd|› ƒ‚t|d ƒ}dd„ |D ƒ}z	|  ||¡ W d S  t	yt } z'dt
|ƒ› dt
|ƒ› d	t ||¡› d
t ||¡› dt ||¡› d}t	|ƒ|‚d }~ww )Nr   r   zUnexpected package type: Zcanonicalised_linked_librariesc                 S   s   h | ]}|  d ¡rd n|’qS )rg  )rh   )r  rR   r   r   r   rT  0  s    ÿÿz*TestBuild.check_linkage.<locals>.<setcomp>z:Unexpected linkage encountered for libllvmlite:
Expected: z
     Got: z

Difference: z
Only in Expected: z
Only in Got: Ú
)rf   ÚmachineÚlowerr‹  Úwheel_expectedÚconda_expectedrÔ  r^   r+   rœ  r   Úsymmetric_differenceÚ
difference)	r)   ÚinfoZpackage_typer}  Úos_nameÚexpectedrò   r€   r«  r   r   r   Úcheck_linkage#  s8   þÿþ
ý
ü
û
€ùzTestBuild.check_linkagec                 C   s:   t j ¡ }|  |d d¡ |  |d d¡ |  |d¡ d S )NÚllvm_linkage_typeÚstaticÚllvm_assertions_stateÚonr   )r#   ÚconfigÚget_sysinfor+   r†  ©r)   rƒ  r   r   r   Útest_wheel_build@  s   
zTestBuild.test_wheel_buildc                 C   s^   t j ¡ }|  |d d¡ |  |d d¡ |  |d¡ t ¡  ¡ dkr-|  |d d¡ d S d S )Nr‡  rˆ  r‰  rŠ  r   rE   Zlibstdcxx_linkage_type)r#   r‹  rŒ  r+   r†  rf   r‹  r~  r  r   r   r   Útest_conda_buildG  s   
ÿzTestBuild.test_conda_buildN)r@   rA   rB   r^   r  r€  r†  Úis_wheel_packagerŽ  Úis_conda_packager  r   r   r   r   r\  •  s,    
!
	÷

ûØ
4
	÷

úÕ9
r\  Ú__main__)lrû   r´  r   r   r   Zctypes.utilr   r$   r   rT   rf   r\   rW   rw   ru   Ú
contextlibr   Útempfiler   rv  r   r	   r#   Zllvmlite.bindingr
   Zllvmlite.testsr   r}  r‡  rv   Zpackage_formatr‘  r  Z
_HAVE_LIEFZliefÚImportErrorZ
needs_liefr   rC   r8  r  r&  r1  r¢  rª  rg   r+  r¯   r  rä  r2  r  rð   r  Zasm_inlineasm2Zasm_inlineasm3Zlicm_asmr   r¦  r¹   r  r¢   r¦   r¨   rþ  r*  rZ  rÉ  rË  Zasm_tli_exp2r  r_  ra  r!   rD   ry   r«   r÷   ÚobjectrD  r€  r‡  Úskipr‰  rÇ  r  rc  r|  r‚  r†  rŒ  r™  rž  r¤  rh   r¹  r»  rÎ  rÖ  rø  rü  r  rW  rU   rx   r\  r@   Úmainr   r   r   r   Ú<module>   sò    
ÿÿÿÿÿ




D(ÿÿ-4!2I  D : A  4 w[&$7	XK	Pznÿ 
;ÿ