Home | History | Annotate | Line # | Download | only in arm
      1 /* Subroutines for the D front end on the ARM architecture.
      2    Copyright (C) 2017-2022 Free Software Foundation, Inc.
      3 
      4 GCC is free software; you can redistribute it and/or modify
      5 it under the terms of the GNU General Public License as published by
      6 the Free Software Foundation; either version 3, or (at your option)
      7 any later version.
      8 
      9 GCC is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12 GNU General Public License for more details.
     13 
     14 You should have received a copy of the GNU General Public License
     15 along with GCC; see the file COPYING3.  If not see
     16 <http://www.gnu.org/licenses/>.  */
     17 
     18 #define IN_TARGET_CODE 1
     19 
     20 #include "config.h"
     21 #include "system.h"
     22 #include "coretypes.h"
     23 #include "tm.h"
     24 #include "tm_d.h"
     25 #include "d/d-target.h"
     26 #include "d/d-target-def.h"
     27 #include "arm-protos.h"
     28 
     29 /* Implement TARGET_D_CPU_VERSIONS for ARM targets.  */
     30 
     31 void
     32 arm_d_target_versions (void)
     33 {
     34   d_add_builtin_version ("ARM");
     35 
     36   if (TARGET_THUMB || TARGET_THUMB2)
     37     {
     38       d_add_builtin_version ("Thumb");
     39       d_add_builtin_version ("ARM_Thumb");
     40     }
     41 
     42   if (TARGET_HARD_FLOAT_ABI)
     43     d_add_builtin_version ("ARM_HardFloat");
     44   else
     45     {
     46       if (TARGET_SOFT_FLOAT)
     47 	d_add_builtin_version ("ARM_SoftFloat");
     48       else if (TARGET_HARD_FLOAT)
     49 	d_add_builtin_version ("ARM_SoftFP");
     50     }
     51 
     52   if (TARGET_SOFT_FLOAT)
     53     d_add_builtin_version ("D_SoftFloat");
     54   else if (TARGET_HARD_FLOAT)
     55     d_add_builtin_version ("D_HardFloat");
     56 }
     57 
     58 /* Handle a call to `__traits(getTargetInfo, "floatAbi")'.  */
     59 
     60 static tree
     61 arm_d_handle_target_float_abi (void)
     62 {
     63   const char *abi;
     64 
     65   switch (arm_float_abi)
     66     {
     67     case ARM_FLOAT_ABI_HARD:
     68       abi = "hard";
     69       break;
     70 
     71     case ARM_FLOAT_ABI_SOFT:
     72       abi = "soft";
     73       break;
     74 
     75     case ARM_FLOAT_ABI_SOFTFP:
     76       abi = "softfp";
     77       break;
     78 
     79     default:
     80       abi = "";
     81       break;
     82     }
     83 
     84   return build_string_literal (strlen (abi) + 1, abi);
     85 }
     86 
     87 /* Implement TARGET_D_REGISTER_CPU_TARGET_INFO.  */
     88 
     89 void
     90 arm_d_register_target_info (void)
     91 {
     92   const struct d_target_info_spec handlers[] = {
     93     { "floatAbi", arm_d_handle_target_float_abi },
     94     { NULL, NULL },
     95   };
     96 
     97   d_add_target_info_handlers (handlers);
     98 }
     99