Hi all,
Can gatekeeper help review the fix for bug851.
https://bugs.open64.net/show_bug.cgi?id=851
This is a revision for bug867.
case:
typedef unsigned char u8;
struct biosregs {
struct {
u8 dil, dih, edi2, edi3;
u8 sil, sih, esi2, esi3;
u8 bpl, bph, ebp2, ebp3;
u8 _spl, _sph, _esp2, _esp3;
u8 bl, bh, ebx2, ebx3;
};
};
int fn(struct biosregs *reg)
{
__builtin_memset(reg,0,sizeof *reg);
}
compile with: opencc -O0 -keep a.c -show -mregparm=3 -m32
memset's parms still transfered by stack.
movl %eax,-8(%ebp) # reg
movl -8(%ebp),%ecx # reg
movl %ecx,0(%esp) #
movl $0,%edx #
movl %edx,4(%esp) #
movl $20,%eax #
movl %eax,8(%esp) #
.loc 1 14 0
# 14 __builtin_memset(reg,0,sizeof *reg);
.globl memset
call memset # memset
Option "mregparm=%d" is used to set the reg parm for function call,
but it is not suitable for build-in fuctions.
There is another option "-TENV:mregparm=%d" to set that value special
for built-in fuction call.
So the fix is to add option "-TENV:mregparm=%d" when mregparm is used.
Patch:
Index: osprey/driver/OPTIONS
===================================================================
--- osprey/driver/OPTIONS (revision 3730)
+++ osprey/driver/OPTIONS (working copy)
@@ -2079,7 +2079,7 @@
""
-malign-functions=%d warn_ignored(option_name); ALL NONE self
""
--mregparm=%d ; Cc cfe -mregparm=%d
+-mregparm=%d ; Cc cfe,be "-mregparm=%d
-TENV:mregparm=%d"
"Control the number registers used to pass integer arguments"
%%% x86 extensions
-mmmx toggle(&mmx,TRUE); ALL ALL ""
Thanks
zhuqing
------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
Open64-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/open64-devel