From 9549767b9fa76abcf00035f099844c3f90bf8b43 Mon Sep 17 00:00:00 2001 From: Arnaud Charlet Date: Mon, 20 Apr 2009 11:02:17 +0200 Subject: [PATCH] [multiple changes] 2009-04-20 Eric Botcazou * adaint.h (__gnat_lwp_self): Declare on Linux. * adaint.c (__gnat_os_filename): Add ATTRIBUTE_UNUSED on 'filename'. 2009-04-20 Robert Dewar * exp_ch5.adb, usage.adb, back_end.adb, opt.ads: Implement front-end part of -fpreserve-control-flow switch. From-SVN: r146376 --- gcc/ada/ChangeLog | 11 +++++++++++ gcc/ada/adaint.c | 6 ++++-- gcc/ada/adaint.h | 3 +++ gcc/ada/back_end.adb | 7 +++++++ gcc/ada/exp_ch5.adb | 7 +++++-- gcc/ada/opt.ads | 5 +++++ gcc/ada/usage.adb | 3 +++ 7 files changed, 38 insertions(+), 4 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ef790b22cf7..aec5ecc2ebd 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,14 @@ +2009-04-20 Eric Botcazou + + * adaint.h (__gnat_lwp_self): Declare on Linux. + + * adaint.c (__gnat_os_filename): Add ATTRIBUTE_UNUSED on 'filename'. + +2009-04-20 Robert Dewar + + * exp_ch5.adb, usage.adb, back_end.adb, opt.ads: Implement + front-end part of -fpreserve-control-flow switch. + 2009-04-20 Bob Duff * rtsfind.adb: Minor comment fix diff --git a/gcc/ada/adaint.c b/gcc/ada/adaint.c index e49e0f05cc4..0047e447655 100644 --- a/gcc/ada/adaint.c +++ b/gcc/ada/adaint.c @@ -666,7 +666,8 @@ __gnat_get_debuggable_suffix_ptr (int *len, const char **value) /* Returns the OS filename and corresponding encoding. */ void -__gnat_os_filename (char *filename, char *w_filename ATTRIBUTE_UNUSED, +__gnat_os_filename (char *filename ATTRIBUTE_UNUSED, + char *w_filename ATTRIBUTE_UNUSED, char *os_name, int *o_length, char *encoding ATTRIBUTE_UNUSED, int *e_length) { @@ -3512,7 +3513,8 @@ __gnat_pthread_setaffinity_np (pthread_t th ATTRIBUTE_UNUSED, thread. We need to do a system call in order to retrieve this information. */ #include -void *__gnat_lwp_self (void) { +void *__gnat_lwp_self (void) +{ return (void *) syscall (__NR_gettid); } #endif diff --git a/gcc/ada/adaint.h b/gcc/ada/adaint.h index 2ecaf730528..46c1f2fac61 100644 --- a/gcc/ada/adaint.h +++ b/gcc/ada/adaint.h @@ -176,6 +176,9 @@ extern int __gnat_dup2 (int, int); extern void __gnat_os_filename (char *, char *, char *, int *, char *, int *); +#if defined (linux) +extern void *__gnat_lwp_self (void); +#endif #if defined (__MINGW32__) && !defined (RTX) extern void __gnat_plist_init (void); diff --git a/gcc/ada/back_end.adb b/gcc/ada/back_end.adb index 7a4e4dadf0f..baf3ffda37f 100644 --- a/gcc/ada/back_end.adb +++ b/gcc/ada/back_end.adb @@ -219,6 +219,13 @@ package body Back_End is if Switch_Chars (First .. Last) = "fno-inline" then Opt.Suppress_All_Inlining := True; + + -- Another special check, the switch -fpreserve-control-flow + -- which is also a back end switch sets the front end flag + -- that inhibits improper control flow transformations. + + elsif Switch_Chars (First .. Last) = "fpreserve-control-flow" then + Opt.Suppress_Control_Flow_Optimizations := True; end if; end if; end Scan_Back_End_Switches; diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index 5008f4c1eed..6afcc6fb1b4 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -3272,9 +3272,12 @@ package body Exp_Ch5 is -- return not (expression); - -- Only do these optimizations if we are at least at -O1 level + -- Only do these optimizations if we are at least at -O1 level and + -- do not do them if control flow optimizations are suppressed. - if Optimization_Level > 0 then + if Optimization_Level > 0 + and then not Opt.Suppress_Control_Flow_Optimizations + then if Nkind (N) = N_If_Statement and then No (Elsif_Parts (N)) and then Present (Else_Statements (N)) diff --git a/gcc/ada/opt.ads b/gcc/ada/opt.ads index 496453457b0..9b8cf0b4309 100644 --- a/gcc/ada/opt.ads +++ b/gcc/ada/opt.ads @@ -1061,6 +1061,11 @@ package Opt is -- Set by -fno-inline. Suppresses all inlining, both front end and back end -- regardless of any other switches that are set. + Suppress_Control_Flow_Optimizations : Boolean := False; + -- GNAT + -- Set by -fpreserve-control-flow. Suppresses control flow optimizations + -- that interfere with coverage analysis based on the object code. + System_Extend_Pragma_Arg : Node_Id := Empty; -- GNAT -- Set non-empty if and only if a correct Extend_System pragma was present diff --git a/gcc/ada/usage.adb b/gcc/ada/usage.adb index 55a3f49921a..76d9a25b4a4 100644 --- a/gcc/ada/usage.adb +++ b/gcc/ada/usage.adb @@ -99,6 +99,9 @@ begin Write_Switch_Char ("fno-inline ", ""); Write_Line ("Inhibit all inlining (makes executable smaller)"); + + Write_Switch_Char ("fpreserve-control-flow ", ""); + Write_Line ("Preserve control flow for coverage analysis"); end if; -- Common switches available to both GCC and JGNAT -- 2.30.2