
     YHh                       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 d d
lmZ  e
j8                         dk(  r ej:                  d       d ZdZdZ dZ!dZ"dZ#dZ$dZ% e
jL                         dk(  re%jO                  dd      Z%dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/d Z0d!Z1d"Z2d#Z3d$Z4d%Z5g d&Z6g d'Z7g d(Z8d)Z9d*Z:d+Z;d,Z<d-Z=d.Z>d/Z?d0Z@d1ZA G d2 d3e      ZB G d4 d5eB      ZC G d6 d7eB      ZD G d8 d9eB      ZE G d: d;eB      ZF G d< d=eG      ZH G d> d?eH      ZI G d@ dAeBeI      ZJ ej                   e
j8                         j                  dB      dC       G dD dEeB             ZM G dF dGeB      ZN G dH dIeB      ZO G dJ dKeB      ZP G dL dMeB      ZQ G dN dOeB      ZR G dP dQeB      ZS G dR dSeG      ZT G dT dUeBeT      ZU G dV dWeBeT      ZV G dX dYeBeT      ZW G dZ d[eB      ZX G d\ d]eB      ZY G d^ d_eB      ZZ G d` daeJ      Z[ G db dceB      Z\ ej                   e
j8                         j                  dB      dd       G de dfeB             Z] G dg dheB      Z^ G di djeB      Z_ G dk dleB      Z` G dm dneB      Za G do dpeG      Zb G dq dreBeb      Zc G ds dteBeb      Zd G du dveBeb      Zeefdwk(  r ej                          yy)x    N)	CFUNCTYPEc_intc_int32)find_library)contextmanager)mkstemp)ir)binding)ffi)TestCase)opaque_pointers_enabledarmv7lzlibgcc_s.so.1c                     t        j                  t         j                        } 	 t        j                  t         j                  d       	 t        j                  t         j                  |        y# t         j                  $ r' Y t        j                  t         j                  |        yw xY w# t        j                  t         j                  |        w xY w)Nde_DEFT)locale	setlocaleLC_ALLError)curs    T/var/www/html/planif/env/lib/python3.12/site-packages/llvmlite/tests/test_binding.pyno_de_localer      s    


6==
)C-0 , <<  	,
 	,s#   $A/ /B)B, (B))B, ,&C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
    }}
    PyPyPy_GetVersion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	ft0, 8(sp)zfmv.w.x	ft1, a0zfcvt.d.s	ft1, ft1fadd.d	ft0, ft1, ft0fsd	ft0, 8(sp)lw	a0, 8(sp)lw	a1, 12(sp)addi	sp, sp, 16ret)r   zsw	a0, 8(sp)zsw	a1, 12(sp)r   zfcvt.d.s	ft1, fa0r   r   r   r    r!   r"   )zfcvt.d.s	ft0, fa0zfadd.d	fa0, ft0, fa1r"   zc
declare void @a_readonly_func(i8 *) readonly

declare i8* @a_arg0_return_func(i8* returned, i32*)
a*  
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* )
@  7f454c4602010100000000000000000001003e000100000000000000000000000000000000000000e0000000000000000000000040000000000040000500010048c1e2204809c24889d048c1c03d4831d048b90120000480001070480fafc8000000000000000000000000000000000000000000000000002f0000000400f1ff00000000000000000000000000000000070000001200020000000000000000001f00000000000000002e74657874005f5f617279626f002e6e6f74652e474e552d737461636b002e737472746162002e73796d746162003c737472696e673e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f0000000300000000000000000000000000000000000000a800000000000000380000000000000000000000000000000100000000000000000000000000000001000000010000000600000000000000000000000000000040000000000000001f000000000000000000000000000000100000000000000000000000000000000f00000001000000000000000000000000000000000000005f00000000000000000000000000000000000000000000000100000000000000000000000000000027000000020000000000000000000000000000000000000060000000000000004800000000000000010000000200000008000000000000001800000000000000>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                   2    e Zd Zd Zd ZedfdZddZd Zy)BaseTestc                     t        j                          t        j                          t        j                          t	        j
                          t        j                  d d  | _        g t        j                  d d  y N)llvm
initializeinitialize_native_targetinitialize_native_asmprintergccollectgarbageold_garbageselfs    r   setUpzBaseTest.setUp  sJ    %%'))+


::a=

1    c                 p    t        j                          | j                  t         j                  g        | `y r(   )r-   r.   assertEqualr/   r0   r1   s    r   tearDownzBaseTest.tearDown  s'     	

R(r4   Nc                 z    |j                  t        j                               }t        j                  ||      }|S )Ntriple)formatr)   get_default_tripleparse_assembly)r2   asmcontextmods       r   modulezBaseTest.module  s2    jj 7 7 9j:!!#w/
r4   c                 H    || j                         }|j                  |      S r(   )rA   get_global_variable)r2   namer@   s      r   globzBaseTest.glob  s#    ;++-C&&t,,r4   c                b    t         j                  j                         }|j                  |      S )Njit)r)   Targetfrom_default_triplecreate_target_machine)r2   rH   targets      r   target_machinezBaseTest.target_machine  s(    002+++44r4   )rE   N)	__name__
__module____qualname__r3   r7   asm_sumrA   rE   rM    r4   r   r&   r&     s"     !$ 
-
5r4   r&   c                       e Zd ZdZ ej
                  ej                  j                  d      d       ej
                  e	j                  j                  d      d      d               Zy)TestDependencieszB
    Test DLL dependencies are within a certain expected set.
    linuxzLinux-specific testLLVMLITE_DIST_TESTzDistribution-specific testc                    t         j                  j                  }t        j                  j                         }d|d<   t        j                  dd|gt        j                  |      }|j                         \  }}| j                  d|j                         t        j                  d      }t               }|j                         j!                         D ]x  }|j#                         }	|	s|	d   dk(  s|	d	   }
|j%                  |
      }t'        |	      d
k7  s|s| j)                  d|       |j+                  |j-                  d	             z d|vsd|vr| j)                  d|       t        g d      }t/        j0                         dk(  r|j+                  d       |D ]0  }
|
j3                  d      r|
|vs| j)                  d|
d|       2 y )NCLANGobjdumpz-p)stdoutenvr   z%^([+-_a-zA-Z0-9]+)\.so(?:\.\d+){0,3}$NEEDED      zinvalid NEEDED line: libc
libpthreadz!failed parsing dependencies? got )	librtlibdlra   libzlibmlibgcc_sr`   zld-linuxld64r   libtinfoz	ld-linux-zunexpected dependency z in )r   lib_nameosenvironcopy
subprocessPopenPIPEcommunicater6   
returncoderecompilesetdecode
splitlinessplitmatchlenfailaddgroupplatformpython_implementation
startswith)r2   lib_pathr\   pout_lib_patdepslinepartsdepmalloweds                r   
test_linuxzTestDependencies.test_linux  s   
 77==jjooFix8$.OO>QALL)**EFuJJL++- 	%DJJLEqX-AhMM#&u:?!II4AB$	% T!9IItEF ? @))+v5KK
# 	JC>>+.3g3E		c4HI	Jr4   N)rN   rO   rP   __doc__unittest
skipUnlesssysr~   r   rk   rl   getr   rR   r4   r   rT   rT     sf     X009.0X(<=57J70Jr4   rT   c                   P     e Zd ZdZdZ fdZd Zd Zd Zd Z	d Z
d	 Zd
 Z xZS )TestRISCVABIz`
    Test calling convention of floating point arguments of RISC-V
    using different ABI.
    zriscv32-unknown-linuxc                 r    t         |           t        j                          t        j                          y r(   )superr3   r)   initialize_all_targetsinitialize_all_asmprinters)r2   	__class__s    r   r3   zTestRISCVABI.setUp  s$    ##%'')r4   c                     	 t         j                  j                  | j                         y # t        $ r+}dt        |      v r| j                  d       n|Y d }~y d }~ww xY w)Nz/No available targets are compatible with triplez(RISCV target unsupported by linked LLVM.)r)   rI   from_tripler:   RuntimeErrorstrskipTest)r2   es     r   check_riscv_targetzTestRISCVABI.check_riscv_target  sQ    	KK##DKK0 	@CFJHI J	s   ), 	A !AA c                 x    t         j                  j                  | j                        } |j                  di |S )NrR   )r)   rI   r   r:   rK   )r2   kwarglltargets      r   riscv_target_machinez!TestRISCVABI.riscv_target_machine  s0    ;;**4;;7-x--666r4   c                    t        j                         }t        j                         }t        j                  |||f      }t        j                         }t        j
                  ||d      }|j                         }t        j                  |      }|j                  \  }}	|j                  ||      }
|j                  |
|	      }|j                  |       t        j                  t        |            }|j                          |S )NfpaddrD   )r	   
DoubleType	FloatTypeFunctionTypeModuleFunctionappend_basic_block	IRBuilderargsfpextfaddr"   r)   r=   r   verify)r2   f64f32fntyrA   funcblockbuilderabarg0resultllmods                r   fpadd_ll_modulezTestRISCVABI.fpadd_ll_module  s    mmollnsS#J/{{64g6''),,u%yy1}}Q$dA&F##CK0r4   c                     g }|j                         D ]M  }|j                         }|j                  d      r%|j                  d      r7|dk(  r=|j                  |       O |S )N.r    )rw   stripr   append)r2   r>   asm_listr   s_lines        r   break_up_asmzTestRISCVABI.break_up_asm  s]    NN$ 	(DZZ\F%%c*f.?.?.H|'		(
 r4   c                     | j                          | j                         }| j                  dd      }| j                  | j	                  |j                  |            t               y )N+f,+dilp32featuresabiname)r   r   r   r6   r   emit_assemblyriscv_asm_ilp32r2   r   rL   s      r   test_rv32d_ilp32zTestRISCVABI.test_rv32d_ilp32  sZ    !$$&**GW*M**6+?+?+FG(	*r4   c                     | j                          | j                         }| j                  dd      }| j                  | j	                  |j                  |            t               y )Nr   ilp32fr   )r   r   r   r6   r   r   riscv_asm_ilp32fr   s      r   test_rv32d_ilp32fzTestRISCVABI.test_rv32d_ilp32f  Z    !$$&**GX*N**6+?+?+FG)	+r4   c                     | j                          | j                         }| j                  dd      }| j                  | j	                  |j                  |            t               y )Nr   ilp32dr   )r   r   r   r6   r   r   riscv_asm_ilp32dr   s      r   test_rv32d_ilp32dzTestRISCVABI.test_rv32d_ilp32d  r   r4   )rN   rO   rP   r   r:   r3   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r     s7     %F*
7"*++r4   r   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Z ej$                   e       d      d        Zd Zy)TestMiscz7
    Test miscellaneous functions in llvm.binding.
    c                 .    | j                  t               y r(   )rA   rQ   r1   s    r   test_parse_assemblyzTestMisc.test_parse_assembly(  s    Gr4   c                     | j                  t              5 }| j                  t               d d d        t	        j
                        }| j                  d|       | j                  d|       y # 1 sw Y   CxY w)Nzparsing errorzinvalid operand type)assertRaisesr   rA   asm_parse_errorr   	exceptionassertIn)r2   cmss      r   test_parse_assembly_errorz"TestMisc.test_parse_assembly_error+  s^    |, 	)KK(	)oq),a0		) 	)s   A..A7c                    t        j                         }t        j                  t        j                  d      g       }t        j                  ||d      }t        j
                  |j                  d            }|j                  t        j                  t        j                  d      d             t        |      }| j                  |t               y )N    fooz<>!*''#r   i90  )r	   r   r   IntTyper   r   r   r"   Constantr   r6   asm_nonalphanum_blocklabel)r2   r@   ftfnbdr>   s         r   test_nonalphanum_block_namez$TestMisc.test_nonalphanum_block_name2  s    iik__RZZ^R0[[b%(\\"//Y/?@
r{{2::b>512#h89r4   c                     t         j                  j                         }t         j                  j                         }||k(  sJ y r(   )r)   r?   get_global_context)r2   	gcontext1	gcontext2s      r   test_global_contextzTestMisc.test_global_context;  s4    LL335	LL335	I%%%r4   c                     t        j                  dd       t        j                  dd       t        j                  d      }| j                  |d       t        j                  d      }| j	                  |d        y )N__xyzzy  i.  __foobar)r)   
add_symboladdress_of_symbolr6   assertIs)r2   addrs     r   test_dylib_symbolszTestMisc.test_dylib_symbols@  s\    	4(	4(%%i0t$%%j1dD!r4   c                 z    t        j                         }| j                  |t               | j	                  |       y r(   )r)   r<   assertIsInstancer   
assertTrue)r2   r:   s     r   test_get_default_triplez TestMisc.test_get_default_tripleH  s,    ((*fc*r4   c                 4   d }t        j                         }t        j                         }| j                  |t               | j                  |        ||j                  d      d         } ||j                  d      d         }| j                  ||       y )Nc                     | dk(  ry| S )Npowerpc64leppc64lerR   )archs    r   normalize_ppcz7TestMisc.test_get_process_triple.<locals>.normalize_ppcO  s    }$ r4   -r   )r)   get_process_tripler<   r   r   r   rx   r6   )r2   r  r:   defaultdefault_archtriple_archs         r   test_get_process_triplez TestMisc.test_get_process_tripleM  s    	 ((*))+fc*$W]]3%7%:;#FLL$5a$89{3r4   c                 R   t        j                         }| j                  |t               | j                  |t         j                         |j                         D ]B  \  }}| j                  |t               | j                  |       | j                  |t               D | j                  |j                         t               d}dj                  |      }| j                  t        j                  |d             | j                  t        j                  |d             | j                  t        j                  |d             t        |      dk(  r!| j                  |j                         d       y | j                  t        j                  ||j                                      y )Nz[+\-][a-zA-Z0-9\._-]+z^({0}|{0}(,{0})*)?$r   z+aaz+a,-bbr   )r)   get_host_cpu_featuresr   dict
FeatureMapitemsr   r   boolflattenr;   assertIsNotNoners   ry   rz   r6   )r2   r   kvre_termregexs         r   test_get_host_cpu_featuresz#TestMisc.test_get_host_cpu_features_  s<   --/h-h8NN$ 	+DAq!!!S)OOA!!!T*	+ 	h..0#6*&--g6RXXeR01RXXeU34RXXeX67x=AX--/4  %1A1A1C!DEr4   c                 z    t        j                         }| j                  |t               | j	                  |       y r(   )r)   get_host_cpu_namer   r   r   )r2   cpus     r   test_get_host_cpu_namezTestMisc.test_get_host_cpu_namev  s,    $$&c3'r4   c                 T    d}t        j                  t        j                  d|g       y )Na2  if 1:
            from llvmlite import binding as llvm

            llvm.initialize()
            llvm.initialize_native_target()
            llvm.initialize_native_asmprinter()
            llvm.initialize_all_targets()
            llvm.initialize_all_asmprinters()
            llvm.shutdown()
            -crn   
check_callr   
executabler2   codes     r   test_initfinizTestMisc.test_initfini{  s$    	 	s~~tT:;r4   c                 T    d}t        j                  t        j                  d|g       y )Nzif 1:
            from llvmlite import binding as llvm

            llvm.set_option("progname", "-debug-pass=Disabled")
            r   r!  r$  s     r   test_set_optionzTestMisc.test_set_option  s$    
 	s~~tT:;r4   c                     t         j                  \  }}}d}| j                  ||       | j                  |t        d             y )N)         )r)   llvm_version_infor   range)r2   majorminorpatchvalids        r   test_versionzTestMisc.test_version  s9    "44ueeU#eU1X&r4   c                 ,    t        j                          y r(   )r)   check_jit_executionr1   s    r   test_check_jit_executionz!TestMisc.test_check_jit_execution  s      "r4   zLocale not availablec                     | j                  t              }t        |      }t        j                  t        j
                  d       t        |      }| j                  ||       y )Nr   )rA   asm_double_localer   r   r   r   r6   )r2   r   expectgots       r   test_print_double_localez!TestMisc.test_print_double_locale  sI    KK)*Q 	0!f%r4   c                 ^    d}d}t         j                  |d|g}t        j                  |       y )Nzfrom llvmlite import bindingz-Werrorr   )r   r#  rn   r"  )r2   r%  flagscmdargss       r   test_no_accidental_warningsz$TestMisc.test_no_accidental_warnings  s,    ->>5$5g&r4   N)rN   rO   rP   r   r   r   r   r   r   r  r  r  r  r&  r(  r3  r6  r   skipIfr   r;  r?  rR   r4   r   r   r   #  sr    1:&
" 
4$F.
<<'# X__\^%;<	& =	&'r4   r   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestModuleRefc                     | j                         }t        |      j                         }| j                  |j	                  d      |       y )Nz; ModuleID =)rA   r   r   r   r   r2   r@   r   s      r   test_strzTestModuleRef.test_str  s4    kkmHNN^4a8r4   c                     | j                         }t        |       |j                          | j                  t        j
                        5  t        |       d d d        |j                          y # 1 sw Y   xY wr(   )rA   r   closer   ctypesArgumentErrorr2   r@   s     r   
test_closezTestModuleRef.test_close  sV    kkmC		v334 	H				 	s   A00A9c                    | j                         }t        |       |5  t        |       d d d        | j                  t        j                        5  t        |       d d d        | j                  t
              5  |5  	 d d d        d d d        y # 1 sw Y   gxY w# 1 sw Y   @xY w# 1 sw Y   *xY w# 1 sw Y   y xY wr(   )rA   r   r   rH  rI  r   rJ  s     r   	test_withzTestModuleRef.test_with  s    kkmC 	H	v334 	H	|, 	 	 			 		 	 	 	s;   BB:B4=B(?B4BB%(B1	-B44B=c                     | j                         }d|_        | j                  |j                  d       d|_        | j                  |j                  d       y )Nr   bar)rA   rD   r6   rJ  s     r   	test_namezTestModuleRef.test_name  sC    kkm5)5)r4   c                 \    | j                         }| j                  |j                  d       y )Nz	asm_sum.c)rA   r6   source_filerJ  s     r   test_source_filezTestModuleRef.test_source_file  s!    kkm+6r4   c                     | j                         }|j                  }| j                  |t               ||_        | j	                  ||j                         y r(   )rA   data_layoutr   r   r6   rD  s      r   test_data_layoutzTestModuleRef.test_data_layout  sA    kkmOOa%COO,r4   c                     | j                         }|j                  }| j                  |t        j                                d|_        | j                  |j                  d       y )Nr   )rA   r:   r6   r)   r<   rD  s      r   test_triplezTestModuleRef.test_triple  sJ    kkmJJD3356
R(r4   c                 P   | j                         }| j                  |j                         d        | j                  t              }| j	                  t
              5 }|j                          d d d        t        j                        }| j                  d|       y # 1 sw Y   1xY w)Nz%.bug = add i32 1, %.bug)	rA   r   r   asm_verification_failr   r   r   r   r   )r2   r@   r   r   s       r   test_verifyzTestModuleRef.test_verify  s{    kkmcjjlD)kk/0|, 	JJL	0!4	 	s   BB%c                 `   | j                         }|j                  d      }| j                  |t        j                         | j                  |j                  d       | j                  t              5  |j                  d       d d d        ~t        |j                          y # 1 sw Y    xY w)Nsumr   )
rA   get_functionr   r)   ValueRefr6   rD   r   	NameErrorr   r2   r@   r   s      r   test_get_functionzTestModuleRef.test_get_function  s    kkme$b$--0%(y) 	$U#	$ BII	$ 	$   3B$$B-c                 P   | j                         }|j                  d      }| j                  |j                  d       | j	                  t        j                  dt        |                   | j                  t              5  |j                  d       d d d        y # 1 sw Y   y xY w)Nstruct.glob_type8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] }zstruct.doesnt_exist)
rA   get_struct_typer6   rD   r  rs   ry   r   r   r`  )r2   r@   st_tys      r   test_get_struct_typez"TestModuleRef.test_get_struct_type  s    kkm##$67%78RXXGJ 	 y) 	7 56	7 	7 	7s   BB%c                 `   | j                         }|j                  d      }| j                  |t        j                         | j                  |j                  d       | j                  t              5  |j                  d       d d d        ~t        |j                          y # 1 sw Y    xY w)NrE   rO  )
rA   rC   r   r)   r_  r6   rD   r   r`  r   )r2   r@   gvs      r   test_get_global_variablez&TestModuleRef.test_get_global_variable  s    kkm$$V,b$--0&)y) 	+##E*	+ BII	+ 	+rc  c                     | j                         }|j                  }~t        |d       }| j                  t	        |      d       | j                  |D cg c]  }|j
                   c}g d       y c c}w )Nc                     | j                   S r(   r   )values    r   <lambda>z5TestModuleRef.test_global_variables.<locals>.<lambda>  s
    UZZ r4   )key   )rE   glob_bglob_fglob_struct)rA   global_variablessortedr6   rz   rD   )r2   r@   itglobsgs        r   test_global_variablesz#TestModuleRef.test_global_variables  sb    kkm!!r78UQ'%0Q!&&0D	F0s   A4c                     | j                         }|j                  }~t        |      }| j                  t	        |      d       | j                  |d   j
                  d       y Nr^   r   r]  )rA   	functionslistr6   rz   rD   )r2   r@   rx  funcss       r   test_functionszTestModuleRef.test_functions  sN    kkm]]RUQ'q.r4   c           	      P   | j                         }|j                  }~t        |      }| j                  t	        |      d       | j                  t        j                  d|d   j                               | j                  t        j                  dt        |d                      y )Nr^   struct\.glob_type(\.[\d]+)?r   rf  )
rA   struct_typesr  r6   rz   r  rs   ry   rD   r   )r2   r@   rx  structss       r   test_structszTestModuleRef.test_structs$  s    kkmr(Wq)RXX&D&-ajoo7 	8RXXG
O 	r4   c                    | j                         }| j                  t              }|j                  |       | j                  t	        d |j
                  D              ddg       |j                  d       |j                          | j                  t        j                        5  |j                  d       d d d        y # 1 sw Y   y xY w)Nc              3   4   K   | ]  }|j                     y wr(   r   .0fs     r   	<genexpr>z-TestModuleRef.test_link_in.<locals>.<genexpr>5       2a1662   mulr]  )rA   asm_mullink_inr6   rw  r~  r^  rG  r   rH  rI  )r2   destsrcs      r   test_link_inzTestModuleRef.test_link_in0  s    {{}kk'"S24>>22UEN	D% 

v334 	$U#	$ 	$ 	$s   %C  C	c                 l   | j                         }| j                  t              }|j                  |d       | j                  t	        d |j
                  D              ddg       |j                          | j                  t	        d |j
                  D              dg       |j                  d       y )NTpreservec              3   4   K   | ]  }|j                     y wr(   r   r  s     r   r  z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>@  r  r  r  r]  c              3   4   K   | ]  }|j                     y wr(   r   r  s     r   r  z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>B  s     ?1?r  )rA   r  r  r6   rw  r~  rG  r^  )r2   r  src2s      r   test_link_in_preservez#TestModuleRef.test_link_in_preserve;  s    {{}{{7#TD)24>>22UEN	D

???%I% r4   c                    | j                         }| j                  t              }| j                  t              5 }|j	                  |       d d d        | j                  dt        j                               y # 1 sw Y   /xY w)Nzsymbol multiply defined)rA   asm_sum2r   r   r  r   r   r   )r2   r  r  r   s       r   test_link_in_errorz TestModuleRef.test_link_in_errorE  sf     {{}kk(#|, 	LL	/R\\1BC	 	s   A;;Bc                     | j                         }|j                         }d}d}| j                  |j                  |      xs |j                  |             y )Ns   s   BC)rA   
as_bitcoder   r   )r2   r@   bcbitcode_wrapper_magicbitcode_magics        r   test_as_bitcodezTestModuleRef.test_as_bitcodeN  sO    kkm^^ !4m4 =&;<	>r4   c                    | j                  t              5 }t        j                  d       d d d        | j	                  dt        j                               | j	                  dt        |j                               y # 1 sw Y   TxY w)Nr4   zLLVM bitcode parsing errorz(file too small to contain bitcode header)r   r   r)   parse_bitcoder   r   r   )r2   r   s     r   test_parse_bitcode_errorz&TestModuleRef.test_parse_bitcode_errorX  sg    |, 	$s#	$2C4EF6BLL8I	
	$ 	$s   A??Bc                 D   t        j                         }| j                  |      j                         }t        j                         }t        j                  ||      }| j                  |j                         |       |j                  d       |j                  d       y )Nr?   r]  rE   )r)   create_contextrA   r  r  r6   r^  rC   )r2   context1r  context2r@   s        r   test_bitcode_roundtripz$TestModuleRef.test_bitcode_roundtrip`  s|    &&([[[*557&&(  X.)2.'r4   c                     | j                         }|j                         }| j                  ||       | j                  |j	                         |j	                                y r(   )rA   cloneassertIsNotr6   r  )r2   r   cloneds      r   test_cloningzTestModuleRef.test_cloningk  sG    KKM#**,alln=r4   N)rN   rO   rP   rE  rK  rM  rP  rS  rV  rX  r[  rb  ri  rl  r{  r  r  r  r  r  r  r  r  r  rR   r4   r   rB  rB    sm    9
	*7-)	5
7F/
	$!D>
	(>r4   rB  c                   f    e Zd ZdZddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zy)JITTestMixinz*
    Mixin for ExecutionEngine tests.
    c                     |j                          |j                  |      }| j                  |        t        t        t        t              |      S r(   )finalize_objectget_function_addressr   r   r   )r2   ee	func_namecfptrs       r   get_sumzJITTestMixin.get_sumw  s@    
''	2-yu-e44r4   c                     | j                         }| j                  |      5 }| j                  |      } |dd      }| j                  d|       d d d        y # 1 sw Y   y xY wNr_   )rA   rH   r  r6   )r2   r@   r  cfuncress        r   test_run_codezJITTestMixin.test_run_code}  sX    kkmXXc] 	&bLL$E2,CR%	& 	& 	&s   -AA!c                 
   | j                  | j                               }|j                          |j                          | j                  t        j
                        5  |j                          d d d        y # 1 sw Y   y xY wr(   )rH   rA   rG  r   rH  rI  r  r2   r  s     r   rK  zJITTestMixin.test_close  s]    XXdkkm$



v334 	! 	! 	! 	!s   A99Bc                 ~   | j                  | j                               }|5  	 d d d        | j                  t              5  |5  	 d d d        d d d        | j                  t        j
                        5  |j                          d d d        y # 1 sw Y   lxY w# 1 sw Y   VxY w# 1 sw Y   ZxY w# 1 sw Y   y xY wr(   )rH   rA   r   r   rH  rI  r  r  s     r   rM  zJITTestMixin.test_with  s    XXdkkm$ 		|, 	 	 v334 	! 	! 	!	 	 	 		! 	!s;   BB'BB'5B3BB$	 B''B03B<c                     | j                         }| j                  |      }|j                          |j                          y r(   rA   rH   rG  r2   r@   r  s      r   test_module_lifetimez!JITTestMixin.test_module_lifetime  s,    kkmXXc]

		r4   c                     | j                         }| j                  |      }|j                          |j                          y r(   r  r  s      r   test_module_lifetime2z"JITTestMixin.test_module_lifetime2  s,    kkmXXc]		

r4   c                    | j                  | j                               }| j                  t              }|j                  |       | j	                  t
              5  |j                  |       d d d        | j                  |j                         |j                          | j                  |j                         y # 1 sw Y   PxY wr(   )
rH   rA   r  
add_moduler   KeyErrorassertFalseclosedrG  r   r2   r  r@   s      r   test_add_modulezJITTestMixin.test_add_module  s    XXdkkm$kk'"
cx( 	MM#	$



#		 	s   B<<Cc                     | j                  | j                               }| j                  t              }|j                  |       |j	                          |j	                          y r(   rH   rA   r  r  rG  r  s      r   test_add_module_lifetimez%JITTestMixin.test_add_module_lifetime  sB    XXdkkm$kk'"
c		

r4   c                     | j                  | j                               }| j                  t              }|j                  |       |j	                          |j	                          y r(   r  r  s      r   test_add_module_lifetime2z&JITTestMixin.test_add_module_lifetime2  sB    XXdkkm$kk'"
c

		r4   c                    | j                  | j                               }| j                  t              }|j                  |       |j	                  |       | j                  t              5  |j	                  |       d d d        | j                  |j                         |j                          | j                  |j                         y # 1 sw Y   PxY wr(   )
