tests: Fission transparent-struct-ptr.rs for wasm · rust-lang/rust@30be609 (original) (raw)

``

1

`+

//@ revisions: wasm32

`

``

2

`+

//@ compile-flags: -O -C no-prepopulate-passes

`

``

3

+

``

4

`+

//@[wasm32] compile-flags: --target wasm32-wasi

`

``

5

`+

//@[wasm32] needs-llvm-components: webassembly

`

``

6

+

``

7

`+

// See ./transparent.rs

`

``

8

`+

// Some platforms pass large aggregates using immediate arrays in LLVMIR

`

``

9

`+

// Other platforms pass large aggregates using struct pointer in LLVMIR

`

``

10

`+

// This covers the "struct pointer" case, except without "byval".

`

``

11

+

``

12

`+

#![feature(no_core, lang_items, transparent_unions)]

`

``

13

`+

#![crate_type = "lib"]

`

``

14

`+

#![no_std]

`

``

15

`+

#![no_core]

`

``

16

+

``

17

`+

#[lang = "sized"]

`

``

18

`+

trait Sized {}

`

``

19

`+

#[lang = "freeze"]

`

``

20

`+

trait Freeze {}

`

``

21

`+

#[lang = "copy"]

`

``

22

`+

trait Copy {}

`

``

23

+

``

24

`+

impl Copy for [u32; 16] {}

`

``

25

`+

impl Copy for BigS {}

`

``

26

`+

impl Copy for BigU {}

`

``

27

+

``

28

`+

#[repr(C)]

`

``

29

`+

pub struct BigS([u32; 16]);

`

``

30

+

``

31

`+

#[repr(transparent)]

`

``

32

`+

pub struct TsBigS(BigS);

`

``

33

+

``

34

`+

#[repr(transparent)]

`

``

35

`+

pub union TuBigS {

`

``

36

`+

field: BigS,

`

``

37

`+

}

`

``

38

+

``

39

`+

#[repr(transparent)]

`

``

40

`+

pub enum TeBigS {

`

``

41

`+

Variant(BigS),

`

``

42

`+

}

`

``

43

+

``

44

`+

// CHECK: define{{.}}void @test_BigS(ptr [[BIGS_RET_ATTRS1:.]] sret([64 x i8]) [[BIGS_RET_ATTRS2:.]], ptr [[BIGS_ARG_ATTRS1:.]] [[BIGS_ARG_ATTRS2:.*]])

`

``

45

`+

#[no_mangle]

`

``

46

`+

pub extern "C" fn test_BigS(_: BigS) -> BigS {

`

``

47

`+

loop {}

`

``

48

`+

}

`

``

49

+

``

50

`+

// CHECK: define{{.}}void @test_TsBigS(ptr [[BIGS_RET_ATTRS1]] sret([64 x i8]) [[BIGS_RET_ATTRS2]], ptr [[BIGS_ARG_ATTRS1]] [[BIGS_ARG_ATTRS2:.]])

`

``

51

`+

#[no_mangle]

`

``

52

`+

pub extern "C" fn test_TsBigS(_: TsBigS) -> TsBigS {

`

``

53

`+

loop {}

`

``

54

`+

}

`

``

55

+

``

56

`+

// CHECK: define{{.}}void @test_TuBigS(ptr [[BIGS_RET_ATTRS1]] sret([64 x i8]) [[BIGS_RET_ATTRS2]], ptr [[BIGS_ARG_ATTRS1]] [[BIGS_ARG_ATTRS2:.]])

`

``

57

`+

#[no_mangle]

`

``

58

`+

pub extern "C" fn test_TuBigS(_: TuBigS) -> TuBigS {

`

``

59

`+

loop {}

`

``

60

`+

}

`

``

61

+

``

62

`+

// CHECK: define{{.*}}void @test_TeBigS(ptr [[BIGS_RET_ATTRS1]] sret([64 x i8]) [[BIGS_RET_ATTRS2]], ptr [[BIGS_ARG_ATTRS1]] [[BIGS_ARG_ATTRS2]])

`

``

63

`+

#[no_mangle]

`

``

64

`+

pub extern "C" fn test_TeBigS(_: TeBigS) -> TeBigS {

`

``

65

`+

loop {}

`

``

66

`+

}

`

``

67

+

``

68

`+

#[repr(C)]

`

``

69

`+

pub union BigU {

`

``

70

`+

foo: [u32; 16],

`

``

71

`+

}

`

``

72

+

``

73

`+

#[repr(transparent)]

`

``

74

`+

pub struct TsBigU(BigU);

`

``

75

+

``

76

`+

#[repr(transparent)]

`

``

77

`+

pub union TuBigU {

`

``

78

`+

field: BigU,

`

``

79

`+

}

`

``

80

+

``

81

`+

#[repr(transparent)]

`

``

82

`+

pub enum TeBigU {

`

``

83

`+

Variant(BigU),

`

``

84

`+

}

`

``

85

+

``

86

`+

// CHECK: define{{.}}void @test_BigU(ptr [[BIGU_RET_ATTRS1:.]] sret([64 x i8]) [[BIGU_RET_ATTRS2:.]], ptr [[BIGU_ARG_ATTRS1:.]] [[BIGU_ARG_ATTRS2:.*]])

`

``

87

`+

#[no_mangle]

`

``

88

`+

pub extern "C" fn test_BigU(_: BigU) -> BigU {

`

``

89

`+

loop {}

`

``

90

`+

}

`

``

91

+

``

92

`+

// CHECK: define{{.}}void @test_TsBigU(ptr [[BIGU_RET_ATTRS1:.]] sret([64 x i8]) [[BIGU_RET_ATTRS2:.*]], ptr [[BIGU_ARG_ATTRS1]] [[BIGU_ARG_ATTRS2]])

`

``

93

`+

#[no_mangle]

`

``

94

`+

pub extern "C" fn test_TsBigU(_: TsBigU) -> TsBigU {

`

``

95

`+

loop {}

`

``

96

`+

}

`

``

97

+

``

98

`+

// CHECK: define{{.}}void @test_TuBigU(ptr [[BIGU_RET_ATTRS1]] sret([64 x i8]) [[BIGU_RET_ATTRS2:.]], ptr [[BIGU_ARG_ATTRS1]] [[BIGU_ARG_ATTRS2]])

`

``

99

`+

#[no_mangle]

`

``

100

`+

pub extern "C" fn test_TuBigU(_: TuBigU) -> TuBigU {

`

``

101

`+

loop {}

`

``

102

`+

}

`

``

103

+

``

104

`+

// CHECK: define{{.}}void @test_TeBigU(ptr [[BIGU_RET_ATTRS1]] sret([64 x i8]) [[BIGU_RET_ATTRS2:.]], ptr [[BIGU_ARG_ATTRS1]] [[BIGU_ARG_ATTRS2]])

`

``

105

`+

#[no_mangle]

`

``

106

`+

pub extern "C" fn test_TeBigU(_: TeBigU) -> TeBigU {

`

``

107

`+

loop {}

`

``

108

`+

}

`