diff options
author | DJ Delorie <dj@redhat.com> | 2010-06-25 23:30:19 -0400 |
---|---|---|
committer | DJ Delorie <dj@gcc.gnu.org> | 2010-06-25 23:30:19 -0400 |
commit | f6052f8680a5510f3f29c51fb69dd2ec3765925a (patch) | |
tree | 029a9ae4281f830a057e8a006a023187ac8c6199 /gcc/config/m32c/m32c-pragma.c | |
parent | 19bbf2c4b8041b1ecb367187fe2555243a70d341 (diff) | |
download | gcc-f6052f8680a5510f3f29c51fb69dd2ec3765925a.zip gcc-f6052f8680a5510f3f29c51fb69dd2ec3765925a.tar.gz gcc-f6052f8680a5510f3f29c51fb69dd2ec3765925a.tar.bz2 |
m32c-protos.h (m32c_note_pragma_address): Declare.
* config/m32c/m32c-protos.h (m32c_note_pragma_address): Declare.
(m32c_output_aligned_common): Likewise.
* config/m32c/m32c.h (ASM_OUTPUT_ALIGNED_DECL_COMMON): New.
(ASM_OUTPUT_ALIGNED_DECL_LOCAL): New.
* config/m32c/m32c-pragma.c (m32c_pragma_address): New.
(m32c_register_pragmas): Register it.
* config/m32c/m32c.c (m32c_get_pragma_address): New.
(m32c_insert_attributes): Set #pragma address decls volatile.
(pragma_entry_eq): New.
(pragma_entry_hash): New.
(m32c_note_pragma_address): New.
(m32c_get_pragma_address): New.
(m32c_output_aligned_common): New.
* doc/extend.texi: Document the new pragma.
* config/m32c/m32c.c (m32c_illegal_subreg_p): Reject illegal MEMs
also.
* config/m32c/predicates.md (m32c_any_operand): Check the code
instead of memory_operand so as to allow matching volatile MEMs.
(m32c_nonimmediate_operand): Likewise.
(mra_operand): Allow volatiles.
From-SVN: r161425
Diffstat (limited to 'gcc/config/m32c/m32c-pragma.c')
-rw-r--r-- | gcc/config/m32c/m32c-pragma.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/gcc/config/m32c/m32c-pragma.c b/gcc/config/m32c/m32c-pragma.c index 49fe023..b576152 100644 --- a/gcc/config/m32c/m32c-pragma.c +++ b/gcc/config/m32c/m32c-pragma.c @@ -87,9 +87,47 @@ m32c_pragma_memregs (cpp_reader * reader ATTRIBUTE_UNUSED) error ("#pragma GCC memregs takes a number [0..16]"); } +/* Implements the "pragma ADDRESS" pragma. This pragma takes a + variable name and an address, and arranges for that variable to be + "at" that address. The variable is also made volatile. */ +static void +m32c_pragma_address (cpp_reader * reader ATTRIBUTE_UNUSED) +{ + /* on off */ + tree var, addr; + enum cpp_ttype type; + const char *var_str; + + type = pragma_lex (&var); + if (type == CPP_NAME) + { + var_str = IDENTIFIER_POINTER (var); + + type = pragma_lex (&addr); + if (type == CPP_NUMBER) + { + if (var != error_mark_node) + { + unsigned uaddr = tree_low_cst (addr, 1); + m32c_note_pragma_address (IDENTIFIER_POINTER (var), uaddr); + } + + type = pragma_lex (&var); + if (type != CPP_EOF) + { + error ("junk at end of #pragma ADDRESS"); + } + return; + } + } + error ("malformed #pragma ADDRESS variable address"); +} + /* Implements REGISTER_TARGET_PRAGMAS. */ void m32c_register_pragmas (void) { c_register_pragma ("GCC", "memregs", m32c_pragma_memregs); + c_register_pragma (NULL, "ADDRESS", m32c_pragma_address); + c_register_pragma (NULL, "address", m32c_pragma_address); } |