rH   rA   r  r  remove_moduler   r  r  r  rG  r  s      r   test_remove_modulezJITTestMixin.test_remove_module  s    XXdkkm$kk'"
c
x( 	"S!	"$

$		" 	"s   ,CCc                     | j                         }| j                  |      }|j                  }| j                  |j                  |       t	        |       ~~t	        |       y r(   )rA   rH   target_datar   r   )r2   r@   r  tds       r   test_target_datazJITTestMixin.test_target_data  sH    kkmXXc]^^bnnb)BBr4   c                 `   | j                         }| j                  |      }|j                  }|j                  d      }|j                  d      }|j                  d      }t        j
                  dk  rdnd}|||fD ]-  }| j                  |j                  |j                        |       / | j                  |j                  |j                        d       | j                  |j                  |j                        d       | j                  |j                  |j                        d       | j                  |j                  |j                        d       | j                  |j                  |j                        d	       | j                  |j                  |j                        d
       y )NrE   rs  ru          rr  r,  r^   )r^   r_   rr     )rr  r,  )rA   rH   r  rC   r   maxsizer6   get_abi_sizetypeglobal_value_typeget_abi_alignmentr   )	r2   r@   r  r  gv_i32gv_i8	gv_structpointer_sizerz  s	            r   test_target_data_abi_enquiriesz+JITTestMixin.test_target_data_abi_enquiries  sX   kkmXXc]^^((0''1++M:	KK'1qq%+ 	DAR__QVV4lC	D 	)A)ABAF--f.F.FGK)@)@A1Eb**5+B+BCYO)D)DErJb**9+F+FGPr4   c                    g fd}| j                         }| j                  |      }|j                  |       | j                  t	              d       | j                  |      } |dd       | j                  t	              d       | j                  d   d   |       | j                  d   d   t               g d d  | j                  t              }|j                  |       | j                  |d      }| j                  t	              d       | j                  d   d   |       | j                  d   d   t               y )Nc                 ,    j                  | |f       y r(   r   r@   bufnotifiess     r   notifyz5JITTestMixin.test_object_cache_notify.<locals>.notify      OOS#J'r4   r   r_   r  r^   r  )rA   rH   set_object_cacher6   rz   r  r   r   bytesr  r  )r2   r  r@   r  r  mod2r  s         @r   test_object_cache_notifyz%JITTestMixin.test_object_cache_notify  s   	( kkmXXc]
F#X*R aX*hqk!nc*hqk!ne4{{7#
dR'X*hqk!nd+hqk!ne4r4   c                 |  	 g g fd}fd}| j                         }| j                  |      }|j                  ||       | j                  t	              d       | j                  t	              d       | j                  |      }| j                  t	              d       | j                  t	              d       | j                  d   |       d   d   		fd}g d d  g d d  | j                  t              }| j                  |      }|j                  ||       | j                  t	              d       | j                  t	              d       | j                  |      }| j                   |dd      d       | j                  t	              d       | j                  t	              d       y )	Nc                 ,    j                  | |f       y r(   r  r  s     r   r  z8JITTestMixin.test_object_cache_getbuffer.<locals>.notify  r  r4   c                 (    j                  |        y r(   r  )r@   
getbufferss    r   	getbufferz;JITTestMixin.test_object_cache_getbuffer.<locals>.getbuffer  s    c"r4   r   r^   c                 *    j                  |        S r(   r  )r@   r  
sum_buffers    r   getbuffer_successfulzFJITTestMixin.test_object_cache_getbuffer.<locals>.getbuffer_successful  s    c"r4   r_   r  r  )rA   rH   r  r6   rz   r  r   r  )
r2   r  r  r@   r  r  r  r  r  r  s
          @@@r   test_object_cache_getbufferz(JITTestMixin.test_object_cache_getbuffer  sy   
	(	# kkmXXc]
FI. 	X*Z!,R X*Z!,jmS)a[^

	 
1kk'"XXc]
F$89X*Z!,R q"r*X*Z!,r4   N)r]  )rN   rO   rP   r   r  r  rK  rM  r  r  r  r  r  r  r  r  r  r   rR   r4   r   r  r  r  sN    5&!!$	%Q*56*-r4   r  c                       e Zd Zd Zd Zy)JITWithTMTestMixinc                 >   | j                  d      }| j                         }| j                  ||      }|j                  |      }| j	                  d|       |j                  d       |j                  |      }| j	                  d|       | j                  ||       y)z%Test TargetMachineRef.emit_assembly()TrG   r]  N)rM   rA   rH   r   r   set_asm_verbosityassertNotEqual)r2   rM   r@   r  raw_asmraw_asm_verboses         r   test_emit_assemblyz%JITWithTMTestMixin.test_emit_assembly-  s    ,,,6kkmXXc>* ..s3eW%((.(66s;eW%G_5r4   c                 $   | j                  d      }| j                         }| j                  ||      }|j                  |      }| j	                  |t
               t        j                  j                  d      r| j                  d|dd        yy)z#Test TargetMachineRef.emit_object()TrG   rU   s   ELFN
   )
rM   rA   rH   emit_objectr   r  r   r~   r   r   )r2   rM   r@   r  code_objects        r   test_emit_objectz#JITWithTMTestMixin.test_emit_object9  s|    ,,,6kkmXXc>*$005k51<<""7+MM&+cr"23 ,r4   N)rN   rO   rP   r  r  rR   r4   r   r  r  +  s    
6	4r4   r  c                       e Zd ZdZddZy)	TestMCJitz@
    Test JIT engines created with create_mcjit_compiler().
    Nc                 V    || j                  d      }t        j                  ||      S )NTrG   )rM   r)   create_mcjit_compiler)r2   r@   rM   s      r   rH   zTestMCJit.jitJ  s.    !!00T0:N))#~>>r4   r(   )rN   rO   rP   r   rH   rR   r4   r   r  r  E  s    ?r4   r  x86x86 onlyc            	           e Zd Zeddd eeee      dfdZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestOrcLLJITr]  NFc                    t        j                  |d|      }t        j                         }|r|j                          |j	                  |j                  t        j                                     j                  |      j                  ||      }	|	|   }
| j                  |
       | j                  ||	j                         ||	 ||
      fS )NF)use_jit_linksuppress_errorsr9   )r)   create_lljit_compilerJITLibraryBuilderadd_current_processadd_irr;   r<   export_symbollinkr   r6   rD   )r2   r>   r  rM   add_process	func_typer  lljitr   rtr  s              r   rH   zTestOrcLLJIT.jitW  s     **>8=;JL ((*'')VCJJd&=&=&?J@A]9%T%# 	 9BGG,b)E***r4   c                     t        j                         }t        j                         j                  dd      j	                  d      j                  |d      }| j                  |d   d       y )Nr   r   r   )r)   r  r  import_symbolr  r  r6   r2   r!  r"  s      r   test_define_symbolzTestOrcLLJIT.test_define_symbolj  sW    **,##%33ItD]9%dd5%&8 	I-r4   c                    t        j                         }| j                  t        d      5  |j	                  dd       d d d        t        j
                         j                  dd      j                  d      j                  |d      }| j                  |d   d       | j                  t        d      5  |j	                  dd       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NzNo such libraryr   r   r   r   r   zSymbols not found.*__foobar)
r)   r  assertRaisesRegexr   lookupr  r$  r  r  r  r%  s      r   "test_lookup_undefined_symbol_failsz/TestOrcLLJIT.test_lookup_undefined_symbol_failsp  s    **,##L2CD 	,LL
+	,##%33ItD]9%dd5%&8 	ByM1-##L$AC 	,LL
+	, 	,	, 	,
	, 	,s   C4CCC%c                     t         j                  dk(  r6| j                  t        d      5  t	        j
                  d       d d d        y | j                  t	        j
                  d             y # 1 sw Y   y xY w)Nwin32zJITLink .* WindowsT)r  )r   r~   r(  r   r)   r  r  r1   s    r   test_jit_linkzTestOrcLLJIT.test_jit_link{  sd    <<7"''(<> >**=> >   !;!;!NO	> >s   A00A9c                     | j                         \  }}}|5   |dd      }| j                  d|       d d d        y # 1 sw Y   y xY wr  )rH   r6   )r2   r!  r"  r  r  s        r   r  zTestOrcLLJIT.test_run_code  sG    !XXZE 	&2,CR%	& 	& 	&s	   <Ac                     | j                         \  }}}|j                          |j                          | j                  t              5  |j	                  dd       d d d        y # 1 sw Y   y xY wNr   r   )rH   rG  r   AssertionErrorr)  r2   r!  r"  r  s       r   rK  zTestOrcLLJIT.test_close  sW    !XXZE~. 	&LL%	& 	& 	&s   
A&&A/c                 X   | j                         \  }}}|5  	 d d d        | j                  t              5  |5  	 d d d        d d d        | j                  t              5  |j	                  dd       d d d        y # 1 sw Y   dxY w# 1 sw Y   NxY w# 1 sw Y   RxY w# 1 sw Y   y xY wr0  )rH   r   r   r1  r)  r2  s       r   rM  zTestOrcLLJIT.test_with  s    !XXZE 		|, 	 	 ~. 	&LL%	& 	&	 	 	 		& 	&s8   A<BBB B <BB	BB B)c                    | j                         \  }}}t        j                         j                  t        j                  t        j                                     j                  d      j                  |d      }  t        t        t        t              |d         dd      }| j                  d|       | j                  |j                  dd      d   d       | j                  |j                  dd      d   d       | j                  t              5  |j                  dd       d d d        | j                  t              5  |j                  dd       d d d        y # 1 sw Y   :xY w# 1 sw Y   y xY w)Nr9   r  r_   r  ir]  r   )rH   r)   r  r  r  r;   r<   r  r  r   r   r6   r  r)  r   r   r2   r!  rt_sum	cfunc_sumrt_mulr  s         r   test_add_ir_modulezTestOrcLLJIT.test_add_ir_module  s5   %)XXZ"	'')VGNN$*A*A*CNDE]5!T% 	 <,iue,VE];ArBc"ELL6u=qAELL6u=qA|, 	'LL&	'|, 	'LL&	' 	'	' 	'	' 	's   E#E/#E,/E8c                     | j                         \  }}}~t        j                          | j                  t              5  |j                  dd       d d d        |j                          y # 1 sw Y   xY wNr]  )rH   r-   r.   r   r   r)  rG  )r2   r!  r6  r   s       r   r  zTestOrcLLJIT.test_remove_module  sZ    !XXZ


|, 	'LL&	'	' 	's   A++A4c                    | j                         \  }}}t        j                         j                  t        j                  t        j                                     j                  d      j                  d      j                  |d      }  t        t        t        t              |d         dd      }| j                  d|       y )Nr9   
square_sumr]  r_   r  	   )rH   r)   r  r  asm_square_sumr;   r<   r  add_jit_libraryr  r   r   r6   r5  s         r   test_lib_dependszTestOrcLLJIT.test_lib_depends  s    %)XXZ"	'')VN))1H1H1J)KL]<(_U#T%&	 	
 C,iue,VL-AB1bIC r4   c                     | j                         \  }}}|j                  }| j                  |j                  |       t        |       ~t        |       y r(   )rH   r  r   r   )r2   r!  r"  r   r  s        r   r  zTestOrcLLJIT.test_target_data  sC    Ae'',BBr4   c                    t        d      }t        j                         }t        j                         }|j	                  t
        j                  t        j                                     j                  dt        j                  |            j                  d      j                  |d      }|d   }| j                  |       | j                    t        t               |             d       ~| j#                  |j$                  d       y )Nr   r9   Ar         )r   r)   r  r  r  asm_ext_ctorsr;   r<   r$  rH  	addressofr  r  r   r6   r   r   r  ro  )r2   shared_valuer!  r   r"  r   s         r   test_global_ctors_dtorsz$TestOrcLLJIT.test_global_ctors_dtors  s     qz**,((*VM((0G0G0I(JK]3 0 0 >?]5!T%	 	
 i.)5)#.0"5L..3r4   c                     d}| j                  t        |      5  | j                  t        dd       d d d        y # 1 sw Y   y xY w)Nz*Failed to materialize symbols:.*getversion
getversionT)r  )r(  r   rH   asm_getversion)r2   msgs     r   (test_lookup_current_process_symbol_failsz5TestOrcLLJIT.test_lookup_current_process_symbol_fails  sD     ;##L#6 	IHH^\4HH	I 	I 	Is	   ;Ac                 4    | j                  t        dd d       y )NrL  T)rH   rM  r1   s    r   "test_lookup_current_process_symbolz/TestOrcLLJIT.test_lookup_current_process_symbol  s    tT:r4   c                 z   t        j                         t        j                  t        j                               fd}t        t        j                               D cg c]  }t        j                   ||              }}|D ]  }|j                           |D ]  }|j                           y c c}w )Nr9   c                       fd}|S )Nc            
          g } t        d      D ]Y  }| j                  t        j                         j	                        j                  d      j                  d d|              [ y )N2   r]  sum_r   )r.  r   r)   r  r  r  r  )trackingcir!  llvm_irs     r   do_workzDTestOrcLLJIT.test_thread_safe.<locals>.compile_many.<locals>.do_work  s`    r BAOOD$:$:$<%+VG_%2]5%9%)T%4s!A3%@BBr4   rR   )rY  r[  r!  rZ  s   ` r   compile_manyz3TestOrcLLJIT.test_thread_safe.<locals>.compile_many  s    B Nr4   )rL   )r)   r  rQ   r;   r<   r.  rk   	cpu_count	threadingThreadstartjoin)r2   r\  rY  thsthr!  rZ  s        @@r   test_thread_safezTestOrcLLJIT.test_thread_safe  s    **,..(?(?(A.B		 blln-/ |A7 / / 	BHHJ	 	BGGI		/s   $#B8c                    | j                  d      }| j                         }t        j                  |      }t        j                         j                  |j                  |            j                  d      j                  |d      } t        t        t        t              |d         }| j                   |dd      d       y )NFrG   r]  r_         )rM   rA   r)   r  r  add_object_imgr  r  r  r   r   r6   )r2   rM   r@   r!  r"  r]  s         r   test_add_object_filez!TestOrcLLJIT.test_add_object_file  s    ,,,7kkm**>:##%^N66s;<]5!T% 	 -iue,RY7QA&r4   c                    | j                  d      }| j                         }|j                  |      }t               \  }}	 t	        j
                  |d      5 }|j                  |       d d d        t        j                  |      }t        j                         j                  |      j                  d      j                  |d      } t        t        t        t              |d         }	| j                   |	dd      d       t	        j                   |       y # 1 sw Y   xY w# t	        j                   |       w xY w)NFrG   wbr]  r_   rf  rg  )rM   rA   r  r   rk   fdopenwriter)   r  r  add_object_filer  r  r   r   r6   unlink)
r2   rM   r@   obj_bin	temp_desc	temp_pathr  r!  r"  r]  s
             r   $test_add_object_file_from_filesystemz1TestOrcLLJIT.test_add_object_file_from_filesystem  s    ,,,7kkm ,,S1&y	9	!9d+ !q !..~>E'') +u%eU#  1)E5%0E;CSAY*IIi ! ! IIi s%   D& D*BD& D#D& &D=)rN   rO   rP   rQ   r   r   rH   r&  r*  r-  r  rK  rM  r9  r  rA  r  rJ  rO  rQ  rd  ri  rs  rR   r4   r   r  r  T  ss     t5%)G!+&.	,P&&&'!4"I;,	'!r4   r  c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestValueRefc                 |    | j                         }|j                  d      }| j                  t        |      d       y )NrE   z@glob = global i32 0)rA   rC   r6   r   r2   r@   rE   s      r   rE  zTestValueRef.test_str  s2    kkm&&v.T$:;r4   c                     | j                         }|j                  d      }| j                  |j                  d       d|_        | j                  |j                  d       y )NrE   foobar)rA   rC   r6   rD   rw  s      r   rP  zTestValueRef.test_name  sL    kkm&&v.F+	H-r4   c                    | j                         }|j                  d      }|j                  }| j                  |j                  t        j
                         ||_        | j                  |j                  |       dD ]Y  }||_        | j                  |j                  t        j
                         | j                  |j                  j                  |       [ y )NrE   )internalexternal)rA   rC   linkager   r)   Linkager6   rD   )r2   r@   rE   r}  s       r   test_linkagezTestValueRef.test_linkage#  s    kkm&&v.,,dllDLL9w// 	9G"DL!!$,,=T\\..8	9r4   c                    | j                         }|j                  d      }|j                  }| j                  |j                  t        j
                         ||_        | j                  |j                  |       dD ]Y  }||_        | j                  |j                  t        j
                         | j                  |j                  j                  |       [ y )NrE   )hidden	protectedr
  )rA   rC   
visibilityr   r)   
Visibilityr6   rD   )r2   r@   rE   r  s       r   test_visibilityzTestValueRef.test_visibility/  s    kkm&&v.__
doot?$*5< 	?J(DO!!$//4??CT__11:>	?r4   c                    | j                         }|j                  d      }|j                  }| j                  |j                  t        j
                         ||_        | j                  |j                  |       dD ]Y  }||_        | j                  |j                  t        j
                         | j                  |j                  j                  |       [ y )NrE   )	dllimport	dllexportr
  )rA   rC   storage_classr   r)   StorageClassr6   rD   )r2   r@   rE   r  s       r   test_storage_classzTestValueRef.test_storage_class;  s    kkm&&v.**d00$2C2CD*++];B 	EM!.D!!$"4"4d6G6GHT//44mD	Er4   c                 (   | j                         }|j                  d      }|j                  d       | j                  t              5 }|j                  d       d d d        | j                  t        j                        d       y # 1 sw Y   /xY w)Nr]  	nocapturezextzno such attribute 'zext')rA   r^  add_function_attributer   
ValueErrorr6   r   r   )r2   r@   r   raisess       r   test_add_function_attributez(TestValueRef.test_add_function_attributeG  sz    kkme$
!!+.z* 	.f%%f-	.V--.0JK	. 	.s   BBc                 ~    | j                         }|j                  d      }| j                  |j                   |       y NrE   )rA   rC   r   rw  s      r   test_modulezTestValueRef.test_moduleO  s/    kkm&&v.dkk3'r4   c                     | j                         }|j                  d      }|j                  }| j                  |t        j
                         y r  )rA   rC   r  r   r)   TypeRefr2   r@   rE   tps       r   	test_typezTestValueRef.test_typeT  s:    kkm&&v.YYb$,,/r4   c                 *   | j                         }|j                  d      }|j                  }| j                  |j                  d       |j                  d      }| j                  t        j                  d|j                  j                               y )NrE   r   ru  r  )	rA   rC   r  r6   rD   r  rs   ry   r  )r2   r@   rE   r  sts        r   test_type_namezTestValueRef.test_type_nameZ  sw    kkm&&v.YY"%$$]3RXX&D&(&:&:&?&?A 	Br4   c                     | j                         }|j                  d      }|j                  }| j                  t	        |      d       y )NrE   i32)rA   rC   r  r6   r   r  s       r   test_type_printing_variablez(TestValueRef.test_type_printing_variablec  s<    kkm&&v.##R%(r4   c                     | j                         }|j                  d      }| j                  t        |j                        d       y )Nr]  zi32 (i32, i32))rA   r^  r6   r   r  ra  s      r   test_type_printing_functionz(TestValueRef.test_type_printing_functioni  s9    kkme$R1124DEr4   c                    | j                         }|j                  d      }| j                  |j                  j                         t
        r9| j                  t        j                  dt        |j                                     n8| j                  t        j                  dt        |j                                     | j                  t        j                  dt        |j                                     y )Nru  ptrz%struct\.glob_type(\.[\d]+)?\*rf  )rA   rC   r   r  
is_pointerr   r  rs   ry   r   r  )r2   r@   r  s      r   test_type_printing_structz&TestValueRef.test_type_printing_structn  s    kkm$$]3**+"  &#bgg,!?@  *K*-bgg,"8 9RXXG$$%' 	(r4   c                 d    | j                         }|j                          |j                          y r(   )rE   rG  )r2   rE   s     r   rK  zTestValueRef.test_close|  s    yy{



r4   c                     | j                         j                  d      }| j                  t              j                  d      }| j                  |j                         | j                  |j                         y r;  )rA   r^  asm_sum_declarer  is_declarationr   )r2   defineddeclareds      r   test_is_declarationz TestValueRef.test_is_declaration  sW    ++-,,U3;;/<<UC//0//0r4   c                     | j                  t              }t        |j                        }| j	                  t        |      d       |D ]  }| j                  |j                          y Nrr  )rA   rQ   r  rv  r6   rz   r   	is_global)r2   r@   gvarsr  s       r   test_module_global_variablesz)TestValueRef.test_module_global_variables  sS    kk'"S))*UQ' 	)AOOAKK(	)r4   c                 @   | j                         }t        |j                        }| j                  t	        |      d       |d   }| j                  |j                         | j                  |j                  d       | j                  t              5  |j                   d d d        | j                  t              5  |j                   d d d        | j                  t              5  |j                   d d d        y # 1 sw Y   ^xY w# 1 sw Y   @xY w# 1 sw Y   y xY wr}  )rA   r  r~  r6   rz   r   is_functionrD   r   r  instructionsoperandsopcode)r2   r@   r  r   s       r   test_module_functionsz"TestValueRef.test_module_functions  s    kkmS]]#UQ'Qx(()E*z* 		z* 	MM	z* 	KK	 			 		 		 	s$   C<<D&D<DDDc                 T   | j                         }|j                  d      }| j                  |j                         t	        |j
                        }| j                  t        |      d       | j                  |d   j                         | j                  |d   j                         | j                  |d   j                  d       | j                  t        |d   j                        d       | j                  |d   j                  d       | j                  t        |d   j                        d       | j                  t              5  |d   j                   d d d        | j                  t              5  |d   j
                   d d d        y # 1 sw Y   7xY w# 1 sw Y   y xY w)Nr]  r_   r   r^   .1r  .2)rA   r^  r   r  r  	argumentsr6   rz   is_argumentrD   r   r  r   r  blocks)r2   r@   r   r   s       r   test_function_argumentsz$TestValueRef.test_function_arguments  sJ   kkm&(()DNN#TA&Q++,Q++,at,T!W\\*E2at,T!W\\*E2z* 	GNN	z* 	G	 		 		 	s   F9FFF'c                     | j                         j                  d      }t        |j                        }| j	                  t        |      d       |d   }| j                  |j                         y )Nr]  r^   r   )rA   r^  r  r  r6   rz   r   is_block)r2   r   r  r   s       r   test_function_blocksz!TestValueRef.test_function_blocks  sS    {{}))%0dkk"Va(q	'r4   c                 <   | j                         j                  d      }t        t        |j                        d   j                        }| j                  t        |      d       | j                  |d   j                         | j                  |d   j                         | j                  |d   j                         | j                  |d   j                  d       | j                  |d   j                  d       | j                  |d   j                  d       y )Nr]  r   rf  r^   r_   r|   r"   )
rA   r^  r  r  r  r6   rz   r   is_instructionr  )r2   r   instss      r   test_block_instructionsz$TestValueRef.test_block_instructions  s    {{}))%0T$++&q)667UQ'a//0a//0a//0q%0q%0q%0r4   c                    | j                         j                  d      }t        t        |j                        d   j                        d   }| j                  |j                  d       t        |j                        }| j                  t        |      d       | j                  |d   j                         | j                  |d   j                         | j                  |d   j                  d       | j                  t        |d   j                        d       | j                  |d   j                  d       | j                  t        |d   j                        d       y )	Nr]  r   r|   r_   r^   r  r  r  )rA   r^  r  r  r  r6   r  r  rz   r   
is_operandrD   r   r  )r2   r   r|   r  s       r   test_instruction_operandsz&TestValueRef.test_instruction_operands  s   {{}))%04$Q'445a8U+%X*../../!))40Xa[--.6!))40Xa[--.6r4   c                    t         j                  d   }|dk(  rdndg}| j                  t              }|j                  D ]  }t        |j                        }|j                  dk(  r| j                  ||       :|j                  dk(  sJ| j                  |g        t        |j                        }| j                  t        |d   j                        dg       | j                  t        |d   j                        g         y )	Nr   r+  s   memory(read)s   readonlya_readonly_funca_arg0_return_funcs   returnedr^   )
r)   r-  rA   asm_attributesr~  r  
attributesrD   r6   r  )r2   verreadonly_attrsr@   r   attrsr   s          r   test_function_attributesz%TestValueRef.test_function_attributes  s    $$Q'-0BY/KHkk.)MM 	?D)Eyy--  722  +DNN+  d1g&8&8!9K=I  d1g&8&8!92>	?r4   c                    | j                         }| j                  |j                  d      j                  t        j
                  j                         |j                  d      }| j                  |j                  t        j
                  j                         t        |j                        d   }| j                  |j                  t        j
                  j                         t        |j                        d   }| j                  |j                  t        j
                  j                         | j                  t        |j                        d   j                  t        j
                  j                         | j                  t        |j                        d   j                  t        j
                  j                         | j                  t               j                  d      }t        t        |j                        d   j                        d   }| j                  t        |j                        d   j                  t        j
                  j"                         y )NrE   r]  r   r^   r   )rA   r6   rC   
value_kindr)   	ValueKindglobal_variabler^  functionr  r  basic_blockr  instructionr  constant_intasm_inlineasm
inline_asm)r2   r@   r   r   inst	iasm_func	iasm_insts          r   test_value_kindzTestValueRef.test_value_kind  s   kkm008CC77	9&$..*A*ABT[[!!$))4>>+E+EFE&&'*$..*D*DEdmm,Q/::44	6dmm,Q/::33	5 KK.;;EB	i../2??@C	i001!4??22	4r4   c                    | j                         }| j                  |j                  d      j                         d}|j                  D ]  }| j                  |j                         |j
                  D ]l  }| j                  |j                         |j                  D ]@  }| j                  |j                         |j                  D ]  }|j                  s|dz  } B n  | j                  |d       y )NrE   r   r^   )
rA   r   rC   is_constantr~  r  r  r  r  r6   )r2   r@   constant_operandsr   r   r  ops          r   test_is_constantzTestValueRef.test_is_constant  s    kkm//7CCDMM 	3DOOD,,- 3  !2!23!.. 3D$$T%5%56"mm 3>>-2-333	3 	*A.r4   c                 n   | j                         }|j                  d      }t        t        |j                        d   j                        }| j                  |d   j                  d       t        |d   j                        }| j                  |d   j                         | j                  |d   j                         | j                  |d   j                         d       | j                  t              5  |d   j                          d d d        | j                  t              }|j                  d      }t        t        |j                        d   j                        }t        |d   j                        d   }t        |d   j                        d   }| j                  |j                         d       | j                  |j                  d      d	       |j                  d
      }t        j!                  |j#                  dd      dd      }| j                  |d	       y # 1 sw Y    xY w)Nr]  r   r^   r|   r_   rg  T)
signed_intr  Fr,  little)signed)rA   r^  r  r  r  r6   r  r  r   r  r  get_constant_valuer   r  asm_sum3int
from_bytesto_bytes)	r2   r@   r   r  r  posint64negint64as_u64as_i64s	            r   test_constant_intzTestValueRef.test_constant_int   s   kkm&T$++&q)667q%0a))*//0!001!7791=z* 	-QK**,	- kk(#&T$++&q)667a))*1-a))*1-446:444ErJ ,,,>8 <h'+   -$	- 	-s   8H**H4c                    | j                  t              }|j                  d      }t        t        |j                        d   j
                        }| j                  t        |      d       | j                  |d   j                  d       t        |d   j                        }| j                  |d   j                         | j                  |d   j                         d       | j                  |d   j                         | j                  |d   j                         d       | j                  t              }|j                  d      }t        t        |j                        d   j
                        d   }t        |j                        }| j                  t               5  |d   j                          d d d        | j                  |d   j                  d	      d       y # 1 sw Y   /xY w)
Nr   r   r_   r   g        r^   gQ	@T)round_fp)rA   r8  r^  r  r  r  r6   rz   r  r  r   r  assertAlmostEqualr  asm_double_inaccurater   r  )r2   r@   r   r  r  r  s         r   test_constant_fpzTestValueRef.test_constant_fp  s   kk+,&T$++&q)667UQ'q&1a))*//0x{==?E//0x{==?Fkk/0&D%a(556q9&z* 	-QK**,	-x{==t=LaP	- 	-s   $G&&G/c                    | j                  t              }|j                  d      }t        t        |j                        d   j
                        d   }t        |j                        d   }| j                  |j                         t        r!| j                  |j                         d       y | j                  |j                         d       y )NrO  r   zptr nullz	i64* null)rA   asm_null_constantr^  r  r  r  r  r   r  r   r6   r  )r2   r@   r   r  args        r   test_constant_as_stringz$TestValueRef.test_constant_as_string.  s    kk+,&D%a(556q94==!!$("S335zBS335{Cr4   c                    | j                  t              }|j                  d      }t        |j                        }t        |d   j
                        }| j                  |d   j                         | j                  |d   j                  d       t        |d   j                        }| j                  t        |      d       | j                  |d   j                         | j                  |d   j                         | j                  |d   |d          | j                  |d   |d          | j                  |d   j                  d       | j                  t              5  |d   j                   d d d        y # 1 sw Y   y xY w)Nr   r   phir_   r^   )rA   asm_phi_blocksr^  r  r  r  r   r  r6   r  incoming_blocksrz   r  r  r   r  )r2   r@   r   r  r  r  s         r   test_incoming_phi_blocksz%TestValueRef.test_incoming_phi_blocks:  sG   kk.)&dkk"F2J334Q667a//7|A>>?_-q1*334*334+VBZ8+VAY7 	LO22E:z* 	,O++	, 	, 	,s   $E==FN)rN   rO   rP   rE  rP  r  r  r  r  r  r  r  r  r  r  rK  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rR   r4   r   ru  ru    s    <
.
9
?
EL(
0B)F
(
1)$(	17?4(/ %4Q(
D,r4   ru  c                   N    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestTypeRefc                    | j                         }|j                  d      }| j                  t        |j                        d       |j                  d      }| j                  t        |      d       t        |j                        }| j                  t        |      d       | j                  t        |d         d       | j                  t        |d         d	       y )
NrE   r  re  z+%struct.glob_type = type { i64, [2 x i64] }r_   r   i64r^   z	[2 x i64])	rA   rC   r6   r   r  rg  r  elementsrz   )r2   r@   rE   glob_struct_typer  s        r   rE  zTestTypeRef.test_strR  s    kkm&&v.T334e<../AB-.F	H (112X*Xa[)51Xa[);7r4   c                    | j                         }|j                  d      }| j                  |j                  j                  t
        j                  j                         | j                  |j                  j                         |j                  d      }| j                  |j                  j                  t
        j                  j                         | j                  |j                  j                         |j                  }| j                  |j                  t
        j                  j                         | j                  |j                         |j                  \  }}| j                  |j                  t
        j                  j                         | j                  |j                  t
        j                  j                         | j                  |j                          |j#                  d      }|j                  \  }}	| j                  |	j                  t
        j                  j$                         | j                  |	j&                         |j)                  d      j                  }
| j                  |
j                  t
        j                  j                         |j)                  d      j                  }| j                  |j                  t
        j                  j*                         y )NrE   ru  struct.glob_type_vecr]  )rA   rC   r6   r  	type_kindr)   TypeKindpointerr   r  r  struct	is_structr  integerarrayis_arrayrg  vector	is_vectorr^  r  )r2   r@   rE   ru  stypestype_astype_bglob_vec_struct_typer   vector_typefuncptrfunctypes               r   test_type_kindzTestTypeRef.test_type_kind_  s   kkm&&v.,,dmm.C.CD		,,---m<))33T]]5J5JK((334--$--*>*>?( >>**DMM,A,AB**DMM,?,?@(()"223IJ-66;..0D0DE--.""5)..**DMM,A,AB##E*<<++T]]-C-CDr4   c                    | j                         }|j                  d      }|j                  \  }}| j                  |j                  d       | j                  t              5  |j                   d d d        y # 1 sw Y   y xY w)Nre  r_   )rA   rg  r  r6   element_countr   r  )r2   r@   r  r   
array_types        r   test_element_countzTestTypeRef.test_element_count|  sp    kkm../AB(11:1115z* 	+**	+ 	+ 	+s   "A88Bc                    | j                         }|j                  d      }|j                  d      }|j                  \  }}|j                  \  }}| j                  |j                  d       | j                  |j                  d       | j                  |j                  d       | j                  |j                  d       y )Nre  r
  @      r   )rA   rg  r  r6   
type_width)r2   r@   r  r  integer_typer  r   r  s           r   test_type_widthzTestTypeRef.test_type_width  s    kkm../AB"223IJ#3#<#< j-66;00"5//8 	)44a8..2r4   c                    | j                  t              }|j                  d      }|j                  }| j	                  |j
                         | j                  t              }|j                  d      }|j                  }| j                  |j
                         | j	                  |j                  j                         | j                  t              5 }|j                  j
                   d d d        t        r&| j                  dt        j                               y | j                  dt        j                               y # 1 sw Y   [xY w)Nvarargr]  zType ptr is not a functionz&Type i32 (i32, i32)* is not a function)rA   asm_vararg_declarer^  r  r   is_function_varargr  r  r  r  r   r  r   r   r   r   )r2   r@   r   decltyper  s        r   test_vararg_functionz TestTypeRef.test_vararg_function  s   kk,-)))334kk/*&))445 			,,-z* 	)fII((	) #MM6F<L<L8MNMMBf../1	) 	)s   EEc                 2   | j                         }t        |j                        \  }| j                  |j                  j
                  t        j                  j                         | j                  |j                  j                         |j                  }| j                  |j
                  t        j                  j                         | j                  |j                         |j                  t        j                         }| j#                  |t        j$                         | j                  |j&                  t        j(                  d      t        j(                  d      f       | j                  |j*                  t        j(                  d             y Nr   )rA   r  r~  r6   r  r  r)   r  r  r  r  r  r  r   as_irr	   global_contextr   r   r   r   return_type)r2   r@   r   r   tyirs        r   test_function_typeref_as_irz'TestTypeRef.test_function_typeref_as_ir  s   kkmCMM"**DMM,A,AB,,-##)?)?@(()zz"++,dBOO4RZZ^RZZ^$DE))2::b>:r4   c                    t        j                  t        j                         d      }t        j                         }t        j                  ||d      }| j                  t        |            }|j                  d      }|j                  }| j                  |j                  |j                  t         j                        j                         y )NrR   r   )r	   r   VoidTyper   r   rA   r   r^  r  r6   r1  r/  r0  )r2   r   irmodr   r@   gvtys         r   test_void_typeref_as_irz#TestTypeRef.test_void_typeref_as_ir  s    r{{}b1		[[e,kk#e*%e$##))B$5$56BB	Dr4   c                    ddl m} t        j                         ddh}i }d }||d<   d }||d<   d	 }||d
<   d }||d<   fd}||d<   d }	|	|d<   d }
|
|d<   d }||d<   | j	                  |j                         D ch c]  }|j                   c}t        |j                               t        |      z         |j                         D ]  \  }}|j                  |v r ||j                            D ]  }| j                  |d|       5  t        j                        }t        j                  ||d       t        |      }t        j                  |      }|j                  d      }|j                   }|j#                  t        j                               }| j	                  ||       | j%                  ||       d d d          y c c}w # 1 sw Y   xY w)Nr   )_TypeKindToIRTyper  voidc               3   8   K   t        j                          y wr(   )r	   HalfTyperR   r4   r   
maker_halfz9TestTypeRef.test_global_typeref_as_ir.<locals>.maker_half  s     ++-   halfc               3   8   K   t        j                          y wr(   )r	   r   rR   r4   r   maker_floatz:TestTypeRef.test_global_typeref_as_ir.<locals>.maker_float  s     ,,. r?  floatc               3   8   K   t        j                          y wr(   )r	   r   rR   r4   r   maker_doublez;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_double  s     --/!r?  doublec               3   :   K   t        j                  d       y wr.  )r	   r   rR   r4   r   maker_integerz<TestTypeRef.test_global_typeref_as_ir.<locals>.maker_integer  s     **R. s   r  c               3   2  K   t        j                  t        j                  d             j                  d      j	                          j                  d      } | j                  t        j                  d             | j	                          y w)Nr,  myclassmyclass2)r	   PointerTyper   get_identified_type
as_pointerset_body)rK  ctxs    r   maker_pointerz<TestTypeRef.test_global_typeref_as_ir.<locals>.maker_pointer  sm     ..A//)))4??AA..z:Hbjjm,%%''s   BBr  c               3   b   K   t        j                  t        j                  d      d       y w)Nr,  {   )r	   	ArrayTyper   rR   r4   r   maker_arrayz:TestTypeRef.test_global_typeref_as_ir.<locals>.maker_array  s     ,,rzz!}c22s   -/r  c               3   `   K   t        j                  t        j                         d       y w)Nr_   )r	   
VectorTyper   rR   r4   r   maker_vectorz;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_vector  s     --22s   ,.r  c               3     K   t        j                  t        j                         t        j                  d      g       t        j                  t        j                         t        j                  d      gd       y w)Nr"  Tpacked)r	   LiteralStructTyper   r   rR   r4   r   maker_structz;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_struct  sU     &&

