From 4cec287d1de6cae77b2e1acdf749c7d2941f2a7a Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Mon, 11 Apr 2016 15:49:41 -0400 Subject: [PATCH 61/91] FIXME: set MEM_OFFSET_KNOWN_P and MEM_OFFSET --- gcc/read-rtl.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/gcc/read-rtl.c b/gcc/read-rtl.c index 177092e..7d8a892 100644 --- a/gcc/read-rtl.c +++ b/gcc/read-rtl.c @@ -1191,11 +1191,12 @@ void maybe_read_location (int operand_idx, rtx insn) filename, atoi(name.string)); } -/* Consume characters until TERMINATOR, consuming TERMINATOR. - Return all characters before TERMINATOR as an allocated buffer. */ +/* Consume characters until encountering a character in TERMINATOR_CHARS, + consuming the terminator character if CONSUME_TERMINATOR is true. + Return all characters before the terminator as an allocated buffer. */ static char * -read_until (char terminator) +read_until (const char *terminator_chars, bool consume_terminator) { int ch = read_skip_spaces (); unread_char (ch); @@ -1203,8 +1204,12 @@ read_until (char terminator) while (1) { ch = read_char (); - if (ch == terminator) - break; + if (strchr (terminator_chars, ch)) + { + if (!consume_terminator) + unread_char (ch); + break; + } buf.safe_push (ch); } buf.safe_push ('\0'); @@ -1652,7 +1657,7 @@ read_rtx_code (const char *code_name) if (ch == '[') { file_location loc = rtx_reader_ptr->get_current_location (); - char *desc = read_until (']'); + char *desc = read_until ("]", true); strip_trailing_whitespace (desc); rtx_reader_ptr->add_fixup_reg_expr (loc, return_rtx, desc); free (desc); @@ -1672,6 +1677,7 @@ read_rtx_code (const char *code_name) { case MEM: { + int ch; require_char_ws ('['); read_name (&name); MEM_ALIAS_SET (return_rtx) = atoi (name.string); @@ -1679,17 +1685,27 @@ read_rtx_code (const char *code_name) if (peek_char () != ' ') { file_location loc = rtx_reader_ptr->get_current_location (); - char *desc = read_until (' '); - unread_char (' '); + char *desc = read_until (" +", false); inform (loc, "got desc for MEM_EXPR of %qs", desc); // FIXME: do something with it. - // FIXME: we may optionally have '+' for MEM_OFFSET_KNOWN_P. + free (desc); } else read_char (); + /* We may optionally have '+' for MEM_OFFSET_KNOWN_P. */ + ch = read_skip_spaces (); + if (ch == '+') + { + read_name (&name); + MEM_OFFSET_KNOWN_P (return_rtx) = 1; + MEM_OFFSET (return_rtx) = atoi (name.string); + } + else + unread_char (ch); + /* Handle optional " S" for MEM_SIZE. */ - int ch = read_skip_spaces (); + ch = read_skip_spaces (); if (ch == 'S') { read_name (&name); -- 1.8.5.3