[#11952] NORETURN — "Nobuyoshi.Nakada" <nobu.nakada@...>

なかだです。

24 messages 2001/01/10
[#11956] Re: NORETURN — WATANABE Hirofumi <eban@...> 2001/01/10

わたなべです.

[#11957] Re: NORETURN — matz@... (Yukihiro Matsumoto) 2001/01/10

まつもと ゆきひろです

[#11958] Re: NORETURN — WATANABE Hirofumi <eban@...> 2001/01/10

わたなべです.

[#11959] CVS branches (Re: Re: NORETURN) — matz@... (Yukihiro Matsumoto) 2001/01/10

[#12087] string#index, gsub, []= のバグ? — Beyond <beyond@...>

18 messages 2001/01/27
[#12091] Re: string#index, gsub, []= のバグ? — matz@... (Yukihiro Matsumoto) 2001/01/27

まつもと ゆきひろです

[ruby-dev:11961] Re: NORETURN

From: "Nobuyoshi.Nakada" <nobu.nakada@...>
Date: 2001-01-10 07:41:04 UTC
List: ruby-dev #11961
なかだです。

At Wed, 10 Jan 2001 14:51:56 +0900
WATANABE Hirofumi <eban@os.rim.or.jp> wrote:
> :# 昔の gcc も __attribute__ じゃなくて前に volatile をつけるという方式だっ
> :# たし。
> :## ってそんな古いのには対応してないか。
> 
> 今でも volatile は有効だから、gcc なら volatile という手もあ
> ることはありますね。

  今のは単に無視しちゃうようですよ。__attribute__((noreturn)) なら最後の 
xorl が消えますから。

$ cat test.c
volatile void foo(void);
int main(void)
{
    foo();
    return 0;
}
$ gcc -v
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/2.95.2-6/specs
gcc version 2.95.2-6 19991024 (cygwin experimental)
$ gcc -O3 -fomit-frame-pointer -S test.c
$ cat test.s
	.file	"test.c"
gcc2_compiled.:
___gnu_compiled_c:
	.def	___main;	.scl	2;	.type	32;	.endef
.text
	.align 4
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	subl $12,%esp
	call ___main
	call _foo
	xorl %eax,%eax
	addl $12,%esp
	ret
	.def	_foo;	.scl	2;	.type	32;	.endef

> そうですね。
>   void rb_exit _((int)) NORETURN;
> じゃなくて
>   NORETURN(void rb_exit _((int)));
> という形式にすればどっちにも対応できていいかも。
> 
> #define NORETURN(x) x __attribte__ ((noreturn))
> 
> #define NORETURN(x) __declspec(noreturn) x

  たしかに。VC 用とあわせて configure.in はこんな感じでしょうか。

AC_CACHE_CHECK([for noreturn], rb_cv_noreturn,
[rb_cv_noreturn=no
for mac in "x __attribute__ ((noreturn))" "__declspec(noreturn) x" x; do
  AC_TRY_COMPILE(
    [#define NORETURN(x) $mac
NORETURN(void exit(int x));],
    [],
    [rb_cv_noreturn="$mac"; break])
done])
AC_DEFINE_UNQUOTED([NORETURN(x)], $rb_cv_noreturn)

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread