1/* Pragma handling for GCC for Renesas / SuperH SH. 2 Copyright (C) 1993-2020 Free Software Foundation, Inc. 3 Contributed by Joern Rennecke <joern.rennecke@st.com>. 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify 8it under the terms of the GNU General Public License as published by 9the Free Software Foundation; either version 3, or (at your option) 10any later version. 11 12GCC is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING3. If not see 19<http://www.gnu.org/licenses/>. */ 20 21#define IN_TARGET_CODE 1 22 23#include "config.h" 24#include "system.h" 25#include "coretypes.h" 26#include "target.h" 27#include "c-family/c-common.h" 28#include "memmodel.h" 29#include "tm_p.h" 30#include "stringpool.h" 31#include "attribs.h" 32 33/* Handle machine specific pragmas to be semi-compatible with Renesas 34 compiler. */ 35 36/* Add ATTR to the attributes of the current function. If there is no 37 such function, save it to be added to the attributes of the next 38 function. */ 39static void 40sh_add_function_attribute (const char *attr) 41{ 42 tree id = get_identifier (attr); 43 44 if (current_function_decl) 45 decl_attributes (¤t_function_decl, 46 tree_cons (id, NULL_TREE, NULL_TREE), 0); 47 else 48 { 49 *sh_deferred_function_attributes_tail 50 = tree_cons (id, NULL_TREE, *sh_deferred_function_attributes_tail); 51 sh_deferred_function_attributes_tail 52 = &TREE_CHAIN (*sh_deferred_function_attributes_tail); 53 } 54} 55 56void 57sh_pr_interrupt (struct cpp_reader *pfile ATTRIBUTE_UNUSED) 58{ 59 sh_add_function_attribute ("interrupt_handler"); 60} 61 62void 63sh_pr_trapa (struct cpp_reader *pfile ATTRIBUTE_UNUSED) 64{ 65 sh_add_function_attribute ("trapa_handler"); 66} 67 68void 69sh_pr_nosave_low_regs (struct cpp_reader *pfile ATTRIBUTE_UNUSED) 70{ 71 sh_add_function_attribute ("nosave_low_regs"); 72} 73 74#define builtin_define(TXT) cpp_define (pfile, TXT) 75#define builtin_assert(TXT) cpp_assert (pfile, TXT) 76 77/* Implement the TARGET_CPU_CPP_BUILTINS macro */ 78void 79sh_cpu_cpp_builtins (cpp_reader* pfile) 80{ 81 builtin_define ("__sh__"); 82 builtin_assert ("cpu=sh"); 83 builtin_assert ("machine=sh"); 84 switch ((int) sh_cpu) 85 { 86 case PROCESSOR_SH1: 87 builtin_define ("__sh1__"); 88 builtin_define ("__SH1__"); 89 break; 90 case PROCESSOR_SH2: 91 builtin_define ("__sh2__"); 92 builtin_define ("__SH2__"); 93 break; 94 case PROCESSOR_SH2E: 95 builtin_define ("__SH2E__"); 96 break; 97 case PROCESSOR_SH2A: 98 builtin_define ("__SH2A__"); 99 if (TARGET_SH2A_DOUBLE) 100 builtin_define (TARGET_FPU_SINGLE 101 ? "__SH2A_SINGLE__" : "__SH2A_DOUBLE__"); 102 else 103 builtin_define (TARGET_FPU_ANY 104 ? "__SH2A_SINGLE_ONLY__" : "__SH2A_NOFPU__"); 105 break; 106 case PROCESSOR_SH3: 107 builtin_define ("__sh3__"); 108 builtin_define ("__SH3__"); 109 if (TARGET_HARD_SH4) 110 builtin_define ("__SH4_NOFPU__"); 111 break; 112 case PROCESSOR_SH3E: 113 builtin_define (TARGET_HARD_SH4 ? "__SH4_SINGLE_ONLY__" : "__SH3E__"); 114 break; 115 case PROCESSOR_SH4: 116 builtin_define (TARGET_FPU_SINGLE ? "__SH4_SINGLE__" : "__SH4__"); 117 break; 118 case PROCESSOR_SH4A: \ 119 builtin_define ("__SH4A__"); 120 builtin_define (TARGET_SH4 121 ? (TARGET_FPU_SINGLE ? "__SH4_SINGLE__" : "__SH4__") 122 : TARGET_FPU_ANY ? "__SH4_SINGLE_ONLY__" 123 : "__SH4_NOFPU__"); 124 break; 125 } 126 if (TARGET_FPU_ANY) 127 builtin_define ("__SH_FPU_ANY__"); 128 if (TARGET_FPU_DOUBLE) 129 builtin_define ("__SH_FPU_DOUBLE__"); 130 if (TARGET_HITACHI) 131 builtin_define ("__HITACHI__"); 132 if (TARGET_FMOVD) 133 builtin_define ("__FMOVD_ENABLED__"); 134 if (TARGET_FDPIC) 135 { 136 builtin_define ("__SH_FDPIC__"); 137 builtin_define ("__FDPIC__"); 138 } 139 builtin_define (TARGET_LITTLE_ENDIAN 140 ? "__LITTLE_ENDIAN__" : "__BIG_ENDIAN__"); 141 142 cpp_define_formatted (pfile, "__SH_ATOMIC_MODEL_%s__", 143 selected_atomic_model ().cdef_name); 144} 145