OSDN Git Service

2008-04-27 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / struct-ret-3.c
1 /* PR middle-end/31309 */
2 /* Origin: Peeter Joot <peeterj@ca.ibm.com> */
3
4 /* { dg-do run { target *-*-linux* } } */
5
6 #include <sys/mman.h>
7 #include <string.h>
8 #include <stdio.h>
9 #include <errno.h>
10
11 unsigned long ossAlignX(unsigned long i, unsigned long X)
12 {
13    return ((i + (X - 1)) & ~(unsigned long) (X - 1));
14 }
15
16 struct STRUCT_6_BYTES
17 {
18    unsigned char slot[sizeof(unsigned short)];
19    unsigned char page[sizeof(unsigned int)];
20 };
21
22 struct SQLU_DICT_INFO_0
23 {
24    void *pBlah;
25    char bSomeFlag1;
26    char bSomeFlag2;
27    struct STRUCT_6_BYTES dRID;
28 };
29
30 struct SQLU_DATAPART_0
31 {
32    struct SQLU_DICT_INFO_0 *pDictRidderInfo;
33 };
34
35 struct XXX
36 {
37    struct SQLU_DATAPART_0 *m_pDatapart;
38 };
39
40 struct STRUCT_6_BYTES INIT_6_BYTES_ZERO()
41 {
42    struct STRUCT_6_BYTES ridOut = {{0,0}, {0,0,0,0}};
43    return ridOut;
44 }
45
46 void Initialize(struct XXX *this, int iIndex)
47 {
48    struct SQLU_DICT_INFO_0 *pDictRidderInfo
49      = this->m_pDatapart[iIndex].pDictRidderInfo;
50    pDictRidderInfo->bSomeFlag1 = 0;
51    pDictRidderInfo->bSomeFlag2 = 0;
52    pDictRidderInfo->dRID = INIT_6_BYTES_ZERO();
53 }
54
55 int main(void)
56 {
57    int rc;
58
59    struct stuff
60    {
61       char c0[4096-sizeof(struct XXX)];
62       struct XXX o;
63       char c1[4096*2-sizeof(struct SQLU_DATAPART_0)];
64       struct SQLU_DATAPART_0 dp;
65       char c2[4096*2-sizeof(struct SQLU_DICT_INFO_0)];
66       struct SQLU_DICT_INFO_0 di;
67       char c3[4096];
68    };
69
70    char buf[sizeof(struct stuff)+4096];
71    struct stuff *u = (struct stuff *)ossAlignX((unsigned long)&buf[0], 4096);
72    memset(u, 1, sizeof(struct stuff));
73    u->c1[0] = '\xAA';
74    u->c2[0] = '\xBB';
75    u->c3[0] = '\xCC';
76
77    rc = mprotect(u->c1, 4096, PROT_NONE);
78    if (rc == -1)
79       printf("mprotect:c1: %d: %d(%s)\n", rc, errno, strerror(errno));
80
81    rc = mprotect(u->c2, 4096, PROT_NONE);
82    if (rc == -1)
83       printf("mprotect:c2: %d: %d(%s)\n", rc, errno, strerror(errno));
84
85    rc = mprotect(u->c3, 4096, PROT_NONE);
86    if (rc == -1)
87       printf("mprotect:c3: %d: %d(%s)\n", rc, errno, strerror(errno));
88
89    u->o.m_pDatapart = &u->dp;
90    u->dp.pDictRidderInfo = &u->di;
91    Initialize(&u->o, 0);
92
93    mprotect(u->c1, 4096, PROT_READ|PROT_WRITE);
94    mprotect(u->c2, 4096, PROT_READ|PROT_WRITE);
95    mprotect(u->c3, 4096, PROT_READ|PROT_WRITE);
96
97    return 0;
98 }