mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	Variadic functions are particularly fragile in the face of ABI changes, so this limits how much the pass changes them git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183625 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
; RUN: opt < %s -deadargelim -S | FileCheck %s
 | 
						|
 | 
						|
declare void @llvm.va_start(i8*)
 | 
						|
 | 
						|
define internal i32 @va_func(i32 %a, i32 %b, ...) {
 | 
						|
  %valist = alloca i8
 | 
						|
  call void @llvm.va_start(i8* %valist)
 | 
						|
 | 
						|
  ret i32 %b
 | 
						|
}
 | 
						|
 | 
						|
; Function derived from AArch64 ABI, where 8 integer arguments go in
 | 
						|
; registers but the 9th goes on the stack. We really don't want to put
 | 
						|
; just 7 args in registers and then start on the stack since any
 | 
						|
; va_arg implementation already present in va_func won't be expecting
 | 
						|
; it.
 | 
						|
define i32 @call_va(i32 %in) {
 | 
						|
  %stacked = alloca i32
 | 
						|
  store i32 42, i32* %stacked
 | 
						|
  %res = call i32(i32, i32, ...)* @va_func(i32 %in, i32 %in, [6 x i32] undef, i32* byval %stacked)
 | 
						|
  ret i32 %res
 | 
						|
; CHECK: call i32 (i32, i32, ...)* @va_func(i32 undef, i32 %in, [6 x i32] undef, i32* byval %stacked)
 | 
						|
}
 | 
						|
 | 
						|
define internal i32 @va_deadret_func(i32 %a, i32 %b, ...) {
 | 
						|
  %valist = alloca i8
 | 
						|
  call void @llvm.va_start(i8* %valist)
 | 
						|
 | 
						|
  ret i32 %a
 | 
						|
}
 | 
						|
 | 
						|
define void @call_deadret(i32 %in) {
 | 
						|
  %stacked = alloca i32
 | 
						|
  store i32 42, i32* %stacked
 | 
						|
  call i32 (i32, i32, ...)* @va_deadret_func(i32 undef, i32 %in, [6 x i32] undef, i32* byval %stacked)
 | 
						|
  ret void
 | 
						|
; CHECK: call void (i32, i32, ...)* @va_deadret_func(i32 undef, i32 undef, [6 x i32] undef, i32* byval %stacked)
 | 
						|
}
 |