1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Replace gcroot verifier tests

These haven't been checking anything useful and have been testing the
wrong failure reason for many years. Replace them with something which
stresses what is actually implemented in the verifier now.

llvm-svn: 354070
This commit is contained in:
Matt Arsenault 2019-02-14 22:41:01 +00:00
parent 98ead046b6
commit 830977dfdd
4 changed files with 52 additions and 44 deletions

View File

@ -1,14 +0,0 @@
; RUN: not llvm-as < %s > /dev/null 2>&1
; PR1633
%meta = type { i8* }
%obj = type { %meta* }
declare void @llvm.gcroot(%obj**, %meta*)
define void @f() {
entry:
call void @llvm.gcroot(%obj** null, %meta* null)
ret void
}

View File

@ -1,16 +0,0 @@
; RUN: not llvm-as < %s > /dev/null 2>&1
; PR1633
%meta = type { i8* }
%obj = type { %meta* }
declare void @llvm.gcroot(%obj**, %meta*)
define void @f() {
entry:
%local.obj = alloca %obj*
%local.meta = alloca %meta
call void @llvm.gcroot(%obj** %local.obj, %meta* %local.meta)
ret void
}

View File

@ -1,14 +0,0 @@
; RUN: not llvm-as < %s > /dev/null 2>&1
; PR1633
%meta = type { i8* }
%obj = type { %meta* }
declare void @llvm.gcroot(%obj*, %meta*)
define void @f() {
entry:
%local.obj = alloca %obj
call void @llvm.gcroot(%obj* %local.obj, %meta* null)
ret void
}

52
test/Verifier/gcroot.ll Normal file
View File

@ -0,0 +1,52 @@
; RUN: not llvm-as -o /dev/null %s 2>&1 | FileCheck %s
; PR1633
declare void @llvm.gcroot(i8**, i8*)
define void @caller_must_use_gc() {
; CHECK: Enclosing function does not use GC.
; CHECK-NEXT: call void @llvm.gcroot(i8** %alloca, i8* null)
%alloca = alloca i8*
call void @llvm.gcroot(i8** %alloca, i8* null)
ret void
}
define void @must_be_alloca() gc "test" {
; CHECK: llvm.gcroot parameter #1 must be an alloca.
; CHECK-NEXT: call void @llvm.gcroot(i8** null, i8* null)
call void @llvm.gcroot(i8** null, i8* null)
ret void
}
define void @non_ptr_alloca_null() gc "test" {
; CHECK: llvm.gcroot parameter #1 must either be a pointer alloca, or argument #2 must be a non-null constant.
; CHECK-NEXT: call void @llvm.gcroot(i8** %cast.alloca, i8* null)
%alloca = alloca i32
%cast.alloca = bitcast i32* %alloca to i8**
call void @llvm.gcroot(i8** %cast.alloca, i8* null)
ret void
}
define void @non_constant_arg1(i8* %arg) gc "test" {
; CHECK: llvm.gcroot parameter #2 must be a constant.
; CHECK-NEXT: call void @llvm.gcroot(i8** %alloca, i8* %arg)
%alloca = alloca i8*
call void @llvm.gcroot(i8** %alloca, i8* %arg)
ret void
}
define void @non_ptr_alloca_non_null() gc "test" {
; CHECK-NOT: llvm.gcroot parameter
%alloca = alloca i32
%cast.alloca = bitcast i32* %alloca to i8**
call void @llvm.gcroot(i8** %cast.alloca, i8* inttoptr (i64 123 to i8*))
ret void
}
define void @casted_alloca() gc "test" {
; CHECK-NOT: llvm.gcroot parameter
%alloca = alloca i32*
%ptr.cast.alloca = bitcast i32** %alloca to i8**
call void @llvm.gcroot(i8** %ptr.cast.alloca, i8* null)
ret void
}