2'GHH&&

2'G.24 4s   B Br  z -> r  rk  r   )llvmlite.binding.typerefr:  r	   Contextr6   keysrD   ru   r  subTestr   GlobalVariabler   r)   r=   rC   r  r/  r   )r2   r:  skippedmakersr>  rB  rE  rH  rQ  rU  rX  r]  xr  irtypetyr6  r>   r@   rk  r7  r:  rP  s                         @r   test_global_typeref_as_irz%TestTypeRef.test_global_typeref_as_ir  s   >jjl 

 	  $v	! &w	" (x	! *y	( *y	3 &w	3 (x	4
 (x 	*;*@*@*BCQ!&&CV[[]+c'l:	< "3!8!8!: 	7Iv~~(,fY^^,. 
7\\YMbT":; 	7IIc2E%%eRd;e*C--c2C006B//D**RZZ\2C$$S"-))#v6	7 	7
7	7	 D	7 	7s   GB3GG c                 ~   t        j                  |      }|j                  |      }|j                  }t	        j
                         }|j                  |      }t	        j                  |      }t	        j                  |||j                        }	t	        j                  ||d      }
t	        j                  |
j                               }|j                  |	|
j                         |j                          t        j                  t        |            }| j!                  |j                  |	j                        j"                  d       |j%                  |d       | j'                  t)        t+        |j,                              t)        t+        |j,                              d	z   d
       | j/                  |j                  |	j                        j"                  d       | j'                  |j                  |	j                        j                  |j                  |
