diff --git a/cpu-all.h b/cpu-all.h index 32b7a6688b..ee0a6e3abf 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 1337cd2b1f..d32142547e 100644 --- a/darwin-user/signal.c +++ b/darwin-user/signal.c @@ -37,6 +37,7 @@ #include #include "qemu.h" +#include "qemu-common.h" #define DEBUG_SIGNAL @@ -132,7 +133,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 dbfe5bf89c..1b28bbcf15 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 c3f7381289..a468d7a830 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -28,6 +28,7 @@ #include #include "qemu.h" +#include "qemu-common.h" #include "target_signal.h" //#define DEBUG_SIGNAL @@ -348,7 +349,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 d3df63ea01..6ee31e0788 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 964b28bcd4..0b59cfda21 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -34,7 +34,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 284f7b0f3b..268982381d 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 6e0e32e75b..a36c959a5b 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);