You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
|   | ; Test loads of symbolic addresses when generating small-model non-PIC.
 | ||
|  | ; All addresses can be treated as PC
 | ||
|  | ;
 | ||
|  | ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
 | ||
|  | 
 | ||
|  | @e4 = external global i32 | ||
|  | @d4 = global i32 1 | ||
|  | @e2 = external global i32, align 2 | ||
|  | @d2 = global i32 1, align 2 | ||
|  | @e1 = external global i32, align 1 | ||
|  | @d1 = global i32 1, align 1 | ||
|  | 
 | ||
|  | declare void @ef() | ||
|  | define void @df() { | ||
|  |   ret void | ||
|  | } | ||
|  | 
 | ||
|  | declare void @foo(i32 *) | ||
|  | 
 | ||
|  | ; Test a load of a fully-aligned external variable.
 | ||
|  | define i32 *@f1() { | ||
|  | ; CHECK-LABEL: f1:
 | ||
|  | ; CHECK: larl %r2, e4
 | ||
|  | ; CHECK-NEXT: br %r14
 | ||
|  |   ret i32 *@e4 | ||
|  | } | ||
|  | 
 | ||
|  | ; Test a load of a fully-aligned local variable.
 | ||
|  | define i32 *@f2() { | ||
|  | ; CHECK-LABEL: f2:
 | ||
|  | ; CHECK: larl %r2, d4
 | ||
|  | ; CHECK-NEXT: br %r14
 | ||
|  |   ret i32 *@d4 | ||
|  | } | ||
|  | 
 | ||
|  | ; Test a load of a 2-byte-aligned external variable.
 | ||
|  | define i32 *@f3() { | ||
|  | ; CHECK-LABEL: f3:
 | ||
|  | ; CHECK: larl %r2, e2
 | ||
|  | ; CHECK-NEXT: br %r14
 | ||
|  |   ret i32 *@e2 | ||
|  | } | ||
|  | 
 | ||
|  | ; Test a load of a 2-byte-aligned local variable.
 | ||
|  | define i32 *@f4() { | ||
|  | ; CHECK-LABEL: f4:
 | ||
|  | ; CHECK: larl %r2, d2
 | ||
|  | ; CHECK-NEXT: br %r14
 | ||
|  |   ret i32 *@d2 | ||
|  | } | ||
|  | 
 | ||
|  | ; Test a load of an unaligned external variable, which must go via the GOT.
 | ||
|  | define i32 *@f5() { | ||
|  | ; CHECK-LABEL: f5:
 | ||
|  | ; CHECK: lgrl %r2, e1@GOT
 | ||
|  | ; CHECK-NEXT: br %r14
 | ||
|  |   ret i32 *@e1 | ||
|  | } | ||
|  | 
 | ||
|  | ; Test a load of an unaligned local variable, which must go via the GOT.
 | ||
|  | define i32 *@f6() { | ||
|  | ; CHECK-LABEL: f6:
 | ||
|  | ; CHECK: lgrl %r2, d1@GOT
 | ||
|  | ; CHECK-NEXT: br %r14
 | ||
|  |   ret i32 *@d1 | ||
|  | } | ||
|  | 
 | ||
|  | ; Test a load of an external function.
 | ||
|  | define void() *@f7() { | ||
|  | ; CHECK-LABEL: f7:
 | ||
|  | ; CHECK: larl %r2, ef
 | ||
|  | ; CHECK-NEXT: br %r14
 | ||
|  |   ret void() *@ef | ||
|  | } | ||
|  | 
 | ||
|  | ; Test a load of a local function.
 | ||
|  | define void() *@f8() { | ||
|  | ; CHECK-LABEL: f8:
 | ||
|  | ; CHECK: larl %r2, df
 | ||
|  | ; CHECK-NEXT: br %r14
 | ||
|  |   ret void() *@df | ||
|  | } | ||
|  | 
 | ||
|  | ; Test that LARL can be rematerialized.
 | ||
|  | define i32 @f9() { | ||
|  | ; CHECK-LABEL: f9:
 | ||
|  | ; CHECK: larl %r2, d2
 | ||
|  | ; CHECK: brasl %r14, foo@PLT
 | ||
|  | ; CHECK: larl %r2, d2
 | ||
|  | ; CHECK: brasl %r14, foo@PLT
 | ||
|  | ; CHECK: br %r14
 | ||
|  |   call void @foo(i32 *@d2) | ||
|  |   call void @foo(i32 *@d2) | ||
|  |   ret i32 0 | ||
|  | } |