j                        j                  d       y )N)ir_ctxr  r   wrapperzdeclfn must not have a body)rN  Tr  r^   z$the only new function is the wrapperzdeclfn must have a body nowz.declfn and wrapfn must have the same llvm Type)r)   r=   r^  r  r	   r_  r/  r   r   rD   r   r   callr   ret_voidr   r   r  r  r6   rz   r  r~  r  )r2   r>   target_symbolr@   cppfn	cppfntype
my_contextrg  wrapper_moddeclfnwrapfnr   new_mods                r   !_check_typeref_as_ir_for_wrappersz-TestTypeRef._check_typeref_as_ir_for_wrappers  s   !!#&  /++	 ZZ\
__J_/ ii
3["5::>["9=,,v88:;VV[[)%%c+&67,,V[[9HH9 	 	; 	d+T'"3"345T#--01A5C 	 	E 	--fkk:II: 	 	<--fkk:LL --fkk:LLM 	 	Or4   c                 0    | j                  t        d       y)ztExercise extracting C++ defined class types.
        Contains both opaque and non-opaque class definitions.
        _Z3fooP7MyClass14MyClassDefinedN)rv  asm_cpp_classr1   s    r   ,test_typeref_as_ir_for_wrappers_of_cpp_classz8TestTypeRef.test_typeref_as_ir_for_wrappers_of_cpp_class6  s     	..-	
r4   c                 0    | j                  t        d       y)zExercise 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.
        _Z3foo8Vector2DPS_N)rv  asm_cpp_vectorr1   s    r   4test_typeref_as_ir_for_wrappers_of_cpp_vector_structz@TestTypeRef.test_typeref_as_ir_for_wrappers_of_cpp_vector_struct?  s     	.. 	
r4   N)rN   rO   rP   rE  r  r   r&  r,  r3  r8  rh  rv  rz  r~  rR   r4   r   r  r  P  s?    8E:+31.;"	DM7^!OF
	
r4   r  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)
TestTargetc                 v   t         j                  j                  }| j                  t              5 } |d       d d d        | j                  dt        j                               t        j                         } ||      }| j                  |j                  |       |j                          y # 1 sw Y   wxY w)Nry  z(No available targets are compatible with)r)   rI   r   r   r   r   r   r   r<   r6   r:   rG  )r2   r  r   r:   rL   s        r   test_from_triplezTestTarget.test_from_tripleM  s    KK##|, 	hK	@",,'	)((*6/	 	s   	B//B8c                     t         j                  j                  t        j                               }|j	                  ddddd       t        j
                         }|j	                  |dddd       y )Nr   r^   r
  )r)   rI   r   r<   rK   r  )r2   rL   r  s      r   test_create_target_machinez%TestTarget.test_create_target_machineX  sY    (()@)@)BC$$RQ	9E$$&$$S"aIFr4   c                 .   t         j                  j                  t        j                               }t         j                  j	                         }| j                  |j                  t               | j                  |j                  |j                         y r(   )	r)   rI   r   r<   rJ   r   rD   r   r6   r2   tus      r   rP  zTestTarget.test_name`  s]    KK##D$;$;$=>KK++-affc*(r4   c                 .   t         j                  j                  t        j                               }t         j                  j	                         }| j                  |j                  t               | j                  |j                  |j                         y r(   )	r)   rI   r   r<   rJ   r   descriptionr   r6   r  s      r   test_descriptionzTestTarget.test_descriptionf  s]    KK##D$;$;$=>KK++-ammS16r4   c                     t         j                  j                  t        j                               }t	        |      }| j                  |j                  |       | j                  |j                  |       y r(   )r)   rI   r   r<   r   r   rD   r  )r2   rL   r   s      r   rE  zTestTarget.test_strl  sN    (()@)@)BCKfkk1%f((!,r4   c                 f   dt         j                  j                  dddddd      fd	t         j                  j                  dddddd      fd
