o
    ñ¹i›ª ã                   @   sî  d dl Z d dlZd dl mZmZmZ d dlmZ d dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ e
 ¡ dkrme d¡ dd„ ZdZdZ dZ!dZ"dZ#dZ$dZ%e
 &¡ dkr‹e% 'dd¡Z%dZ(d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>d0Z?d1Z@d2ZAG d3d4„ d4eƒZBG d5d6„ d6eBƒZCG d7d8„ d8eBƒZDG d9d:„ d:eBƒZEG d;d<„ d<eBƒZFG d=d>„ d>eGƒZHG d?d@„ d@eHƒZIG dAdB„ dBeBeIƒZJe Ke
 ¡  LdC¡dD¡G dEdF„ dFeBƒƒZMG dGdH„ dHeBƒZNG dIdJ„ dJeBƒZOG dKdL„ dLeBƒZPG dMdN„ dNeBƒZQG dOdP„ dPeBƒZRG dQdR„ dReBƒZSG dSdT„ dTeGƒZTG dUdV„ dVeBeTƒZUG dWdX„ dXeBeTƒZVG dYdZ„ dZeBeTƒZWG d[d\„ d\eBƒZXG d]d^„ d^eBƒZYG d_d`„ d`eBƒZZG dadb„ dbeJƒZ[G dcdd„ ddeBƒZ\e Ke
 ¡  LdC¡de¡G dfdg„ dgeBƒƒZ]G dhdi„ dieBƒZ^G djdk„ dkeBƒZ_G dldm„ dmeBƒZ`G dndo„ doeBƒZaG dpdq„ dqeGƒZbG drds„ dseBebƒZcG dtdu„ dueBebƒZdG dvdw„ dweBebƒZeefdxkrõe g¡  dS dS )yé    N)Ú	CFUNCTYPEÚc_intÚc_int32)Úfind_library)Úcontextmanager)Úmkstemp)Úir)Úbinding)Úffi)ÚTestCase)Úopaque_pointers_enabledÚarmv7lzlibgcc_s.so.1c               
   C   sl   t  t j¡} z'z	t  t jd¡ W n t jy#   Y W t  t j| ¡ dS w W t  t j| ¡ dS t  t j| ¡ w )NÚde_DETF)ÚlocaleÚ	setlocaleÚLC_ALLÚError)Úcur© r   úX/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/llvmlite/tests/test_binding.pyÚno_de_locale   s   û"r   aæ  
    ; ModuleID = '<string>'
    source_filename = "asm_sum.c"
    target triple = "{triple}"
    %struct.glob_type = type {{ i64, [2 x i64]}}
    %struct.glob_type_vec = type {{ i64, <2 x i64>}}

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

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

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

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

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

    define i32 @mul(i32 %.1, i32 %.2) {{
      %.3 = mul i32 %.1, %.2
      ret i32 %.3
    }}
    a  
    ; ModuleID = '<string>'
    target triple = "{triple}"
    @mul_glob = global i32 0

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

    declare i8* @Py_GetVersion()

    define void @getversion(i32 %.1, i32 %.2) {{
      %1 = call i8* @Py_GetVersion()
      ret void
    }}
    Ú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                   @   s<   e Zd Zdd„ Zdd„ Zedfdd„Zdd	d
„Zdd„ ZdS )ÚBaseTestc                 C   sB   t  ¡  t  ¡  t  ¡  t ¡  tjd d … | _g tjd d …< d S ©N)ÚllvmÚ
initializeÚinitialize_native_targetÚinitialize_native_asmprinterÚgcÚcollectÚgarbageÚold_garbage©Úselfr   r   r   ÚsetUp  s   zBaseTest.setUpc                 C   s   t  ¡  |  t jg ¡ | `d S r%   )r*   r+   ÚassertEqualr,   r-   r.   r   r   r   ÚtearDown˜  s   zBaseTest.tearDownNc                 C   s    |j t ¡ d}t ||¡}|S )N©Útriple)Úformatr&   Úget_default_tripleÚparse_assembly)r/   ÚasmÚcontextÚmodr   r   r   Úmodule¡  s   zBaseTest.moduleÚglobc                 C   s   |d u r|   ¡ }| |¡S r%   )r;   Úget_global_variable)r/   Únamer:   r   r   r   r<   ¦  s   
zBaseTest.globc                C   s   t j ¡ }|j|dS )N©Újit)r&   ÚTargetÚfrom_default_tripleÚcreate_target_machine)r/   r@   Útargetr   r   r   Útarget_machine«  s   
zBaseTest.target_machine)r<   N)	Ú__name__Ú
__module__Ú__qualname__r0   r2   Úasm_sumr;   r<   rE   r   r   r   r   r$   Ž  s    	
r$   c                   @   s@   e Zd ZdZe ej d¡d¡e e	j
 d¡d¡dd„ ƒƒZdS )	ÚTestDependencieszB
    Test DLL dependencies are within a certain expected set.
    ÚlinuxzLinux-specific testÚLLVMLITE_DIST_TESTzDistribution-specific testc                 C   s<  t jj}tj ¡ }d|d< tjdd|gtj|d}| 	¡ \}}|  
d|j¡ t d¡}tƒ }| ¡  ¡ D ]/}| ¡ }	|	rc|	d dkrc|	d	 }
| |
¡}t|	ƒd
ksS|s[|  d|f ¡ | | d	¡¡ q4d|vsld|vrt|  d|f ¡ tg d¢ƒ}t ¡ dkr…| d¡ |D ]}
|
 d¡s›|
|vr›|  d|
|f ¡ q‡d S )NÚCÚLANGÚobjdumpz-p)ÚstdoutÚenvr   z%^([+-_a-zA-Z0-9]+)\.so(?:\.\d+){0,3}$ÚNEEDEDé   é   zinvalid NEEDED line: %rÚlibcÚ
libpthreadz#failed parsing dependencies? got %r)	ÚlibrtÚlibdlrV   ÚlibzÚlibmÚlibgcc_srU   zld-linuxÚld64r   Úlibtinfoz	ld-linux-zunexpected dependency %r in %r)r
   ÚlibÚ_nameÚosÚenvironÚcopyÚ
subprocessÚPopenÚPIPEÚcommunicater1   Ú
returncodeÚreÚcompileÚsetÚdecodeÚ
splitlinesÚsplitÚmatchÚlenÚfailÚaddÚgroupÚplatformÚpython_implementationÚ
startswith)r/   Úlib_pathrQ   ÚpÚoutÚ_Úlib_patÚdepsÚlineÚpartsÚdepÚmÚallowedr   r   r   Ú
test_linuxµ  s:   
ÿ

€
€þzTestDependencies.test_linuxN)rF   rG   rH   Ú__doc__ÚunittestÚ
skipUnlessÚsysrs   ru   r`   ra   Úgetr   r   r   r   r   rJ   °  s    ÿÿrJ   c                       s\   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚTestRISCVABIz`
    Test calling convention of floating point arguments of RISC-V
    using different ABI.
    zriscv32-unknown-linuxc                    s   t ƒ  ¡  t ¡  t ¡  d S r%   )Úsuperr0   r&   Úinitialize_all_targetsÚinitialize_all_asmprintersr.   ©Ú	__class__r   r   r0   á  s   
zTestRISCVABI.setUpc              
   C   sX   z
t j | j¡ W d S  ty+ } zdt|ƒv r|  d¡ n|‚W Y d }~d S d }~ww )Nz/No available targets are compatible with triplez(RISCV target unsupported by linked LLVM.)r&   rA   Úfrom_tripler4   ÚRuntimeErrorÚstrÚskipTest)r/   Úer   r   r   Úcheck_riscv_targetæ  s   þ€þzTestRISCVABI.check_riscv_targetc                 K   s   t j | j¡}|jdi |¤ŽS )Nr   )r&   rA   r   r4   rC   )r/   ÚkwargÚlltargetr   r   r   Úriscv_target_machineï  s   z!TestRISCVABI.riscv_target_machinec                 C   s   t  ¡ }t  ¡ }t  |||f¡}t  ¡ }t j||dd}| ¡ }t  |¡}|j\}}	| 	||¡}
| 
|
|	¡}| |¡ t t|ƒ¡}| ¡  |S )NÚfpadd©r>   )r   Ú
DoubleTypeÚ	FloatTypeÚFunctionTypeÚModuleÚFunctionÚappend_basic_blockÚ	IRBuilderÚargsÚfpextÚfaddr!   r&   r7   r   Úverify)r/   Úf64Úf32Úfntyr;   ÚfuncÚblockÚbuilderÚaÚbÚarg0ÚresultÚllmodr   r   r   Úfpadd_ll_moduleó  s   


zTestRISCVABI.fpadd_ll_modulec                 C   sD   g }|  ¡ D ]}| ¡ }| d¡s| d¡s|dks| |¡ q|S )NÚ.r–   Ú )rl   Ústripru   Úappend)r/   r8   Úasm_listr|   Ús_liner   r   r   Úbreak_up_asm  s   
€zTestRISCVABI.break_up_asmc                 C   ó:   |   ¡  |  ¡ }| jddd}|  |  | |¡¡t¡ d S )Nú+f,+dÚilp32©ÚfeaturesÚabiname)r’   r®   r•   r1   rµ   Úemit_assemblyÚriscv_asm_ilp32©r/   r­   rD   r   r   r   Útest_rv32d_ilp32  ó   ÿzTestRISCVABI.test_rv32d_ilp32c                 C   r¶   )Nr·   Úilp32fr¹   )r’   r®   r•   r1   rµ   r¼   Úriscv_asm_ilp32fr¾   r   r   r   Útest_rv32d_ilp32f  rÀ   zTestRISCVABI.test_rv32d_ilp32fc                 C   r¶   )Nr·   Úilp32dr¹   )r’   r®   r•   r1   rµ   r¼   Úriscv_asm_ilp32dr¾   r   r   r   Útest_rv32d_ilp32d  rÀ   zTestRISCVABI.test_rv32d_ilp32d)rF   rG   rH   r‚   r4   r0   r’   r•   r®   rµ   r¿   rÃ   rÆ   Ú__classcell__r   r   r‹   r   r‡   Ú  s    		r‡   c                   @   s–   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze eƒ d¡dd„ ƒZdd „ Zd!S )"ÚTestMiscz7
    Test miscellaneous functions in llvm.binding.
    c                 C   s   |   t¡ d S r%   )r;   rI   r.   r   r   r   Útest_parse_assembly(  ó   zTestMisc.test_parse_assemblyc                 C   sZ   |   t¡}|  t¡ W d   ƒ n1 sw   Y  t|jƒ}|  d|¡ |  d|¡ d S )Nzparsing errorzinvalid operand type)ÚassertRaisesrŽ   r;   Úasm_parse_errorr   Ú	exceptionÚassertIn)r/   ÚcmÚsr   r   r   Útest_parse_assembly_error+  s   ÿ
z"TestMisc.test_parse_assembly_errorc                 C   sj   t  ¡ }t  t  d¡g ¡}t  ||d¡}t  |jdd¡}| t  t  d¡d¡¡ t	|ƒ}|  
|t¡ d S )Né    Úfooz<>!*''#r—   i90  )r   r›   rš   ÚIntTyperœ   rž   r   r!   ÚConstantr   r1   Úasm_nonalphanum_blocklabel)r/   r:   ÚftÚfnÚbdr8   r   r   r   Útest_nonalphanum_block_name2  s   z$TestMisc.test_nonalphanum_block_namec                 C   s$   t j ¡ }t j ¡ }||ksJ ‚d S r%   )r&   r9   Úget_global_context)r/   Ú	gcontext1Ú	gcontext2r   r   r   Útest_global_context;  s   

zTestMisc.test_global_contextc                 C   sH   t  dd¡ t  dd¡ t  d¡}|  |d¡ t  d¡}|  |d ¡ d S )NÚ__xyzzyéÒ  i.  Ú__foobar)r&   Ú
add_symbolÚaddress_of_symbolr1   ÚassertIs)r/   Úaddrr   r   r   Útest_dylib_symbols@  s   

zTestMisc.test_dylib_symbolsc                 C   ó"   t  ¡ }|  |t¡ |  |¡ d S r%   )r&   r6   ÚassertIsInstancer   Ú
assertTrue)r/   r4   r   r   r   Útest_get_default_tripleH  ó   z TestMisc.test_get_default_triplec                 C   sb   dd„ }t  ¡ }t  ¡ }|  |t¡ |  |¡ || d¡d ƒ}|| d¡d ƒ}|  ||¡ d S )Nc                 S   s   | dkrdS | S )NÚpowerpc64leÚppc64ler   )Úarchr   r   r   Únormalize_ppcO  s   z7TestMisc.test_get_process_triple.<locals>.normalize_ppcú-r   )r&   Úget_process_tripler6   rè   r   ré   rm   r1   )r/   rï   r4   ÚdefaultÚdefault_archÚtriple_archr   r   r   Útest_get_process_tripleM  s   
z TestMisc.test_get_process_triplec                 C   sä   t  ¡ }|  |t¡ |  |t j¡ | ¡ D ]\}}|  |t¡ |  |¡ |  |t¡ q|  | 	¡ t¡ d}d 
|¡}|  t |d¡¡ |  t |d¡¡ |  t |d¡¡ t|ƒdkre|  | 	¡ d¡ d S |  t || 	¡ ¡¡ d S )Nz[+\-][a-zA-Z0-9\._-]+z^({0}|{0}(,{0})*)?$r°   z+aaz+a,-bbr   )r&   Úget_host_cpu_featuresrè   ÚdictÚ
FeatureMapÚitemsr   ré   ÚboolÚflattenr5   ÚassertIsNotNonerh   rn   ro   r1   )r/   rº   ÚkÚvÚre_termÚregexr   r   r   Útest_get_host_cpu_features_  s    

