aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/m32c/m32c-pragma.c
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2010-06-25 23:30:19 -0400
committerDJ Delorie <dj@gcc.gnu.org>2010-06-25 23:30:19 -0400
commitf6052f8680a5510f3f29c51fb69dd2ec3765925a (patch)
tree029a9ae4281f830a057e8a006a023187ac8c6199 /gcc/config/m32c/m32c-pragma.c
parent19bbf2c4b8041b1ecb367187fe2555243a70d341 (diff)
downloadgcc-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.c38
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);
}