From: Lorenzo Cavallaro Date: Wed, 24 Mar 2010 17:25:17 +0000 (+0000) Subject: cdecl calling convention expects the callee to pop the hidden pointer on X-Git-Tag: v3.1.7~204 X-Git-Url: http://zhaoyanbai.com/repos/%22http:/www.isc.org/icons/invmod.png?a=commitdiff_plain;h=a16308efdb1534588207e6c098409d19ea500289;p=minix.git cdecl calling convention expects the callee to pop the hidden pointer on struct return. For example, GCC and LLVM comply with this (tested on IA32). ACK doesn't seem to follow this convention and expects the caller to clean up the stack. Compiling hand-written ACK-compliant assembly code (returning a struct) with GCC or LLVM used to break things (4-bytes misaligned stack). The patch fixes this problem. --- diff --git a/include/Makefile b/include/Makefile index b33a8b9f1..a50426d6c 100644 --- a/include/Makefile +++ b/include/Makefile @@ -21,7 +21,8 @@ INCS+= minix/a.out.h minix/bitmap.h minix/callnr.h minix/cdrom.h \ minix/rs.h minix/safecopies.h minix/sef.h minix/sound.h \ minix/sys_config.h minix/sysinfo.h minix/syslib.h \ minix/sysutil.h minix/tty.h minix/type.h minix/types.h \ - minix/u64.h minix/vfsif.h minix/vm.h + minix/u64.h minix/vfsif.h minix/vm.h \ + minix/compiler.h minix/compiler-ack.h INCS+= net/hton.h net/if.h net/ioctl.h net/netlib.h INCS+= net/gen/arp_io.h net/gen/dhcp.h net/gen/ether.h \ net/gen/eth_hdr.h net/gen/eth_io.h net/gen/icmp.h \ diff --git a/include/minix/compiler-ack.h b/include/minix/compiler-ack.h new file mode 100644 index 000000000..a5ab4db10 --- /dev/null +++ b/include/minix/compiler-ack.h @@ -0,0 +1,9 @@ +/* Definitions for ACK-specific features. */ + +#ifndef _MINIX_COMPILER_ACK_H +#define _MINIX_COMPILER_ACK_H + +/* ACK expects the caller to pop the hidden pointer on struct return. */ +#define BYTES_TO_POP_ON_STRUCT_RETURN + +#endif /* _MINIX_COMPILER_ACK_H */ diff --git a/include/minix/compiler.h b/include/minix/compiler.h new file mode 100644 index 000000000..25732d156 --- /dev/null +++ b/include/minix/compiler.h @@ -0,0 +1,25 @@ +/* Definitions for compiler-specific features. */ + +#ifndef _MINIX_COMPILER_H +#define _MINIX_COMPILER_H + +/*===========================================================================* + * Compiler overrides * + *===========================================================================*/ +/* ACK */ +#ifdef __ACK__ +#include +#endif + +/*===========================================================================* + * Default values * + *===========================================================================*/ +/* + * cdecl calling convention expects the callee to pop the hidden pointer on + * struct return. For example, GCC and LLVM comply with this (tested on IA32). + */ +#ifndef BYTES_TO_POP_ON_STRUCT_RETURN +#define BYTES_TO_POP_ON_STRUCT_RETURN $4 +#endif + +#endif /* _MINIX_COMPILER_H */ diff --git a/lib/libc/arch/i386/int64/add64.S b/lib/libc/arch/i386/int64/add64.S index 0518b8d43..573bd7ff8 100644 --- a/lib/libc/arch/i386/int64/add64.S +++ b/lib/libc/arch/i386/int64/add64.S @@ -1,5 +1,7 @@ /* add64() - 64 bit addition Author: Kees J. Bot */ /* 7 Dec 1995 */ +#include + .text .globl _add64 @@ -12,7 +14,7 @@ _add64: movl 12(%esp), %edx adcl 20(%esp), %edx movl %edx, 4(%eax) - ret + ret BYTES_TO_POP_ON_STRUCT_RETURN /* */ /* $PchId: add64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */ diff --git a/lib/libc/arch/i386/int64/add64u.S b/lib/libc/arch/i386/int64/add64u.S index 5a63df8fd..41a0a93a6 100644 --- a/lib/libc/arch/i386/int64/add64u.S +++ b/lib/libc/arch/i386/int64/add64u.S @@ -1,5 +1,7 @@ /* add64u() - unsigned to 64 bit addition Author: Kees J. Bot */ /* 7 Dec 1995 */ +#include + .text .globl _add64u, _add64ul @@ -14,7 +16,7 @@ _add64ul: movl 12(%esp), %edx adcl $0, %edx movl %edx, 4(%eax) - ret + ret BYTES_TO_POP_ON_STRUCT_RETURN /* */ /* $PchId: add64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */ diff --git a/lib/libc/arch/i386/int64/cvu64.S b/lib/libc/arch/i386/int64/cvu64.S index 13fa832c1..8513f9d0e 100644 --- a/lib/libc/arch/i386/int64/cvu64.S +++ b/lib/libc/arch/i386/int64/cvu64.S @@ -1,5 +1,7 @@ /* cvu64() - unsigned converted to 64 bit Author: Kees J. Bot */ /* 7 Dec 1995 */ +#include + .text .globl _cvu64, _cvul64 @@ -11,7 +13,7 @@ _cvul64: movl 8(%esp), %edx movl %edx, (%eax) movl $0, 4(%eax) - ret + ret BYTES_TO_POP_ON_STRUCT_RETURN /* */ /* $PchId: cvu64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */ diff --git a/lib/libc/arch/i386/int64/make64.S b/lib/libc/arch/i386/int64/make64.S index c53474bb1..27b5a1d98 100644 --- a/lib/libc/arch/i386/int64/make64.S +++ b/lib/libc/arch/i386/int64/make64.S @@ -1,6 +1,8 @@ /* make64() - make a 64 bit number from two 32 bit halves */ /* Author: Kees J. Bot */ /* 7 Dec 1995 */ +#include + .text .globl _make64 @@ -11,7 +13,7 @@ _make64: movl %edx, (%eax) movl 12(%esp), %edx movl %edx, 4(%eax) - ret + ret BYTES_TO_POP_ON_STRUCT_RETURN /* */ /* $PchId: make64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */ diff --git a/lib/libc/arch/i386/int64/mul64u.S b/lib/libc/arch/i386/int64/mul64u.S index 60e8c487c..fd693a62e 100644 --- a/lib/libc/arch/i386/int64/mul64u.S +++ b/lib/libc/arch/i386/int64/mul64u.S @@ -1,6 +1,8 @@ /* mul64u() - unsigned long by unsigned multiply giving 64 bit result */ /* Author: Kees J. Bot */ /* 7 Dec 1995 */ +#include + .text .globl _mul64u @@ -12,7 +14,7 @@ _mul64u: movl %eax, (%ecx) movl %edx, 4(%ecx) movl %ecx, %eax - ret + ret BYTES_TO_POP_ON_STRUCT_RETURN /* */ /* $PchId: mul64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */ diff --git a/lib/libc/arch/i386/int64/sub64.S b/lib/libc/arch/i386/int64/sub64.S index 5100311be..fc1d80ad7 100644 --- a/lib/libc/arch/i386/int64/sub64.S +++ b/lib/libc/arch/i386/int64/sub64.S @@ -1,5 +1,7 @@ /* sub64() - 64 bit subtraction Author: Kees J. Bot */ /* 7 Dec 1995 */ +#include + .text .globl _sub64 @@ -12,7 +14,7 @@ _sub64: movl 12(%esp), %edx sbbl 20(%esp), %edx movl %edx, 4(%eax) - ret + ret BYTES_TO_POP_ON_STRUCT_RETURN /* */ /* $PchId: sub64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */ diff --git a/lib/libc/arch/i386/int64/sub64u.S b/lib/libc/arch/i386/int64/sub64u.S index 84314f275..2f5c2d45f 100644 --- a/lib/libc/arch/i386/int64/sub64u.S +++ b/lib/libc/arch/i386/int64/sub64u.S @@ -1,5 +1,7 @@ /* sub64() - unsigned from 64 bit subtraction Author: Kees J. Bot */ /* 7 Dec 1995 */ +#include + .text .globl _sub64u, _sub64ul @@ -14,7 +16,7 @@ _sub64ul: movl 12(%esp), %edx sbbl $0, %edx movl %edx, 4(%eax) - ret + ret BYTES_TO_POP_ON_STRUCT_RETURN /* */ /* $PchId: sub64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ */