aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/backend_utils.adb
diff options
context:
space:
mode:
authorGhjuvan Lacambre <lacambre@adacore.com>2021-06-21 11:47:59 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2021-09-20 12:31:29 +0000
commit8967ee52ea92c865801d6137600e33e4a32cd2ec (patch)
tree42ccd25ab111e6d198e2da96aca647f095db6339 /gcc/ada/backend_utils.adb
parent3afd5368f50f7a5060fddd652a41b141691172d1 (diff)
downloadgcc-8967ee52ea92c865801d6137600e33e4a32cd2ec.zip
gcc-8967ee52ea92c865801d6137600e33e4a32cd2ec.tar.gz
gcc-8967ee52ea92c865801d6137600e33e4a32cd2ec.tar.bz2
[Ada] Refactor scan_backend_switch to share logic across backends
gcc/ada/ * adabkend.adb (Scan_Back_End_Switches): Replace switch-scanning logic with call to Backend_Utils.Scan_Common_Back_End_Switches. * back_end.adb (Scan_Back_End_Switches): Replace switch-scanning logic with call to Backend_Utils.Scan_Common_Back_End_Switches. * backend_utils.adb: New file. * backend_utils.ads: New file. * gcc-interface/Make-lang.in: Add ada/backend_utils.o.
Diffstat (limited to 'gcc/ada/backend_utils.adb')
-rw-r--r--gcc/ada/backend_utils.adb96
1 files changed, 96 insertions, 0 deletions
diff --git a/gcc/ada/backend_utils.adb b/gcc/ada/backend_utils.adb
new file mode 100644
index 0000000..6f492fd
--- /dev/null
+++ b/gcc/ada/backend_utils.adb
@@ -0,0 +1,96 @@
+------------------------------------------------------------------------------
+-- --
+-- GNAT COMPILER COMPONENTS --
+-- --
+-- B A C K E N D _ U T I L S --
+-- --
+-- B o d y --
+-- --
+-- Copyright (C) 2021-2021, Free Software Foundation, Inc. --
+-- --
+-- GNAT is free software; you can redistribute it and/or modify it under --
+-- terms of the GNU General Public License as published by the Free Soft- --
+-- ware Foundation; either version 3, or (at your option) any later ver- --
+-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
+-- for more details. You should have received a copy of the GNU General --
+-- Public License distributed with GNAT; see file COPYING3. If not, go to --
+-- http://www.gnu.org/licenses for a complete copy of the license. --
+-- --
+-- GNAT was originally developed by the GNAT team at New York University. --
+-- Extensive contributions were provided by Ada Core Technologies Inc. --
+-- --
+------------------------------------------------------------------------------
+
+with Lib;
+with Opt; use Opt;
+with Switch; use Switch;
+
+package body Backend_Utils is
+
+ ---------------------------------
+ -- Scan_Common_Back_End_Switch --
+ ---------------------------------
+
+ function Scan_Common_Back_End_Switch (Switch_Chars : String) return Boolean
+ is
+ First : constant Positive := Switch_Chars'First + 1;
+ Last : constant Natural := Switch_Last (Switch_Chars);
+ begin
+
+ -- Recognize -gxxx switches
+
+ if Switch_Chars (First) = 'g' then
+ Debugger_Level := 2;
+
+ if First < Last then
+ case Switch_Chars (First + 1) is
+ when '0' =>
+ Debugger_Level := 0;
+ when '1' =>
+ Debugger_Level := 1;
+ when '2' =>
+ Debugger_Level := 2;
+ when '3' =>
+ Debugger_Level := 3;
+ when others =>
+ null;
+ end case;
+ end if;
+
+ -- Back end switch -fdiagnostics-format=json tells the frontend to
+ -- output its error and warning messages in the same format GCC
+ -- uses when passed -fdiagnostics-format=json.
+
+ elsif Switch_Chars (First .. Last) = "fdiagnostics-format=json" then
+ Opt.JSON_Output := True;
+
+ -- Back-end switch -fno-inline also sets the front end flags to entirely
+ -- inhibit all inlining. So we store it and set the appropriate
+ -- flags.
+ -- For gcc back ends, -fno-inline disables Inline pragmas only,
+ -- not Inline_Always to remain consistent with the always_inline
+ -- attribute behavior.
+
+ elsif Switch_Chars (First .. Last) = "fno-inline" then
+ Opt.Disable_FE_Inline := True;
+
+ -- Back end switch -fpreserve-control-flow also 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;
+
+ elsif Switch_Chars (First .. Last) = "S" then
+ Generate_Asm := True;
+
+ else
+ return False;
+ end if;
+
+ Lib.Store_Compilation_Switch (Switch_Chars);
+ return True;
+ end Scan_Common_Back_End_Switch;
+
+end Backend_Utils;