t         j                  j                  dddddd      fdt         j                  j                  dddddd      fdt         j                  j                  dddddd      fdt         j                  j                  dddddd      fdt         j                  j                  dddddd      fdt         j                  j                  dddddd      fdt         j                  j                  d dd!d"dd#      fd$t         j                  j                  d%ddd&dd'      fg
}|D ].  }|\  }}t        j                  |      }| j	                  ||       0 y )(Nzx86_64-scei-ps4x86_64r   sceips4unknownELF)ArchSubArchVendorOSEnvObjectFormatzx86_64-sie-ps4zpowerpc-dunno-notsurepowerpczpowerpcspe-unknown-freebsdspefreebsdzarmv6hl-none-linux-gnueabiarmv6hlrU   gnueabizi686-unknown-linux-gnui386gnuzi686-apple-macosxapplemacosxMachOzi686-dunno-win32windowsmsvcCOFFzs390x-ibm-zoss390xibmzosGOFFzwasm64-wasiwasm64wasiWasm)r)   targetsTripleget_triple_partsr6   )r2   casescase
triple_str
triple_objr  s         r   test_get_parts_from_triplez%TestTarget.test_get_parts_from_tripler  s0    \\  h(.5%.U ! DE \\  h(.5%.U ! DE %\\  i(1i%.U ! DE *\\  i(1i%.U ! DE *\\  eV(1g%.U ! DE &\\  fb(1g%* ! @A !\\  fb(/H%.W ! FG  \\  fb(1i%+& ! BC \\  gr(-%%.V ! EF \\  h(1f%.V ! EFK)
V  	.D%)"J
''
3CS*-		.r4   N)	rN   rO   rP   r  r  rP  r  rE  r  rR   r4   r   r  r  K  s!    	G)7-1.r4   r  c                   $    e Zd Zd Zd Zd Zd Zy)TestTargetDatac                 ,    t        j                  d      S )Nz%e-m:e-i64:64-f80:128-n8:16:32:64-S128)r)   create_target_datar1   s    r   r  zTestTargetData.target_data  s    &&'NOOr4   c                     | j                         }| j                         }| j                  |j                  |j                        d       y )Nr,  )r  rE   r6   r  r  r2   r  rE   s      r   test_get_abi_sizez TestTargetData.test_get_abi_size  s8    yy{3Q7r4   c                    | j                         }| j                         }| j                  |j                  |j                        d       | j                  d      }| j                  |j                  |j                        d       y )Nrr  ru  r  )r  rE   r6   r  r  r  s      r   test_get_pointee_abi_sizez(TestTargetData.test_get_pointee_abi_size  sg    yy{)?)?@!Dyy')?)?@"Er4   c                 r   | j                         }| j                  d      }| j                  t              5  |j	                  |j
                  d       d d d        |j                  }| j                  |j	                  |d      d       | j                  |j	                  |d      d       y # 1 sw Y   ZxY w)Nru  r   r^   r,  )r  rE   r   r  get_element_offsetr  r  r6   )r2   r  rE   struct_types       r   test_get_struct_element_offsetz-TestTargetData.test_get_struct_element_offset  s    yy'z* 	0!!$))Q/	0 ,,..{A>B..{A>B	0 	0s   B--B6N)rN   rO   rP   r  r  r  r  rR   r4   r   r  r    s    P8
F	Cr4   r  c                       e Zd Zd Zd Zy)TestTargetMachinec                 r    | j                  d      }t        j                         }|j                  |       y NFrG   )rM   r)   create_module_pass_manageradd_analysis_passes)r2   tmpms      r   test_add_analysis_passesz*TestTargetMachine.test_add_analysis_passes  s1      U +,,.
r"r4   c                    | j                  d      }|j                  }| j                         }|j                  d      }t        j
                  dk  rdnd}| j                  |j                  |j                        |       y )NFrG   rE   r  rr  r,  )	rM   r  rA   rC   r   r  r6   r  r  )r2   r  r  r@   r  r  s         r   test_target_data_from_tmz*TestTargetMachine.test_target_data_from_tm  sh      U +^^kkm((0KK'1qq5|Dr4   N)rN   rO   rP   r  r  rR   r4   r   r  r    s    #
Er4   r  c                   N    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestPassManagerBuilderc                 *    t        j                         S r(   )r)   PassManagerBuilderr1   s    r   pmbzTestPassManagerBuilder.pmb  s    &&((r4   c                 H    t        j                         }d|_        d|_        y )Nr_   rf  )r)   create_pass_manager_builderinlining_threshold	opt_levelr2   r  s     r   test_old_apiz#TestPassManagerBuilder.test_old_api  s    ..0!"r4   c                 d    | j                         }|j                          |j                          y r(   )r  rG  r  s     r   rK  z!TestPassManagerBuilder.test_close  s    hhj				r4   c                     | j                         }| j                  |j                  t               t	        d      D ]%  }||_        | j                  |j                  |       ' y r  )r  r   r  r  r.  r6   r2   r  rY  s      r   test_opt_levelz%TestPassManagerBuilder.test_opt_level  sO    hhjcmmS1q 	/ACMS]]A.	/r4   c                     | j                         }| j                  |j                  t               t	        d      D ]%  }||_        | j                  |j                  |       ' y r  )r  r   
size_levelr  r.  r6   r  s      r   test_size_levelz&TestPassManagerBuilder.test_size_level  O    hhjcnnc2q 	0ACNS^^Q/	0r4   c                     | j                         }| j                  t              5  |j                   d d d        dD ]	  }||_         y # 1 sw Y   xY w)N)   P   i^  )r  r   NotImplementedErrorr  r  s      r   test_inlining_thresholdz.TestPassManagerBuilder.test_inlining_threshold  sQ    hhj23 	#""	# 	'A%&C"	'	# 	#s   A

Ac                     | j                         }| j                  |j                  t               dD ]%  }||_        | j	                  |j                  |       ' y N)TF)r  r   disable_unroll_loopsr  r6   r2   r  r   s      r   test_disable_unroll_loopsz0TestPassManagerBuilder.test_disable_unroll_loops  sP    hhjc66= 	:A'(C$S55q9	:r4   c                     | j                         }| j                  |j                  t               dD ]%  }||_        | j	                  |j                  |       ' y r  )r  r   loop_vectorizer  r6   r  s      r   test_loop_vectorizez*TestPassManagerBuilder.test_loop_vectorize	  P    hhjc00$7 	4A!"CS//3	4r4   c                     | j                         }| j                  |j                  t               dD ]%  }||_        | j	                  |j                  |       ' y r  )r  r   slp_vectorizer  r6   r  s      r   test_slp_vectorizez)TestPassManagerBuilder.test_slp_vectorize		  sP    hhjc//6 	3A !CS..2	3r4   c                     | j                         }t        j                         }|j                  |       |j	                          |j	                          y r(   )r  r)   r  populaterG  )r2   r  r  s      r   !test_populate_module_pass_managerz8TestPassManagerBuilder.test_populate_module_pass_manager	  s9    hhj,,.R		

r4   c                     | j                         }| j                         }t        j                  |      }|j	                  |       |j                          |j                          y r(   )rA   r  r)   create_function_pass_managerr  rG  )r2   r@   r  r  s       r   #test_populate_function_pass_managerz:TestPassManagerBuilder.test_populate_function_pass_manager	  sF    kkmhhj..s3R		

r4   N)rN   rO   rP   r  r  rK  r  r  r  r  r  r  r  r  rR   r4   r   r  r    s9    )
/0':43r4   r  c                       e Zd Zd Zd Zy)PassManagerTestMixinc                 J    t        j                         }d|_        d|_        |S )Nr_   i,  )r)   r  r  r  r  s     r   r  zPassManagerTestMixin.pmb"	  s$    ..0!$
r4   c                 d    | j                         }|j                          |j                          y r(   r  rG  r2   r  s     r   rK  zPassManagerTestMixin.test_close(	  s    WWY



r4   N)rN   rO   rP   r  rK  rR   r4   r   r  r   	  s    r4   r  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestModulePassManagerc                 *    t        j                         S r(   r)   r  r1   s    r   r  zTestModulePassManager.pm0	      ..00r4   c                    | j                         }| j                         j                  |       | j                         }t	        |      }|j                  |       t	        |      }|j                         }t        |      D ]z  \  }}|j                         j                  d      s&ddh}|D ]  }	|	|v s n t        d      ||	hz  j                         }
| j                  d|       | j                  |
|        y  t        d      )Nzret i32%.3%.4zexpected tokens not foundzexpected IR not found)r  r  r  rA   r   runrw   	enumerater   r   r   popr   assertNotIn)r2   r  r@   orig_asmopt_asmopt_asm_splitidxltoksr  
othertokens              r   test_runzTestModulePassManager.test_run3	  s    WWY
Bkkms8
sc(  **,. 	8FCwwy##I.u~ DAAvD ''BCC"aSj--/
eX.  W5	8 677r4   c                 @   | j                         }|j                  d       | j                         j                  |       | j	                  t
              }|j                  |      \  }}| j                  |       | j                  d|       | j                  d|       y )NF   Passedinlineme	r  add_function_inlining_passr  r  rA   asm_inlineasm2run_with_remarksr   r   r2   r  r@   statusremarkss        r   'test_run_with_remarks_successful_inlinez=TestModulePassManager.test_run_with_remarks_successful_inlineQ	  sz    WWY
%%b)
Bkk.)//4h(j'*r4   c                 d   | j                         }|j                  d       | j                         j                  |       | j	                  t
              }|j                  |      \  }}| j                  |       | j                  d|       | j                  d|       | j                  d|       y )Nr   Missedr  znoinline function attribute)	r  r  r  r  rA   asm_inlineasm3r  r   r   r  s        r   #test_run_with_remarks_failed_inlinez9TestModulePassManager.test_run_with_remarks_failed_inline\	  s    WWY
%%a(
Bkk.)//4 	h(j'*3W=r4   c                     | j                         }|j                  d       | j                         j                  |       | j	                  t
              }|j                  |d      \  }}| j                  |       | j                  d|       y )Nr  nothingremarks_filterr   )	r  r  r  r  rA   r  r  r   r6   r  s        r   'test_run_with_remarks_inline_filter_outz=TestModulePassManager.test_run_with_remarks_inline_filter_outi	  ss    WWY
%%b)
Bkk.)//I/NW%r4   c                 D   | j                         }|j                  d       | j                         j                  |       | j	                  t
              }|j                  |d      \  }}| j                  |       | j                  d|       | j                  d|       y )Nr  zinlin.*r$  r  r  r  r  s        r   &test_run_with_remarks_inline_filter_inz<TestModulePassManager.test_run_with_remarks_inline_filter_inr	  s    WWY
%%b)
Bkk.)//I/Nh(j'*r4   N)	rN   rO   rP   r  r  r  r!  r&  r(  rR   r4   r   r  r  .	  s     18<	+>&+r4   r  c                   2    e Zd ZddZd Zd Zd Zd Zd Zy)	TestFunctionPassManagerNc                 T    |xs | j                         }t        j                  |      S r(   )rA   r)   r  rJ  s     r   r  zTestFunctionPassManager.pm	  s#    "T[[]0055r4   c                 d    | j                         }|j                          |j                          y r(   )r  r*   finalizer  s     r   r&  z%TestFunctionPassManager.test_initfini	  s    WWY

r4   c                    | j                         }|j                  d      }| j                  |      }| j                         j	                  |       |j                          t        |      }|j                          |j                  |       |j                          t        |      }| j                  d|       | j                  d|       y )Nr]  r  )rA   r^  r  r  r  rG  r   r*   r  r-  r   r	  )r2   r@   r   r  r
  r  s         r   r  z TestFunctionPassManager.test_run	  s    kkme$WWS\
B		r7

r

b'eX&(r4   c                    | j                  t              }|j                  d      }| j                  |      }|j	                          | j                         j                  |       |j                          |j                          |j                  |      \  }}|j                          | j                  |       | j                  d|       | j                  d|       y )Nlicmr  rA   licm_asmr^  r  add_licm_passr  r  rG  r*   r  r-  r   r   r2   r@   r   r  okr  s         r   test_run_with_remarksz-TestFunctionPassManager.test_run_with_remarks	  s    kk(#f%WWS\

B		
++B/W
h(fg&r4   c                    | j                  t              }|j                  d      }| j                  |      }|j	                          | j                         j                  |       |j                          |j                          |j                  |d      \  }}|j                          | j                  |       | j                  d|       y )Nr0  r#  r$  r   )rA   r2  r^  r  r3  r  r  rG  r*   r  r-  r   r6   r4  s         r    test_run_with_remarks_filter_outz8TestFunctionPassManager.test_run_with_remarks_filter_out	  s    kk(#f%WWS\

