These tests are located in 'X86' subfolders which means that they should be compiled for that target. As they did not have the target specified explicitly, they in fact were compiled for a default target triple. Not all targets support all required features for these tests; for example, if NVPTX is used as a default triple, the tests fail. The patch makes the tests run for 'x86_64', thus they pass regardless of the default target. Differential Revision: https://reviews.llvm.org/D121998
53 lines
1.2 KiB
LLVM
53 lines
1.2 KiB
LLVM
; RUN: llc -mtriple=x86_64 < %s
|
|
|
|
declare i8* @llvm_gc_allocate(i32)
|
|
declare void @llvm_gc_initialize(i32)
|
|
|
|
declare void @llvm.gcroot(i8**, i8*)
|
|
declare void @llvm.gcwrite(i8*, i8*, i8**)
|
|
|
|
define i32 @main() gc "shadow-stack" {
|
|
entry:
|
|
%A = alloca i8*
|
|
%B = alloca i8**
|
|
|
|
call void @llvm_gc_initialize(i32 1048576) ; Start with 1MB heap
|
|
|
|
;; void *A;
|
|
call void @llvm.gcroot(i8** %A, i8* null)
|
|
|
|
;; A = gcalloc(10);
|
|
%Aptr = call i8* @llvm_gc_allocate(i32 10)
|
|
store i8* %Aptr, i8** %A
|
|
|
|
;; void **B;
|
|
%tmp.1 = bitcast i8*** %B to i8**
|
|
call void @llvm.gcroot(i8** %tmp.1, i8* null)
|
|
|
|
;; B = gcalloc(4);
|
|
%B.upgrd.1 = call i8* @llvm_gc_allocate(i32 8)
|
|
%tmp.2 = bitcast i8* %B.upgrd.1 to i8**
|
|
store i8** %tmp.2, i8*** %B
|
|
|
|
;; *B = A;
|
|
%B.1 = load i8**, i8*** %B
|
|
%A.1 = load i8*, i8** %A
|
|
call void @llvm.gcwrite(i8* %A.1, i8* %B.upgrd.1, i8** %B.1)
|
|
|
|
br label %AllocLoop
|
|
|
|
AllocLoop:
|
|
%i = phi i32 [ 0, %entry ], [ %indvar.next, %AllocLoop ]
|
|
;; Allocated mem: allocated memory is immediately dead.
|
|
call i8* @llvm_gc_allocate(i32 100)
|
|
|
|
%indvar.next = add i32 %i, 1
|
|
%exitcond = icmp eq i32 %indvar.next, 10000000
|
|
br i1 %exitcond, label %Exit, label %AllocLoop
|
|
|
|
Exit:
|
|
ret i32 0
|
|
}
|
|
|
|
declare void @__main()
|