z#TestMisc.test_get_host_cpu_featuresc                 C   rç   r%   )r&   Úget_host_cpu_namerè   r   ré   )r/   Úcpur   r   r   Útest_get_host_cpu_namev  rë   zTestMisc.test_get_host_cpu_namec                 C   ó   d}t  tjd|g¡ d S )Na2  if 1:
            from llvmlite import binding as llvm

            llvm.initialize()
            llvm.initialize_native_target()
            llvm.initialize_native_asmprinter()
            llvm.initialize_all_targets()
            llvm.initialize_all_asmprinters()
            llvm.shutdown()
            ú-c©rc   Ú
check_callr…   Ú
executable©r/   Úcoder   r   r   Útest_initfini{  s   
zTestMisc.test_initfinic                 C   r  )Nz„if 1:
            from llvmlite import binding as llvm

            llvm.set_option("progname", "-debug-pass=Disabled")
            r  r  r
  r   r   r   Útest_set_optionˆ  s   zTestMisc.test_set_optionc                 C   s0   t j\}}}d}|  ||¡ |  |tdƒ¡ d S )N)é   é   é   )r&   Úllvm_version_inforÎ   Úrange)r/   ÚmajorÚminorÚpatchÚvalidr   r   r   Útest_version’  s   zTestMisc.test_versionc                 C   s   t  ¡  d S r%   )r&   Úcheck_jit_executionr.   r   r   r   Útest_check_jit_execution™  s   z!TestMisc.test_check_jit_executionzLocale not availablec                 C   s8   |   t¡}t|ƒ}t tjd¡ t|ƒ}|  ||¡ d S )Nr   )r;   Úasm_double_localer   r   r   r   r1   )r/   r   ÚexpectÚgotr   r   r   Útest_print_double_localeœ  s
   
z!TestMisc.test_print_double_localec                 C   s$   d}d}t j|d|g}t |¡ d S )Nzfrom llvmlite import bindingz-Werrorr  )r…   r	  rc   r  )r/   r  ÚflagsÚcmdargsr   r   r   Útest_no_accidental_warnings¨  s   z$TestMisc.test_no_accidental_warningsN)rF   rG   rH   r‚   rÉ   rÑ   rÚ   rÞ   ræ   rê   rõ   r  r  r  r  r  r  rƒ   ÚskipIfr   r  r   r   r   r   r   rÈ   #  s$    	

rÈ   c                   @   s´   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+S ),ÚTestModuleRefc                 C   s*   |   ¡ }t|ƒ ¡ }|  | d¡|¡ d S )Nz; ModuleID =)r;   r   r±   ré   ru   ©r/   r:   rÐ   r   r   r   Útest_str±  s   zTestModuleRef.test_strc                 C   sX   |   ¡ }t|ƒ | ¡  |  tj¡ t|ƒ W d   ƒ n1 s!w   Y  | ¡  d S r%   )r;   r   ÚcloserË   ÚctypesÚArgumentError©r/   r:   r   r   r   Ú
test_close¶  s   
ÿzTestModuleRef.test_closec              	   C   sÔ   |   ¡ }t|ƒ | t|ƒ W d   ƒ n1 sw   Y  |  tj¡ t|ƒ W d   ƒ n1 s3w   Y  |  t¡# | W d   ƒ n1 sKw   Y  W d   ƒ d S W d   ƒ d S 1 scw   Y  d S r%   )r;   r   rË   r&  r'  rŽ   r(  r   r   r   Ú	test_with¾  s   
ÿ
ÿÿÿ"ÿzTestModuleRef.test_withc                 C   s4   |   ¡ }d|_|  |jd¡ d|_|  |jd¡ d S )NrÓ   Úbar)r;   r>   r1   r(  r   r   r   Ú	test_nameÉ  s
   zTestModuleRef.test_namec                 C   s   |   ¡ }|  |jd¡ d S )Nz	asm_sum.c)r;   r1   Úsource_filer(  r   r   r   Útest_source_fileÐ  s   zTestModuleRef.test_source_filec                 C   s2   |   ¡ }|j}|  |t¡ ||_|  ||j¡ d S r%   )r;   Údata_layoutrè   r   r1   r#  r   r   r   Útest_data_layoutÔ  s
   zTestModuleRef.test_data_layoutc                 C   s6   |   ¡ }|j}|  |t ¡ ¡ d|_|  |jd¡ d S )Nr°   )r;   r4   r1   r&   r6   r#  r   r   r   Útest_tripleÛ  s
   zTestModuleRef.test_triplec                 C   sn   |   ¡ }|  | ¡ d ¡ |   t¡}|  t¡}| ¡  W d   ƒ n1 s%w   Y  t|jƒ}|  d|¡ d S )Nz%.bug = add i32 1, %.bug)	r;   rä   r¢   Úasm_verification_failrË   rŽ   r   rÍ   rÎ   )r/   r:   rÏ   rÐ   r   r   r   Útest_verifyâ  s   

ÿ
zTestModuleRef.test_verifyc                 C   ór   |   ¡ }| d¡}|  |tj¡ |  |jd¡ |  t¡ | d¡ W d   ƒ n1 s,w   Y  ~t	|j ƒ d S )NÚsumrÓ   )
r;   Úget_functionrè   r&   ÚValueRefr1   r>   rË   Ú	NameErrorr   ©r/   r:   rØ   r   r   r   Útest_get_functioní  ó   
ÿzTestModuleRef.test_get_functionc                 C   sp   |   ¡ }| d¡}|  |jd¡ |  t dt|ƒ¡¡ |  t	¡ | d¡ W d   ƒ d S 1 s1w   Y  d S )Nústruct.glob_typeú8%struct\.glob_type(\.[\d]+)? = type { i64, \[2 x i64\] }zstruct.doesnt_exist)
r;   Úget_struct_typer1   r>   rü   rh   rn   r   rË   r8  )r/   r:   Úst_tyr   r   r   Útest_get_struct_typeú  s   
þ"ÿz"TestModuleRef.test_get_struct_typec                 C   r4  )Nr<   r+  )
r;   r=   rè   r&   r7  r1   r>   rË   r8  r   )r/   r:   Úgvr   r   r   Útest_get_global_variable  r;  z&TestModuleRef.test_get_global_variablec                 C   sN   |   ¡ }|j}~t|dd„ d}|  t|ƒd¡ |  dd„ |D ƒg d¢¡ d S )Nc                 S   s   | j S r%   r—   )Úvaluer   r   r   Ú<lambda>  s    z5TestModuleRef.test_global_variables.<locals>.<lambda>)Úkeyé   c                 S   s   g | ]}|j ‘qS r   r—   )Ú.0Úgr   r   r   Ú
<listcomp>  ó    z7TestModuleRef.test_global_variables.<locals>.<listcomp>)r<   Úglob_bÚglob_fÚglob_struct)r;   Úglobal_variablesÚsortedr1   ro   )r/   r:   ÚitÚglobsr   r   r   Útest_global_variables  s   ÿz#TestModuleRef.test_global_variablesc                 C   s>   |   ¡ }|j}~t|ƒ}|  t|ƒd¡ |  |d jd¡ d S ©NrS   r   r5  )r;   Ú	functionsÚlistr1   ro   r>   )r/   r:   rP  Úfuncsr   r   r   Útest_functions  s   zTestModuleRef.test_functionsc                 C   s^   |   ¡ }|j}~t|ƒ}|  t|ƒd¡ |  t d|d j¡¡ |  t dt	|d ƒ¡¡ d S )NrS   ústruct\.glob_type(\.[\d]+)?r   r=  )
r;   Ústruct_typesrU  r1   ro   rü   rh   rn   r>   r   )r/   r:   rP  Ústructsr   r   r   Útest_structs$  s   
ÿ

þzTestModuleRef.test_structsc                 C   sŠ   |   ¡ }|   t¡}| |¡ |  tdd„ |jD ƒƒddg¡ | d¡ | ¡  |  t	j
¡ | d¡ W d   ƒ d S 1 s>w   Y  d S )Nc                 s   ó    | ]}|j V  qd S r%   r—   ©rG  Úfr   r   r   Ú	<genexpr>5  ó   € z-TestModuleRef.test_link_in.<locals>.<genexpr>Úmulr5  )r;   Úasm_mulÚlink_inr1   rO  rT  r6  r%  rË   r&  r'  )r/   ÚdestÚsrcr   r   r   Útest_link_in0  s   

