/src/test/codegen/riscv-abi/riscv64-lp64d-abi.rs

https://gitlab.com/rust-lang/rust · Rust · 293 lines · 209 code · 48 blank · 36 comment · 0 complexity · 2d8febcabd79f8e2a98df073e13ce09f MD5 · raw file

  1. //
  2. // compile-flags: -C no-prepopulate-passes
  3. // only-riscv64
  4. // only-linux
  5. #![crate_type = "lib"]
  6. // CHECK: define void @f_fpr_tracking(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, i8 zeroext %i)
  7. #[no_mangle]
  8. pub extern "C" fn f_fpr_tracking(
  9. a: f64,
  10. b: f64,
  11. c: f64,
  12. d: f64,
  13. e: f64,
  14. f: f64,
  15. g: f64,
  16. h: f64,
  17. i: u8,
  18. ) {
  19. }
  20. #[repr(C)]
  21. pub struct Double {
  22. f: f64,
  23. }
  24. #[repr(C)]
  25. pub struct DoubleDouble {
  26. f: f64,
  27. g: f64,
  28. }
  29. #[repr(C)]
  30. pub struct DoubleFloat {
  31. f: f64,
  32. g: f32,
  33. }
  34. // CHECK: define void @f_double_s_arg(double %0)
  35. #[no_mangle]
  36. pub extern "C" fn f_double_s_arg(a: Double) {}
  37. // CHECK: define double @f_ret_double_s()
  38. #[no_mangle]
  39. pub extern "C" fn f_ret_double_s() -> Double {
  40. Double { f: 1. }
  41. }
  42. // CHECK: define void @f_double_double_s_arg({ double, double } %0)
  43. #[no_mangle]
  44. pub extern "C" fn f_double_double_s_arg(a: DoubleDouble) {}
  45. // CHECK: define { double, double } @f_ret_double_double_s()
  46. #[no_mangle]
  47. pub extern "C" fn f_ret_double_double_s() -> DoubleDouble {
  48. DoubleDouble { f: 1., g: 2. }
  49. }
  50. // CHECK: define void @f_double_float_s_arg({ double, float } %0)
  51. #[no_mangle]
  52. pub extern "C" fn f_double_float_s_arg(a: DoubleFloat) {}
  53. // CHECK: define { double, float } @f_ret_double_float_s()
  54. #[no_mangle]
  55. pub extern "C" fn f_ret_double_float_s() -> DoubleFloat {
  56. DoubleFloat { f: 1., g: 2. }
  57. }
  58. // CHECK: define void @f_double_double_s_arg_insufficient_fprs(double %0, double %1, double %2, double %3, double %4, double %5, double %6, [2 x i64] %7)
  59. #[no_mangle]
  60. pub extern "C" fn f_double_double_s_arg_insufficient_fprs(
  61. a: f64,
  62. b: f64,
  63. c: f64,
  64. d: f64,
  65. e: f64,
  66. f: f64,
  67. g: f64,
  68. h: DoubleDouble,
  69. ) {
  70. }
  71. #[repr(C)]
  72. pub struct DoubleInt8 {
  73. f: f64,
  74. i: i8,
  75. }
  76. #[repr(C)]
  77. pub struct DoubleUInt8 {
  78. f: f64,
  79. i: u8,
  80. }
  81. #[repr(C)]
  82. pub struct DoubleInt32 {
  83. f: f64,
  84. i: i32,
  85. }
  86. #[repr(C)]
  87. pub struct DoubleInt64 {
  88. f: f64,
  89. i: i64,
  90. }
  91. // CHECK: define void @f_double_int8_s_arg({ double, i8 } %0)
  92. #[no_mangle]
  93. pub extern "C" fn f_double_int8_s_arg(a: DoubleInt8) {}
  94. // CHECK: define { double, i8 } @f_ret_double_int8_s()
  95. #[no_mangle]
  96. pub extern "C" fn f_ret_double_int8_s() -> DoubleInt8 {
  97. DoubleInt8 { f: 1., i: 2 }
  98. }
  99. // CHECK: define void @f_double_int32_s_arg({ double, i32 } %0)
  100. #[no_mangle]
  101. pub extern "C" fn f_double_int32_s_arg(a: DoubleInt32) {}
  102. // CHECK: define { double, i32 } @f_ret_double_int32_s()
  103. #[no_mangle]
  104. pub extern "C" fn f_ret_double_int32_s() -> DoubleInt32 {
  105. DoubleInt32 { f: 1., i: 2 }
  106. }
  107. // CHECK: define void @f_double_uint8_s_arg({ double, i8 } %0)
  108. #[no_mangle]
  109. pub extern "C" fn f_double_uint8_s_arg(a: DoubleUInt8) {}
  110. // CHECK: define { double, i8 } @f_ret_double_uint8_s()
  111. #[no_mangle]
  112. pub extern "C" fn f_ret_double_uint8_s() -> DoubleUInt8 {
  113. DoubleUInt8 { f: 1., i: 2 }
  114. }
  115. // CHECK: define void @f_double_int64_s_arg({ double, i64 } %0)
  116. #[no_mangle]
  117. pub extern "C" fn f_double_int64_s_arg(a: DoubleInt64) {}
  118. // CHECK: define { double, i64 } @f_ret_double_int64_s()
  119. #[no_mangle]
  120. pub extern "C" fn f_ret_double_int64_s() -> DoubleInt64 {
  121. DoubleInt64 { f: 1., i: 2 }
  122. }
  123. // CHECK: define void @f_double_int8_s_arg_insufficient_gprs(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, [2 x i64] %0)
  124. #[no_mangle]
  125. pub extern "C" fn f_double_int8_s_arg_insufficient_gprs(
  126. a: i32,
  127. b: i32,
  128. c: i32,
  129. d: i32,
  130. e: i32,
  131. f: i32,
  132. g: i32,
  133. h: i32,
  134. i: DoubleInt8,
  135. ) {
  136. }
  137. // CHECK: define void @f_struct_double_int8_insufficient_fprs(float %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, [2 x i64] %8)
  138. #[no_mangle]
  139. pub extern "C" fn f_struct_double_int8_insufficient_fprs(
  140. a: f32,
  141. b: f64,
  142. c: f64,
  143. d: f64,
  144. e: f64,
  145. f: f64,
  146. g: f64,
  147. h: f64,
  148. i: DoubleInt8,
  149. ) {
  150. }
  151. #[repr(C)]
  152. pub struct DoubleArr1 {
  153. a: [f64; 1],
  154. }
  155. // CHECK: define void @f_doublearr1_s_arg(double %0)
  156. #[no_mangle]
  157. pub extern "C" fn f_doublearr1_s_arg(a: DoubleArr1) {}
  158. // CHECK: define double @f_ret_doublearr1_s()
  159. #[no_mangle]
  160. pub extern "C" fn f_ret_doublearr1_s() -> DoubleArr1 {
  161. DoubleArr1 { a: [1.] }
  162. }
  163. #[repr(C)]
  164. pub struct DoubleArr2 {
  165. a: [f64; 2],
  166. }
  167. // CHECK: define void @f_doublearr2_s_arg({ double, double } %0)
  168. #[no_mangle]
  169. pub extern "C" fn f_doublearr2_s_arg(a: DoubleArr2) {}
  170. // CHECK: define { double, double } @f_ret_doublearr2_s()
  171. #[no_mangle]
  172. pub extern "C" fn f_ret_doublearr2_s() -> DoubleArr2 {
  173. DoubleArr2 { a: [1., 2.] }
  174. }
  175. #[repr(C)]
  176. pub struct Tricky1 {
  177. f: [f64; 1],
  178. }
  179. #[repr(C)]
  180. pub struct DoubleArr2Tricky1 {
  181. g: [Tricky1; 2],
  182. }
  183. // CHECK: define void @f_doublearr2_tricky1_s_arg({ double, double } %0)
  184. #[no_mangle]
  185. pub extern "C" fn f_doublearr2_tricky1_s_arg(a: DoubleArr2Tricky1) {}
  186. // CHECK: define { double, double } @f_ret_doublearr2_tricky1_s()
  187. #[no_mangle]
  188. pub extern "C" fn f_ret_doublearr2_tricky1_s() -> DoubleArr2Tricky1 {
  189. DoubleArr2Tricky1 { g: [Tricky1 { f: [1.] }, Tricky1 { f: [2.] }] }
  190. }
  191. #[repr(C)]
  192. pub struct EmptyStruct {}
  193. #[repr(C)]
  194. pub struct DoubleArr2Tricky2 {
  195. s: EmptyStruct,
  196. g: [Tricky1; 2],
  197. }
  198. // CHECK: define void @f_doublearr2_tricky2_s_arg({ double, double } %0)
  199. #[no_mangle]
  200. pub extern "C" fn f_doublearr2_tricky2_s_arg(a: DoubleArr2Tricky2) {}
  201. // CHECK: define { double, double } @f_ret_doublearr2_tricky2_s()
  202. #[no_mangle]
  203. pub extern "C" fn f_ret_doublearr2_tricky2_s() -> DoubleArr2Tricky2 {
  204. DoubleArr2Tricky2 { s: EmptyStruct {}, g: [Tricky1 { f: [1.] }, Tricky1 { f: [2.] }] }
  205. }
  206. #[repr(C)]
  207. pub struct IntDoubleInt {
  208. a: i32,
  209. b: f64,
  210. c: i32,
  211. }
  212. // CHECK: define void @f_int_double_int_s_arg(%IntDoubleInt* {{.*}}%a)
  213. #[no_mangle]
  214. pub extern "C" fn f_int_double_int_s_arg(a: IntDoubleInt) {}
  215. // CHECK: define void @f_ret_int_double_int_s(%IntDoubleInt* {{.*}}sret
  216. #[no_mangle]
  217. pub extern "C" fn f_ret_int_double_int_s() -> IntDoubleInt {
  218. IntDoubleInt { a: 1, b: 2., c: 3 }
  219. }
  220. #[repr(C)]
  221. pub struct CharCharDouble {
  222. a: u8,
  223. b: u8,
  224. c: f64,
  225. }
  226. // CHECK: define void @f_char_char_double_s_arg([2 x i64] %0)
  227. #[no_mangle]
  228. pub extern "C" fn f_char_char_double_s_arg(a: CharCharDouble) {}
  229. // CHECK: define [2 x i64] @f_ret_char_char_double_s()
  230. #[no_mangle]
  231. pub extern "C" fn f_ret_char_char_double_s() -> CharCharDouble {
  232. CharCharDouble { a: 1, b: 2, c: 3. }
  233. }
  234. #[repr(C)]
  235. pub union DoubleU {
  236. a: f64,
  237. }
  238. // CHECK: define void @f_double_u_arg(i64 %0)
  239. #[no_mangle]
  240. pub extern "C" fn f_double_u_arg(a: DoubleU) {}
  241. // CHECK: define i64 @f_ret_double_u()
  242. #[no_mangle]
  243. pub extern "C" fn f_ret_double_u() -> DoubleU {
  244. unsafe { DoubleU { a: 1. } }
  245. }