variadic_safety.ll 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. ; RUN: opt < %s -deadargelim -S | FileCheck %s
  2. declare void @llvm.va_start(i8*)
  3. define internal i32 @va_func(i32 %a, i32 %b, ...) {
  4. %valist = alloca i8
  5. call void @llvm.va_start(i8* %valist)
  6. ret i32 %b
  7. }
  8. ; Function derived from AArch64 ABI, where 8 integer arguments go in
  9. ; registers but the 9th goes on the stack. We really don't want to put
  10. ; just 7 args in registers and then start on the stack since any
  11. ; va_arg implementation already present in va_func won't be expecting
  12. ; it.
  13. define i32 @call_va(i32 %in) {
  14. %stacked = alloca i32
  15. store i32 42, i32* %stacked
  16. %res = call i32(i32, i32, ...) @va_func(i32 %in, i32 %in, [6 x i32] undef, i32* byval %stacked)
  17. ret i32 %res
  18. ; CHECK: call i32 (i32, i32, ...) @va_func(i32 undef, i32 %in, [6 x i32] undef, i32* byval %stacked)
  19. }
  20. define internal i32 @va_deadret_func(i32 %a, i32 %b, ...) {
  21. %valist = alloca i8
  22. call void @llvm.va_start(i8* %valist)
  23. ret i32 %a
  24. }
  25. define void @call_deadret(i32 %in) {
  26. %stacked = alloca i32
  27. store i32 42, i32* %stacked
  28. call i32 (i32, i32, ...) @va_deadret_func(i32 undef, i32 %in, [6 x i32] undef, i32* byval %stacked)
  29. ret void
  30. ; CHECK: call void (i32, i32, ...) @va_deadret_func(i32 undef, i32 undef, [6 x i32] undef, i32* byval %stacked)
  31. }