ÿ
"ÿzTestModuleRef.test_link_inc                 C   st   |   ¡ }|   t¡}|j|dd |  tdd„ |jD ƒƒddg¡ | ¡  |  tdd„ |jD ƒƒdg¡ | d¡ d S )NT©Úpreservec                 s   r\  r%   r—   r]  r   r   r   r_  @  r`  z6TestModuleRef.test_link_in_preserve.<locals>.<genexpr>ra  r5  c                 s   r\  r%   r—   r]  r   r   r   r_  B  r`  )r;   rb  rc  r1   rO  rT  r%  r6  )r/   rd  Úsrc2r   r   r   Útest_link_in_preserve;  s   
ÿz#TestModuleRef.test_link_in_preservec                 C   s\   |   ¡ }|   t¡}|  t¡}| |¡ W d   ƒ n1 sw   Y  |  dt|jƒ¡ d S )Nzsymbol multiply defined)r;   Úasm_sum2rË   rŽ   rc  rÎ   r   rÍ   )r/   rd  re  rÏ   r   r   r   Útest_link_in_errorE  s   
ÿz TestModuleRef.test_link_in_errorc                 C   s6   |   ¡ }| ¡ }d}d}|  | |¡p| |¡¡ d S )Ns   ÞÀs   BC)r;   Ú
as_bitcoderé   ru   )r/   r:   ÚbcÚbitcode_wrapper_magicÚbitcode_magicr   r   r   Útest_as_bitcodeN  s   ÿzTestModuleRef.test_as_bitcodec                 C   s\   |   t¡}t d¡ W d   ƒ n1 sw   Y  |  dt|jƒ¡ |  dt|jƒ¡ d S )Nó    zLLVM bitcode parsing errorz(file too small to contain bitcode header)rË   rŽ   r&   Úparse_bitcoderÎ   r   rÍ   )r/   rÏ   r   r   r   Útest_parse_bitcode_errorX  s   ÿ
ÿz&TestModuleRef.test_parse_bitcode_errorc                 C   sT   t  ¡ }| j|d ¡ }t  ¡ }t  ||¡}|  | ¡ |¡ | d¡ | d¡ d S )N©r9   r5  r<   )r&   Úcreate_contextr;   rm  rs  r1   r6  r=   )r/   Úcontext1rn  Úcontext2r:   r   r   r   Útest_bitcode_roundtrip`  s   
z$TestModuleRef.test_bitcode_roundtripc                 C   s4   |   ¡ }| ¡ }|  ||¡ |  | ¡ | ¡ ¡ d S r%   )r;   ÚcloneÚassertIsNotr1   rm  )r/   r   Úclonedr   r   r   Útest_cloningk  s   zTestModuleRef.test_cloningN)rF   rG   rH   r$  r)  r*  r,  r.  r0  r1  r3  r:  r@  rB  rR  rW  r[  rf  rj  rl  rq  rt  ry  r}  r   r   r   r   r"  ¯  s,    	
	
r"  c                   @   s‚   e Zd ZdZd dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )!ÚJITTestMixinz*
    Mixin for ExecutionEngine tests.
    r5  c                 C   s,   |  ¡  | |¡}|  |¡ ttttƒ|ƒS r%   )Úfinalize_objectÚget_function_addressré   r   r   )r/   ÚeeÚ	func_nameÚcfptrr   r   r   Úget_sumw  s   

zJITTestMixin.get_sumc                 C   sX   |   ¡ }|  |¡}|  |¡}|ddƒ}|  d|¡ W d   ƒ d S 1 s%w   Y  d S ©NrT   éûÿÿÿéýÿÿÿ)r;   r@   r„  r1   )r/   r:   r  ÚcfuncÚresr   r   r   Útest_run_code}  s   

"ýzJITTestMixin.test_run_codec                 C   sX   |   |  ¡ ¡}| ¡  | ¡  |  tj¡ | ¡  W d   ƒ d S 1 s%w   Y  d S r%   )r@   r;   r%  rË   r&  r'  r  ©r/   r  r   r   r   r)  „  s   
"ÿzJITTestMixin.test_closec              	   C   sº   |   |  ¡ ¡}| W d   ƒ n1 sw   Y  |  t¡ | W d   ƒ n1 s,w   Y  W d   ƒ n1 s;w   Y  |  tj¡ | ¡  W d   ƒ d S 1 sVw   Y  d S r%   )r@   r;   rË   rŽ   r&  r'  r  r‹  r   r   r   r*  ‹  s   ÿÿ€ÿ
"ÿzJITTestMixin.test_withc                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r%   ©r;   r@   r%  ©r/   r:   r  r   r   r   Útest_module_lifetime•  ó   
z!JITTestMixin.test_module_lifetimec                 C   s&   |   ¡ }|  |¡}| ¡  | ¡  d S r%   rŒ  r  r   r   r   Útest_module_lifetime2›  r  z"JITTestMixin.test_module_lifetime2c                 C   sz   |   |  ¡ ¡}|  t¡}| |¡ |  t¡ | |¡ W d   ƒ n1 s&w   Y  |  |j¡ | ¡  |  	|j¡ d S r%   )
r@   r;   rb  Ú
add_modulerË   ÚKeyErrorÚassertFalseÚclosedr%  ré   ©r/   r  r:   r   r   r   Útest_add_module¡  s   

ÿzJITTestMixin.test_add_modulec                 C   s6   |   |  ¡ ¡}|  t¡}| |¡ | ¡  | ¡  d S r%   ©r@   r;   rb  r‘  r%  r•  r   r   r   Útest_add_module_lifetime«  ó
   

z%JITTestMixin.test_add_module_lifetimec                 C   s6   |   |  ¡ ¡}|  t¡}| |¡ | ¡  | ¡  d S r%   r—  r•  r   r   r   Útest_add_module_lifetime2²  r™  z&JITTestMixin.test_add_module_lifetime2c                 C   s„   |   |  ¡ ¡}|  t¡}| |¡ | |¡ |  t¡ | |¡ W d   ƒ n1 s+w   Y  |  |j¡ | 	¡  |  |j¡ d S r%   )
r@   r;   rb  r‘  Úremove_modulerË   r’  r“  r”  r%  r•  r   r   r   Útest_remove_module¹  s   


ÿzJITTestMixin.test_remove_modulec                 C   s>   |   ¡ }|  |¡}|j}|  |j|¡ t|ƒ ~~t|ƒ d S r%   )r;   r@   Útarget_datarä   r   )r/   r:   r  Útdr   r   r   Útest_target_dataÄ  s   
zJITTestMixin.test_target_datac           	      C   sè   |   ¡ }|  |¡}|j}| d¡}| d¡}| d¡}tjdk r"dnd}|||fD ]}|  | |j¡|¡ q)|  | |j	¡d¡ |  | 
|j	¡d¡ |  | |j	¡d¡ |  | 
|j	¡d¡ |  | |j	¡d	¡ |  | 
|j	¡d
¡ d S )Nr<   rK  rM  ì        rF  r  rS   )rS   rT   rF  é   )rF  r  )r;   r@   r  r=   r…   Úmaxsizer1   Úget_abi_sizeÚtypeÚglobal_value_typeÚget_abi_alignmentrÎ   )	r/   r:   r  rž  Úgv_i32Úgv_i8Ú	gv_structÚpointer_sizerH  r   r   r   Útest_target_data_abi_enquiriesÎ  s   



z+JITTestMixin.test_target_data_abi_enquiriesc                    sð   g ‰ ‡ fdd„}|   ¡ }|  |¡}| |¡ |  tˆ ƒd¡ |  |¡}|ddƒ |  tˆ ƒd¡ |  ˆ d d |¡ |  ˆ d d t¡ g ˆ d d …< |   t	¡}| 
|¡ |  |d¡}|  tˆ ƒd¡ |  ˆ d d |¡ |  ˆ d d t¡ d S )Nc                    ó   ˆ   | |f¡ d S r%   ©r²   ©r:   Úbuf©Únotifiesr   r   Únotifyæ  ó   z5JITTestMixin.test_object_cache_notify.<locals>.notifyr   rT   r†  rS   ra  )r;   r@   Úset_object_cacher1   ro   r„  rä   rè   Úbytesrb  r‘  )r/   r²  r:   r  rˆ  Úmod2r   r°  r   Útest_object_cache_notifyã  s$   





z%JITTestMixin.test_object_cache_notifyc                    sJ  g ‰g ‰ ‡fdd„}‡ fdd„}|   ¡ }|  |¡}| ||¡ |  tˆƒd¡ |  tˆ ƒd¡ |  |¡}|  tˆƒd¡ |  tˆ ƒd¡ |  ˆ d |¡ ˆd d ‰‡ ‡fdd„}g ˆd d …< g ˆ d d …< |   t¡}|  |¡}| ||¡ |  tˆƒd¡ |  tˆ ƒd¡ |  |¡}|  |d	d
ƒd¡ |  tˆƒd¡ |  tˆ ƒd¡ d S )Nc                    r¬  r%   r­  r®  r°  r   r   r²    r³  z8JITTestMixin.test_object_cache_getbuffer.<locals>.notifyc                    s   ˆ   | ¡ d S r%   r­  ©r:   )Ú
getbuffersr   r   Ú	getbuffer  rÊ   z;JITTestMixin.test_object_cache_getbuffer.<locals>.getbufferr   rS   c                    s   ˆ   | ¡ ˆS r%   r­  r¸  )r¹  Ú
sum_bufferr   r   Úgetbuffer_successful  s   
zFJITTestMixin.test_object_cache_getbuffer.<locals>.getbuffer_successfulrT   r†  r‡  )r;   r@   r´  r1   ro   r„  rä   rb  )r/   r²  rº  r:   r  rˆ  r¼  r   )r¹  r±  r»  r   Útest_object_cache_getbufferþ  s4   




z(JITTestMixin.test_object_cache_getbufferN)r5  )rF   rG   rH   r‚   r„  rŠ  r)  r*  rŽ  r  r–  r˜  rš  rœ  rŸ  r«  r·  r½  r   r   r   r   r~  r  s     



r~  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚJITWithTMTestMixinc                 C   sf   | j dd}|  ¡ }|  ||¡}| |¡}|  d|¡ | d¡ | |¡}|  d|¡ |  ||¡ dS )z%Test TargetMachineRef.emit_assembly()Tr?   r5  N)rE   r;   r@   r¼   rÎ   Úset_asm_verbosityÚassertNotEqual)r/   rE   r:   r  Úraw_asmÚraw_asm_verboser   r   r   Útest_emit_assembly-  s   


z%JITWithTMTestMixin.test_emit_assemblyc                 C   s^   | j dd}|  ¡ }|  ||¡}| |¡}|  |t¡ tj d¡r-|  	d|dd… ¡ dS dS )z#Test TargetMachineRef.emit_object()Tr?   rK   s   ELFNé
   )
rE   r;   r@   Úemit_objectrè   rµ  r…   rs   ru   rÎ   )r/   rE   r:   r  Úcode_objectr   r   r   Útest_emit_object9  s   
þz#JITWithTMTestMixin.test_emit_objectN)rF   rG   rH   rÄ  rÈ  r   r   r   r   r¿  +  s    r¿  c                   @   s   e Zd ZdZddd„ZdS )Ú	TestMCJitz@
    Test JIT engines created with create_mcjit_compiler().
    Nc                 C   s    |d u r
| j dd}t ||¡S )NTr?   )rE   r&   Úcreate_mcjit_compiler)r/   r:   rE   r   r   r   r@   J  s   zTestMCJit.jitr%   )rF   rG   rH   r‚   r@   r   r   r   r   rÉ  E  s    rÉ  Úx86úx86 onlyc                   @   sª   e Zd Zedddeeeeƒdfdd„Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ ZdS )&ÚTestOrcLLJITr5  NFc                 C   sv   t j|d|d}t  ¡ }|r| ¡  | |jt  ¡ d¡ |¡ ||¡}	|	| }
|  	|
¡ |  
||	j¡ ||	||
ƒfS )NF)Úuse_jit_linkÚsuppress_errorsr3   )r&   Úcreate_lljit_compilerÚJITLibraryBuilderÚadd_current_processÚadd_irr5   r6   Úexport_symbolÚlinkré   r1   r>   )r/   r8   r‚  rE   Úadd_processÚ	func_typerÏ  Úlljitr¨   Úrtrƒ  r   r   r   r@   W  s    þý
zTestOrcLLJIT.jitc                 C   s:   t  ¡ }t  ¡  dd¡ d¡ |d¡}|  |d d¡ d S )Nrß   rà   rÓ   )r&   rÐ  rÑ  Úimport_symbolrÔ  rÕ  r1   ©r/   rØ  rÙ  r   r   r   Útest_define_symbolj  s
   ÿzTestOrcLLJIT.test_define_symbolc                 C   s¬   t  ¡ }|  td¡ | dd¡ W d   ƒ n1 sw   Y  t  ¡  dd¡ d¡ |d¡}|  	|d d¡ |  td¡ | dd¡ W d   ƒ d S 1 sOw   Y  d S )NzNo such libraryrÓ   rá   rß   rà   r   zSymbols not found.*__foobar)
r&   rÐ  ÚassertRaisesRegexrŽ   ÚlookuprÑ  rÚ  rÔ  rÕ  rÁ  rÛ  r   r   r   Ú"test_lookup_undefined_symbol_failsp  s   ÿÿÿ"þz/TestOrcLLJIT.test_lookup_undefined_symbol_failsc                 C   s^   t jdkr$|  td¡ tjdd W d   ƒ d S 1 sw   Y  d S |  tjdd¡ d S )NÚwin32zJITLink .* WindowsT)rÎ  )r…   rs   rÝ  rŽ   r&   rÐ  rü   r.   r   r   r   Útest_jit_link{  s   
ÿ"þzTestOrcLLJIT.test_jit_linkc                 C   sN   |   ¡ \}}}| |ddƒ}|  d|¡ W d   ƒ d S 1 s w   Y  d S r…  )r@   r1   )r/   rØ  rÙ  rˆ  r‰  r   r   r   rŠ  ƒ  s
   
"þzTestOrcLLJIT.test_run_codec                 C   sZ   |   ¡ \}}}| ¡  | ¡  |  t¡ | dd¡ W d   ƒ d S 1 s&w   Y  d S ©NrÓ   rØ   )r@   r%  rË   ÚAssertionErrorrÞ  ©r/   rØ  rÙ  rˆ  r   r   r   r)  ‰  s   "ÿzTestOrcLLJIT.test_closec              	   C   s¼   |   ¡ \}}}| W d   ƒ n1 sw   Y  |  t¡ | W d   ƒ n1 s,w   Y  W d   ƒ n1 s;w   Y  |  t¡ | dd¡ W d   ƒ d S 1 sWw   Y  d S râ  )r@   rË   rŽ   rã  rÞ  rä  r   r   r   r*    s   ÿÿ€ÿ"ÿzTestOrcLLJIT.test_withc                 C   sþ   |   ¡ \}}}t ¡  tjt ¡ d¡ d¡ |d¡}t	t
t
t
ƒ|d ƒddƒ}|  d|¡ |  | dd¡d d¡ |  | dd¡d d¡ |  t¡ | dd¡ W d   ƒ n1 s\w   Y  |  t¡ | dd¡ W d   ƒ d S 1 sxw   Y  d S )Nr3   ra  rT   r†  iöÿÿÿr5  r   )r@   r&   rÑ  rÓ  rb  r5   r6   rÔ  rÕ  r   r   r1   rÁ  rÞ  rË   rŽ   ©r/   rØ  Úrt_sumÚ	cfunc_sumÚrt_mulr‰  r   r   r   Útest_add_ir_moduleš  s    ýÿ"ÿzTestOrcLLJIT.test_add_ir_modulec                 C   sZ   |   ¡ \}}}~t ¡  |  t¡ | dd¡ W d   ƒ n1 s"w   Y  | ¡  d S ©Nr5  )r@   r*   r+   rË   rŽ   rÞ  r%  )r/   rØ  ræ  ry   r   r   r   rœ  ©  s   ÿzTestOrcLLJIT.test_remove_modulec                 C   sf   |   ¡ \}}}t ¡  tjt ¡ d¡ d¡ d¡ 	|d¡}t
tttƒ|d ƒddƒ}|  d|¡ d S )Nr3   Ú
square_sumr5  rT   r†  é	   )r@   r&   rÑ  rÓ  Úasm_square_sumr5   r6   rÔ  Úadd_jit_libraryrÕ  r   r   r1   rå  r   r   r   Útest_lib_depends±  s   üzTestOrcLLJIT.test_lib_dependsc                 C   s8   |   ¡ \}}}|j}|  |j|¡ t|ƒ ~t|ƒ d S r%   )r@   r  rä   r   )r/   rØ  rÙ  ry   rž  r   r   r   rŸ  »  s   zTestOrcLLJIT.test_target_datac                 C   s†   t dƒ}t ¡ }t ¡ }| tjt ¡ d¡ dt	 
|¡¡ d¡ |d¡}|d }|  |¡ |  ttƒ|ƒƒ d¡ ~|  |jd¡ d S )Nr   r3   ÚArÓ   é   é   )r   r&   rÐ  rÑ  rÓ  Úasm_ext_ctorsr5   r6   rÚ  r&  Ú	addressofrÔ  rÕ  ré   r1   r   r   rÁ  rC  )r/   Úshared_valuerØ  r¨   rÙ  rÓ   r   r   r   Útest_global_ctors_dtorsÄ  s   ü
z$TestOrcLLJIT.test_global_ctors_dtorsc                 C   sF   d}|   t|¡ | jtddd W d   ƒ d S 1 sw   Y  d S )Nz*Failed to materialize symbols:.*getversionÚ
getversionT)rÏ  )rÝ  rŽ   r@   Úasm_getversion)r/   Úmsgr   r   r   Ú(test_lookup_current_process_symbol_failsÕ  s   "ÿz5TestOrcLLJIT.test_lookup_current_process_symbol_failsc                 C   s   |   tdd d¡ d S )Nr÷  T)r@   rø  r.   r   r   r   Ú"test_lookup_current_process_symbolÝ  s   z/TestOrcLLJIT.test_lookup_current_process_symbolc                    sh   t  ¡ ‰tjt  ¡ d‰‡‡fdd„‰ ‡ fdd„tt ¡ ƒD ƒ}|D ]}| ¡  q"|D ]}| 	¡  q+d S )Nr3   c                    s   ‡ ‡‡fdd„}|S )Nc               
      sD   g } t dƒD ]}|  t ¡  ˆ¡ d¡ ˆdˆ › d|› ¡¡ qd S )Né2   r5  Úsum_ry   )r  r²   r&   rÑ  rÓ  rÔ  rÕ  )ÚtrackingÚc)ÚirØ  Úllvm_irr   r   Údo_workå  s   
ýÿzDTestOrcLLJIT.test_thread_safe.<locals>.compile_many.<locals>.do_workr   )r   r  )rØ  r  )r   r   Úcompile_manyä  s   z3TestOrcLLJIT.test_thread_safe.<locals>.compile_manyc                    s   g | ]
}t jˆ |ƒd ‘qS ))rD   )Ú	threadingÚThread)rG  r   )r  r   r   rI  ï  s    ÿz1TestOrcLLJIT.test_thread_safe.<locals>.<listcomp>)
r&   rÐ  rI   r5   r6   r  r`   Ú	cpu_countÚstartÚjoin)r/   ÚthsÚthr   )r  rØ  r  r   Útest_thread_safeà  s   