B		
++By+IW
W%r4   c                    | j                  t              }|j                  d      }| j                  |      }|j	                          | j                         j                  |       |j                          |j                          |j                  |d      \  }}|j                          | j                  |       | j                  d|       | j                  d|       y )Nr0  r$  r  r1  r4  s         r   test_run_with_remarks_filter_inz7TestFunctionPassManager.test_run_with_remarks_filter_in	  s    kk(#f%WWS\

B		
++Bv+FW
h(fg&r4   r(   )	rN   rO   rP   r  r&  r  r6  r8  r:  rR   r4   r   r*  r*  }	  s     6
)'&'r4   r*  c                       e Zd Zd Zd Z ej                   ej                         j                  d      d      d        Z
d Zy)
TestPassesc                 *    t        j                         S r(   r  r1   s    r   r  zTestPasses.pm	  r  r4   c                    t         j                  d   }| j                         }|j                  d       |j	                          |j                          |j                          |j                  d       |j                          |j                          |j                          |j                          |j                          |j                          |j                          |j                          |j!                          |j#                          |j%                          |j'                          |j)                          |j+                          |j-                          |j/                          |j1                          |j3                          |j5                          |j7                          |j9                          |dk  r|j;                          |j=                          |j?                  d       |jA                          |jC                          |jE                          |jG                          |jI                          |jK                          |jM                          |jO                          |jQ                          |jS                          |jU                          |jW                          |jY                          |j[                          |j]                          |dk  r|j_                          |ja                          |jc                          |je                          |jg                          |ji                          |jk                          |jm                          |jo                          |jq                          |js                          |ju                          |jw                          |jy                          |j{                          |j}                          |j                          |j                          |j                          |j                          |j                          |j                          |j                          y )Nr   r      r+     )Fr)   r-  r  add_target_library_infoadd_constant_merge_passadd_dead_arg_elimination_passadd_function_attrs_passr  add_global_dce_passadd_global_optimizer_passadd_ipsccp_passadd_dead_code_elimination_passadd_cfg_simplification_passadd_gvn_passadd_instruction_combining_passr3  add_sccp_passadd_sroa_pass"add_type_based_alias_analysis_passadd_basic_alias_analysis_passadd_loop_rotate_passadd_region_info_passadd_scalar_evolution_aa_pass)add_aggressive_dead_code_elimination_passadd_aa_eval_passadd_always_inliner_passadd_break_critical_edges_passadd_dead_store_elimination_pass*add_reverse_post_order_function_attrs_pass)add_aggressive_instruction_combining_passadd_internalize_passadd_jump_threading_passadd_lcssa_passadd_loop_deletion_passadd_loop_extractor_passadd_single_loop_extractor_passadd_loop_strength_reduce_passadd_loop_simplification_passadd_loop_unroll_passadd_loop_unroll_and_jam_passadd_lower_atomic_passadd_lower_invoke_passadd_lower_switch_passadd_memcpy_optimization_passadd_merge_functions_passadd_merge_returns_passadd_partial_inlining_pass!add_prune_exception_handling_pass add_reassociate_expressions_pass"add_demote_register_to_memory_passadd_sink_passadd_strip_symbols_passadd_strip_dead_debug_info_passadd_strip_dead_prototypes_passadd_strip_debug_declare_passadd_strip_nondebug_symbols_passadd_tail_call_elimination_passadd_basic_aa_passadd_dependence_analysis_passadd_dot_call_graph_passadd_dot_cfg_printer_passadd_dot_dom_printer_passadd_dot_postdom_printer_passadd_globals_mod_ref_aa_passadd_iv_users_passadd_lazy_value_info_passadd_lint_passadd_module_debug_info_passadd_refprune_passadd_instruction_namer_pass)r2   llvm_verr  s      r   test_populatezTestPasses.test_populate	  sS   ))!,WWY
""2&
""$
((*
""$
%%c*
 
$$&

))+
&&(

))+



--/
((*
!
!
'')
446

""$
((*
**,
557b=88:
!
""1%

!!#
""$
))+
((*
'')
!
'')
  "
  "
  "
'')
##%
!!#
$$&b=002
++-
--/

!!#
))+
))+
'')
**,
))+

'')
""$
##%
##%
'')
&&(

##%

%%'

%%'r4   r  r  c                     d } |d      }| j                  dt        |              |d      }| j                  dt        |             | j                  dt        |             y)zTest a specific situation that demonstrate TLI is affecting
        optimization. See https://github.com/numba/numba/issues/8898.
        c                 p   t        j                  t              }t         j                  j	                  |j
                        }|j                         }t        j                         }|j                  |       | r|j                  |j
                         |j                          |j                  |       |S r(   )r)   r=   asm_tli_exp2rI   r   r:   rK   ModulePassManagerr  rA  rK  r  )use_tlir@   rL   r  r  s        r   r  z9TestPasses.test_target_library_info_behavior.<locals>.run
  s    %%l3C[[,,SZZ8F--/B'')B""2&**3::6--/FF3KJr4   T)r  zcall float @llvm.exp2.f32Fzcall float @ldexpfN)r   r   r	  )r2   r  r@   s      r   !test_target_library_info_behaviorz,TestPasses.test_target_library_info_behavior
  sZ    

	 $13s8< % 4c#h?*CH5r4   c                    t         j                  t        j                               }t        j                  |      }t        j
                         }|j                          |j                  |       |j                  d      }t        |j                        }t        |j                        }| j                  |d   j                  d       | j                  |d   j                  d       y )Nr9   r   r   rY  r^   i2)r   r;   r)   r<   r=   r  r  r  r^  nextr  r  r  r6   rD   )r2   r>   r@   r  r   first_blockr  s          r   test_instruction_namer_passz&TestPasses.test_instruction_namer_pass1
  s    ##4+B+B+D#E!!#& ##%
%%'
s &4;;'K445a--s3a--t4r4   N)rN   rO   rP   r  r  r   r   r~   machiner   r  r  rR   r4   r   r<  r<  	  sN    1L(\ X)))+66u=zJ6 K625r4   r<  c                   f    e Zd Zd Z ej
                   ej                         dv d      d        Zy)	TestDylibc                     | j                  t              5  t        j                  d       d d d        y # 1 sw Y   y xY w)Nzzzzasdkf;jasd;l)r   r   r)   load_library_permanentlyr1   s    r   test_bad_libraryzTestDylib.test_bad_libraryD
  s4    |, 	=))*;<	= 	= 	=s   5>)Linuxztest only works on Linuxc                 D    t        d      }t        j                  |       y )Nr   )r   r)   r  )r2   re   s     r   	test_libmzTestDylib.test_libmH
  s     C %%d+r4   N)	rN   rO   rP   r  r   r   r~   systemr  rR   r4   r   r  r  B
  s;    = X*i735,5,r4   r  c                       e Zd Zd Zd Zd Zy)TestAnalysisc                    t        j                         }t        j                  t        j                  d      t        j                  d      t        j                  d      g      }t        j                  ||d      }t        j
                  |j                               }|j                  \  }}|j                  ||      }|j                  |       |S )Nr   r   )
r	   r   r   r   r   r   r   r   r|   r"   )r2   r   r   r   r   re  yzs           r   build_ir_modulezTestAnalysis.build_ir_moduleP
  s    IIK__RZZ^bjjnbjjn-MN[[B&\\"//12ww1FF1aL
q	r4   c                     | j                         }|j                  d      }t        j                  |      }t        j                  |d      }d}| j	                  ||       | j                  ||       y )Nr   F	show_instz%.5 = add i32 %.1, %.2)r  
get_globalr)   get_function_cfgr   r	  )r2   r@   r   dot_showing_instdot_without_instr  s         r   test_get_function_cfg_on_irz(TestAnalysis.test_get_function_cfg_on_irZ
  sg    ""$nnU#00500F'd,-/0r4   c                    | j                         j                  d      }t        j                  |d      }t        j                  |d      }d}| j	                  ||       | j	                  ||       d}| j	                  ||       | j	                  ||       d}| j	                  ||       | j                  ||       y )Nr]  Tr  FdigraphzCFG for 'sum' functionz%.3 = add i32 %.1, %.2)rA   r^  r)   r  r   r	  )r2   r  r  r  prefixfnamer  s          r   test_function_cfg_on_llvm_valuez,TestAnalysis.test_function_cfg_on_llvm_valuec
  s    ++-,,U300DI00EJf./f./(e-.e-.'d,-/0r4   N)rN   rO   rP   r  r  r  rR   r4   r   r  r  O
  s    11r4   r  c                   "    e Zd Zed        Zd Zy)TestTypeParsingc              #   |   K   t        j                         }| t        |      }t        j                  |       y wr(   )r	   r   r   r)   r=   )r2   r@   r>   s      r   check_parsingzTestTypeParsing.check_parsingv
  s/     iik 	#hC s   :<c                 R   | j                         5 }t        j                  t        j                  d      g      }t        j                  ||d      }t        j
                  |dg      |_        d d d        | j                         5 }t        j                  t        j                  d      gd      }t        j                  ||d      }t        j
                  |dg      |_        d d d        | j                         5 }t        j
                  j                   t        j                  d      d       t        j                  d      d      gd      }t        j                  ||j                  d      }||_        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   r^   TrZ  r_   )	r  r	   r\  r   rb  r   initializerliteral_structr  )r2   r@   typrk  consts        r   test_literal_structz#TestTypeParsing.test_literal_struct
  se   ! 	3S&&

2'78C""3U3B[[qc2BN		3 ! 	3S&&

2'7.24C""3U3B[[qc2BN	3 ! 	#SKK..

2q0A0>

2q0A0C6: / <E ""3

E:B"BN	# 	#	3 	3	3 	3	# 	#s&   AFAF=A>FFFF&N)rN   rO   rP   r   r  r  rR   r4   r   r  r  u
  s    ! !#r4   r  c                       e Zd Zd Zy)TestGlobalConstructorsc                 ~   | j                  t              }| j                  |      }|j                          |j	                          |j                  d      }t        j                  t        j                        }t        j                  ||      }| j                  |j                  j                  d       |j                  d      } t        j                  t        j                        |      }| j                   |       d       |j                          | j                  |j                  j                  d       y )NrD  r
  r   rE  rF  )rA   asm_global_ctorsrH   r  run_static_constructorsget_global_value_addressrH  POINTERr   castr6   contentsro  r  r   run_static_destructors)r2   r@   r  ptr_addrptr_tr  foo_addrr   s           r   rJ  z.TestGlobalConstructors.test_global_ctors_dtors
  s     kk*+XXc]

""$ ..s3v~~.kk(E*++R0**51.fv~~.x8#
!!# 	++R0r4   N)rN   rO   rP   rJ  rR   r4   r   r  r  
  s    1r4   r  c                   V    e Zd ZddZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)TestGlobalVariablesc                    t        j                         }t        j                  d      }t        j                  ||d      }||_        t        |      }|r| j                  d|       n| j                  d|       | j                  |       y )Nr   r   undef)	r	   r   r   rb  r}  r   r   r	  rA   )r2   r}  	has_undefr@   r  rk  r>   s          r   check_global_variable_linkagez1TestGlobalVariables.check_global_variable_linkage
  sm     iikjjnsC/
