qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] ColdFire/m68k target


From: Paul Brook
Subject: Re: [Qemu-devel] ColdFire/m68k target
Date: Tue, 31 Oct 2006 20:32:10 +0000
User-agent: KMail/1.9.5

On Tuesday 31 October 2006 20:20, Neo Jia wrote:
> Paul,
>
> I just checkout from CVS repository and encountered the following problem
> while building the code.
>
> It seems you eleminate your original arguments of function gen_op_divs and
> gen_op_divu.
>
> Could you take a look?
>
> gcc -Wall -O2 -g -fno-strict-aliasing -I. -I..
> -I/home/cjia/research/Operating_Systems/qemu_cvs/target-m68k
> -I/home/cjia/research/Operating_Systems/qemu_cvs
> -I/home/cjia/research/Operating_Systems/qemu_cvs/linux-user
> -I/home/cjia/research/Operating_Systems/qemu_cvs/linux-user/m68k
> -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
> -I/home/cjia/research/Operating_Systems/qemu_cvs/fpu
> -I/home/cjia/research/Operating_Systems/qemu_cvs/slirp -c -o
> translate.o/home/cjia/research/Operating_Systems/qemu_cvs/target-m68k/trans
>late.c
> /home/cjia/research/Operating_Systems/qemu_cvs/target-m68k/translate.c: In
> function `disas_divw':

Ah, this is a dyngen bug. op_divw contains "if (PARAM1) {...}". PARAM1 is 
implemented by taking the address of a symbol. gcc knows that symbols can 
never have address zero (because the C standard says so), and eliminates the 
whole block of code.

The patch below fixes it (weak symbols can be zero).  However it break lame 
hosts that don't support weak symbols, eg. win32. I'm still trying to figure 
out a proper solution.

Index: dyngen-exec.h
===================================================================
RCS file: /sources/qemu/qemu/dyngen-exec.h,v
retrieving revision 1.29
diff -u -p -r1.29 dyngen-exec.h
--- dyngen-exec.h       18 Jul 2006 21:23:34 -0000      1.29
+++ dyngen-exec.h       31 Oct 2006 16:53:38 -0000
@@ -222,7 +222,7 @@ extern int __op_param3 __hidden;
 #if defined(__APPLE__)
 static int __op_param1, __op_param2, __op_param3;
 #else
-extern int __op_param1, __op_param2, __op_param3;
+extern int __attribute__((weak)) __op_param1, __op_param2, __op_param3;
 #endif
 #define PARAM1 ((long)(&__op_param1))
 #define PARAM2 ((long)(&__op_param2))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]