ÿ

ÿzTestOrcLLJIT.test_thread_safec                 C   sj   | j dd}|  ¡ }t |¡}t ¡  | |¡¡ d¡ |d¡}t	t
t
t
ƒ|d ƒ}|  |ddƒd¡ d S )NFr?   r5  rT   é   é   )rE   r;   r&   rÐ  rÑ  Úadd_object_imgrÆ  rÔ  rÕ  r   r   r1   )r/   rE   r:   rØ  rÙ  r5  r   r   r   Útest_add_object_fileö  s   
ýz!TestOrcLLJIT.test_add_object_filec           
   	   C   sÈ   | j dd}|  ¡ }| |¡}tƒ \}}zIt |d¡}| |¡ W d   ƒ n1 s+w   Y  t |¡}t 	¡  
|¡ d¡ |d¡}ttttƒ|d ƒ}	|  |	ddƒd¡ W t |¡ d S t |¡ w )NFr?   Úwbr5  rT   r  r  )rE   r;   rÆ  r   r`   ÚfdopenÚwriter&   rÐ  rÑ  Úadd_object_filerÔ  rÕ  r   r   r1   Úunlink)
r/   rE   r:   Úobj_binÚ	temp_descÚ	temp_pathr^  rØ  rÙ  r5  r   r   r   Ú$test_add_object_file_from_filesystem  s"   

ÿ
ýz1TestOrcLLJIT.test_add_object_file_from_filesystem)rF   rG   rH   rI   r   r   r@   rÜ  rß  rá  rŠ  r)  r*  ré  rœ  rï  rŸ  rö  rú  rû  r  r  r  r   r   r   r   rÍ  T  s*    
þ

	rÍ  c                   @   sä   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7S )8ÚTestValueRefc                 C   s&   |   ¡ }| d¡}|  t|ƒd¡ d S )Nr<   z@glob = global i32 0)r;   r=   r1   r   ©r/   r:   r<   r   r   r   r$    s   
zTestValueRef.test_strc                 C   s8   |   ¡ }| d¡}|  |jd¡ d|_|  |jd¡ d S )Nr<   Úfoobar)r;   r=   r1   r>   r  r   r   r   r,    s
   
zTestValueRef.test_namec                 C   óp   |   ¡ }| d¡}|j}|  |jtj¡ ||_|  |j|¡ dD ]}||_|  |jtj¡ |  |jj|¡ q d S )Nr<   )ÚinternalÚexternal)r;   r=   Úlinkagerè   r&   ÚLinkager1   r>   )r/   r:   r<   r  r   r   r   Útest_linkage#  ó   
ýzTestValueRef.test_linkagec                 C   r  )Nr<   )ÚhiddenÚ	protectedrò   )r;   r=   Ú
visibilityrè   r&   Ú
Visibilityr1   r>   )r/   r:   r<   r%  r   r   r   Útest_visibility/  r"  zTestValueRef.test_visibilityc                 C   r  )Nr<   )Ú	dllimportÚ	dllexportrò   )r;   r=   Ústorage_classrè   r&   ÚStorageClassr1   r>   )r/   r:   r<   r*  r   r   r   Útest_storage_class;  r"  zTestValueRef.test_storage_classc                 C   sf   |   ¡ }| d¡}| d¡ |  t¡}| d¡ W d   ƒ n1 s#w   Y  |  t|jƒd¡ d S )Nr5  Ú	nocaptureÚzextzno such attribute 'zext')r;   r6  Úadd_function_attributerË   Ú
ValueErrorr1   r   rÍ   )r/   r:   rØ   Úraisesr   r   r   Útest_add_function_attributeG  s   

ÿz(TestValueRef.test_add_function_attributec                 C   s$   |   ¡ }| d¡}|  |j |¡ d S ©Nr<   )r;   r=   rä   r  r   r   r   Útest_moduleO  s   
zTestValueRef.test_modulec                 C   s*   |   ¡ }| d¡}|j}|  |tj¡ d S r3  )r;   r=   r¤  rè   r&   ÚTypeRef©r/   r:   r<   Útpr   r   r   Ú	test_typeT  s   
zTestValueRef.test_typec                 C   sJ   |   ¡ }| d¡}|j}|  |jd¡ | d¡}|  t d|jj¡¡ d S )Nr<   r°   rM  rX  )	r;   r=   r¤  r1   r>   rü   rh   rn   r¥  )r/   r:   r<   r7  Ústr   r   r   Útest_type_nameZ  s   



ÿzTestValueRef.test_type_namec                 C   s,   |   ¡ }| d¡}|j}|  t|ƒd¡ d S )Nr<   Úi32)r;   r=   r¥  r1   r   r6  r   r   r   Útest_type_printing_variablec  s   
z(TestValueRef.test_type_printing_variablec                 C   s(   |   ¡ }| d¡}|  t|jƒd¡ d S )Nr5  zi32 (i32, i32))r;   r6  r1   r   r¥  r9  r   r   r   Útest_type_printing_functioni  s   
z(TestValueRef.test_type_printing_functionc                 C   sr   |   ¡ }| d¡}|  |jj¡ tr|  t dt	|jƒ¡¡ n|  t dt	|jƒ¡¡ |  t dt	|j
ƒ¡¡ d S )NrM  Úptrz%struct\.glob_type(\.[\d]+)?\*r=  )r;   r=   ré   r¤  Ú
is_pointerr   rü   rh   rn   r   r¥  )r/   r:   r9  r   r   r   Útest_type_printing_structn  s   

ÿ
þz&TestValueRef.test_type_printing_structc                 C   ó   |   ¡ }| ¡  | ¡  d S r%   )r<   r%  )r/   r<   r   r   r   r)  |  ó   zTestValueRef.test_closec                 C   s:   |   ¡  d¡}|   t¡ d¡}|  |j¡ |  |j¡ d S rê  )r;   r6  Úasm_sum_declarer“  Úis_declarationré   )r/   ÚdefinedÚdeclaredr   r   r   Útest_is_declaration  s   z TestValueRef.test_is_declarationc                 C   s>   |   t¡}t|jƒ}|  t|ƒd¡ |D ]}|  |j¡ qd S ©NrF  )r;   rI   rU  rN  r1   ro   ré   Ú	is_global)r/   r:   Úgvarsrþ   r   r   r   Útest_module_global_variables‡  s   

ÿz)TestValueRef.test_module_global_variablesc                 C   sÚ   |   ¡ }t|jƒ}|  t|ƒd¡ |d }|  |j¡ |  |jd¡ |  t	¡ |j
 W d   ƒ n1 s5w   Y  |  t	¡ |j W d   ƒ n1 sMw   Y  |  t	¡ |j W d   ƒ d S 1 sfw   Y  d S rS  )r;   rU  rT  r1   ro   ré   Úis_functionr>   rË   r0  ÚinstructionsÚoperandsÚopcode)r/   r:   rV  r¦   r   r   r   Útest_module_functionsŽ  s   
ÿÿ"ÿz"TestValueRef.test_module_functionsc                 C   s  |   ¡ }| d¡}|  |j¡ t|jƒ}|  t|ƒd¡ |  |d j¡ |  |d j¡ |  |d j	d¡ |  t
|d jƒd¡ |  |d j	d¡ |  t
|d jƒd¡ |  t¡ |d j W d   ƒ n1 siw   Y  |  t¡ |d j W d   ƒ d S 1 s„w   Y  d S )Nr5  rT   r   rS   ú.1r;  ú.2)r;   r6  ré   rL  rU  Ú	argumentsr1   ro   Úis_argumentr>   r   r¤  rË   r0  Úblocks)r/   r:   r¦   rŸ   r   r   r   Útest_function_arguments  s"   

ÿ"ÿz$TestValueRef.test_function_argumentsc                 C   s@   |   ¡  d¡}t|jƒ}|  t|ƒd¡ |d }|  |j¡ d S )Nr5  rS   r   )r;   r6  rU  rU  r1   ro   ré   Úis_block)r/   r¦   rU  r§   r   r   r   Útest_function_blocks¯  s
   
z!TestValueRef.test_function_blocksc                 C   sœ   |   ¡  d¡}tt|jƒd jƒ}|  t|ƒd¡ |  |d j¡ |  |d j¡ |  |d j¡ |  |d j	d¡ |  |d j	d¡ |  |d j	d¡ d S )Nr5  r   r  rS   rT   rq   r!   )
r;   r6  rU  rU  rM  r1   ro   ré   Úis_instructionrO  )r/   r¦   Úinstsr   r   r   Útest_block_instructions¶  s   z$TestValueRef.test_block_instructionsc                 C   sÂ   |   ¡  d¡}tt|jƒd jƒd }|  |jd¡ t|jƒ}|  t|ƒd¡ |  	|d j
¡ |  	|d j
¡ |  |d jd¡ |  t|d jƒd¡ |  |d jd¡ |  t|d jƒd¡ d S )	Nr5  r   rq   rT   rS   rQ  r;  rR  )r;   r6  rU  rU  rM  r1   rO  rN  ro   ré   Ú
is_operandr>   r   r¤  )r/   r¦   rq   rN  r   r   r   Útest_instruction_operandsÁ  s   
z&TestValueRef.test_instruction_operandsc                 C   s¦   t jd }|dkrdndg}|  t¡}|jD ]:}t|jƒ}|jdkr)|  ||¡ q|jdkrP|  |g ¡ t|j	ƒ}|  t|d jƒdg¡ |  t|d jƒg ¡ qd S )	Nr   r  s   memory(read)s   readonlyÚa_readonly_funcÚa_arg0_return_funcs   returnedrS   )
r&   r  r;   Úasm_attributesrT  rU  Ú
attributesr>   r1   rS  )r/   ÚverÚreadonly_attrsr:   r¦   ÚattrsrŸ   r   r   r   Útest_function_attributesÎ  s   






€øz%TestValueRef.test_function_attributesc                 C   sü   |   ¡ }|  | d¡jtjj¡ | d¡}|  |jtjj¡ t	|j
ƒd }|  |jtjj¡ t	|jƒd }|  |jtjj¡ |  t	|jƒd jtjj¡ |  t	|jƒd jtjj¡ |   t¡ d¡}t	t	|j
ƒd jƒd }|  t	|jƒd jtjj¡ d S )Nr<   r5  r   rS   rÓ   )r;   r1   r=   Ú
value_kindr&   Ú	ValueKindÚglobal_variabler6  ÚfunctionrU  rU  Úbasic_blockrM  ÚinstructionrN  Úconstant_intÚasm_inlineasmÚ
inline_asm)r/   r:   r¦   r§   ÚinstÚ	iasm_funcÚ	iasm_instr   r   r   Útest_value_kindÜ  s*   ÿ
ÿÿÿzTestValueRef.test_value_kindc                 C   s   |   ¡ }|  | d¡j¡ d}|jD ]-}|  |j¡ |jD ]!}|  |j¡ |jD ]}|  |j¡ |jD ]	}|jr<|d7 }q3q(qq|  	|d¡ d S )Nr<   r   rS   )
r;   ré   r=   Úis_constantrT  rU  r“  rM  rN  r1   )r/   r:   Úconstant_operandsr¦   r§   ro  Úopr   r   r   Útest_is_constantð  s"   



€þþþzTestValueRef.test_is_constantc           	      C   sT  |   ¡ }| d¡}tt|jƒd jƒ}|  |d jd¡ t|d jƒ}|  |d j	¡ |  
|d j	¡ |  |d  ¡ d¡ |  t¡ |d  ¡  W d   ƒ n1 sSw   Y  |   t¡}| d¡}tt|jƒd jƒ}t|d jƒd }t|d jƒd }|  | ¡ d¡ |  |jddd	¡ |jd
d}tj| dd¡ddd}|  |d	¡ d S )Nr5  r   rS   rq   rT   r  T)Ú
signed_intr†  Fr  Úlittle)Úsigned)r;   r6  rU  rU  rM  r1   rO  rN  ré   rs  r“  Úget_constant_valuerË   r0  Úasm_sum3ÚintÚ
from_bytesÚto_bytes)	r/   r:   r¦   rZ  rN  Úposint64Únegint64Úas_u64Úas_i64r   r   r   Útest_constant_int   s.   
ÿ

ÿzTestValueRef.test_constant_intc                 C   s(  |   t¡}| d¡}tt|jƒd jƒ}|  t|ƒd¡ |  |d jd¡ t|d j	ƒ}|  
|d j¡ |  |d  ¡ d¡ |  
|d j¡ |  |d  ¡ d¡ |   t¡}| d¡}tt|jƒd jƒd }t|j	ƒ}|  t¡ |d  ¡  W d   ƒ n1 sw   Y  |  |d jdd	d¡ d S )
NrÓ   r   rT   r¡   g        rS   g…ëQ¸	@T)Úround_fp)r;   r  r6  rU  rU  rM  r1   ro   rO  rN  ré   rs  ÚassertAlmostEqualrz  Úasm_double_inaccuraterË   r0  )r/   r:   r¦   rZ  rN  ro  r   r   r   Útest_constant_fp  s$   




ÿzTestValueRef.test_constant_fpc                 C   sr   |   t¡}| d¡}tt|jƒd jƒd }t|jƒd }|  |j¡ t	r/|  
| ¡ d¡ d S |  
| ¡ d¡ d S )Nr+  r   zptr nullz	i64* null)r;   Úasm_null_constantr6  rU  rU  rM  rN  ré   rs  r   r1   rz  )r/   r:   r¦   ro  Úargr   r   r   Útest_constant_as_string.  s   

z$TestValueRef.test_constant_as_stringc                 C   s   |   t¡}| d¡}t|jƒ}t|d jƒ}|  |d j¡ |  |d j	d¡ t|d j
ƒ}|  t|ƒd¡ |  |d j¡ |  |d j¡ |  |d |d ¡ |  |d |d ¡ |  |d j	d¡ |  t¡ |d j
 W d   ƒ d S 1 syw   Y  d S )NrÓ   éÿÿÿÿr   ÚphirT   rS   )r;   Úasm_phi_blocksr6  rU  rU  rM  ré   rY  r1   rO  Úincoming_blocksro   rW  rÁ  rË   r0  )r/   r:   r¦   rU  rM  rŽ  r   r   r   Útest_incoming_phi_blocks:  s    


"ÿz%TestValueRef.test_incoming_phi_blocksN)rF   rG   rH   r$  r,  r!  r'  r,  r2  r4  r8  r:  r<  r=  r@  r)  rG  rK  rP  rV  rX  r[  r]  re  rr  rv  rƒ  r‡  rŠ  r  r   r   r   r   r    s8    	r  c                   @   ód   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTestTypeRefc                 C   s„   |   ¡ }| d¡}|  t|jƒd¡ | d¡}|  t|ƒd¡ t|jƒ}|  t|ƒd¡ |  t|d ƒd¡ |  t|d ƒd	¡ d S )
Nr<   r;  r<  z+%struct.glob_type = type { i64, [2 x i64] }rT   r   Úi64rS   z	[2 x i64])	r;   r=   r1   r   r¥  r>  rU  Úelementsro   )r/   r:   r<   Úglob_struct_typer“  r   r   r   r$  R  s   


ÿ
zTestTypeRef.test_strc                 C   s0  |   ¡ }| d¡}|  |jjtjj¡ |  |jj	¡ | d¡}|  |jjtjj¡ |  |jj	¡ |j
}|  |jtjj¡ |  |j¡ |j\}}|  |jtjj¡ |  |jtjj¡ |  |j¡ | d¡}|j\}}	|  |	jtjj¡ |  |	j¡ | d¡j}
|  |
jtjj¡ | d¡j
}|  |jtjj¡ d S )Nr<   rM  ústruct.glob_type_vecr5  )r;   r=   r1   r¤  Ú	type_kindr&   ÚTypeKindÚpointerré   r?  r¥  ÚstructÚ	is_structr“  ÚintegerÚarrayÚis_arrayr>  ÚvectorÚ	is_vectorr6  ri  )r/   r:   r<   rM  ÚstypeÚstype_aÚstype_bÚglob_vec_struct_typery   Úvector_typeÚfuncptrÚfunctyper   r   r   Útest_type_kind_  s,   




zTestTypeRef.test_type_kindc                 C   s`   |   ¡ }| d¡}|j\}}|  |jd¡ |  t¡ |j W d   ƒ d S 1 s)w   Y  d S )Nr<  rT   )r;   r>  r“  r1   Úelement_countrË   r0  )r/   r:   r”  ry   Ú
array_typer   r   r   Útest_element_count|  s   

