public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Ulrich Weigand <weigand@immd1.informatik.uni-erlangen.de>
To: rth@redhat.com
Cc: kenner@vlsi1.ultra.nyu.edu, gcc@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: Re: DATA_ALIGNMENT vs. DECL_USER_ALIGNMENT
Date: Thu, 10 Apr 2003 16:20:00 -0000	[thread overview]
Message-ID: <200304101527.RAA07154@faui11.informatik.uni-erlangen.de> (raw)
In-Reply-To: <200304100040.CAA24017@faui11.informatik.uni-erlangen.de> from "Ulrich Weigand" at Apr 10, 2003 02:40:09 AM

I wrote:

> For data labels, it would of course be possible to use
> some other means to load the address (e.g. from the literal
> pool); however as the backend has no way to find out for
> which labels this would be necessary, the alternative
> would mean not to use LARL for any label.

I've tried to identify symbols with forced 1-byte alignment
in encode_section_info, and mark them specically; this allows
me to avoid using LARL for those (and only those) symbols.

The patch below implements this; I'll commit this as soon
as testing is complete, because it fixes a bug in any case.

However, Ada bootstrap still fails, because it uses 
inconsistent alignment flags for the same symbol between
different translation units:  the elaboration check flag
variables are defined from within Ada sources, and marked
as forced 1-byte aligned there, but they are *referenced*
from within auto-generated C sources, and are declared
simply as 'extern char xxx;' there, without any forced
alignment specification.

This means that when compiling the C source that references
the variables, I do not know that they are in fact 1-byte
aligned.  Do you think the backend should be able to cope
with even this scenario, or would you consider this a 
frontend bug?

Bye,
Ulrich

ChangeLog:

	* config/s390/s390.c (larl_operand): Do not allow symbols
	marked with '@'.
	(s390_encode_section_info): Mark symbols with forced 1-byte
	alignment with '@'.
	(s390_strip_name_encoding): Strip '@'.
	(legitimize_pic_address): Handle symbols that are not valid
	LARL operands in 64-bit mode.

Index: gcc/config/s390/s390.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/s390/s390.c,v
retrieving revision 1.86
diff -c -p -r1.86 s390.c
*** gcc/config/s390/s390.c	1 Apr 2003 17:32:33 -0000	1.86
--- gcc/config/s390/s390.c	10 Apr 2003 02:21:28 -0000
*************** larl_operand (op, mode)
*** 1051,1056 ****
--- 1051,1057 ----
    if (GET_CODE (op) == LABEL_REF)
      return 1;
    if (GET_CODE (op) == SYMBOL_REF
+       && XSTR (op, 0)[0] != '@'
        && !tls_symbolic_operand (op)
        && (!flag_pic || SYMBOL_REF_FLAG (op) 
            || CONSTANT_POOL_ADDRESS_P (op)))
*************** larl_operand (op, mode)
*** 1074,1079 ****
--- 1075,1081 ----
    if (GET_CODE (op) == LABEL_REF)
      return 1;
    if (GET_CODE (op) == SYMBOL_REF
+       && XSTR (op, 0)[0] != '@'
        && !tls_symbolic_operand (op)
        && (!flag_pic || SYMBOL_REF_FLAG (op)
            || CONSTANT_POOL_ADDRESS_P (op)))
*************** legitimize_pic_address (orig, reg)
*** 2179,2185 ****
                || CONSTANT_POOL_ADDRESS_P (addr))))
      {
        /* This is a local symbol.  */
!       if (TARGET_64BIT)
          {
            /* Access local symbols PC-relative via LARL.  
               This is the same as in the non-PIC case, so it is 
--- 2181,2187 ----
                || CONSTANT_POOL_ADDRESS_P (addr))))
      {
        /* This is a local symbol.  */
!       if (TARGET_64BIT && larl_operand (addr, VOIDmode))
          {
            /* Access local symbols PC-relative via LARL.  
               This is the same as in the non-PIC case, so it is 
*************** legitimize_pic_address (orig, reg)
*** 2191,2199 ****
  
            rtx temp = reg? reg : gen_reg_rtx (Pmode);
  
!           addr = gen_rtx_UNSPEC (SImode, gen_rtvec (1, addr), 100);
!           addr = gen_rtx_CONST (SImode, addr);
!           addr = force_const_mem (SImode, addr);
  	  emit_move_insn (temp, addr);
  
            base = gen_rtx_REG (Pmode, BASE_REGISTER);
--- 2193,2201 ----
  
            rtx temp = reg? reg : gen_reg_rtx (Pmode);
  
!           addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), 100);
!           addr = gen_rtx_CONST (Pmode, addr);
!           addr = force_const_mem (Pmode, addr);
  	  emit_move_insn (temp, addr);
  
            base = gen_rtx_REG (Pmode, BASE_REGISTER);
*************** legitimize_pic_address (orig, reg)
*** 2254,2262 ****
  	  if (reload_in_progress || reload_completed)
  	    regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
  
!           addr = gen_rtx_UNSPEC (SImode, gen_rtvec (1, addr), 112);
!           addr = gen_rtx_CONST (SImode, addr);
!           addr = force_const_mem (SImode, addr);
            emit_move_insn (temp, addr);
  
            new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, temp);
--- 2256,2264 ----
  	  if (reload_in_progress || reload_completed)
  	    regs_ever_live[PIC_OFFSET_TABLE_REGNUM] = 1;
  
!           addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), 112);
!           addr = gen_rtx_CONST (Pmode, addr);
!           addr = force_const_mem (Pmode, addr);
            emit_move_insn (temp, addr);
  
            new = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, temp);
*************** legitimize_pic_address (orig, reg)
*** 2282,2288 ****
                    case 100:
                    case 112:
                    case 114:
!                     new = force_const_mem (SImode, orig);
                      break;
  
                    /* @GOTENT is OK as is.  */
--- 2284,2290 ----
                    case 100:
                    case 112:
                    case 114:
!                     new = force_const_mem (Pmode, orig);
                      break;
  
                    /* @GOTENT is OK as is.  */
*************** legitimize_pic_address (orig, reg)
*** 2297,2305 ****
                          rtx temp = reg? reg : gen_reg_rtx (Pmode);
  
                          addr = XVECEXP (addr, 0, 0);
!                         addr = gen_rtx_UNSPEC (SImode, gen_rtvec (1, addr), 114);
!                         addr = gen_rtx_CONST (SImode, addr);
!                         addr = force_const_mem (SImode, addr);
  	                emit_move_insn (temp, addr);
  
                          base = gen_rtx_REG (Pmode, BASE_REGISTER);
--- 2299,2307 ----
                          rtx temp = reg? reg : gen_reg_rtx (Pmode);
  
                          addr = XVECEXP (addr, 0, 0);
!                         addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), 114);
!                         addr = gen_rtx_CONST (Pmode, addr);
!                         addr = force_const_mem (Pmode, addr);
  	                emit_move_insn (temp, addr);
  
                          base = gen_rtx_REG (Pmode, BASE_REGISTER);
*************** legitimize_pic_address (orig, reg)
*** 2333,2339 ****
                          || CONSTANT_POOL_ADDRESS_P (op0))))
  	      && GET_CODE (op1) == CONST_INT)
  	    {
!               if (TARGET_64BIT)
                  {
                    if (INTVAL (op1) & 1)
                      {
--- 2335,2341 ----
                          || CONSTANT_POOL_ADDRESS_P (op0))))
  	      && GET_CODE (op1) == CONST_INT)
  	    {
!               if (TARGET_64BIT && larl_operand (op0, VOIDmode))
                  {
                    if (INTVAL (op1) & 1)
                      {
*************** legitimize_pic_address (orig, reg)
*** 2370,2379 ****
  
                    rtx temp = reg? reg : gen_reg_rtx (Pmode);
  
!                   addr = gen_rtx_UNSPEC (SImode, gen_rtvec (1, op0), 100);
!                   addr = gen_rtx_PLUS (SImode, addr, op1);
!                   addr = gen_rtx_CONST (SImode, addr);
!                   addr = force_const_mem (SImode, addr);
          	  emit_move_insn (temp, addr);
  
                    base = gen_rtx_REG (Pmode, BASE_REGISTER);
--- 2372,2381 ----
  
                    rtx temp = reg? reg : gen_reg_rtx (Pmode);
  
!                   addr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op0), 100);
!                   addr = gen_rtx_PLUS (Pmode, addr, op1);
!                   addr = gen_rtx_CONST (Pmode, addr);
!                   addr = force_const_mem (Pmode, addr);
          	  emit_move_insn (temp, addr);
  
                    base = gen_rtx_REG (Pmode, BASE_REGISTER);
*************** legitimize_pic_address (orig, reg)
*** 2399,2405 ****
                if (XINT (op0, 1) != 100)
                  abort ();
  
!               new = force_const_mem (SImode, orig);
              }
  
            /* Otherwise, compute the sum.  */
--- 2401,2407 ----
                if (XINT (op0, 1) != 100)
                  abort ();
  
!               new = force_const_mem (Pmode, orig);
              }
  
            /* Otherwise, compute the sum.  */
*************** s390_encode_section_info (decl, first)
*** 6480,6485 ****
--- 6482,6504 ----
  
        XSTR (symbol, 0) = ggc_alloc_string (newstr, len + 2 - 1);
      }
+ 
+   /* If a variable has a forced alignment to < 2 bytes, mark it
+      with '@' to prevent it from being used as LARL operand.  */
+ 
+   else if (TREE_CODE (decl) == VAR_DECL 
+ 	   && DECL_USER_ALIGN (decl) && DECL_ALIGN (decl) < 16
+ 	   && XSTR (symbol, 0)[0] != '@')
+     {
+       const char *symbol_str = XSTR (symbol, 0);
+       size_t len = strlen (symbol_str) + 1;
+       char *newstr = alloca (len + 1);
+ 
+       newstr[0] = '@';
+       memcpy (newstr + 1, symbol_str, len);
+ 
+       XSTR (symbol, 0) = ggc_alloc_string (newstr, len + 1 - 1);
+     }
  }
  
  /* Undo the above when printing symbol names.  */
*************** s390_strip_name_encoding (str)
*** 6490,6495 ****
--- 6509,6516 ----
  {
    if (str[0] == '%')
      str += 2;
+   if (str[0] == '@')
+     str += 1;
    if (str[0] == '*')
      str += 1;
    return str;


-- 
  Dr. Ulrich Weigand
  weigand@informatik.uni-erlangen.de

  reply	other threads:[~2003-04-10 15:31 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-04-09 23:31 Ulrich Weigand
2003-04-10  2:27 ` Richard Henderson
2003-04-10  3:10   ` Ulrich Weigand
2003-04-10 16:20     ` Ulrich Weigand [this message]
2003-04-10 16:39       ` Geoff Keating
2003-04-10 16:44         ` Ulrich Weigand
2003-04-10 18:06       ` Richard Henderson
  -- strict thread matches above, loose matches on Subject: below --
2003-04-23  3:29 Robert Dewar
2003-04-23  2:20 Richard Kenner
2003-04-23  5:31 ` Alexandre Oliva
2003-04-24  6:23   ` Jason Merrill
2003-04-24  8:43     ` Geert Bosch
2003-04-24 17:48       ` Jason Merrill
2003-04-24 18:04         ` Zack Weinberg
2003-04-24 19:31           ` Jason Merrill
2003-04-24 21:32         ` Geert Bosch
2003-04-24 23:24           ` Jason Merrill
2003-04-25  2:56     ` Richard Henderson
2003-04-22 15:08 Richard Kenner
2003-04-23  1:07 ` Alexandre Oliva
2003-04-22  0:15 Robert Dewar
2003-04-22  1:58 ` Jamie Lokier
2003-04-22  0:11 Robert Dewar
2003-04-22  1:35 ` Jamie Lokier
2003-04-21 21:25 Richard Kenner
2003-04-21 20:59 Richard Kenner
2003-04-21 21:14 ` Jamie Lokier
2003-04-21 20:45 Richard Kenner
2003-04-21 20:58 ` Jamie Lokier
2003-04-21 18:14 Richard Kenner
2003-04-21 20:33 ` Jamie Lokier
2003-04-21 17:25 Richard Kenner
2003-04-21 18:14 ` Jamie Lokier
2003-04-22  9:00 ` Alexandre Oliva
2003-04-20 21:28 Robert Dewar
2003-04-21 17:05 ` Alexandre Oliva
2003-04-20 21:19 Robert Dewar
2003-04-18 11:41 Richard Kenner
2003-04-18  8:06 Richard Kenner
2003-04-18  8:59 ` Richard Henderson
2003-04-17 21:41 Richard Kenner
2003-04-17 23:20 ` Alexandre Oliva
2003-04-18  1:16 ` Richard Henderson
2003-04-17 21:40 Richard Kenner
2003-04-17 11:56 Richard Kenner
2003-04-17 20:35 ` Alexandre Oliva
2003-04-17 22:41   ` Geert Bosch
2003-04-17 23:19     ` Alexandre Oliva
2003-04-17 10:44 Robert Dewar
2003-04-17 20:30 ` Alexandre Oliva
2003-04-17  8:12 Richard Kenner
2003-04-17  8:38 ` Alexandre Oliva
2003-04-11 22:26 Robert Dewar
2003-04-11 16:59 Robert Dewar
2003-04-11 18:49 ` Laurent Guerby
2003-04-11 16:51 Robert Dewar
2003-04-11 14:52 Robert Dewar
2003-04-11  4:45 Richard Kenner
2003-04-17  5:39 ` Alexandre Oliva
2003-04-11  0:45 Ulrich Weigand
2003-04-10 22:43 Richard Kenner
2003-04-11  0:31 ` Richard Henderson
2003-04-11  2:19   ` David Edelsohn
2003-04-10 22:23 Richard Kenner
2003-04-10 22:16 Richard Kenner
2003-04-10 22:07 Richard Kenner
2003-04-10 22:23 ` David Edelsohn
2003-04-10 22:05 Robert Dewar
2003-04-10 22:02 Richard Kenner
2003-04-10 22:24 ` Richard Henderson
2003-04-11 11:20   ` Laurent Guerby
2003-04-11 11:57     ` Arnaud Charlet
2003-04-11 14:16       ` Laurent Guerby
2003-04-10 21:56 Richard Kenner
2003-04-10 22:02 ` David Edelsohn
2003-04-10 21:45 Richard Kenner
2003-04-10 21:52 ` David Edelsohn
2003-04-10 21:57 ` Richard Henderson
2003-04-10 21:44 Richard Kenner
2003-04-10 21:32 Robert Dewar
2003-04-10 21:32 ` David Edelsohn
2003-04-10 21:31 Richard Kenner
2003-04-10 21:29 Robert Dewar
2003-04-10 21:10 Richard Kenner
2003-04-10 21:10 Robert Dewar
2003-04-10 21:17 ` David Edelsohn
2003-04-10 21:04 Richard Kenner
2003-04-10 21:41 ` Geoff Keating
2003-04-10 20:57 Robert Dewar
2003-04-10 21:07 ` Ulrich Weigand
2003-04-10 20:52 Robert Dewar
2003-04-10 20:39 Richard Kenner
2003-04-10 21:00 ` Geoff Keating
2003-04-10 21:01 ` Ulrich Weigand
2003-04-10 21:44 ` Richard Henderson
2003-04-10 20:13 Richard Kenner
2003-04-10 20:28 ` Ulrich Weigand
2003-04-10 19:20 Richard Kenner
2003-04-10  5:33 Richard Kenner
2003-04-10  7:20 ` Ulrich Weigand
2003-04-08 17:47 Ulrich Weigand

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200304101527.RAA07154@faui11.informatik.uni-erlangen.de \
    --to=weigand@immd1.informatik.uni-erlangen.de \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=gcc@gcc.gnu.org \
    --cc=kenner@vlsi1.ultra.nyu.edu \
    --cc=rth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).