1/* PR middle-end/31309 */ 2/* Origin: Peeter Joot <peeterj@ca.ibm.com> */ 3 4/* { dg-do run { target *-*-linux* *-*-gnu* } } */ 5 6#include <sys/mman.h> 7#include <string.h> 8#include <stdio.h> 9#include <errno.h> 10#include <unistd.h> 11 12#if defined(STACK_SIZE) && (STACK_SIZE < 128*1024) 13 #define CHUNK_SIZE 4096 14#else 15 #define CHUNK_SIZE 16384 16#endif 17 18unsigned long ossAlignX(unsigned long i, unsigned long X) 19{ 20 return ((i + (X - 1)) & ~(unsigned long) (X - 1)); 21} 22 23struct STRUCT_6_BYTES 24{ 25 unsigned char slot[sizeof(unsigned short)]; 26 unsigned char page[sizeof(unsigned int)]; 27}; 28 29struct SQLU_DICT_INFO_0 30{ 31 void *pBlah; 32 char bSomeFlag1; 33 char bSomeFlag2; 34 struct STRUCT_6_BYTES dRID; 35}; 36 37struct SQLU_DATAPART_0 38{ 39 struct SQLU_DICT_INFO_0 *pDictRidderInfo; 40}; 41 42struct XXX 43{ 44 struct SQLU_DATAPART_0 *m_pDatapart; 45}; 46 47struct STRUCT_6_BYTES INIT_6_BYTES_ZERO() 48{ 49 struct STRUCT_6_BYTES ridOut = {{0,0}, {0,0,0,0}}; 50 return ridOut; 51} 52 53void Initialize(struct XXX *this, int iIndex) 54{ 55 struct SQLU_DICT_INFO_0 *pDictRidderInfo 56 = this->m_pDatapart[iIndex].pDictRidderInfo; 57 pDictRidderInfo->bSomeFlag1 = 0; 58 pDictRidderInfo->bSomeFlag2 = 0; 59 pDictRidderInfo->dRID = INIT_6_BYTES_ZERO(); 60} 61 62int main(void) 63{ 64 int rc; 65 66 struct stuff 67 { 68 char c0[CHUNK_SIZE-sizeof(struct XXX)]; 69 struct XXX o; 70 char c1[CHUNK_SIZE*2-sizeof(struct SQLU_DATAPART_0)]; 71 struct SQLU_DATAPART_0 dp; 72 char c2[CHUNK_SIZE*2-sizeof(struct SQLU_DICT_INFO_0)]; 73 struct SQLU_DICT_INFO_0 di; 74 char c3[CHUNK_SIZE]; 75 }; 76 77 char buf[sizeof(struct stuff)+CHUNK_SIZE]; 78 struct stuff *u 79 = (struct stuff *)ossAlignX((unsigned long)&buf[0], CHUNK_SIZE); 80 81 /* This test assumes system memory page 82 size of CHUNK_SIZE bytes or less. */ 83 if (sysconf(_SC_PAGESIZE) > CHUNK_SIZE) 84 return 0; 85 86 memset(u, 1, sizeof(struct stuff)); 87 u->c1[0] = '\xAA'; 88 u->c2[0] = '\xBB'; 89 u->c3[0] = '\xCC'; 90 91 rc = mprotect(u->c1, CHUNK_SIZE, PROT_NONE); 92 if (rc == -1) 93 printf("mprotect:c1: %d: %d(%s)\n", rc, errno, strerror(errno)); 94 95 rc = mprotect(u->c2, CHUNK_SIZE, PROT_NONE); 96 if (rc == -1) 97 printf("mprotect:c2: %d: %d(%s)\n", rc, errno, strerror(errno)); 98 99 rc = mprotect(u->c3, CHUNK_SIZE, PROT_NONE); 100 if (rc == -1) 101 printf("mprotect:c3: %d: %d(%s)\n", rc, errno, strerror(errno)); 102 103 u->o.m_pDatapart = &u->dp; 104 u->dp.pDictRidderInfo = &u->di; 105 Initialize(&u->o, 0); 106 107 mprotect(u->c1, CHUNK_SIZE, PROT_READ|PROT_WRITE); 108 mprotect(u->c2, CHUNK_SIZE, PROT_READ|PROT_WRITE); 109 mprotect(u->c3, CHUNK_SIZE, PROT_READ|PROT_WRITE); 110 111 return 0; 112} 113