#hMM'3'Wc*Cr4   c                 &    | j                  d       y )Nr{  r  r1   s    r   test_internal_linkagez)TestGlobalVariables.test_internal_linkage
      **:6r4   c                 &    | j                  d       y )Ncommonr  r1   s    r   test_common_linkagez'TestGlobalVariables.test_common_linkage
  s    **84r4   c                 *    | j                  dd       y )Nr|  Fr  r  r1   s    r   test_external_linkagez)TestGlobalVariables.test_external_linkage
  s    **:*Gr4   c                 &    | j                  d       y )Navailable_externallyr  r1   s    r   !test_available_externally_linkagez5TestGlobalVariables.test_available_externally_linkage
  s    **+ABr4   c                 &    | j                  d       y )Nprivater  r1   s    r   test_private_linkagez(TestGlobalVariables.test_private_linkage
  s    **95r4   c                 &    | j                  d       y )Nlinkoncer  r1   s    r   test_linkonce_linkagez)TestGlobalVariables.test_linkonce_linkage
  r  r4   c                 &    | j                  d       y )Nweakr  r1   s    r   test_weak_linkagez%TestGlobalVariables.test_weak_linkage
  s    **62r4   c                 &    | j                  d       y )N	appendingr  r1   s    r   test_appending_linkagez*TestGlobalVariables.test_appending_linkage
  s    **;7r4   c                 *    | j                  dd       y )Nextern_weakFr  r  r1   s    r   test_extern_weak_linkagez,TestGlobalVariables.test_extern_weak_linkage
  s    **=E*Jr4   c                 &    | j                  d       y )Nlinkonce_odrr  r1   s    r   test_linkonce_odr_linkagez-TestGlobalVariables.test_linkonce_odr_linkage
  s    **>:r4   c                 &    | j                  d       y )Nweak_odrr  r1   s    r   test_weak_odr_linkagez)TestGlobalVariables.test_weak_odr_linkage
  r  r4   N)T)rN   rO   rP   r  r  r  r  r  r  r  r  r  r  r  r  rR   r4   r   r  r  
  sA    (75HC6738K;7r4   r  zonly on x86c                       e Zd Zd Zy)TestInlineAsmc                     t        j                          | j                  t              }| j	                  d      }|j                  |      }| j                  d|       y )N)r>   FrG   nop)r)   initialize_native_asmparserrA   r  rM   r   r   )r2   r   r  r>   s       r   test_inlineasmzTestInlineAsm.test_inlineasm
  sO    ((*KKMK*  U +q!eS!r4   N)rN   rO   rP   r  rR   r4   r   r  r  
  s    "r4   r  c                   (    e Zd ZdZd Zd Zd Zd Zy)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                    | j                  d      }| j                         }|j                  |      }t        j                  j                  |      }d}d}|j                         D ]  }|j                         sd}| j                  |j                                | j                  |j                         dkD         | j                  t        |j                               dkD         | j                  |j                                | j                  ||j                         k         |j                         } n | j                  |       y )NFrG   r  Tr   )rM   rA   r  r)   ObjectFileRef	from_datasectionsis_textr  rD   r   sizerz   dataaddress)r2   rM   r@   rp  objhas_textlast_addressr   s           r   test_object_filezTestObjectFile.test_object_file  s    ,,,7kkm ,,S1  **73 		Ayy{$$QVVX.1-AFFH 12$$QYY[1qyy{ :; yy{		 	!r4   c                    | j                  d      }| j                         }|j                  |      }t        j                  j                  |      }t        j                  | j                  | j                        |      }|j                  |        t        t        t        t              |j                  d            }| j                   |dd      d       y )NFrG   	sum_twicer_   rf  r
  )rM   rA   r  r)   r  r  r  mod_asmrn  r   r   r  r6   )r2   rM   r@   rp  r  rH   r   s          r   ri  z#TestObjectFile.test_add_object_file  s    ,,,7kkm ,,S1  **73((T\\)B)79 	C 2IeUE2$$[13	 	1a"-r4   c                    | j                  d      }| j                         }|j                  |      }t               \  }}	 	 t	        j
                  |d      }|j                  |       |j                          |j                          t        j                  | j                  | j                        |      }|j                  |       t	        j                  |        t        t        t        t              |j!                  d            }| j#                   |dd      d       y # j                          w xY w# t	        j                  |       w xY w)NFrG   rk  r   r_   rf  r
  )rM   rA   r  r   rk   rl  rm  flushrG  r)   r  r  rn  ro  r   r   r  r6   )	r2   rM   r@   rp  rq  rr  r  rH   r   s	            r   rs  z3TestObjectFile.test_add_object_file_from_filesystem'  s	   ,,,7kkm ,,S1&y	9	!IIi. 		,,T[[-F-;=C 	*IIi 2IeUE2$$[13	 	1a"- 	 IIi s   7D' :AD< 'D99D< <Ec                 v   t         j                  t              }t        j                  j                  |      }|j                         D ]n  }|j                         s| j                  t        |j                               d       | j                  |j                         j                         t               p y )N   )r  fromhexissue_632_elfr)   r  r  r  r  r6   rz   r  hexissue_632_text)r2   elfr  r   s       r   test_get_section_contentz'TestObjectFile.test_get_section_contentA  s~     mmM*  **3/ 	AAyy{  QVVX3  @	Ar4   N)rN   rO   rP   r  r  ri  rs  r  rR   r4   r   r  r  
  s    G"(. .4Ar4   r  c                       e Zd Zd Zd Zy)TestTimePassesc                    t        j                         }t        j                         }d|_        |j	                  |       	 t        j
                  d       |j                  | j                                |j                  | j                                |j                  | j                                t        j                         }t        j
                  d       | j                  |t               | j                  |j                  d      d       y # t        j                         }t        j
                  d       w xY w)Nrf  TFzPass execution timing reportr^   )r)   r  r  r  r  set_time_passesr  rA   report_and_reset_timingsr   r   r6   count)r2   mpr  reports       r   test_reportingzTestTimePasses.test_reportingM  s    ,,...0R	(  &FF4;;=!FF4;;=!FF4;;=!224F  'fc*&DEqI	 224F  's   A2D +E c                 J    | j                  t        j                                y r(   )r  r)   r  r1   s    r   test_empty_reportz TestTimePasses.test_empty_report`  s    6689r4   N)rN   rO   rP   r  r  rR   r4   r   r  r  L  s    J&:r4   r  c                       e Zd Zd Zy)TestLLVMLockCallbacksc                    g fd}fd}t         j                  j                  ||       | j                         t        j                          | j                  d       | j                  d       t         j                  j                  ||       | j                  t              5  t         j                  j                  ||       d d d        y # 1 sw Y   y xY w)Nc                  (     j                  d       y )Nacqr  eventss   r   r  z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.acqi      MM% r4   c                  (     j                  d       y )Nrelr  r  s   r   r   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.rell  r  r4   r  r   )	r)   r   register_lock_callbackr  r  r   unregister_lock_callbackr   r  )r2   r  r   r  s      @r   test_lock_callbacksz)TestLLVMLockCallbacks.test_lock_callbacksf  s    	!	! 	''S1 	 '')eV$eV$ 	))#s3 z* 	8HH--c37	8 	8 	8s   ,!CCN)rN   rO   rP   r#  rR   r4   r   r  r  e  s    8r4   r  c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)TestPipelineTuningOptionsc                 *    t        j                         S r(   )r)   create_pipeline_tuning_optionsr1   s    r   ptozTestPipelineTuningOptions.pto      2244r4   c                 D    | j                         }|j                          y r(   )r(  rG  r2   r(  s     r   rK  z$TestPipelineTuningOptions.test_close  s    hhj		r4   c                     | j                         }| j                  |j                  t               t	        d      D ]%  }||_        | j                  |j                  |       ' y r  )r(  r   speed_levelr  r.  r6   r2   r(  rY  s      r   test_speed_levelz*TestPipelineTuningOptions.test_speed_level  sO    hhjcoos3q 	1ACOS__a0	1r4   c                     | j                         }| j                  |j                  t               t	        d      D ]%  }||_        | j                  |j                  |       ' y Nrf  )r(  r   r  r  r.  r6   r.  s      r   r  z)TestPipelineTuningOptions.test_size_level  r  r4   c                     | j                         }| j                  |j                  t               dD ]%  }||_        | j	                  |j                  |       ' y r  )r(  r   loop_interleavingr  r6   r2   r(  r   s      r   test_loop_interleavingz0TestPipelineTuningOptions.test_loop_interleaving  P    hhjc33T: 	7A$%C!S22A6	7r4   c                     | j                         }| j                  |j                  t               dD ]%  }||_        | j	                  |j                  |       ' y r  )r(  r   loop_vectorizationr  r6   r4  s      r   test_loop_vectorizationz1TestPipelineTuningOptions.test_loop_vectorization  sP    hhjc44d; 	8A%&C"S33Q7	8r4   c                     | j                         }| j                  |j                  t               dD ]%  }||_        | j	                  |j                  |       ' y r  )r(  r   slp_vectorizationr  r6   r4  s      r   test_slp_vectorizationz0TestPipelineTuningOptions.test_slp_vectorization  r6  r4   c                     | j                         }| j                  |j                  t               dD ]%  }||_        | j	                  |j                  |       ' y r  )r(  r   loop_unrollingr  r6   r4  s      r   test_loop_unrollingz-TestPipelineTuningOptions.test_loop_unrolling  r  r4   c                     | j                         }| j                  t              5  d|_        d d d        | j                  t              5  d|_        d d d        y # 1 sw Y   /xY w# 1 sw Y   y xY w)Nrr  r  )r(  r   r  r-  r+  s     r   test_speed_level_constraintsz6TestPipelineTuningOptions.test_speed_level_constraints  sf    hhjz* 	 CO	 z* 	! CO	! 	!	  	 	! 	!s   AA(A%(A1c                 X   | j                         }| j                  t              5  d|_        d d d        | j                  t              5  d|_        d d d        | j                  t              5  d|_        d|_        d d d        y # 1 sw Y   [xY w# 1 sw Y   BxY w# 1 sw Y   y xY w)Nrf  r  r_   )r(  r   r  r  r-  r+  s     r   test_size_level_constraintsz5TestPipelineTuningOptions.test_size_level_constraints  s    hhjz* 	CN	z* 	! CO	!z* 	COCN	 			 		! 	!	 	s#   BB0B BB B)N)rN   rO   rP   r(  rK  r/  r  r5  r9  r<  r?  rA  rC  rR   r4   r   r%  r%    s4    5107874!r4   r%  c                       e Zd ZddZy)NewPassManagerMixinc                     | j                  d      }t        j                  ||      }t        j                  ||      }|S r  )rM   r)   r'  create_pass_builder)r2   r-  r  r  r(  pbs         r   rH  zNewPassManagerMixin.pb  s>      U +11+zJ%%b#.	r4   N)r   r   )rN   rO   rP   rH  rR   r4   r   rE  rE    s    r4   rE  c                   $    e Zd Zd Zd Zd Zd Zy)TestPassBuilderc                 D    | j                         }|j                          y r(   )rH  rG  )r2   rH  s     r   rK  zTestPassBuilder.test_close  s    WWY

r4   c                     | j                  d      }t        j                  dd      }d|_        d|_        d|_        d|_        d|_        t        j                  ||      }|j                          y )NFrG   rf  r   r_   T)
rM   r)   r'  r  r3  r8  r;  r>  rG  rG  )r2   r  r(  rH  s       r   test_ptozTestPassBuilder.test_pto  sj      U +11!Q7!" $!% $"%%b#.

r4   c                     | j                         }|j                         }|j                  | j                         |       |j	                          y r(   )rH  getModulePassManagerr  rA   rG  )r2   rH  mpms      r   test_get_module_pass_managerz,TestPassBuilder.test_get_module_pass_manager  s8    WWY%%'r"

r4   c                     | j                         }|j                         }|j                  | j                         j	                  d      |       |j                          y r;  )rH  getFunctionPassManagerr  rA   r^  rG  )r2   rH  fpms      r   test_get_function_pass_managerz.TestPassBuilder.test_get_function_pass_manager  sC    WWY'')**5126

r4   N)rN   rO   rP   rK  rM  rQ  rU  rR   r4   r   rJ  rJ    s    	r4   rJ  c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestNewModulePassManagerc                 *    t        j                         S r(   )r)   create_new_module_pass_managerr1   s    r   r  zTestNewModulePassManager.pm  r)  r4   c                     | j                         }t        |      }| j                  |d      }|j                         }|j	                  ||       t        |      }||fS )Nr   r-  r  )rA   r   rH  rO  r  )r2   levelr@   r
  rH  rP  optimized_asms          r   run_o_nz TestNewModulePassManager.run_o_n  sX    kkms8WW1W5%%'RC&&r4   c                 D    | j                         }|j                          y r(   r  r2   rP  s     r   rK  z#TestNewModulePassManager.test_close      ggi		r4   c                 t    | j                  d      \  }}| j                  d|       | j                  d|       y Nrf  r  r^  r   r	  r2   r
  r]  s      r   test_run_o3z$TestNewModulePassManager.test_run_o3  2    "&,,q/-eX&.r4   c                 t    | j                  d      \  }}| j                  d|       | j                  d|       y Nr   r  r^  r   re  s      r   test_run_o0z$TestNewModulePassManager.test_run_o0  0    "&,,q/-eX&e]+r4   c                 &   | j                         }| j                         }|j                          | j                  t              }t        |      }|j                  ||       t        |      }| j                  d|       | j                  d|       y )Nr  )	rH  r  add_instruction_combine_passrA   asm_sum4r   r  r   r	  )r2   rH  rP  r@   r
  r]  s         r   test_instcombinez)TestNewModulePassManager.test_instcombine  sp    WWYggi((*kk(#s8RCeX&.r4   c                    | j                  dd      }t        t        j                  dd            }t	        j
                  |      }|j                         }|j                  ||       t        |      }| j                  d|       | j                  d|       t        t              }|j                         }t	        j
                  |      }|j                  ||       t        |      }| j                  d|       | j                  d|       y )Nrf  r   r[  optnone r   alloca)
rH  r   asm_alloca_optnonereplacer)   r=   rO  r  r   r	  )r2   rH  r
  r@   rP  r]  orig_asm_optnoneoptimized_asm_optnones           r   test_optnonez%TestNewModulePassManager.test_optnone  s    WWqW1)11*bAB!!(+%%'RCh)=1 12%%'!!"23R #Ch 01h 56r4   c                 $   | j                         }|j                          |j                          |j                          |j	                          |j                          |j                          |j                          |j                          y r(   )	r  add_verifierrT  add_simplify_cfg_passrb  rP  rn  r[  r  r`  s     r   test_add_passesz(TestNewModulePassManager.test_add_passes/  sm    ggi!!#  "  "((*##%r4   N)rN   rO   rP   r  r^  rK  rf  rk  rp  rx  r|  rR   r4   r   rW  rW    s*    5'/
,
	/7&	 r4   rW  c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)TestNewFunctionPassManagerc                 *    t        j                         S r(   )r)    create_new_function_pass_managerr1   s    r   r  zTestNewFunctionPassManager.pm<  s    4466r4   c                 D    | j                         }|j                          y r(   r  r2   rT  s     r   rK  z%TestNewFunctionPassManager.test_close?  ra  r4   c                     | j                         }|j                  d      }t        |      }| j                  |d      }|j	                         }|j                  ||       t        |      }||fS )Nr]  r   r[  )rA   r^  r   rH  rS  r  )r2   r\  r@   funr
  rH  rT  r]  s           r   r^  z"TestNewFunctionPassManager.run_o_nC  sh    kkmu%s8WW1W5'')RC&&r4   c                 t    | j                  d      \  }}| j                  d|       | j                  d|       y rc  rd  re  s      r   rf  z&TestNewFunctionPassManager.test_run_o3M  rg  r4   c                 t    | j                  d      \  }}| j                  d|       | j                  d|       y ri  rj  re  s      r   rk  z&TestNewFunctionPassManager.test_run_o0R  rl  r4   c                 Z   | j                  dd      }t        t        j                  dd            }t	        j
                  |      j                  d      }|j                         }|j                  ||       t        |      }| j                  d|       | j                  d|       t        t              }t	        j
                  |      j                  d      }|j                         }|j                  ||       t        |      }| j                  d|       | j                  d|       y )Nrf  r   r[  rr  r   r   rs  )rH  r   rt  ru  r)   r=   r^  rS  r  r   r	  )r2   rH  r
  r  rT  r]  rv  rw  s           r   rx  z'TestNewFunctionPassManager.test_optnoneW  s    WWqW1)11*bAB!!(+88?'')RCh)=1 12!!"23@@G'')R #Ch 01h 56r4   c                 D   | j                         }| j                         }| j                  t              j	                  d      }|j                          t        |      }|j                  ||       t        |      }| j                  d|       | j                  d|       y )Nr]  r  )
rH  r  rA   ro  r^  rn  r   r  r   r	  )r2   rH  rT  r  r
  r]  s         r   rp  z+TestNewFunctionPassManager.test_instcombinej  s{    WWYggikk(#007((*s8RCeX&.r4   c                     | j                  d      }|j                         }t        j                  t              j
                  D ]  }|j                  ||        y r1  )rH  rS  r)   r=   asm_declarationr~  r  )r2   rH  rT  r  s       r   test_declarationsz,TestNewFunctionPassManager.test_declarationsv  sK    WWQZ'')&&7AA 	CGGC	r4   c                    | j                         }|j                          |j                          |j                          |j	                          |j                          |j                          |j                          y r(   )r  rT  r{  rb  rP  rn  r[  r  r  s     r   r|  z*TestNewFunctionPassManager.test_add_passes|  sa    ggi!!#  "  "((*##%r4   N)rN   rO   rP   r  rK  r^  rf  rk  rx  rp  r  r|  rR   r4   r   r~  r~  ;  s/    7'/
,
7&	/ r4   r~  __main__)hrH  r^  r   r   r   ctypes.utilr   r-   r   rk   r~   rs   rn   r   r   
contextlibr   tempfiler   llvmliter	   r
   r)   llvmlite.bindingr   llvmlite.testsr   r   r  r  r   rQ   r  r  ro  r  r?  rM  r   ru  r   rZ  r  r)  r  r8  r  r  r   r2  r  rG  r   r  r   r   r   r  rt  r  r  r	  r  r   ry  r}  r&   rT   r   r   rB  objectr  r  r  r   r   r  ru  r  r  r  r  r  r  r  r*  r<  r  r  r  r  r  r  r  r  r  r%  rE  rJ  rW  r~  rN   mainrR   r4   r   <module>r     s     , , $ 	  	  	  
  %   $   # - 8!!D!!/2	-&
	
 "8!!#v-#++O=NON    ,BH&P :<	      "0- ( E  (+Z1h5x 5D'Jx 'JTF+8 F+RI'x I'X@>H @>Fv-6 v-r4 44?, ? %X%%'2259:F}!8 }! G}!@x,8 x,v	x
( x
vX. X.vCX C>E E"GX GT6 L+H&: L+^D'h(< D'N{5/ {5|
, 
,#18 #1L!#h !#H1Y 1447( 47n %X%%'2259=I"H " J"UAX UAp:X :28H 8:J JZ& h 3 <B x)< B JI +> I X zHMMO r4   