diff mbox

[1/3] Add support for target helper functions which don't return

Message ID 1332108964-12716-1-git-send-email-sw@weilnetz.de
State Accepted
Headers show

Commit Message

Stefan Weil March 18, 2012, 10:16 p.m. UTC
Most functions which handle exceptions don't return.

With a compiler attribute (added by QEMU_NORETURN),
gcc can optimize the code.

Signed-off-by: Stefan Weil <sw@weilnetz.de>
---
 def-helper.h |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

Comments

Andreas Färber March 19, 2012, 10:45 a.m. UTC | #1
Am 18.03.2012 23:16, schrieb Stefan Weil:
> Most functions which handle exceptions don't return.
> 
> With a compiler attribute (added by QEMU_NORETURN),
> gcc can optimize the code.

Do you have any numbers?

> 
> Signed-off-by: Stefan Weil <sw@weilnetz.de>

Seems like a sensible optimization,

Reviewed-by: Andreas Färber <afaerber@suse.de>

Andreas

> ---
>  def-helper.h |    7 +++++++
>  1 files changed, 7 insertions(+), 0 deletions(-)
> 
> diff --git a/def-helper.h b/def-helper.h
> index 0e70c31..b98ff69 100644
> --- a/def-helper.h
> +++ b/def-helper.h
> @@ -39,6 +39,7 @@
>  #endif
>  #define dh_alias_ptr ptr
>  #define dh_alias_void void
> +#define dh_alias_noreturn noreturn
>  #define dh_alias_env ptr
>  #define dh_alias(t) glue(dh_alias_, t)
>  
> @@ -52,36 +53,42 @@
>  #define dh_ctype_tl target_ulong
>  #define dh_ctype_ptr void *
>  #define dh_ctype_void void
> +#define dh_ctype_noreturn void QEMU_NORETURN
>  #define dh_ctype_env CPUArchState *
>  #define dh_ctype(t) dh_ctype_##t
>  
>  /* We can't use glue() here because it falls foul of C preprocessor
>     recursive expansion rules.  */
>  #define dh_retvar_decl0_void void
> +#define dh_retvar_decl0_noreturn void
>  #define dh_retvar_decl0_i32 TCGv_i32 retval
>  #define dh_retvar_decl0_i64 TCGv_i64 retval
>  #define dh_retvar_decl0_ptr TCGv_ptr retval
>  #define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
>  
>  #define dh_retvar_decl_void
> +#define dh_retvar_decl_noreturn
>  #define dh_retvar_decl_i32 TCGv_i32 retval,
>  #define dh_retvar_decl_i64 TCGv_i64 retval,
>  #define dh_retvar_decl_ptr TCGv_ptr retval,
>  #define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
>  
>  #define dh_retvar_void TCG_CALL_DUMMY_ARG
> +#define dh_retvar_noreturn TCG_CALL_DUMMY_ARG
>  #define dh_retvar_i32 GET_TCGV_i32(retval)
>  #define dh_retvar_i64 GET_TCGV_i64(retval)
>  #define dh_retvar_ptr GET_TCGV_ptr(retval)
>  #define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
>  
>  #define dh_is_64bit_void 0
> +#define dh_is_64bit_noreturn 0
>  #define dh_is_64bit_i32 0
>  #define dh_is_64bit_i64 1
>  #define dh_is_64bit_ptr (TCG_TARGET_REG_BITS == 64)
>  #define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t))
>  
>  #define dh_is_signed_void 0
> +#define dh_is_signed_noreturn 0
>  #define dh_is_signed_i32 0
>  #define dh_is_signed_s32 1
>  #define dh_is_signed_i64 0
Stefan Weil March 19, 2012, 11:06 a.m. UTC | #2
Am 19.03.2012 11:45, schrieb Andreas Färber:
> Am 18.03.2012 23:16, schrieb Stefan Weil:
>> Most functions which handle exceptions don't return.
>>
>> With a compiler attribute (added by QEMU_NORETURN),
>> gcc can optimize the code.
>
> Do you have any numbers?

Yes, of course: for (;;) { printf("%ld\n", random()); } :-)

To be honest, I don't expect large savings of code (some bytes for the 
function return
which is no longer needed), nor will there be a huge gain in execution 
speed.

It's more for documentation purposes that this attribute is useful here.
|We might also add a compiler warning for missing attributes some day
(-Wsuggest-attribute=||noreturn|) - it is surprising how many functions 
never return!

Regards,
Stefan

>
>>
>> Signed-off-by: Stefan Weil <sw@weilnetz.de>
>
> Seems like a sensible optimization,
>
> Reviewed-by: Andreas Färber <afaerber@suse.de>
>
> Andreas
diff mbox

Patch

diff --git a/def-helper.h b/def-helper.h
index 0e70c31..b98ff69 100644
--- a/def-helper.h
+++ b/def-helper.h
@@ -39,6 +39,7 @@ 
 #endif
 #define dh_alias_ptr ptr
 #define dh_alias_void void
+#define dh_alias_noreturn noreturn
 #define dh_alias_env ptr
 #define dh_alias(t) glue(dh_alias_, t)
 
@@ -52,36 +53,42 @@ 
 #define dh_ctype_tl target_ulong
 #define dh_ctype_ptr void *
 #define dh_ctype_void void
+#define dh_ctype_noreturn void QEMU_NORETURN
 #define dh_ctype_env CPUArchState *
 #define dh_ctype(t) dh_ctype_##t
 
 /* We can't use glue() here because it falls foul of C preprocessor
    recursive expansion rules.  */
 #define dh_retvar_decl0_void void
+#define dh_retvar_decl0_noreturn void
 #define dh_retvar_decl0_i32 TCGv_i32 retval
 #define dh_retvar_decl0_i64 TCGv_i64 retval
 #define dh_retvar_decl0_ptr TCGv_ptr retval
 #define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
 
 #define dh_retvar_decl_void
+#define dh_retvar_decl_noreturn
 #define dh_retvar_decl_i32 TCGv_i32 retval,
 #define dh_retvar_decl_i64 TCGv_i64 retval,
 #define dh_retvar_decl_ptr TCGv_ptr retval,
 #define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
 
 #define dh_retvar_void TCG_CALL_DUMMY_ARG
+#define dh_retvar_noreturn TCG_CALL_DUMMY_ARG
 #define dh_retvar_i32 GET_TCGV_i32(retval)
 #define dh_retvar_i64 GET_TCGV_i64(retval)
 #define dh_retvar_ptr GET_TCGV_ptr(retval)
 #define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
 
 #define dh_is_64bit_void 0
+#define dh_is_64bit_noreturn 0
 #define dh_is_64bit_i32 0
 #define dh_is_64bit_i64 1
 #define dh_is_64bit_ptr (TCG_TARGET_REG_BITS == 64)
 #define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t))
 
 #define dh_is_signed_void 0
+#define dh_is_signed_noreturn 0
 #define dh_is_signed_i32 0
 #define dh_is_signed_s32 1
 #define dh_is_signed_i64 0