This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: C++: Letting compiler know asm block can call function that can throw?


On 03/29/2012 09:44 AM, Jakub Jelinek wrote:
On Thu, Mar 29, 2012 at 09:05:29AM +0200, Stephan Bergmann wrote:
In LibreOffice's ever-beloved low-level code to synthesize calls to
C++ virtual functions, I'm having the following problem (on Linux
x86_64). The function callVirtualMethod at<http://cgit.freedesktop.org/libreoffice/core/tree/bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx?id=571876c1234ae55aab0198c7e2caf9049fcd230e#n61>
effectively does the following:

First, call dummy_can_throw_anything that can potentially throw (see
below for why that's there).  Second, in an asm block, call some
virtual function (that can potentially throw).  Third, call
x86_64::fill_struct that can potentially throw (it doesn't, but
nobody bothered to annotate it as "throw ()").

If the asm isn't in headers, but just in a single short source file or two, you could try compiling that file with -fnon-call-exceptions. It is nothing I'd recommend for the whole codebase though.

Turns out I had to move the callVirtualMethod function containing the asm into a source file of its own, anyway. (Otherwise, even if it no longer explicitly called functions that can throw, and thus no longer had corresponding .gcc_except_table entries, exception throwing still lead to std::terminate. There are other functions in the same source file callVirtualMethod was originally in that do have .gcc_except_table entries. Kind of invalidates my previous explanation of why exception handling bailed out to std::terminate. Looks like I haven't groked it yet, anyway.)


So an explicit -fnon-call-exceptions on the command line seems to indeed help. Unfortunately, moving that into a

#pragma GCC optimize ("non-call-exceptions")

at the top of the source file that defines callVirtualMethod (and nothing more) does *not* work. Is that a bug?

Anyway, would it be worthwhile filing an RFE for an asm annotation telling the compiler that it contains code that can throw?

Thanks,
Stephan


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]