[Top][All Lists]
[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))