frameescape.ll 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. ; RUN: not llvm-as %s -o /dev/null 2>&1 | FileCheck %s
  2. declare void @llvm.localescape(...)
  3. declare i8* @llvm.localrecover(i8*, i8*, i32)
  4. define internal void @f() {
  5. %a = alloca i8
  6. call void (...) @llvm.localescape(i8* %a)
  7. call void (...) @llvm.localescape(i8* %a)
  8. ret void
  9. }
  10. ; CHECK: multiple calls to llvm.localescape in one function
  11. define internal void @g() {
  12. entry:
  13. %a = alloca i8
  14. br label %not_entry
  15. not_entry:
  16. call void (...) @llvm.localescape(i8* %a)
  17. ret void
  18. }
  19. ; CHECK: llvm.localescape used outside of entry block
  20. define internal void @h() {
  21. call i8* @llvm.localrecover(i8* null, i8* null, i32 0)
  22. ret void
  23. }
  24. ; CHECK: llvm.localrecover first argument must be function defined in this module
  25. @global = constant i8 0
  26. declare void @declaration()
  27. define internal void @i() {
  28. call i8* @llvm.localrecover(i8* @global, i8* null, i32 0)
  29. ret void
  30. }
  31. ; CHECK: llvm.localrecover first argument must be function defined in this module
  32. define internal void @j() {
  33. call i8* @llvm.localrecover(i8* bitcast(void()* @declaration to i8*), i8* null, i32 0)
  34. ret void
  35. }
  36. ; CHECK: llvm.localrecover first argument must be function defined in this module
  37. define internal void @k(i32 %n) {
  38. call i8* @llvm.localrecover(i8* bitcast(void()* @f to i8*), i8* null, i32 %n)
  39. ret void
  40. }
  41. ; CHECK: idx argument of llvm.localrecover must be a constant int
  42. define internal void @l(i8* %b) {
  43. %a = alloca i8
  44. call void (...) @llvm.localescape(i8* %a, i8* %b)
  45. ret void
  46. }
  47. ; CHECK: llvm.localescape only accepts static allocas
  48. define internal void @m() {
  49. %a = alloca i8
  50. call void (...) @llvm.localescape(i8* %a)
  51. ret void
  52. }
  53. define internal void @n(i8* %fp) {
  54. call i8* @llvm.localrecover(i8* bitcast(void ()* @m to i8*), i8* %fp, i32 1)
  55. ret void
  56. }
  57. ; CHECK: all indices passed to llvm.localrecover must be less than the number of arguments passed ot llvm.localescape in the parent function