From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LDIu7-0005eW-5I for qemu-devel@nongnu.org; Thu, 18 Dec 2008 08:27:03 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LDIu6-0005e8-Ek for qemu-devel@nongnu.org; Thu, 18 Dec 2008 08:27:02 -0500 Received: from [199.232.76.173] (port=58908 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LDIu6-0005e5-CD for qemu-devel@nongnu.org; Thu, 18 Dec 2008 08:27:02 -0500 Received: from david.siemens.de ([192.35.17.14]:19606) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LDIu5-0001B6-Mf for qemu-devel@nongnu.org; Thu, 18 Dec 2008 08:27:02 -0500 Received: from lizzard.sbs.de (lizzard.sbs.de [194.138.37.39]) by david.siemens.de (8.12.11.20060308/8.12.11) with ESMTP id mBIDR0uu009573 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 18 Dec 2008 14:27:00 +0100 Received: from mail2.sbs.de (localhost [127.0.0.1]) by lizzard.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id mBIDQxZV031514 for ; Thu, 18 Dec 2008 14:26:59 +0100 Received: from [139.25.109.167] (mchn012c.mchp.siemens.de [139.25.109.167] (may be forged)) by mail2.sbs.de (8.12.11.20060308/8.12.11) with ESMTP id mBIDQxA3025151 for ; Thu, 18 Dec 2008 14:26:59 +0100 Message-ID: <494A4F87.4090108@siemens.com> Date: Thu, 18 Dec 2008 14:26:31 +0100 From: Jan Kiszka MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] Add noreturn function attribute Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Introduce noreturn attribute and attach it to cpu_loop_exit as well as interrupt/exception helpers for i386. This avoids a bunch of gcc4 warnings. [ Note that this patch comes with a workaround to include qemu-common.h even in cases where is currently causes conflicts with dyngen-exec.h. I've been told that these conflicts will get resolved in the future (/me will try to have a look as well - as time permits). ] Signed-off-by: Jan Kiszka --- cpu-all.h | 7 ++++--- darwin-user/signal.c | 3 ++- exec-all.h | 5 ++++- linux-user/signal.c | 3 ++- qemu-common.h | 14 +++++++++++--- qemu-img.c | 2 +- target-i386/exec.h | 5 +++-- target-i386/op_helper.c | 4 ++-- 8 files changed, 29 insertions(+), 14 deletions(-) diff --git a/cpu-all.h b/cpu-all.h index 648264c..329d26d 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -20,6 +20,8 @@ #ifndef CPU_ALL_H #define CPU_ALL_H +#include "qemu-common.h" + #if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) #define WORDS_ALIGNED #endif @@ -751,9 +753,8 @@ void cpu_dump_statistics (CPUState *env, FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...), int flags); -void cpu_abort(CPUState *env, const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 2, 3))) - __attribute__ ((__noreturn__)); +void noreturn cpu_abort(CPUState *env, const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); extern CPUState *first_cpu; extern CPUState *cpu_single_env; extern int64_t qemu_icount; diff --git a/darwin-user/signal.c b/darwin-user/signal.c index f412b36..98d0894 100644 --- a/darwin-user/signal.c +++ b/darwin-user/signal.c @@ -36,6 +36,7 @@ #include #include "qemu.h" +#include "qemu-common.h" #define DEBUG_SIGNAL @@ -131,7 +132,7 @@ static inline void free_sigqueue(struct sigqueue *q) } /* abort execution with signal */ -void __attribute((noreturn)) force_sig(int sig) +void noreturn force_sig(int sig) { int host_sig; host_sig = target_to_host_signal(sig); diff --git a/exec-all.h b/exec-all.h index fd96adf..03c174c 100644 --- a/exec-all.h +++ b/exec-all.h @@ -20,6 +20,9 @@ #ifndef _EXEC_ALL_H_ #define _EXEC_ALL_H_ + +#include "qemu-common.h" + /* allow to see translation results - the slowdown should be negligible, so we leave it */ #define DEBUG_DISAS @@ -82,7 +85,7 @@ TranslationBlock *tb_gen_code(CPUState *env, target_ulong pc, target_ulong cs_base, int flags, int cflags); void cpu_exec_init(CPUState *env); -void cpu_loop_exit(void); +void noreturn cpu_loop_exit(void); int page_unprotect(target_ulong address, unsigned long pc, void *puc); void tb_invalidate_phys_page_range(target_phys_addr_t start, target_phys_addr_t end, int is_cpu_write_access); diff --git a/linux-user/signal.c b/linux-user/signal.c index e0f6aaf..9d4946d 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -27,6 +27,7 @@ #include #include "qemu.h" +#include "qemu-common.h" #include "target_signal.h" //#define DEBUG_SIGNAL @@ -325,7 +326,7 @@ static inline void free_sigqueue(CPUState *env, struct sigqueue *q) } /* abort execution with signal */ -static void __attribute((noreturn)) force_sig(int sig) +static void noreturn force_sig(int sig) { int host_sig; host_sig = target_to_host_signal(sig); diff --git a/qemu-common.h b/qemu-common.h index d3df63e..6ee31e0 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -2,6 +2,13 @@ #ifndef QEMU_COMMON_H #define QEMU_COMMON_H +#define noreturn __attribute__ ((__noreturn__)) + +/* Hack around the mess dyngen-exec.h causes: We need noreturn in files that + cannot include the following headers without conflicts. This condition has + to be removed once dyngen is gone. */ +#ifndef __DYNGEN_EXEC_H__ + /* we put basic includes here to avoid repeating them in device drivers */ #include #include @@ -134,9 +141,8 @@ void *get_mmap_addr(unsigned long size); /* Error handling. */ -void hw_error(const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 1, 2))) - __attribute__ ((__noreturn__)); +void noreturn hw_error(const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 1, 2))); /* IO callbacks. */ typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size); @@ -179,4 +185,6 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id); /* Force QEMU to stop what it's doing and service IO */ void qemu_service_io(void); +#endif /* dyngen-exec.h hack */ + #endif diff --git a/qemu-img.c b/qemu-img.c index 207535f..d72dd71 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -33,7 +33,7 @@ /* Default to cache=writeback as data integrity is not important for qemu-tcg. */ #define BRDV_O_FLAGS BDRV_O_CACHE_WB -static void __attribute__((noreturn)) error(const char *fmt, ...) +static void noreturn error(const char *fmt, ...) { va_list ap; va_start(ap, fmt); diff --git a/target-i386/exec.h b/target-i386/exec.h index 4d97a1b..48d6102 100644 --- a/target-i386/exec.h +++ b/target-i386/exec.h @@ -31,6 +31,7 @@ register struct CPUX86State *env asm(AREG0); +#include "qemu-common.h" #include "qemu-log.h" #define EAX (env->regs[R_EAX]) @@ -62,8 +63,8 @@ void do_interrupt(int intno, int is_int, int error_code, target_ulong next_eip, int is_hw); void do_interrupt_user(int intno, int is_int, int error_code, target_ulong next_eip); -void raise_exception_err(int exception_index, int error_code); -void raise_exception(int exception_index); +void noreturn raise_exception_err(int exception_index, int error_code); +void noreturn raise_exception(int exception_index); void do_smm_enter(void); /* n must be a constant to be efficient */ diff --git a/target-i386/op_helper.c b/target-i386/op_helper.c index 52fee3d..d50a9c0 100644 --- a/target-i386/op_helper.c +++ b/target-i386/op_helper.c @@ -1284,8 +1284,8 @@ static int check_exception(int intno, int *error_code) * EIP value AFTER the interrupt instruction. It is only relevant if * is_int is TRUE. */ -static void raise_interrupt(int intno, int is_int, int error_code, - int next_eip_addend) +static void noreturn raise_interrupt(int intno, int is_int, int error_code, + int next_eip_addend) { if (!is_int) { helper_svm_check_intercept_param(SVM_EXIT_EXCP_BASE + intno, error_code);