"ÿzTestTypeRef.test_element_countc                 C   sl   |   ¡ }| d¡}| d¡}|j\}}|j\}}|  |jd¡ |  |jd¡ |  |jd¡ |  |jd¡ d S )Nr<  r•  é@   é€   r   )r;   r>  r“  r1   Ú
type_width)r/   r:   r”  r£  Úinteger_typer©  ry   r¤  r   r   r   Útest_type_width„  s   



zTestTypeRef.test_type_widthc                 C   s¼   |   t¡}| d¡}|j}|  |j¡ |   t¡}| d¡}|j}|  |j¡ |  |jj	¡ |  
t¡}|jj W d   ƒ n1 sAw   Y  trS|  dt|jƒ¡ d S |  dt|jƒ¡ d S )NÚvarargr5  zType ptr is not a functionz&Type i32 (i32, i32)* is not a function)r;   Úasm_vararg_declarer6  r¥  ré   Úis_function_varargrC  r“  r¤  r?  rË   r0  r   rÎ   r   rÍ   )r/   r:   r¦   Údecltyper1  r   r   r   Útest_vararg_function‘  s"   




ÿÿz TestTypeRef.test_vararg_functionc                 C   sª   |   ¡ }t|jƒ\}|  |jjtjj¡ |  	|jj
¡ |j}|  |jtjj¡ |  |j
¡ | tj¡}|  |tj¡ |  |jt d¡t d¡f¡ |  |jt d¡¡ d S ©NrÒ   )r;   rU  rT  r1   r¤  r–  r&   r—  r˜  r“  rL  r¥  ri  ré   Úas_irr   Úglobal_contextrè   rš   rŸ   rÔ   Úreturn_type)r/   r:   rØ   r¥   Útyirr   r   r   Útest_function_typeref_as_ir¨  s   z'TestTypeRef.test_function_typeref_as_irc                 C   s`   t  t  ¡ d¡}t  ¡ }t  ||d¡}|  t|ƒ¡}| d¡}|j}|  	|j
| t j¡j
¡ d S )Nr   rÓ   )r   rš   ÚVoidTyper›   rœ   r;   r   r6  r¥  r1   r¸  r¶  r·  )r/   r¥   ÚirmodrØ   r:   Úgvtyr   r   r   Útest_void_typeref_as_ir¹  s   
ÿz#TestTypeRef.test_void_typeref_as_irc              
      sš  ddl m} t ¡ ‰ ddh}i }dd„ }||d< dd	„ }||d
< dd„ }||d< dd„ }||d< ‡ fdd„}||d< dd„ }	|	|d< dd„ }
|
|d< dd„ }||d< |  dd„ | ¡ D ƒt| ¡ ƒt|ƒB ¡ | ¡ D ]_\}}|j|v ruqk||j ƒ D ]N}|  	|›d|› ¡: tj
ˆ d }tj||d!d" t|ƒ}t |¡}| d!¡}|j}| t ¡ ¡}|  ||¡ |  ||¡ W d   ƒ n1 sÄw   Y  q{qkd S )#Nr   )Ú_TypeKindToIRTyperi  Úvoidc                   s   ó    t  ¡ V  d S r%   )r   ÚHalfTyper   r   r   r   Ú
maker_halfÏ  ó   €z9TestTypeRef.test_global_typeref_as_ir.<locals>.maker_halfÚhalfc                   s   rÁ  r%   )r   r™   r   r   r   r   Úmaker_floatÔ  rÄ  z:TestTypeRef.test_global_typeref_as_ir.<locals>.maker_floatÚfloatc                   s   rÁ  r%   )r   r˜   r   r   r   r   Úmaker_doubleÙ  rÄ  z;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_doubleÚdoublec                   s   s    t  d¡V  d S rµ  )r   rÔ   r   r   r   r   Úmaker_integerÞ  s   €z<TestTypeRef.test_global_typeref_as_ir.<locals>.maker_integerr›  c                  3   sL    t  t  d¡¡V  ˆ  d¡ ¡ V  ˆ  d¡} |  t  d¡¡ |  ¡ V  d S )Nr  ÚmyclassÚmyclass2)r   ÚPointerTyperÔ   Úget_identified_typeÚ
as_pointerÚset_body)rÌ  ©Úctxr   r   Úmaker_pointerã  s   €
z<TestTypeRef.test_global_typeref_as_ir.<locals>.maker_pointerr˜  c                   s   s    t  t  d¡d¡V  d S )Nr  é{   )r   Ú	ArrayTyperÔ   r   r   r   r   Úmaker_arrayî  s   €z:TestTypeRef.test_global_typeref_as_ir.<locals>.maker_arrayrœ  c                   s   s    t  t  ¡ d¡V  d S )NrT   )r   Ú
VectorTyper™   r   r   r   r   Úmaker_vectoró  s   €z;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_vectorrž  c                   s   s>    t  t  ¡ t  d¡g¡V  t jt  ¡ t  d¡gddV  d S )Nr«  T©Úpacked)r   ÚLiteralStructTyper™   rÔ   r   r   r   r   Úmaker_structø  s
   €ÿz;TestTypeRef.test_global_typeref_as_ir.<locals>.maker_structr™  c                 S   s   h | ]}|j ’qS r   r—   )rG  Úxr   r   r   Ú	<setcomp>   rJ  z8TestTypeRef.test_global_typeref_as_ir.<locals>.<setcomp>z -> ru  rA  r—   )Úllvmlite.binding.typerefr¿  r   ÚContextr1   Úkeysrj   rù   r>   ÚsubTestr›   ÚGlobalVariabler   r&   r7   r=   r¥  r¶  rè   )r/   r¿  ÚskippedÚmakersrÃ  rÆ  rÈ  rÊ  rÓ  rÖ  rØ  rÜ  r–  ÚirtypeÚtyr¼  r8   r:   rA  r½  r  r   rÑ  r   Útest_global_typeref_as_irÄ  sV   þ	ÿ


÷€ÿýz%TestTypeRef.test_global_typeref_as_irc                 C   s  t  |¡}| |¡}|j}t ¡ }|j|d}tj|d}tj|||j	d}	tj||dd}
t 
|
 ¡ ¡}| |	|
j¡ | ¡  t  t|ƒ¡}| j| |	j	¡jdd |j|dd | jtt|jƒƒtt|jƒƒd	 d
d | j| |	j	¡jdd | j| |	j	¡j| |
j	¡jdd d S )N)Úir_ctxru  r—   Úwrapperzdeclfn must not have a body)rù  Trg  rS   z$the only new function is the wrapperzdeclfn must have a body nowz.declfn and wrapfn must have the same llvm Type)r&   r7   r6  r¥  r   rà  r¶  r›   rœ   r>   rž   r   ÚcallrŸ   Úret_voidr   ré   rD  rc  r1   ro   rU  rT  r“  )r/   r8   Útarget_symbolr:   ÚcppfnÚ	cppfntypeÚ
my_contextrç  Úwrapper_modÚdeclfnÚwrapfnr¨   Únew_modr   r   r   Ú!_check_typeref_as_ir_for_wrappers  s6   

ÿþÿ
þz-TestTypeRef._check_typeref_as_ir_for_wrappersc                 C   ó   |   td¡ dS )ztExercise extracting C++ defined class types.
        Contains both opaque and non-opaque class definitions.
        Ú_Z3fooP7MyClass14MyClassDefinedN)rõ  Úasm_cpp_classr.   r   r   r   Ú,test_typeref_as_ir_for_wrappers_of_cpp_class6  s   þz8TestTypeRef.test_typeref_as_ir_for_wrappers_of_cpp_classc                 C   rö  )z¨Exercise extracting C++ struct types that are passed as vectors.

        IA64 ABI on x86_64 will put struct with two floats as
        a vector of two floats.
        Ú_Z3foo8Vector2DPS_N)rõ  Úasm_cpp_vectorr.   r   r   r   Ú4test_typeref_as_ir_for_wrappers_of_cpp_vector_struct?  s   þz@TestTypeRef.test_typeref_as_ir_for_wrappers_of_cpp_vector_structN)rF   rG   rH   r$  r§  rª  r¯  r´  rº  r¾  rè  rõ  rù  rü  r   r   r   r   r‘  P  s    O#	r‘  c                   @   ó<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú
TestTargetc                 C   sv   t jj}|  t¡}|dƒ W d   ƒ n1 sw   Y  |  dt|jƒ¡ t  ¡ }||ƒ}|  	|j
|¡ | ¡  d S )Nr  z(No available targets are compatible with)r&   rA   r   rË   rŽ   rÎ   r   rÍ   r6   r1   r4   r%  )r/   r^  rÏ   r4   rD   r   r   r   Útest_from_tripleM  s   
ÿÿzTestTarget.test_from_triplec                 C   s@   t j t  ¡ ¡}| ddddd¡ t  ¡ }| |dddd¡ d S )Nr°   rS   rò   )r&   rA   r   r6   rC   r  )r/   rD   r  r   r   r   Útest_create_target_machineX  s   z%TestTarget.test_create_target_machinec                 C   ó<   t j t  ¡ ¡}t j ¡ }|  |jt¡ |  |j|j¡ d S r%   )	r&   rA   r   r6   rB   rè   r>   r   r1   ©r/   ÚtÚur   r   r   r,  `  ó   
zTestTarget.test_namec                 C   r  r%   )	r&   rA   r   r6   rB   rè   Údescriptionr   r1   r  r   r   r   Útest_descriptionf  r  zTestTarget.test_descriptionc                 C   s8   t j t  ¡ ¡}t|ƒ}|  |j|¡ |  |j|¡ d S r%   )r&   rA   r   r6   r   rÎ   r>   r  )r/   rD   rÐ   r   r   r   r$  l  s   zTestTarget.test_strc                 C   s4  dt jjdddddddfd	t jjdddddddfd
t jjdddddddfdt jjdddddddfdt jjdddddddfdt jjdddddddfdt jjdddddddfdt jjdddddddfdt jjd dd!d"dd#dfd$t jjd%ddd&dd'dfg
}|D ]}|\}}t  |¡}|  ||¡ q†d S )(Nzx86_64-scei-ps4Úx86_64r°   Ú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Úv6hlrK   Ú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_partsr1   )r/   ÚcasesÚcaseÚ
triple_strÚ
triple_objr‰  r   r   r   Útest_get_parts_from_tripler  s„   
þÿ
þÿ
þÿ
þÿ
þÿ
þÿ
þÿ
þÿ
þÿ
þÿÛ+
üz%TestTarget.test_get_parts_from_tripleN)	rF   rG   rH   rÿ  r   r,  r  r$  r/  r   r   r   r   rþ  K  s    rþ  c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestTargetDatac                 C   s
   t  d¡S )Nz%e-m:e-i64:64-f80:128-n8:16:32:64-S128)r&   Úcreate_target_datar.   r   r   r   r  ¨  s   
zTestTargetData.target_datac                 C   s(   |   ¡ }|  ¡ }|  | |j¡d¡ d S )Nr  )r  r<   r1   r£  r¤  ©r/   rž  r<   r   r   r   Útest_get_abi_size«  s   z TestTargetData.test_get_abi_sizec                 C   sF   |   ¡ }|  ¡ }|  | |j¡d¡ |  d¡}|  | |j¡d¡ d S )NrF  rM  r¡  )r  r<   r1   r£  r¥  r3  r   r   r   Útest_get_pointee_abi_size°  s
   
z(TestTargetData.test_get_pointee_abi_sizec                 C   s|   |   ¡ }|  d¡}|  t¡ | |jd¡ W d   ƒ n1 s w   Y  |j}|  | |d¡d¡ |  | |d¡d¡ d S )NrM  r   rS   r  )r  r<   rË   r0  Úget_element_offsetr¤  r¥  r1   )r/   rž  r<   Ústruct_typer   r   r   Útest_get_struct_element_offset¹  s   
ÿz-TestTargetData.test_get_struct_element_offsetN)rF   rG   rH   r  r4  r5  r8  r   r   r   r   r1  ¦  s
    	r1  c                   @   r¾  )ÚTestTargetMachinec                 C   s"   | j dd}t ¡ }| |¡ d S ©NFr?   )rE   r&   Úcreate_module_pass_managerÚadd_analysis_passes)r/   ÚtmÚpmr   r   r   Útest_add_analysis_passesÇ  s   z*TestTargetMachine.test_add_analysis_passesc                 C   sN   | j dd}|j}|  ¡ }| d¡}tjdk rdnd}|  | |j¡|¡ d S )NFr?   r<   r   rF  r  )	rE   r  r;   r=   r…   r¢  r1   r£  r¤  )r/   r=  rž  r:   r§  rª  r   r   r   Útest_target_data_from_tmÌ  s   
z*TestTargetMachine.test_target_data_from_tmN)rF   rG   rH   r?  r@  r   r   r   r   r9  Å  s    r9  c                   @   r  )ÚTestPassManagerBuilderc                 C   ó   t  ¡ S r%   )r&   ÚPassManagerBuilderr.   r   r   r   ÚpmbØ  ó   zTestPassManagerBuilder.pmbc                 C   s   t  ¡ }d|_d|_d S )NrT   r  )r&   Úcreate_pass_manager_builderÚinlining_thresholdÚ	opt_level©r/   rD  r   r   r   Útest_old_apiÛ  s   
z#TestPassManagerBuilder.test_old_apic                 C   rA  r%   )rD  r%  rI  r   r   r   r)  á  rB  z!TestPassManagerBuilder.test_closec                 C   ó<   |   ¡ }|  |jt¡ tdƒD ]}||_|  |j|¡ qd S rH  )rD  rè   rH  r|  r  r1   ©r/   rD  r   r   r   r   Útest_opt_levelæ  ó   þz%TestPassManagerBuilder.test_opt_levelc                 C   rK  rH  )rD  rè   Ú
size_levelr|  r  r1   rL  r   r   r   Útest_size_levelí  rN  z&TestPassManagerBuilder.test_size_levelc                 C   sL   |   ¡ }|  t¡ |j W d   ƒ n1 sw   Y  dD ]}||_qd S )N)é   éP   i^  )rD  rË   ÚNotImplementedErrorrG  rL  r   r   r   Útest_inlining_thresholdô  s   ÿÿz.TestPassManagerBuilder.test_inlining_thresholdc                 C   ó8   |   ¡ }|  |jt¡ dD ]}||_|  |j|¡ qd S ©N)TF)rD  rè   Údisable_unroll_loopsrú   r1   ©r/   rD  rª   r   r   r   Útest_disable_unroll_loopsû  ó   þz0TestPassManagerBuilder.test_disable_unroll_loopsc                 C   rU  rV  )rD  rè   Úloop_vectorizerú   r1   rX  r   r   r   Útest_loop_vectorize	  rZ  z*TestPassManagerBuilder.test_loop_vectorizec                 C   rU  rV  )rD  rè   Úslp_vectorizerú   r1   rX  r   r   r   Útest_slp_vectorize		  rZ  z)TestPassManagerBuilder.test_slp_vectorizec                 C   s.   |   ¡ }t ¡ }| |¡ | ¡  | ¡  d S r%   )rD  r&   r;  Úpopulater%  )r/   rD  r>  r   r   r   Ú!test_populate_module_pass_manager	  s
   
z8TestPassManagerBuilder.test_populate_module_pass_managerc                 C   s8   |   ¡ }|  ¡ }t |¡}| |¡ | ¡  | ¡  d S r%   )r;   rD  r&   Úcreate_function_pass_managerr_  r%  )r/   r:   rD  r>  r   r   r   Ú#test_populate_function_pass_manager	  s   

z:TestPassManagerBuilder.test_populate_function_pass_managerN)rF   rG   rH   rD  rJ  r)  rM  rP  rT  rY  r\  r^  r`  rb  r   r   r   r   rA  Ö  s    rA  c                   @   r¾  )ÚPassManagerTestMixinc                 C   s   t  ¡ }d|_d|_|S )NrT   i,  )r&   rF  rH  rG  rI  r   r   r   rD  "	  s   zPassManagerTestMixin.pmbc                 C   rA  r%   ©r>  r%  ©r/   r>  r   r   r   r)  (	  rB  zPassManagerTestMixin.test_closeN)rF   rG   rH   rD  r)  r   r   r   r   rc   	  s    rc  c                   @   rý  )ÚTestModulePassManagerc                 C   rB  r%   ©r&   r;  r.   r   r   r   r>  0	  rE  zTestModulePassManager.pmc                 C   sº   |   ¡ }|  ¡  |¡ |  ¡ }t|ƒ}| |¡ t|ƒ}| ¡ }t|ƒD ]4\}}| ¡  	d¡rXddh}|D ]}	|	|v r= nq5t
dƒ‚||	hA  ¡ }
|  d|¡ |  |
|¡  d S q$t
dƒ‚)Nzret i32ú%.3ú%.4zexpected tokens not foundzexpected IR not found)r>  rD  r_  r;   r   Úrunrl   Ú	enumerater±   ru   rŽ   ÚpoprÎ   ÚassertNotIn)r/   r>  r:   Úorig_asmÚopt_asmÚopt_asm_splitÚidxÚlÚtoksr  Ú
othertokenr   r   r   Útest_run3	  s*   
ÿõzTestModulePassManager.test_runc                 C   s^   |   ¡ }| d¡ |  ¡  |¡ |  t¡}| |¡\}}|  |¡ |  d|¡ |  d|¡ d S )NéF   ÚPassedÚinlineme©	r>  Úadd_function_inlining_passrD  r_  r;   Úasm_inlineasm2Úrun_with_remarksré   rÎ   ©r/   r>  r:   ÚstatusÚremarksr   r   r   Ú'test_run_with_remarks_successful_inlineQ	  s   


z=TestModulePassManager.test_run_with_remarks_successful_inlinec                 C   sj   |   ¡ }| d¡ |  ¡  |¡ |  t¡}| |¡\}}|  |¡ |  d|¡ |  d|¡ |  d|¡ d S )Nr   ÚMissedrx  znoinline function attribute)	r>  rz  rD  r_  r;   Úasm_inlineasm3r|  ré   rÎ   r}  r   r   r   Ú#test_run_with_remarks_failed_inline\	  s   


z9TestModulePassManager.test_run_with_remarks_failed_inlinec                 C   sV   |   ¡ }| d¡ |  ¡  |¡ |  t¡}|j|dd\}}|  |¡ |  d|¡ d S )Nrv  Únothing©Úremarks_filterr°   )	r>  rz  rD  r_  r;   r{  r|  ré   r1   r}  r   r   r   Ú'test_run_with_remarks_inline_filter_outi	  s   


z=TestModulePassManager.test_run_with_remarks_inline_filter_outc                 C   sb   |   ¡ }| d¡ |  ¡  |¡ |  t¡}|j|dd\}}|  |¡ |  d|¡ |  d|¡ d S )Nrv  zinlin.*r…  rw  rx  ry  r}  r   r   r   Ú&test_run_with_remarks_inline_filter_inr	  s   


z<TestModulePassManager.test_run_with_remarks_inline_filter_inN)	rF   rG   rH   r>  ru  r€  rƒ  r‡  rˆ  r   r   r   r   rf  .	  s    	rf  c                   @   s>   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚTestFunctionPassManagerNc                 C   s   |p|   ¡ }t |¡S r%   )r;   r&   ra  r(  r   r   r   r>  	  s   
zTestFunctionPassManager.pmc                 C   s   |   ¡ }| ¡  | ¡  d S r%   )r>  r'   Úfinalizere  r   r   r   r  ƒ	  rB  z%TestFunctionPassManager.test_initfinic                 C   sx   |   ¡ }| d¡}|  |¡}|  ¡  |¡ | ¡  t|ƒ}| ¡  | |¡ | 	¡  t|ƒ}|  
d|¡ |  d|¡ d S )Nr5  ri  )r;   r6  r>  rD  r_  r%  r   r'   rj  rŠ  rÎ   rm  )r/   r:   rØ   r>  rn  ro  r   r   r   ru  ˆ	  s   


z TestFunctionPassManager.test_runc                 C   s€   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  | 	|¡\}}| 
¡  |  |¡ |  d|¡ |  d|¡ d S )NÚlicmrw  ©r;   Úlicm_asmr6  r>  Úadd_licm_passrD  r_  r%  r'   r|  rŠ  ré   rÎ   ©r/   r:   rØ   r>  Úokr  r   r   r   Útest_run_with_remarks—	  s   



z-TestFunctionPassManager.test_run_with_remarksc                 C   sx   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  |j	|dd\}}| 
¡  |  |¡ |  d|¡ d S )Nr‹  r„  r…  r°   )r;   r  r6  r>  rŽ  rD  r_  r%  r'   r|  rŠ  ré   r1   r  r   r   r   Ú test_run_with_remarks_filter_out¦	  s   



