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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
/* Asm operands that are given as hard registers must keep the same
hard register all the way through compilation. Example derived
from glibc source. */
/* { dg-do compile } */
/* { dg-options "-O2 -frename-registers -fcprop-registers" } */
/* { dg-final { scan-assembler "callsys1 .0 .19 .0 .16 .17" } } */
/* { dg-final { scan-assembler "callsys2 .0 .19 .0 .16 .17" } } */
struct stat {
int dummy;
};
struct kernel_stat {
int dummy;
};
extern int xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf);
extern int *__errno_location (void) __attribute__ ((__const__));
int
__fxstat (int vers, int fd, struct stat *buf)
{
struct kernel_stat kbuf;
int result;
if (vers == 0)
return
({
long _sc_ret, _sc_err;
{
register long _sc_0 __asm__("$0");
register long _sc_16 __asm__("$16");
register long _sc_17 __asm__("$17");
register long _sc_19 __asm__("$19");
_sc_0 = 91;
_sc_16 = (long) (fd);
_sc_17 = (long) (((struct kernel_stat *) buf));
__asm__("callsys1 %0 %1 %2 %3 %4"
: "=r"(_sc_0), "=r"(_sc_19)
: "0"(_sc_0), "r"(_sc_16), "r"(_sc_17)
: "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8",
"$22", "$23", "$24", "$25", "$27", "$28", "memory");
_sc_ret = _sc_0, _sc_err = _sc_19;
}
if (_sc_err)
{
(*__errno_location ()) = (_sc_ret);
_sc_ret = -1L;
}
_sc_ret;
});
result =
({
long _sc_ret, _sc_err;
{
register long _sc_0 __asm__("$0");
register long _sc_16 __asm__("$16");
register long _sc_17 __asm__("$17");
register long _sc_19 __asm__("$19");
_sc_0 = 91;
_sc_16 = (long) (fd);
_sc_17 = (long) ((&kbuf));
__asm__("callsys2 %0 %1 %2 %3 %4"
: "=r"(_sc_0), "=r"(_sc_19)
: "0"(_sc_0), "r"(_sc_16), "r"(_sc_17)
: "$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8",
"$22", "$23", "$24", "$25", "$27", "$28", "memory");
_sc_ret = _sc_0, _sc_err = _sc_19;
}
if (_sc_err)
{
(*__errno_location ()) = (_sc_ret);
_sc_ret = -1L;
}
_sc_ret;
});
if (result == 0)
result = xstat_conv (vers, &kbuf, buf);
return result;
}
|