1/* PR middle-end/36043 target/58744 target/65408 */
2/* { dg-do run { target mmap } } */
3/* { dg-options "-O2" } */
4
5#include <sys/mman.h>
6#ifndef MAP_ANONYMOUS
7#define MAP_ANONYMOUS MAP_ANON
8#endif
9#ifndef MAP_ANON
10#define MAP_ANON 0
11#endif
12#ifndef MAP_FAILED
13#define MAP_FAILED ((void *)-1)
14#endif
15
16typedef struct
17{
18  unsigned char r;
19  unsigned char g;
20  unsigned char b;
21} __attribute__((packed)) pr58744;
22
23typedef struct
24{
25  unsigned short r;
26  unsigned short g;
27  unsigned short b;
28} pr36043;
29
30typedef struct
31{
32  int r;
33  int g;
34  int b;
35} pr65408;
36
37__attribute__ ((noinline, noclone))
38void
39f1a (pr58744 x)
40{
41  if (x.r != 1 || x.g != 2 || x.b != 3)
42    __builtin_abort();
43}
44
45__attribute__ ((noinline, noclone))
46void
47f1 (pr58744 *x)
48{
49  f1a (*x);
50}
51
52__attribute__ ((noinline, noclone))
53void
54f2a (pr36043 x)
55{
56  if (x.r != 1 || x.g != 2 || x.b != 3)
57    __builtin_abort();
58}
59
60__attribute__ ((noinline, noclone))
61void
62f2 (pr36043 *x)
63{
64  f2a (*x);
65}
66
67__attribute__ ((noinline, noclone))
68void
69f3a (pr65408 x)
70{
71  if (x.r != 1 || x.g != 2 || x.b != 3)
72    __builtin_abort();
73}
74
75__attribute__ ((noinline, noclone))
76void
77f3 (pr65408 *x)
78{
79  f3a (*x);
80}
81
82int
83main ()
84{
85  char *p = mmap ((void *) 0, 131072, PROT_READ | PROT_WRITE,
86		  MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
87  if (p == MAP_FAILED)
88    return 0;
89  char *endp = p + 65536;
90  if (munmap (endp, 65536) < 0)
91    return 0;
92
93  pr58744 *s1 = (pr58744 *) endp - 1;
94  s1->r = 1;
95  s1->g = 2;
96  s1->b = 3;
97  f1 (s1);
98
99  pr36043 *s2 = (pr36043 *) endp - 1;
100  s2->r = 1;
101  s2->g = 2;
102  s2->b = 3;
103  f2 (s2);
104
105  pr65408 *s3 = (pr65408 *) endp - 1;
106  s3->r = 1;
107  s3->g = 2;
108  s3->b = 3;
109  f3 (s3);
110
111  return 0;
112}
113