From: Tanaka Akira Date: 2005-12-29T17:31:47+09:00 Subject: [ruby-dev:28170] Re: Intel C++ Compiler and HP aC++/ANSI C on IA64 In article <87fyofvyns.fsf@m17n.org>, Tanaka Akira writes: > 問題は、setjmp/getcontext から (longjmp/setcontext 経由で) > return した時に r32 以降 (register stack に保存されるレジス > タ) が setjmp/getcontext の呼出し時とは違う値になっている可 > 能性があるにもかかわらずコンパイラがその可能性を想定しないコー > ドを生成している、というところにあります。 Intel Itanium Processor-specific Application Binary Interface (ABI) http://www.intel.com/design/itanium/downloads/245370.htm にこの話の記述があることを見付けました。 7.2.3.2 Pragma for Control Flow Properties of Procedure Calls というところに載っている #pragma unknown_control_flow という やつです。 そういう #pragma をコンパイラがサポートしていて、ただ glibc のヘッダファイルに入ってないだけの問題であれば、自分で #pragma をつければいいかなぁ、と試してみると、残念ながら Intel C++ Compiler 9.0 はサポートしていないようです。 eval.c(34): warning #161: unrecognized #pragma #pragma unknown_control_flow(getcontext) ^ td178.testdrive.hp.com> icc --version icc (ICC) 9.0 20051020 Copyright (C) 1985-2005 Intel Corporation. All rights reserved. なお、HP-UX のヘッダファイルには ASYNCH_RETURN という、指定 されている関数が非常に似通っている #pragma があります。でも、 検索しても引っかからないのでどんな効果があるのか不明で気になっ ています。 (少なくとも現状では ruby が core を吐かなくなる効果は無いわ けですが、それがコンパイラのバグなのか ASYNCH_RETURN の効果 が想像しているものと違うのかがわからない) td176> cd /usr/include td176> find . -type f -print|xargs grep ASYNCH_RETURN td176> /dev/null ./sys/ucontext.h:# pragma ASYNCH_RETURN getcontext ./ia64/sys/setjmp.h:#pragma ASYNCH_RETURN setjmp ./setjmp.h:# pragma ASYNCH_RETURN setjmp ./setjmp.h:# pragma ASYNCH_RETURN _setjmp ./setjmp.h:# pragma ASYNCH_RETURN sigsetjmp -- [田中 哲][たなか あきら][Tanaka Akira]