diff options
Diffstat (limited to 'gcc/config/pru/pru-pragma.cc')
-rw-r--r-- | gcc/config/pru/pru-pragma.cc | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/gcc/config/pru/pru-pragma.cc b/gcc/config/pru/pru-pragma.cc new file mode 100644 index 0000000..3425d64 --- /dev/null +++ b/gcc/config/pru/pru-pragma.cc @@ -0,0 +1,88 @@ +/* PRU target specific pragmas + Copyright (C) 2015-2022 Free Software Foundation, Inc. + Contributed by Dimitar Dimitrov <dimitar@dinux.eu> + + This file is part of GCC. + + GCC is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + GCC is distributed in the hope that it will be useful, but WITHOUT + 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 + along with GCC; see the file COPYING3. If not see + <http://www.gnu.org/licenses/>. */ + +#define IN_TARGET_CODE 1 + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "alias.h" +#include "symtab.h" +#include "tree.h" +#include "c-family/c-pragma.h" +#include "c-family/c-common.h" +#include "diagnostic-core.h" +#include "cpplib.h" +#include "pru-protos.h" + + +/* Implements the "pragma CTABLE_ENTRY" pragma. This pragma takes a + CTABLE index and an address, and instructs the compiler that + LBCO/SBCO can be used on that base address. + + WARNING: Only immediate constant addresses are currently supported. */ +static void +pru_pragma_ctable_entry (cpp_reader * reader ATTRIBUTE_UNUSED) +{ + tree ctable_index, base_addr; + enum cpp_ttype type; + + type = pragma_lex (&ctable_index); + if (type == CPP_NUMBER && tree_fits_uhwi_p (ctable_index)) + { + type = pragma_lex (&base_addr); + if (type == CPP_NUMBER && tree_fits_uhwi_p (base_addr)) + { + unsigned HOST_WIDE_INT i = tree_to_uhwi (ctable_index); + unsigned HOST_WIDE_INT base = tree_to_uhwi (base_addr); + + type = pragma_lex (&base_addr); + if (type != CPP_EOF) + error ("junk at end of %<#pragma CTABLE_ENTRY%>"); + else if (i >= ARRAY_SIZE (pru_ctable)) + error ("%<CTABLE_ENTRY%> index %" HOST_WIDE_INT_PRINT "d" + " is not valid", i); + else if (pru_ctable[i].valid && pru_ctable[i].base != base) + error ("redefinition of %<CTABLE_ENTRY " + "%" HOST_WIDE_INT_PRINT "d%>", i); + else + { + if (base & 0xff) + warning (0, "%<CTABLE_ENTRY%> base address is not " + "a multiple of 256"); + pru_ctable[i].base = base; + pru_ctable[i].valid = true; + } + return; + } + } + error ("malformed %<#pragma CTABLE_ENTRY%> variable address"); +} + +/* Implements REGISTER_TARGET_PRAGMAS. */ +void +pru_register_pragmas (void) +{ + c_register_pragma (NULL, "ctable_entry", pru_pragma_ctable_entry); + c_register_pragma (NULL, "CTABLE_ENTRY", pru_pragma_ctable_entry); + + c_register_addr_space ("__regio_symbol", ADDR_SPACE_REGIO); +} |