On Solaris 11 2011-11 the vendor gcc 4.5.2 cannot compile gnulib's mktime.c:
$ make
...
gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -DGNULIB_STRICT_CHECKING=1 -Wall
-D_REENTRANT -g -O2 -MT mktime.o -MD -MP -MF $depbase.Tpo -c -o mktime.o
mktime.c &&\
mv -f $depbase.Tpo $depbase.Po
Assembler: mktime.c
"/var/tmp//ccGla4PN.s", line 10 : .align test amount has negative value
"/var/tmp//ccGla4PN.s", line 131 : .align test amount has negative value
"/var/tmp//ccGla4PN.s", line 355 : .align test amount has negative value
"/var/tmp//ccGla4PN.s", line 1111 : .align test amount has negative
value
*** Error code 1
Indeed, find attached the output of
$ gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -DGNULIB_STRICT_CHECKING=1 -Wall
-D_REENTRANT -O2 -S mktime.c -o mktime1.s
$ gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -DGNULIB_STRICT_CHECKING=1 -Wall
-D_REENTRANT -O2 -S mktime.c -DWRAPV -o mktime2.s
As you can see, the use of
#pragma GCC optimize ("wrapv")
apparently replaces the valid asm statements
.p2align 4,,15
with
.p2align 4,,-1
For the semantics of .p2align, see
http://sourceware.org/binutils/docs/as/P2align.html
I can reproduce the effect with gcc-4.5.2 built from source on a glibc system.
The difference is that the GNU assembler accepts the .p2align 4,,-1
pseudo-instruction, while the Solaris assembler doesn't.
I've registered this bug as <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51793>.
As a workaround, I would propose to emit this #pragma only on platforms
where we can be sure that GNU as is used. Namely, glibc systems.
2012-01-08 Bruno Haible <[email protected]>
mktime: Avoid compilation error on Solaris 11.
* lib/mktime.c (WRAPV): Define to 0 on all non-glibc systems.
--- lib/mktime.c.orig Sun Jan 8 14:27:58 2012
+++ lib/mktime.c Sun Jan 8 14:27:51 2012
@@ -25,24 +25,6 @@
# include <config.h>
#endif
-/* Some of the code in this file assumes that signed integer overflow
- silently wraps around. This assumption can't easily be programmed
- around, nor can it be checked for portably at compile-time or
- easily eliminated at run-time.
-
- Define WRAPV to 1 if the assumption is valid. Otherwise, define it
- to 0; this forces the use of slower code that, while not guaranteed
- by the C Standard, works on all production platforms that we know
- about. */
-#ifndef WRAPV
-# if (__GNUC__ == 4 && 4 <= __GNUC_MINOR__) || 4 < __GNUC__
-# pragma GCC optimize ("wrapv")
-# define WRAPV 1
-# else
-# define WRAPV 0
-# endif
-#endif
-
/* Assume that leap seconds are possible, unless told otherwise.
If the host has a 'zic' command with a '-L leapsecondfilename' option,
then it supports leap seconds; otherwise it probably doesn't. */
@@ -64,6 +46,26 @@
# define mktime my_mktime
#endif /* DEBUG */
+/* Some of the code in this file assumes that signed integer overflow
+ silently wraps around. This assumption can't easily be programmed
+ around, nor can it be checked for portably at compile-time or
+ easily eliminated at run-time.
+
+ Define WRAPV to 1 if the assumption is valid and if
+ #pragma GCC optimize ("wrapv")
+ does not trigger GCC bug
<http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51793>.
+ Otherwise, define it to 0; this forces the use of slower code that,
+ while not guaranteed by the C Standard, works on all production
+ platforms that we know about. */
+#ifndef WRAPV
+# if ((__GNUC__ == 4 && 4 <= __GNUC_MINOR__) || 4 < __GNUC__) && defined
__GLIBC__
+# pragma GCC optimize ("wrapv")
+# define WRAPV 1
+# else
+# define WRAPV 0
+# endif
+#endif
+
/* Verify a requirement at compile-time (unlike assert, which is runtime). */
#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
.file "mktime.c"
.text
.p2align 4,,-1
.type ranged_convert, @function
ranged_convert:
pushl %ebp
movl %esp, %ebp
subl $56, %esp
movl %ecx, 4(%esp)
movl %ebx, -12(%ebp)
movl %edx, %ebx
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
movl %eax, -28(%ebp)
movl %ecx, -32(%ebp)
movl %edx, (%esp)
call *%eax
testl %eax, %eax
je .L11
.L2:
movl -12(%ebp), %ebx
movl -8(%ebp), %esi
movl -4(%ebp), %edi
movl %ebp, %esp
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L11:
movl (%ebx), %esi
testl %esi, %esi
je .L2
xorl %edi, %edi
jmp .L9
.p2align 4,,7
.p2align 3
.L6:
movl %esi, %edx
movl %edi, %eax
sarl %eax
sarl %edx
addl %eax, %edx
movl %esi, %eax
andl %edi, %eax
andl $1, %eax
addl %eax, %edx
movl -32(%ebp), %eax
movl %edx, (%ebx)
movl %edx, -36(%ebp)
movl %ebx, (%esp)
movl %eax, 4(%esp)
call *-28(%ebp)
movl -36(%ebp), %edx
testl %eax, %eax
cmovl.ne %edx, %edi
cmovl.e %edx, %esi
.L9:
movl %esi, %edx
sarl $31, %edx
orl $1, %edx
addl %edi, %edx
cmpl %esi, %edx
jne .L6
testl %edi, %edi
je .L2
testl %eax, %eax
jne .L2
movl -32(%ebp), %eax
movl %edi, (%ebx)
movl %ebx, (%esp)
movl %eax, 4(%esp)
call *-28(%ebp)
jmp .L2
.size ranged_convert, .-ranged_convert
.p2align 4,,-1
.type guess_time_tm.clone.0, @function
guess_time_tm.clone.0:
pushl %ebp
pushl %edi
pushl %esi
pushl %ebx
movl %eax, %ebx
subl $24, %esp
movl 68(%esp), %ecx
movl 44(%esp), %eax
testl %ecx, %ecx
movl %eax, 12(%esp)
je .L13
movl 20(%ecx), %eax
movl %eax, 4(%esp)
movl %ebx, %eax
movl 4(%esp), %edi
shrdl $2, %edx, %eax
leal 475(%eax), %ebp
movl %ebx, %eax
andl $3, %eax
testl %eax, %eax
sete %al
movzbl %al, %eax
sarl $2, %edi
subl %eax, %ebp
addl $475, %edi
xorl %eax, %eax
testb $3, 4(%esp)
sete %al
subl %eax, %edi
movl $1374389535, %eax
imull %ebp
movl %ebp, %eax
sarl $31, %eax
subl 4(%esp), %ebx
sarl $3, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
leal (%eax,%eax,4), %eax
movl %eax, 8(%esp)
movl %ebp, %eax
subl 8(%esp), %eax
imull $365, %ebx, %ebx
shrl $31, %eax
subl %eax, %edx
movl $1374389535, %eax
movl %edx, 8(%esp)
imull %edi
movl %edi, %eax
sarl $31, %eax
sarl $3, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
leal (%eax,%eax,4), %eax
movl %eax, 16(%esp)
movl %edi, %eax
subl 16(%esp), %eax
shrl $31, %eax
subl %eax, %edx
movl 60(%esp), %eax
subl (%ecx), %eax
movl %eax, 16(%esp)
movl 56(%esp), %eax
subl 4(%ecx), %eax
movl %eax, 20(%esp)
movl 52(%esp), %eax
subl 8(%ecx), %eax
movl %eax, (%esp)
movl 12(%esp), %eax
subl 28(%ecx), %eax
movl %eax, %ecx
movl (%esp), %eax
subl %edi, %ecx
addl %ebx, %ecx
addl %ebp, %ecx
addl %edx, %ecx
sarl $2, %edx
subl %edx, %ecx
movl 8(%esp), %edx
subl 8(%esp), %ecx
sarl $2, %edx
addl %edx, %ecx
leal (%ecx,%ecx,2), %edx
leal (%eax,%edx,8), %edx
movl 64(%esp), %eax
imull $60, %edx, %edx
addl 20(%esp), %edx
imull $60, %edx, %edx
addl 16(%esp), %edx
leal (%edx,%eax), %eax
cmpl 64(%esp), %eax
setge %cl
shrl $31, %edx
cmpb %dl, %cl
jne .L14
.L13:
movl 64(%esp), %eax
testl %eax, %eax
js .L18
movl 64(%esp), %edx
movl $2147483647, %eax
subl $1, %edx
cmpl $2147483646, 64(%esp)
cmovl.ge %edx, %eax
.L14:
addl $24, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L18:
movl 64(%esp), %edx
movl $-2147483648, %eax
addl $1, %edx
cmpl $-2147483647, 64(%esp)
cmovl.le %edx, %eax
addl $24, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.size guess_time_tm.clone.0, .-guess_time_tm.clone.0
.globl __moddi3
.globl __divdi3
.p2align 4,,-1
.globl mktime_internal
.type mktime_internal, @function
mktime_internal:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
pushl %ebx
subl $220, %esp
movl 8(%ebp), %eax
movl 8(%ebp), %edx
movl 8(%ebp), %edi
movl (%eax), %eax
movl 4(%edx), %edx
movl 8(%edi), %edi
movl %eax, -176(%ebp)
movl 8(%ebp), %eax
movl %edx, -164(%ebp)
movl 8(%ebp), %edx
movl %edi, -168(%ebp)
movl 12(%eax), %eax
movl 16(%edx), %ecx
movl 20(%edx), %edi
movl %eax, -124(%ebp)
movl 32(%edx), %eax
movl %edi, -128(%ebp)
movl $715827883, %edi
movl %eax, -160(%ebp)
movl %ecx, %eax
imull %edi
movl %ecx, %eax
sarl $31, %eax
movl %edx, %edi
sarl %edi
subl %eax, %edi
leal (%edi,%edi,2), %eax
movl %edi, %ebx
sall $2, %eax
movl %ecx, %edi
subl %eax, %edi
movl -128(%ebp), %eax
movl %edi, %ecx
shrl $31, %ecx
subl %ecx, %ebx
movl %ebx, %esi
movl %eax, %edx
sarl $31, %edx
sarl $31, %esi
addl %eax, %ebx
adcl %edx, %esi
movl %ebx, %edx
xorl %eax, %eax
andl $3, %edx
movl %edx, -148(%ebp)
jne .L20
movl $100, 8(%esp)
movl $0, 12(%esp)
movl %ebx, (%esp)
movl %esi, 4(%esp)
movl %ecx, -184(%ebp)
call __moddi3
movl -184(%ebp), %ecx
movl %eax, -132(%ebp)
movl $1, %eax
orl -132(%ebp), %edx
je .L56
.L20:
leal (%eax,%eax), %edx
addl %eax, %edx
leal (%eax,%edx,4), %eax
leal (%ecx,%ecx), %edx
leal (%edx,%ecx), %ecx
leal (%edi,%ecx,4), %edx
addl %edx, %eax
movzwl __mon_yday(%eax,%eax), %eax
subl $1, %eax
movl %eax, -144(%ebp)
movl %eax, %edi
movl -124(%ebp), %eax
sarl $31, %edi
movl %edi, -140(%ebp)
movl %eax, %edx
sarl $31, %edx
addl %eax, -144(%ebp)
adcl %edx, -140(%ebp)
movl 16(%ebp), %edx
movl -176(%ebp), %eax
movl (%edx), %edx
testl %eax, %eax
movl $0, -132(%ebp)
movl %edx, -180(%ebp)
js .L22
cmpl $59, -176(%ebp)
movl $59, %edi
cmovl.le -176(%ebp), %edi
movl %edi, -132(%ebp)
.L22:
movl %ebx, %eax
movl $1374389535, %edx
shrdl $2, %esi, %eax
leal 475(%eax), %ecx
xorl %eax, %eax
cmpl $0, -148(%ebp)
sete %al
subl %eax, %ecx
movl %ecx, %eax
movl %ecx, %edi
imull %edx
movl %ecx, %eax
sarl $31, %eax
sarl $3, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
leal (%eax,%eax,4), %eax
subl %eax, %edi
movl %edi, %eax
shrl $31, %eax
subl %eax, %edx
leal -70(%ebx), %eax
imull $365, %eax, %eax
leal -477(%ecx,%eax), %ecx
movl %edx, %eax
addl -144(%ebp), %ecx
sarl $2, %eax
leal (%ecx,%eax), %eax
subl %edx, %eax
movl -168(%ebp), %edx
leal (%eax,%eax,2), %eax
leal (%edx,%eax,8), %eax
movl -128(%ebp), %edx
imull $60, %eax, %eax
addl -164(%ebp), %eax
sarl %edx
imull $60, %eax, %eax
addl -180(%ebp), %eax
addl -132(%ebp), %eax
movl %eax, -172(%ebp)
movl -124(%ebp), %eax
sarl $10, %eax
leal -35(%edx,%eax), %ecx
movl -168(%ebp), %eax
sarl $14, %eax
addl %eax, %ecx
movl -164(%ebp), %eax
sarl $20, %eax
addl %eax, %ecx
movl -172(%ebp), %eax
sarl $26, %eax
subl %ecx, %eax
movl %eax, %edx
sarl $31, %edx
xorl %eax, %edx
cmpl $21, %edx
jg .L57
.L24:
movl -172(%ebp), %edi
movl $0, -148(%ebp)
movl $6, -128(%ebp)
movl %edi, -32(%ebp)
movl %edi, -28(%ebp)
movl %edi, -124(%ebp)
.L27:
movl 12(%ebp), %eax
leal -72(%ebp), %ecx
leal -28(%ebp), %edx
call ranged_convert
movl -132(%ebp), %edx
movl -28(%ebp), %edi
movl %edx, 16(%esp)
movl -168(%ebp), %edx
movl %edi, 20(%esp)
movl %eax, 24(%esp)
movl -164(%ebp), %eax
movl %edx, 8(%esp)
movl -140(%ebp), %edx
movl %eax, 12(%esp)
movl -144(%ebp), %eax
movl %edx, 4(%esp)
movl %esi, %edx
movl %eax, (%esp)
movl %ebx, %eax
call guess_time_tm.clone.0
cmpl %eax, %edi
je .L58
cmpl %edi, -124(%ebp)
jne .L28
movl -124(%ebp), %edx
cmpl -32(%ebp), %edx
je .L28
movl -40(%ebp), %edx
testl %edx, %edx
js .L29
movl -160(%ebp), %ecx
testl %ecx, %ecx
js .L59
movl -160(%ebp), %ecx
testl %edx, %edx
setne %dl
testl %ecx, %ecx
setne %cl
cmpb %cl, %dl
jne .L29
.L28:
subl $1, -128(%ebp)
je .L46
movl -32(%ebp), %edx
movl %eax, -28(%ebp)
xorl %eax, %eax
cmpl $0, -40(%ebp)
movl %edi, -32(%ebp)
movl %edx, -124(%ebp)
setne %al
movl %eax, -148(%ebp)
jmp .L27
.p2align 4,,7
.p2align 3
.L59:
testl %edx, %edx
setne %dl
movzbl %dl, %edx
cmpl %edx, -148(%ebp)
jg .L28
.p2align 4,,7
.p2align 3
.L29:
movl -180(%ebp), %eax
movl 16(%ebp), %edi
subl -172(%ebp), %eax
addl -124(%ebp), %eax
movl %eax, (%edi)
movl -72(%ebp), %eax
cmpl %eax, -176(%ebp)
jne .L60
.L37:
movl -72(%ebp), %eax
movl 8(%ebp), %edi
movl %eax, (%edi)
movl -68(%ebp), %eax
movl %eax, 4(%edi)
movl -64(%ebp), %eax
movl %eax, 8(%edi)
movl -60(%ebp), %eax
movl %eax, 12(%edi)
movl -56(%ebp), %eax
movl %eax, 16(%edi)
movl -52(%ebp), %eax
movl %eax, 20(%edi)
movl -48(%ebp), %eax
movl %eax, 24(%edi)
movl -44(%ebp), %eax
movl %eax, 28(%edi)
movl -40(%ebp), %eax
movl %eax, 32(%edi)
movl -124(%ebp), %eax
addl $220, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L46:
movl $-1, -124(%ebp)
.L26:
movl -124(%ebp), %eax
addl $220, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L56:
movl $100, 8(%esp)
movl $0, 12(%esp)
movl %ebx, (%esp)
movl %esi, 4(%esp)
call __divdi3
movl -184(%ebp), %ecx
andl $3, %eax
cmpl $1, %eax
sete %al
movzbl %al, %eax
jmp .L20
.p2align 4,,7
.p2align 3
.L58:
movl -160(%ebp), %eax
movl -40(%ebp), %edx
movl %edi, -124(%ebp)
testl %eax, %eax
movl -160(%ebp), %eax
sete -148(%ebp)
orl %edx, %eax
notl %eax
shrl $31, %eax
testl %edx, %edx
sete %dl
xorb -148(%ebp), %dl
testl %edx, %eax
je .L29
movl $-601200, -128(%ebp)
movl $1202400, -124(%ebp)
movl %ebx, -160(%ebp)
movl %esi, -156(%ebp)
jmp .L32
.p2align 4,,7
.p2align 3
.L33:
addl $2, %esi
addl -124(%ebp), %ebx
cmpl $3, %esi
jne .L36
addl $1202400, -124(%ebp)
subl $601200, -128(%ebp)
cmpl $538675200, -124(%ebp)
je .L61
.L32:
movl -128(%ebp), %ebx
movl $-1, %esi
.L36:
leal (%edi,%ebx), %eax
movl %ebx, %edx
cmpl %edi, %eax
setge %cl
shrl $31, %edx
cmpb %dl, %cl
je .L33
movl %eax, -36(%ebp)
movl 12(%ebp), %eax
leal -36(%ebp), %edx
leal -108(%ebp), %ecx
call ranged_convert
movl -76(%ebp), %eax
movl %eax, %edx
notl %edx
shrl $31, %edx
testl %eax, %eax
sete %al
xorb -148(%ebp), %al
testl %eax, %edx
je .L55
movl -28(%ebp), %edi
jmp .L33
.L57:
movl -172(%ebp), %edi
movl $-1, -124(%ebp)
notl %edi
movl %edi, %eax
sarl $26, %eax
subl %ecx, %eax
movl %eax, %edx
sarl $31, %edx
xorl %eax, %edx
cmpl $21, %edx
jg .L26
movl %edi, %eax
subl -172(%ebp), %eax
movl %edi, -172(%ebp)
addl %eax, -180(%ebp)
jmp .L24
.L55:
movl -36(%ebp), %eax
leal -108(%ebp), %edx
movl %edx, 24(%esp)
movl -168(%ebp), %edx
movl -160(%ebp), %ebx
movl -156(%ebp), %esi
movl %eax, 20(%esp)
movl -164(%ebp), %eax
movl -132(%ebp), %edi
movl %edx, 8(%esp)
movl -140(%ebp), %edx
movl %eax, 12(%esp)
movl -144(%ebp), %eax
movl %edi, 16(%esp)
movl %edx, 4(%esp)
movl %esi, %edx
movl %eax, (%esp)
movl %ebx, %eax
call guess_time_tm.clone.0
leal -28(%ebp), %edx
leal -72(%ebp), %ecx
movl %eax, -28(%ebp)
movl 12(%ebp), %eax
call ranged_convert
movl -28(%ebp), %edx
movl %edx, -124(%ebp)
jmp .L29
.L60:
movl -132(%ebp), %edi
xorl %ebx, %ebx
testl %edi, %edi
jne .L38
xorl %ebx, %ebx
cmpl $60, %eax
sete %bl
.L38:
movl -124(%ebp), %eax
movl -176(%ebp), %ecx
addl -176(%ebp), %eax
cmpl -124(%ebp), %eax
movl $-1, -124(%ebp)
setge %dl
shrl $31, %ecx
cmpb %cl, %dl
je .L26
subl -132(%ebp), %ebx
leal (%ebx,%eax), %edx
cmpl %edx, %eax
setle %al
shrl $31, %ebx
cmpb %bl, %al
je .L26
leal -72(%ebp), %eax
movl %eax, 4(%esp)
leal -32(%ebp), %eax
movl %edx, -32(%ebp)
movl %eax, (%esp)
call *12(%ebp)
testl %eax, %eax
je .L26
movl -32(%ebp), %edx
movl %edx, -124(%ebp)
jmp .L37
.p2align 4,,7
.p2align 3
.L61:
movl %edi, -124(%ebp)
jmp .L29
.size mktime_internal, .-mktime_internal
.p2align 4,,-1
.globl rpl_mktime
.type rpl_mktime, @function
rpl_mktime:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 8(%ebp), %eax
movl $localtime_offset, 8(%esp)
movl $localtime_r, 4(%esp)
movl %eax, (%esp)
call mktime_internal
leave
ret
.size rpl_mktime, .-rpl_mktime
.local localtime_offset
.comm localtime_offset,4,4
.section .rodata
.align 32
.type __mon_yday, @object
.size __mon_yday, 52
__mon_yday:
.value 0
.value 31
.value 59
.value 90
.value 120
.value 151
.value 181
.value 212
.value 243
.value 273
.value 304
.value 334
.value 365
.value 0
.value 31
.value 60
.value 91
.value 121
.value 152
.value 182
.value 213
.value 244
.value 274
.value 305
.value 335
.value 366
.ident "GCC: (GNU) 4.5.2"
.file "mktime.c"
.text
.p2align 4,,15
.type ranged_convert, @function
ranged_convert:
pushl %ebp
movl %esp, %ebp
subl $56, %esp
movl %ecx, 4(%esp)
movl %ebx, -12(%ebp)
movl %edx, %ebx
movl %esi, -8(%ebp)
movl %edi, -4(%ebp)
movl %eax, -28(%ebp)
movl %ecx, -32(%ebp)
movl %edx, (%esp)
call *%eax
testl %eax, %eax
je .L11
.L2:
movl -12(%ebp), %ebx
movl -8(%ebp), %esi
movl -4(%ebp), %edi
movl %ebp, %esp
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L11:
movl (%ebx), %esi
testl %esi, %esi
je .L2
xorl %edi, %edi
jmp .L9
.p2align 4,,7
.p2align 3
.L6:
movl %esi, %edx
movl %edi, %eax
sarl %eax
sarl %edx
addl %eax, %edx
movl %esi, %eax
andl %edi, %eax
andl $1, %eax
addl %eax, %edx
movl -32(%ebp), %eax
movl %edx, (%ebx)
movl %edx, -36(%ebp)
movl %ebx, (%esp)
movl %eax, 4(%esp)
call *-28(%ebp)
movl -36(%ebp), %edx
testl %eax, %eax
cmovl.ne %edx, %edi
cmovl.e %edx, %esi
.L9:
movl %esi, %edx
sarl $31, %edx
orl $1, %edx
addl %edi, %edx
cmpl %esi, %edx
jne .L6
testl %edi, %edi
je .L2
testl %eax, %eax
jne .L2
movl -32(%ebp), %eax
movl %edi, (%ebx)
movl %ebx, (%esp)
movl %eax, 4(%esp)
call *-28(%ebp)
jmp .L2
.size ranged_convert, .-ranged_convert
.p2align 4,,15
.type guess_time_tm.clone.0, @function
guess_time_tm.clone.0:
pushl %ebp
pushl %edi
pushl %esi
pushl %ebx
movl %eax, %ebx
subl $24, %esp
movl 68(%esp), %ecx
movl 44(%esp), %eax
testl %ecx, %ecx
movl %eax, 12(%esp)
je .L13
movl 68(%esp), %ecx
movl %ebx, %edi
movl %ebx, %eax
shrdl $2, %edx, %edi
andl $3, %eax
addl $475, %edi
testl %eax, %eax
sete %al
movl 20(%ecx), %ecx
movzbl %al, %eax
subl %eax, %edi
xorl %eax, %eax
movl %ecx, %ebp
sarl $2, %ebp
addl $475, %ebp
testb $3, %cl
sete %al
subl %eax, %ebp
movl $1374389535, %eax
imull %edi
movl %edi, %eax
sarl $31, %eax
movl %ecx, 4(%esp)
subl 4(%esp), %ebx
sarl $3, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
leal (%eax,%eax,4), %ecx
movl %edi, %eax
subl %ecx, %eax
movl %eax, %ecx
movl $1374389535, %eax
shrl $31, %ecx
subl %ecx, %edx
movl %edx, 8(%esp)
imull %ebp
movl %ebp, %eax
sarl $31, %eax
imull $365, %ebx, %ebx
sarl $3, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
leal (%eax,%eax,4), %ecx
movl %ebp, %eax
subl %ecx, %eax
movl %eax, %ecx
movl 60(%esp), %eax
shrl $31, %ecx
subl %ecx, %edx
movl 68(%esp), %ecx
addl %edx, %edi
subl %ebp, %edi
sarl $2, %edx
subl (%ecx), %eax
subl %edx, %edi
movl 8(%esp), %edx
subl 8(%esp), %edi
movl %eax, 16(%esp)
movl 56(%esp), %eax
subl 4(%ecx), %eax
sarl $2, %edx
addl %edx, %edi
movl %eax, 20(%esp)
movl 52(%esp), %eax
subl 8(%ecx), %eax
movl %eax, (%esp)
movl 12(%esp), %eax
subl 28(%ecx), %eax
movl %eax, %ecx
movl 64(%esp), %eax
addl %ebx, %ecx
addl %edi, %ecx
leal (%ecx,%ecx,2), %edx
movl (%esp), %ecx
leal (%ecx,%edx,8), %edx
imull $60, %edx, %edx
addl 20(%esp), %edx
imull $60, %edx, %edx
addl 16(%esp), %edx
leal (%edx,%eax), %eax
cmpl 64(%esp), %eax
setge %cl
shrl $31, %edx
cmpb %dl, %cl
jne .L14
.L13:
movl 64(%esp), %eax
testl %eax, %eax
js .L18
movl 64(%esp), %edx
movl $2147483647, %eax
subl $1, %edx
cmpl $2147483646, 64(%esp)
cmovl.ge %edx, %eax
.L14:
addl $24, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L18:
movl 64(%esp), %edx
movl $-2147483648, %eax
addl $1, %edx
cmpl $-2147483647, 64(%esp)
cmovl.le %edx, %eax
addl $24, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.size guess_time_tm.clone.0, .-guess_time_tm.clone.0
.globl __moddi3
.globl __divdi3
.p2align 4,,15
.globl mktime_internal
.type mktime_internal, @function
mktime_internal:
pushl %ebp
movl %esp, %ebp
pushl %edi
pushl %esi
pushl %ebx
subl $220, %esp
movl 8(%ebp), %eax
movl 8(%ebp), %edx
movl 8(%ebp), %edi
movl (%eax), %eax
movl 4(%edx), %edx
movl 8(%edi), %edi
movl %eax, -176(%ebp)
movl 8(%ebp), %eax
movl %edx, -164(%ebp)
movl 8(%ebp), %edx
movl %edi, -168(%ebp)
movl 12(%eax), %eax
movl 16(%edx), %ecx
movl 20(%edx), %edi
movl %eax, -124(%ebp)
movl 32(%edx), %eax
movl %edi, -128(%ebp)
movl $715827883, %edi
movl %eax, -160(%ebp)
movl %ecx, %eax
imull %edi
movl %ecx, %eax
sarl $31, %eax
movl %edx, %edi
sarl %edi
subl %eax, %edi
leal (%edi,%edi,2), %eax
movl %edi, %ebx
sall $2, %eax
movl %ecx, %edi
subl %eax, %edi
movl -128(%ebp), %eax
movl %edi, %ecx
shrl $31, %ecx
subl %ecx, %ebx
movl %ebx, %esi
movl %eax, %edx
sarl $31, %edx
sarl $31, %esi
addl %eax, %ebx
adcl %edx, %esi
movl %ebx, %edx
xorl %eax, %eax
andl $3, %edx
movl %edx, -148(%ebp)
jne .L20
movl $100, 8(%esp)
movl $0, 12(%esp)
movl %ebx, (%esp)
movl %esi, 4(%esp)
movl %ecx, -184(%ebp)
call __moddi3
movl -184(%ebp), %ecx
movl %eax, -132(%ebp)
movl $1, %eax
orl -132(%ebp), %edx
je .L56
.L20:
leal (%eax,%eax), %edx
addl %eax, %edx
leal (%eax,%edx,4), %eax
leal (%ecx,%ecx), %edx
leal (%edx,%ecx), %ecx
leal (%edi,%ecx,4), %edx
addl %edx, %eax
movzwl __mon_yday(%eax,%eax), %eax
subl $1, %eax
movl %eax, -144(%ebp)
movl %eax, %edi
movl -124(%ebp), %eax
sarl $31, %edi
movl %edi, -140(%ebp)
movl %eax, %edx
sarl $31, %edx
addl %eax, -144(%ebp)
adcl %edx, -140(%ebp)
movl 16(%ebp), %edx
movl -176(%ebp), %eax
movl (%edx), %edx
testl %eax, %eax
movl $0, -132(%ebp)
movl %edx, -180(%ebp)
js .L22
cmpl $59, -176(%ebp)
movl $59, %edi
cmovl.le -176(%ebp), %edi
movl %edi, -132(%ebp)
.L22:
movl %ebx, %eax
movl $1374389535, %edx
shrdl $2, %esi, %eax
leal 475(%eax), %ecx
xorl %eax, %eax
cmpl $0, -148(%ebp)
sete %al
subl %eax, %ecx
movl %ecx, %eax
movl %ecx, %edi
imull %edx
movl %ecx, %eax
sarl $31, %eax
sarl $3, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
leal (%eax,%eax,4), %eax
subl %eax, %edi
movl %edi, %eax
movl -144(%ebp), %edi
shrl $31, %eax
subl %eax, %edx
leal -70(%ebx), %eax
imull $365, %eax, %eax
leal (%eax,%edi), %edi
movl %edx, %eax
sarl $2, %eax
leal -477(%ecx,%eax), %eax
subl %edx, %eax
movl -168(%ebp), %edx
leal (%edi,%eax), %eax
leal (%eax,%eax,2), %eax
leal (%edx,%eax,8), %eax
movl -128(%ebp), %edx
imull $60, %eax, %eax
addl -164(%ebp), %eax
sarl %edx
imull $60, %eax, %eax
addl -180(%ebp), %eax
addl -132(%ebp), %eax
movl %eax, -172(%ebp)
movl -124(%ebp), %eax
sarl $10, %eax
leal -35(%edx,%eax), %ecx
movl -168(%ebp), %eax
sarl $14, %eax
addl %eax, %ecx
movl -164(%ebp), %eax
sarl $20, %eax
addl %eax, %ecx
movl -172(%ebp), %eax
sarl $26, %eax
subl %ecx, %eax
movl %eax, %edx
sarl $31, %edx
xorl %eax, %edx
cmpl $21, %edx
jg .L57
.L24:
movl -172(%ebp), %edi
movl $0, -148(%ebp)
movl $6, -128(%ebp)
movl %edi, -32(%ebp)
movl %edi, -28(%ebp)
movl %edi, -124(%ebp)
.L27:
movl 12(%ebp), %eax
leal -72(%ebp), %ecx
leal -28(%ebp), %edx
call ranged_convert
movl -132(%ebp), %edx
movl -28(%ebp), %edi
movl %edx, 16(%esp)
movl -168(%ebp), %edx
movl %edi, 20(%esp)
movl %eax, 24(%esp)
movl -164(%ebp), %eax
movl %edx, 8(%esp)
movl -140(%ebp), %edx
movl %eax, 12(%esp)
movl -144(%ebp), %eax
movl %edx, 4(%esp)
movl %esi, %edx
movl %eax, (%esp)
movl %ebx, %eax
call guess_time_tm.clone.0
cmpl %eax, %edi
je .L58
cmpl %edi, -124(%ebp)
jne .L28
movl -124(%ebp), %edx
cmpl -32(%ebp), %edx
je .L28
movl -40(%ebp), %edx
testl %edx, %edx
js .L29
movl -160(%ebp), %ecx
testl %ecx, %ecx
js .L59
movl -160(%ebp), %ecx
testl %edx, %edx
setne %dl
testl %ecx, %ecx
setne %cl
cmpb %cl, %dl
jne .L29
.L28:
subl $1, -128(%ebp)
je .L46
movl -32(%ebp), %edx
movl %eax, -28(%ebp)
xorl %eax, %eax
cmpl $0, -40(%ebp)
movl %edi, -32(%ebp)
movl %edx, -124(%ebp)
setne %al
movl %eax, -148(%ebp)
jmp .L27
.p2align 4,,7
.p2align 3
.L59:
testl %edx, %edx
setne %dl
movzbl %dl, %edx
cmpl %edx, -148(%ebp)
jg .L28
.p2align 4,,7
.p2align 3
.L29:
movl -180(%ebp), %eax
movl 16(%ebp), %edi
subl -172(%ebp), %eax
addl -124(%ebp), %eax
movl %eax, (%edi)
movl -72(%ebp), %eax
cmpl %eax, -176(%ebp)
jne .L60
.L37:
movl -72(%ebp), %eax
movl 8(%ebp), %edi
movl %eax, (%edi)
movl -68(%ebp), %eax
movl %eax, 4(%edi)
movl -64(%ebp), %eax
movl %eax, 8(%edi)
movl -60(%ebp), %eax
movl %eax, 12(%edi)
movl -56(%ebp), %eax
movl %eax, 16(%edi)
movl -52(%ebp), %eax
movl %eax, 20(%edi)
movl -48(%ebp), %eax
movl %eax, 24(%edi)
movl -44(%ebp), %eax
movl %eax, 28(%edi)
movl -40(%ebp), %eax
movl %eax, 32(%edi)
movl -124(%ebp), %eax
addl $220, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L46:
movl $-1, -124(%ebp)
.L26:
movl -124(%ebp), %eax
addl $220, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.p2align 4,,7
.p2align 3
.L56:
movl $100, 8(%esp)
movl $0, 12(%esp)
movl %ebx, (%esp)
movl %esi, 4(%esp)
call __divdi3
movl -184(%ebp), %ecx
andl $3, %eax
cmpl $1, %eax
sete %al
movzbl %al, %eax
jmp .L20
.p2align 4,,7
.p2align 3
.L58:
movl -160(%ebp), %eax
movl -40(%ebp), %edx
movl %edi, -124(%ebp)
testl %eax, %eax
movl -160(%ebp), %eax
sete -148(%ebp)
orl %edx, %eax
notl %eax
shrl $31, %eax
testl %edx, %edx
sete %dl
xorb -148(%ebp), %dl
testl %edx, %eax
je .L29
movl $-601200, -128(%ebp)
movl $1202400, -124(%ebp)
movl %ebx, -160(%ebp)
movl %esi, -156(%ebp)
jmp .L32
.p2align 4,,7
.p2align 3
.L33:
addl $2, %esi
addl -124(%ebp), %ebx
cmpl $3, %esi
jne .L36
addl $1202400, -124(%ebp)
subl $601200, -128(%ebp)
cmpl $538675200, -124(%ebp)
je .L61
.L32:
movl -128(%ebp), %ebx
movl $-1, %esi
.L36:
leal (%edi,%ebx), %eax
movl %ebx, %edx
cmpl %edi, %eax
setge %cl
shrl $31, %edx
cmpb %dl, %cl
je .L33
movl %eax, -36(%ebp)
movl 12(%ebp), %eax
leal -36(%ebp), %edx
leal -108(%ebp), %ecx
call ranged_convert
movl -76(%ebp), %eax
movl %eax, %edx
notl %edx
shrl $31, %edx
testl %eax, %eax
sete %al
xorb -148(%ebp), %al
testl %eax, %edx
je .L55
movl -28(%ebp), %edi
jmp .L33
.L57:
movl -172(%ebp), %edi
movl $-1, -124(%ebp)
notl %edi
movl %edi, %eax
sarl $26, %eax
subl %ecx, %eax
movl %eax, %edx
sarl $31, %edx
xorl %eax, %edx
cmpl $21, %edx
jg .L26
movl %edi, %eax
subl -172(%ebp), %eax
movl %edi, -172(%ebp)
addl %eax, -180(%ebp)
jmp .L24
.L55:
movl -36(%ebp), %eax
leal -108(%ebp), %edx
movl %edx, 24(%esp)
movl -168(%ebp), %edx
movl -160(%ebp), %ebx
movl -156(%ebp), %esi
movl %eax, 20(%esp)
movl -164(%ebp), %eax
movl -132(%ebp), %edi
movl %edx, 8(%esp)
movl -140(%ebp), %edx
movl %eax, 12(%esp)
movl -144(%ebp), %eax
movl %edi, 16(%esp)
movl %edx, 4(%esp)
movl %esi, %edx
movl %eax, (%esp)
movl %ebx, %eax
call guess_time_tm.clone.0
leal -28(%ebp), %edx
leal -72(%ebp), %ecx
movl %eax, -28(%ebp)
movl 12(%ebp), %eax
call ranged_convert
movl -28(%ebp), %edx
movl %edx, -124(%ebp)
jmp .L29
.L60:
movl -132(%ebp), %esi
xorl %ebx, %ebx
testl %esi, %esi
jne .L38
xorl %ebx, %ebx
cmpl $60, %eax
sete %bl
.L38:
movl -124(%ebp), %eax
movl -176(%ebp), %ecx
addl -176(%ebp), %eax
cmpl -124(%ebp), %eax
movl $-1, -124(%ebp)
setge %dl
shrl $31, %ecx
cmpb %cl, %dl
je .L26
subl -132(%ebp), %ebx
leal (%ebx,%eax), %edx
cmpl %edx, %eax
setle %al
shrl $31, %ebx
cmpb %bl, %al
je .L26
leal -72(%ebp), %eax
movl %eax, 4(%esp)
leal -32(%ebp), %eax
movl %edx, -32(%ebp)
movl %eax, (%esp)
call *12(%ebp)
testl %eax, %eax
je .L26
movl -32(%ebp), %edx
movl %edx, -124(%ebp)
jmp .L37
.p2align 4,,7
.p2align 3
.L61:
movl %edi, -124(%ebp)
jmp .L29
.size mktime_internal, .-mktime_internal
.p2align 4,,15
.globl rpl_mktime
.type rpl_mktime, @function
rpl_mktime:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 8(%ebp), %eax
movl $localtime_offset, 8(%esp)
movl $localtime_r, 4(%esp)
movl %eax, (%esp)
call mktime_internal
leave
ret
.size rpl_mktime, .-rpl_mktime
.local localtime_offset
.comm localtime_offset,4,4
.section .rodata
.align 32
.type __mon_yday, @object
.size __mon_yday, 52
__mon_yday:
.value 0
.value 31
.value 59
.value 90
.value 120
.value 151
.value 181
.value 212
.value 243
.value 273
.value 304
.value 334
.value 365
.value 0
.value 31
.value 60
.value 91
.value 121
.value 152
.value 182
.value 213
.value 244
.value 274
.value 305
.value 335
.value 366
.ident "GCC: (GNU) 4.5.2"