diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-05-24 15:19:11 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-05-24 15:19:11 +0000 |
commit | 5b941af607517aa973fb6528345e20a51394ced7 (patch) | |
tree | 3771082957c81623666f68cc0fc153c68f93f964 /gcc/ada/init.c | |
parent | babfbd63bce1aae7352f47da3becac684cdf995a (diff) | |
download | gcc-5b941af607517aa973fb6528345e20a51394ced7.tar.gz |
2004-05-24 Geert Bosch <bosch@gnat.com>
* a-numaux-x86.adb (Reduce): Reimplement using an approximation of Pi
with 192 bits of precision, sufficient to reduce a double-extended
arguments X with a maximum relative error of T'Machine_Epsilon, for X
in -2.0**32 .. 2.0**32.
(Cos, Sin): Always reduce arguments of 1/4 Pi or larger, to prevent
reduction by the processor, which only uses a 68-bit approximation of
Pi.
(Tan): Always reduce arguments and compute function either using
the processor's fptan instruction, or by dividing sin and cos as needed.
2004-05-24 Doug Rupp <rupp@gnat.com>
* adaint.c (__gnat_readdir): Cast CRTL function retun value to avoid
gcc error on 32/64 bit VMS.
2004-05-24 Olivier Hainque <hainque@act-europe.fr>
* init.c (__gnat_error_handler): Handle EEXIST as EACCES for SIGSEGVs,
since this is what we get for stack overflows although not documented
as such.
Document the issues which may require adjustments to our signal
handlers.
2004-05-24 Ed Schonberg <schonberg@gnat.com>
* inline.adb (Add_Scope_To_Clean): Do not add cleanup actions to the
enclosing dynamic scope if the instantiation is within a generic unit.
2004-05-24 Arnaud Charlet <charlet@act-europe.fr>
* exp_dbug.ads: Fix typo.
* Makefile.in: s-osinte-linux-ia64.ads was misnamed.
Rename it to its proper name: system-linux-ia64.ads
(stamp-gnatlib1): Remove extra target specific run time files when
setting up the rts directory.
2004-05-24 Javier Miranda <miranda@gnat.com>
* einfo.ads, einfo.adb (Limited_Views): Removed.
(Limited_View): New attribute that replaces the previous one. It is
now a bona fide package with the limited-view list through the
first_entity and first_private attributes.
* sem_ch10.adb (Install_Private_With_Clauses): Give support to
limited-private-with clause.
(Install_Limited_Withed_Unit): Install the private declarations of a
limited-private-withed package. Update the installation of the shadow
entities according to the new structure (see Build_Limited_Views)
(Build_Limited_Views): Replace the previous implementation of the
limited view by a package entity that references the first shadow
entity plus the first shadow private entity (required for limited-
private-with clause)
(New_Internal_Shadow_Entity): Code cleanup.
(Remove_Limited_With_Clause): Update the implementation to undo the
new work carried out by Build_Limited_Views.
(Build_Chain): Complete documentation.
Replace Ada0Y by Ada 0Y in comments
Minor reformating
* sem_ch3.adb (Array_Type_Declaration): In case of anonymous access
types the level of accessibility depends on the enclosing type
declaration.
* sem_ch8.adb (Find_Expanded_Name): Fix condition to detect shadow
entities. Complete documentation of previous change.
2004-05-24 Robert Dewar <dewar@gnat.com>
* namet.adb: Minor reformatting
Avoid use of name I (replace by J)
Minor code restructuring
* sem_ch6.adb: Minor reformatting
* lib-writ.adb: Do not set restriction as active if this is a
Restriction_Warning case.
* sem_prag.adb: Reset restriction warning flag if real pragma
restriction encountered.
* s-htable.adb: Minor reformatting
Change rotate count to 3 in Hash (improves hash for small strings)
* 5qsystem.ads: Add comments for type Address (no literals allowed).
* gnat_ugn.texi: Add new section of documentation "Code Generation
Control", which describes the use of -m switches.
2004-05-24 Eric Botcazou <ebotcazou@act-europe.fr>
(tree_transform) <N_Identifier>: Do the dereference directly through
the DECL_INITIAL for renamed variables.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82205 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/init.c')
-rw-r--r-- | gcc/ada/init.c | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/gcc/ada/init.c b/gcc/ada/init.c index b27e059ed9d..9d79b6c3c0e 100644 --- a/gcc/ada/init.c +++ b/gcc/ada/init.c @@ -262,6 +262,51 @@ __gnat_set_globals (int main_priority, at all; the intention is that this be replaced by system specific code where initialization is required. */ +/* Notes on the Zero Cost Exceptions scheme and its impact on the signal + handlers implemented below : + + What we call Zero Cost Exceptions is implemented using the GCC eh + circuitry, even if the underlying implementation is setjmp/longjmp + based. In any case ... + + The GCC unwinder expects to be dealing with call return addresses, since + this is the "nominal" case of what we retrieve while unwinding a regular + call chain. To evaluate if a handler applies at some point in this chain, + the propagation engine needs to determine what region the corresponding + call instruction pertains to. The return address may not be attached to the + same region as the call, so the unwinder unconditionally substracts "some" + amount to the return addresses it gets to search the region tables. The + exact amount is computed to ensure that the resulting address is inside the + call instruction, and is thus target dependant (think about delay slots for + instance). + + When we raise an exception from a signal handler, e.g. to transform a + SIGSEGV into Storage_Error, things need to appear as if the signal handler + had been "called" by the instruction which triggered the signal, so that + exception handlers that apply there are considered. What the unwinder will + retrieve as the return address from the signal handler is what it will find + as the faulting instruction address in the corresponding signal context + pushed by the kernel. Leaving this address untouched may loose, because if + the triggering instruction happens to be the very first of a region, the + later adjustements performed by the unwinder would yield an address outside + that region. We need to compensate for those adjustments at some point, + which we currently do in the GCC unwinding fallback macro. + + The thread at http://gcc.gnu.org/ml/gcc-patches/2004-05/msg00343.html + describes a couple of issues with our current approach. Basically: on some + targets the adjustment to apply depends on the triggering signal, which is + not easily accessible from the macro, and we actually do not tackle this as + of today. Besides, other languages, e.g. Java, deal with this by performing + the adjustment in the signal handler before the raise, so our adjustments + may break those front-ends. + + To have it all right, we should either find a way to deal with the signal + variants from the macro and convert Java on all targets (ugh), or remove + our macro adjustments and update our signal handlers a-la-java way. The + latter option appears the simplest, although some targets have their share + of subtleties to account for. See for instance the syscall(SYS_sigaction) + story in libjava/include/i386-signal.h. */ + /***********************************/ /* __gnat_initialize (AIX Version) */ /***********************************/ @@ -1051,6 +1096,18 @@ struct Machine_State static void __gnat_error_handler (int, int, sigcontext_t *); +/* We are not setting the SA_SIGINFO bit in the sigaction flags when + connecting that handler, with the effects described in the sigaction + man page: + + SA_SIGINFO [...] + If cleared and the signal is caught, the first argument is + also the signal number but the second argument is the signal + code identifying the cause of the signal. The third argument + points to a sigcontext_t structure containing the receiving + process's context when the signal was delivered. +*/ + static void __gnat_error_handler (int sig, int code, sigcontext_t *sc) { @@ -1076,8 +1133,13 @@ __gnat_error_handler (int sig, int code, sigcontext_t *sc) exception = &program_error; /* ??? storage_error ??? */ msg = "SIGSEGV: (Autogrow for file failed)"; } - else if (code == EACCES) + else if (code == EACCES || code == EEXIST) { + /* ??? We handle stack overflows here, some of which do trigger + SIGSEGV + EEXIST on Irix 6.5 although EEXIST is not part of + the documented valid codes for SEGV in the signal(5) man + page. */ + /* ??? Re-add smarts to further verify that we launched the stack into a guard page, not an attempt to write to .text or something */ |