z8TestFunctionPassManager.test_run_with_remarks_filter_outc                 C   s„   |   t¡}| d¡}|  |¡}| ¡  |  ¡  |¡ | ¡  | ¡  |j	|dd\}}| 
¡  |  |¡ |  d|¡ |  d|¡ d S )Nr‹  r…  rw  rŒ  r  r   r   r   Útest_run_with_remarks_filter_in´	  s   



z7TestFunctionPassManager.test_run_with_remarks_filter_inr%   )	rF   rG   rH   r>  r  ru  r‘  r’  r“  r   r   r   r   r‰  }	  s    
r‰  c                   @   sB   e Zd Zdd„ Zdd„ Ze e ¡  	d¡d¡dd„ ƒZ
d	d
„ ZdS )Ú
TestPassesc                 C   rB  r%   rg  r.   r   r   r   r>  Æ	  rE  zTestPasses.pmc                 C   sD  t jd }|  ¡ }| d¡ | ¡  | ¡  | ¡  | d¡ | ¡  | 	¡  | 
¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  |dk r{| ¡  | ¡  | d¡ |  ¡  | !¡  | "¡  | #¡  | $¡  | %¡  | &¡  | '¡  | (¡  | )¡  | *¡  | +¡  | ,¡  | -¡  | .¡  |dk rÈ| /¡  | 0¡  | 1¡  | 2¡  | 3¡  | 4¡  | 5¡  | 6¡  | 7¡  | 8¡  | 9¡  | :¡  | ;¡  | <¡  | =¡  | >¡  | ?¡  | @¡  | A¡  | B¡  | C¡  | D¡  | E¡  d S )Nr   r°   éá   r  é   )Fr&   r  r>  Úadd_target_library_infoÚadd_constant_merge_passÚadd_dead_arg_elimination_passÚadd_function_attrs_passrz  Ú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_passrŽ  Ú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)r/   Úllvm_verr>  r   r   r   Útest_populateÉ	  sŽ   



zTestPasses.test_populaterË  rÌ  c                 C   sP   dd„ }|dd}|   dt|ƒ¡ |dd}|  dt|ƒ¡ |   dt|ƒ¡ dS )	zŠTest a specific situation that demonstrate TLI is affecting
        optimization. See https://github.com/numba/numba/issues/8898.
        c                 S   sX   t  t¡}t j |j¡}| ¡ }t  ¡ }| |¡ | r!| 	|j¡ | 
¡  | |¡ |S r%   )r&   r7   Úasm_tli_exp2rA   r   r4   rC   ÚModulePassManagerr<  r—  r¡  rj  )Úuse_tlir:   rD   r=  r>  r   r   r   rj  
  s   


z9TestPasses.test_target_library_info_behavior.<locals>.runT)rÜ  zcall float @llvm.exp2.f32Fzcall float @ldexpfN)rÎ   r   rm  )r/   rj  r:   r   r   r   Ú!test_target_library_info_behavior
  s   

z,TestPasses.test_target_library_info_behaviorc                 C   sz   t jt ¡ d}t |¡}t ¡ }| ¡  | |¡ | d¡}t	|j
ƒ}t|jƒ}|  |d jd¡ |  |d jd¡ d S )Nr3   rÓ   r   r   rS   Úi2)r‚  r5   r&   r6   r7   rÛ  r×  rj  r6  ÚnextrU  rU  rM  r1   r>   )r/   r8   r:   r>  r¦   Úfirst_blockrM  r   r   r   Útest_instruction_namer_pass1
  s   




z&TestPasses.test_instruction_namer_passN)rF   rG   rH   r>  rÙ  rƒ   r„   rs   Úmachineru   rÝ  rá  r   r   r   r   r”  Ä	  s    N
r”  c                   @   s0   e Zd Zdd„ Ze e ¡ dv d¡dd„ ƒZdS )Ú	TestDylibc                 C   s:   |   t¡ t d¡ W d   ƒ d S 1 sw   Y  d S )Nzzzzasdkf;jasd;l)rË   rŽ   r&   Úload_library_permanentlyr.   r   r   r   Útest_bad_libraryD
  s   "ÿzTestDylib.test_bad_library)ÚLinuxztest only works on Linuxc                 C   s   t dƒ}t |¡ d S )Nr   )r   r&   rä  )r/   rZ   r   r   r   Ú	test_libmH
  s   zTestDylib.test_libmN)	rF   rG   rH   rå  rƒ   r„   rs   Úsystemrç  r   r   r   r   rã  B
  s    ÿrã  c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestAnalysisc                 C   sj   t  ¡ }t  t  d¡t  d¡t  d¡g¡}t  ||d¡}t  | ¡ ¡}|j\}}| ||¡}| 	|¡ |S )NrÒ   rÓ   )
r   r›   rš   rÔ   rœ   rž   r   rŸ   rq   r!   )r/   r   r×   rØ   rÙ   rÝ  ÚyÚzr   r   r   Úbuild_ir_moduleP
  s   "

zTestAnalysis.build_ir_modulec                 C   sJ   |   ¡ }| d¡}t |¡}tj|dd}d}|  ||¡ |  ||¡ d S )NrÓ   F©Ú	show_instz%.5 = add i32 %.1, %.2)rì  Ú
get_globalr&   Úget_function_cfgrÎ   rm  )r/   r:   rÓ   Údot_showing_instÚdot_without_instro  r   r   r   Útest_get_function_cfg_on_irZ
  s   

z(TestAnalysis.test_get_function_cfg_on_irc                 C   s‚   |   ¡  d¡}tj|dd}tj|dd}d}|  ||¡ |  ||¡ d}|  ||¡ |  ||¡ d}|  ||¡ |  ||¡ d S )Nr5  Trí  FÚdigraphzCFG for 'sum' functionz%.3 = add i32 %.1, %.2)r;   r6  r&   rð  rÎ   rm  )r/   rE  rñ  rò  ÚprefixÚfnamero  r   r   r   Útest_function_cfg_on_llvm_valuec
  s   z,TestAnalysis.test_function_cfg_on_llvm_valueN)rF   rG   rH   rì  ró  r÷  r   r   r   r   ré  O
  s    
	ré  c                   @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚTestTypeParsingc                 c   s&    t  ¡ }|V  t|ƒ}t |¡ d S r%   )r   r›   r   r&   r7   )r/   r:   r8   r   r   r   Úcheck_parsingv
  s
   €zTestTypeParsing.check_parsingc                 C   s   |   ¡  }t t d¡g¡}t ||d¡}t |dg¡|_W d   ƒ n1 s'w   Y  |   ¡ "}tjt d¡gdd}t ||d¡}t |dg¡|_W d   ƒ n1 sUw   Y  |   ¡ (}tjjt d¡dƒt d¡dƒgdd}t ||jd¡}||_W d   ƒ d S 1 s‰w   Y  d S )NrÒ   rÓ   rS   TrÙ  rT   )	rù  r   rÛ  rÔ   rã  rÕ   ÚinitializerÚliteral_structr¤  )r/   r:   ÚtyprA  Úconstr   r   r   Útest_literal_struct€
  s*   
ü
ÿû
ÿþ"ûz#TestTypeParsing.test_literal_structN)rF   rG   rH   r   rù  rþ  r   r   r   r   rø  u
  s    
	rø  c                   @   ó   e Zd Zdd„ ZdS )ÚTestGlobalConstructorsc                 C   sš   |   t¡}|  |¡}| ¡  | ¡  | d¡}t tj¡}t 	||¡}|  
|jjd¡ | d¡}t tj¡|ƒ}|  
|ƒ d¡ | ¡  |  
|jjd¡ d S )Nrð  rÅ  rÓ   rñ  rò  )r;   Úasm_global_ctorsr@   r  Úrun_static_constructorsÚget_global_value_addressr&  ÚPOINTERr   Úcastr1   ÚcontentsrC  r€  r   Úrun_static_destructors)r/   r:   r  Úptr_addrÚptr_tr>  Úfoo_addrrÓ   r   r   r   rö  š
  s   



z.TestGlobalConstructors.test_global_ctors_dtorsN)rF   rG   rH   rö  r   r   r   r   r   ™
  ó    r   c                   @   sn   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestGlobalVariablesTc                 C   sZ   t  ¡ }t  d¡}t  ||d¡}||_t|ƒ}|r |  d|¡ n|  d|¡ |  |¡ d S )NrÒ   rÓ   Úundef)	r   r›   rÔ   rã  r  r   rÎ   rm  r;   )r/   r  Ú	has_undefr:   rü  rA  r8   r   r   r   Úcheck_global_variable_linkage´
  s   
z1TestGlobalVariables.check_global_variable_linkagec                 C   ó   |   d¡ d S )Nr  ©r  r.   r   r   r   Útest_internal_linkageÈ
  rÊ   z)TestGlobalVariables.test_internal_linkagec                 C   r  )NÚcommonr  r.   r   r   r   Útest_common_linkageË
  rÊ   z'TestGlobalVariables.test_common_linkagec                 C   ó   | j ddd d S )Nr  F©r  r  r.   r   r   r   Útest_external_linkageÎ
  r³  z)TestGlobalVariables.test_external_linkagec                 C   r  )NÚavailable_externallyr  r.   r   r   r   Ú!test_available_externally_linkageÑ
  rÊ   z5TestGlobalVariables.test_available_externally_linkagec                 C   r  )NÚprivater  r.   r   r   r   Útest_private_linkageÔ
  rÊ   z(TestGlobalVariables.test_private_linkagec                 C   r  )NÚlinkoncer  r.   r   r   r   Útest_linkonce_linkage×
  rÊ   z)TestGlobalVariables.test_linkonce_linkagec                 C   r  )NÚweakr  r.   r   r   r   Útest_weak_linkageÚ
  rÊ   z%TestGlobalVariables.test_weak_linkagec                 C   r  )NÚ	appendingr  r.   r   r   r   Útest_appending_linkageÝ
  rÊ   z*TestGlobalVariables.test_appending_linkagec                 C   r  )NÚextern_weakFr  r  r.   r   r   r   Útest_extern_weak_linkageà
  r³  z,TestGlobalVariables.test_extern_weak_linkagec                 C   r  )NÚlinkonce_odrr  r.   r   r   r   Útest_linkonce_odr_linkageã
  rÊ   z-TestGlobalVariables.test_linkonce_odr_linkagec                 C   r  )NÚweak_odrr  r.   r   r   r   Útest_weak_odr_linkageæ
  rÊ   z)TestGlobalVariables.test_weak_odr_linkageN)T)rF   rG   rH   r  r  r  r  r  r  r  r  r!  r#  r%  r'  r   r   r   r   r  ³
  s    
r  zonly on x86c                   @   rÿ  )ÚTestInlineAsmc                 C   s:   t  ¡  | jtd}| jdd}| |¡}|  d|¡ d S )N)r8   Fr?   Únop)r&   Úinitialize_native_asmparserr;   rm  rE   r¼   rÎ   )r/   r   r=  r8   r   r   r   Útest_inlineasmì
  s
   
zTestInlineAsm.test_inlineasmN)rF   rG   rH   r+  r   r   r   r   r(  ê
  s    r(  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTestObjectFilea,  
        ;ModuleID = <string>
        target triple = "{triple}"

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

        define i32 @sum_twice(i32 %.1, i32 %.2) {{
            %.3 = call i32 @sum(i32 %.1, i32 %.2)
            %.4 = call i32 @sum(i32 %.3, i32 %.3)
            ret i32 %.4
        }}
    c                 C   s¼   | j dd}|  ¡ }| |¡}tj |¡}d}d}| ¡ D ]9}| ¡ rVd}|  | 	¡ ¡ |  
| ¡ dk¡ |  
t| ¡ ƒdk¡ |  | ¡ ¡ |  
|| ¡ k ¡ | ¡ } nq|  
|¡ d S )NFr?   r‹  Tr   )rE   r;   rÆ  r&   ÚObjectFileRefÚ	from_dataÚsectionsÚis_textrü   r>   ré   Úsizero   ÚdataÚaddress)r/   rE   r:   r  ÚobjÚhas_textÚlast_addressrÐ   r   r   r   Útest_object_file  s$   
ø	zTestObjectFile.test_object_filec                 C   st   | j dd}|  ¡ }| |¡}tj |¡}t |  | j¡|¡}| |¡ t	t
t
t
ƒ| d¡ƒ}|  |ddƒd¡ d S )NFr?   Ú	sum_twicerT   r  rÅ  )rE   r;   rÆ  r&   r-  r.  rÊ  Úmod_asmr  r   r   r€  r1   )r/   rE   r:   r  r4  r@   r8  r   r   r   r    s   
ÿ

ÿz#TestObjectFile.test_add_object_filec           	   	   C   sÄ   | j dd}|  ¡ }| |¡}tƒ \}}z1zt |d¡}| |¡ | ¡  W | ¡  n| ¡  w t	 
|  | j¡|¡}| |¡ W t |¡ nt |¡ w ttttƒ| d¡ƒ}|  |ddƒd¡ d S )NFr?   r  r8  rT   r  rÅ  )rE   r;   rÆ  r   r`   r  r  Úflushr%  r&   rÊ  r9  r  r  r   r   r€  r1   )	r/   rE   r:   r  r  r  r^  r@   r8  r   r   r   r  '  s&   



ÿ
ÿz3TestObjectFile.test_add_object_file_from_filesystemc                 C   sX   t  t¡}tj |¡}| ¡ D ]}| ¡ r)|  t	| 
¡ ƒd¡ |  | 
¡  ¡ t¡ qd S )Né   )rµ  ÚfromhexÚissue_632_elfr&   r-  r.  r/  r0  r1   ro   r2  ÚhexÚissue_632_text)r/   Úelfr4  rÐ   r   r   r   Útest_get_section_contentA  s   
€ýz'TestObjectFile.test_get_section_contentN)rF   rG   rH   r9  r7  r  r  rA  r   r   r   r   r,  ô
  s    r,  c                   @   r¾  )ÚTestTimePassesc              	   C   s¢   t  ¡ }t  ¡ }d|_| |¡ z%t  d¡ | |  ¡ ¡ | |  ¡ ¡ | |  ¡ ¡ W t  ¡ }t  d¡ n
t  ¡ }t  d¡ w |  	|t
¡ |  | d¡d¡ d S )Nr  TFzPass execution timing reportrS   )r&   r;  rF  rH  r_  Úset_time_passesrj  r;   Úreport_and_reset_timingsrè   r   r1   Úcount)r/   ÚmprD  Úreportr   r   r   Útest_reportingM  s   

ÿzTestTimePasses.test_reportingc                 C   s   |   t ¡ ¡ d S r%   )r“  r&   rD  r.   r   r   r   Útest_empty_report`  s   z TestTimePasses.test_empty_reportN)rF   rG   rH   rH  rI  r   r   r   r   rB  L  s    rB  c                   @   rÿ  )ÚTestLLVMLockCallbacksc                    s    g ‰ ‡ fdd„}‡ fdd„}t j ||¡ |  ˆ ¡ t  ¡  |  dˆ ¡ |  dˆ ¡ t j ||¡ |  t¡ t j ||¡ W d   ƒ d S 1 sIw   Y  d S )Nc                      ó   ˆ   d¡ d S )NÚacqr­  r   ©Úeventsr   r   rL  i  rÊ   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.acqc                      rK  )NÚrelr­  r   rM  r   r   rO  l  rÊ   z6TestLLVMLockCallbacks.test_lock_callbacks.<locals>.relrL  rO  )	r&   r
   Úregister_lock_callbackr“  r;  rÎ   Úunregister_lock_callbackrË   r0  )r/   rL  rO  r   rM  r   Útest_lock_callbacksf  s   
"ÿz)TestLLVMLockCallbacks.test_lock_callbacksN)rF   rG   rH   rR  r   r   r   r   rJ  e  r  rJ  c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestPipelineTuningOptionsc                 C   rB  r%   )r&   Úcreate_pipeline_tuning_optionsr.   r   r   r   Úpto„  rE  zTestPipelineTuningOptions.ptoc                 C   ó   |   ¡ }| ¡  d S r%   )rU  r%  ©r/   rU  r   r   r   r)  ‡  ó   z$TestPipelineTuningOptions.test_closec                 C   rK  rH  )rU  rè   Úspeed_levelr|  r  r1   ©r/   rU  r   r   r   r   Útest_speed_level‹  rN  z*TestPipelineTuningOptions.test_speed_levelc                 C   rK  ©Nr  )rU  rè   rO  r|  r  r1   rZ  r   r   r   rP  ’  rN  z)TestPipelineTuningOptions.test_size_levelc                 C   rU  rV  )rU  rè   Úloop_interleavingrú   r1   ©r/   rU  rª   r   r   r   Útest_loop_interleaving¡  rZ  z0TestPipelineTuningOptions.test_loop_interleavingc                 C   rU  rV  )rU  rè   Úloop_vectorizationrú   r1   r^  r   r   r   Útest_loop_vectorization¨  rZ  z1TestPipelineTuningOptions.test_loop_vectorizationc                 C   rU  rV  )rU  rè   Úslp_vectorizationrú   r1   r^  r   r   r   Útest_slp_vectorization¯  rZ  z0TestPipelineTuningOptions.test_slp_vectorizationc                 C   rU  rV  )rU  rè   Úloop_unrollingrú   r1   r^  r   r   r   Útest_loop_unrolling¶  rZ  z-TestPipelineTuningOptions.test_loop_unrollingc                 C   sn   |   ¡ }|  t¡ d|_W d   ƒ n1 sw   Y  |  t¡ d|_W d   ƒ d S 1 s0w   Y  d S )NrF  r‹  )rU  rË   r0  rY  rW  r   r   r   Útest_speed_level_constraints½  s   ÿ"ÿz6TestPipelineTuningOptions.test_speed_level_constraintsc                 C   s¤   |   ¡ }|  t¡ d|_W d   ƒ n1 sw   Y  |  t¡ d|_W d   ƒ n1 s/w   Y  |  t¡ d|_d|_W d   ƒ d S 1 sKw   Y  d S )Nr  r‹  rT   )rU  rË   r0  rO  rY  rW  r   r   r   Útest_size_level_constraintsÄ  s   ÿÿ"þz5TestPipelineTuningOptions.test_size_level_constraintsN)rF   rG   rH   rU  r)  r[  rP  r_  ra  rc  re  rf  rg  r   r   r   r   rS  ‚  s    rS  c                   @   s   e Zd Zddd„ZdS )ÚNewPassManagerMixinr   c                 C   s(   | j dd}t ||¡}t ||¡}|S r:  )rE   r&   rT  Úcreate_pass_builder)r/   rY  rO  r=  rU  Úpbr   r   r   rj  Ñ  s   zNewPassManagerMixin.pbN)r   r   )rF   rG   rH   rj  r   r   r   r   rh  Ï  s    rh  c                   @   r0  )
ÚTestPassBuilderc                 C   rV  r%   )rj  r%  )r/   rj  r   r   r   r)  Ú  rX  zTestPassBuilder.test_closec                 C   sN   | j dd}t dd¡}d|_d|_d|_d|_d|_t ||¡}| 	¡  d S )NFr?   r  r   rT   T)
rE   r&   rT  rG  r]  r`  rb  rd  ri  r%  )r/   r=  rU  rj  r   r   r   Útest_ptoÞ  s   zTestPassBuilder.test_ptoc                 C   s,   |   ¡ }| ¡ }| |  ¡ |¡ | ¡  d S r%   )rj  ÚgetModulePassManagerrj  r;   r%  )r/   rj  Úmpmr   r   r   Útest_get_module_pass_manageré  s   z,TestPassBuilder.test_get_module_pass_managerc                 C   s2   |   ¡ }| ¡ }| |  ¡  d¡|¡ | ¡  d S rê  )rj  ÚgetFunctionPassManagerrj  r;   r6  r%  )r/   rj  Úfpmr   r   r   Útest_get_function_pass_managerï  s   z.TestPassBuilder.test_get_function_pass_managerN)rF   rG   rH   r)  rl  ro  rr  r   r   r   r   rk  Ø  s
    rk  c                   @   sL   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTestNewModulePassManagerc                 C   rB  r%   )r&   Úcreate_new_module_pass_managerr.   r   r   r   r>  ÷  rE  zTestNewModulePassManager.pmc                 C   sB   |   ¡ }t|ƒ}| j|dd}| ¡ }| ||¡ t|ƒ}||fS )Nr   ©rY  rO  )r;   r   rj  rm  rj  )r/   Úlevelr:   rn  rj  rn  Úoptimized_asmr   r   r   Úrun_o_nú  s   z TestNewModulePassManager.run_o_nc                 C   rV  r%   rd  ©r/   rn  r   r   r   r)    rX  z#TestNewModulePassManager.test_closec                 C   ó*   |   d¡\}}|  d|¡ |  d|¡ d S ©Nr  ri  ©rx  rÎ   rm  ©r/   rn  rw  r   r   r   Útest_run_o3  ó   z$TestNewModulePassManager.test_run_o3c                 C   ó*   |   d¡\}}|  d|¡ |  d|¡ d S ©Nr   ri  ©rx  rÎ   r}  r   r   r   Útest_run_o0  r  z$TestNewModulePassManager.test_run_o0c                 C   sZ   |   ¡ }|  ¡ }| ¡  |  t¡}t|ƒ}| ||¡ t|ƒ}|  d|¡ |  d|¡ d S )Nrh  )	rj  r>  Úadd_instruction_combine_passr;   Úasm_sum4r   rj  rÎ   rm  )r/   rj  rn  r:   rn  rw  r   r   r   Útest_instcombine  s   
z)TestNewModulePassManager.test_instcombinec                 C   s¦   | j ddd}tt dd¡ƒ}t |¡}| ¡ }| ||¡ t|ƒ}|  d|¡ |  	d|¡ ttƒ}| ¡ }t |¡}| ||¡ t|ƒ}|  d|¡ |  d|¡ d S )Nr  r   ru  úoptnone r°   Úalloca)
rj  r   Úasm_alloca_optnoneÚreplacer&   r7   rm  rj  rÎ   rm  )r/   rj  rn  r:   rn  rw  Úorig_asm_optnoneÚoptimized_asm_optnoner   r   r   Útest_optnone  s   

z%TestNewModulePassManager.test_optnonec                 C   sL   |   ¡ }| ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  d S r%   )	r>  Úadd_verifierrª  Úadd_simplify_cfg_passr¸  r¦  r„  r±  rÖ  ry  r   r   r   Útest_add_passes/  s   z(TestNewModulePassManager.test_add_passesN)rF   rG   rH   r>  rx  r)  r~  rƒ  r†  r  r  r   r   r   r   rs  ö  s    	rs  c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestNewFunctionPassManagerc                 C   rB  r%   )r&   Ú create_new_function_pass_managerr.   r   r   r   r>  <  rE  zTestNewFunctionPassManager.pmc                 C   rV  r%   rd  ©r/   rq  r   r   r   r)  ?  rX  z%TestNewFunctionPassManager.test_closec                 C   sL   |   ¡ }| d¡}t|ƒ}| j|dd}| ¡ }| ||¡ t|ƒ}||fS )Nr5  r   ru  )r;   r6  r   rj  rp  rj  )r/   rv  r:   Úfunrn  rj  rq  rw  r   r   r   rx  C  s   
z"TestNewFunctionPassManager.run_o_nc                 C   rz  r{  r|  r}  r   r   r   r~  M  r  z&TestNewFunctionPassManager.test_run_o3c                 C   r€  r  r‚  r}  r   r   r   rƒ  R  r  z&TestNewFunctionPassManager.test_run_o0c                 C   s²   | j ddd}tt dd¡ƒ}t |¡ d¡}| ¡ }| ||¡ t|ƒ}|  	d|¡ |  
d|¡ ttƒ}t |¡ d¡}| ¡ }| ||¡ t|ƒ}|  	d|¡ |  	d|¡ d S )Nr  r   ru  r‡  r°   rÓ   rˆ  )rj  r   r‰  rŠ  r&   r7   r6  rp  rj  rÎ   rm  )r/   rj  rn  r”  rq  rw  r‹  rŒ  r   r   r   r  W  s   z'TestNewFunctionPassManager.test_optnonec                 C   s`   |   ¡ }|  ¡ }|  t¡ d¡}| ¡  t|ƒ}| ||¡ t|ƒ}|  d|¡ |  	d|¡ d S )Nr5  rh  )
rj  r>  r;   r…  r6  r„  r   rj  rÎ   rm  )r/   rj  rq  r”  rn  rw  r   r   r   r†  j  s   z+TestNewFunctionPassManager.test_instcombinec                 C   s4   |   d¡}| ¡ }t t¡jD ]}| ||¡ qd S r\  )rj  rp  r&   r7   Úasm_declarationrT  rj  )r/   rj  rq  r”  r   r   r   Útest_declarationsv  s
   
ÿz,TestNewFunctionPassManager.test_declarationsc                 C   sD   |   ¡ }| ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  d S r%   )r>  rª  r  r¸  r¦  r„  r±  rÖ  r“  r   r   r   r  |  s   z*TestNewFunctionPassManager.test_add_passesN)rF   rG   rH   r>  r)  rx  r~  rƒ  r  r†  r–  r  r   r   r   r   r‘  ;  s    
r‘  Ú__main__)hr&  r  r   r   r   Úctypes.utilr   r*   r   r`   rs   rh   rc   r…   rƒ   Ú
contextlibr   Útempfiler   Úllvmliter   r	   r&   Úllvmlite.bindingr
   Úllvmlite.testsr   r   râ  rä  r   rI   rk  r{  r…  rb  rí  rø  rt   rŠ  rÌ   r2  rC  r±  r†  r  rm  r{  r‚  r  r  ró  rÖ   rˆ  r½   rÂ   rÅ   r`  r‰  r•  r=  r?  rÚ  r  rø  rû  r$   rJ   r‡   rÈ   r"  Úobjectr~  r¿  rÉ  r„   ru   rÍ  r  r‘  rþ  r1  r9  rA  rc  rf  r‰  r”  rã  ré  rø  r   r  r(  r,  rB  rJ  rS  rh  rk  rs  r‘  rF   Úmainr   r   r   r   Ú<module>   sÐ    





D(ÿÿ-4"*I  D : A  = |[JOG~&$7	XM	E
Lÿ