summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/compile/pr45535.c
blob: 03d15a12d053fcd23e32deddba855ed444aaae0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
typedef struct {
    unsigned long pmd0;
    unsigned long pmd1;
} pmd_t;
typedef unsigned int pgd_t;
struct mm_struct {
    pgd_t * pgd;
};
extern inline int pmd_bad(pmd_t pmd)
{
}
extern inline void pmd_clear(pmd_t * pmdp)
{
  ((*pmdp).pmd0) = 0x20 | 0x00;
  ((*pmdp).pmd1) = 0x20 | 0x00;
}
static inline void free_one_pmd(pmd_t * dir)
{
  if (pmd_bad(*dir)) {
      pmd_clear(dir);
  }
}
static inline void free_one_pgd(pgd_t * dir)
{
  int j;
  pmd_t * pmd;
  pmd = ((pmd_t *) ((unsigned long) (void *)(__pgd_val(dir) & (~((1UL << 12)-1)))) + (((0) >> 21) & (512 - 1)));
  for (j = 0; j < 512 ; j++) {
      free_one_pmd(pmd+j);
  }
}
void clear_page_tables(struct mm_struct *mm, unsigned long first, int nr)
{
  pgd_t * page_dir = mm->pgd;
  do {
      free_one_pgd(page_dir);
  } while (--nr);
}