Build problem with latest git head

Timo Sintonen t.sintonen at luukku.com
Mon Nov 4 05:47:53 PST 2013


On Monday, 4 November 2013 at 11:21:03 UTC, Iain Buclaw wrote:
>
>
> For the time being, use gcc-4.9-20131013.tar.bz2 snapshot - 
> that is the
> last build I've done here (currently all my time is being used 
> up on D
> 2.064).
>
> Feel free to send patches though (see this two line change here:
> http://gcc.gnu.org/git/?p=gcc.git;a=commitdiff;h=02774f2d493655713721ceef4ebfd7d0c8fb1d8d;hp=2043dfcce183f27ffe84a339da8b75aec20d3c33#patch21).
> :-)

Ok, I check that later

Meanwhile, a short description of my original problem

I want to send characters of a string to uart
These are member functions of my uart struct. The full source is 
https://bitbucket.org/timosi/minlibd/src/540e52150644719682f37900db1c298902e4d8c9/tools/main/uart.d?at=default

    // send a byte to the uart
    void send(int t) {
      while ((sr&0x80)==0)
      {
      }
      dr=t;
    }


   // send a string or char buffer
   void sendtext(const char[] p) {

      //if (!p) return;  // null pointer test

      foreach (c;p) {
	 //if (c==0) break;
	 send (c);
      }
   }

The problem is that send is inlined with -O2 such a way that the 
write is optimized outside of the foreach loop and only the last 
character is sent.
This works with -O0.

This is the asm
r0 is this, r1 is p and r2 is length of p

  151 00ac 10B4      		push	{r4}
  152 00ae 83B0      		sub	sp, sp, #12
  153 00b0 02AB      		add	r3, sp, #8
  154 00b2 03E90600  		stmdb	r3, {r1, r2}
  155 00b6 009C     		ldr	r4, [sp]
  156 00b8 019A     		ldr	r2, [sp, #4]
  157 00ba 4CB1     		cbz	r4, .L11       zero length test
  158 00bc 4368     		ldr	r3, [r0, #4]
  159 00be 1444     		add	r4, r4, r2
                  At this point r4 = end address
                                r2 = p
                  Foreach begins here
  160              	.L13:
  161 00c0 12F8011B  		ldrb	r1, [r2], #1     get c

  162              	.L15:                   First part of send here
  163 00c4 0368     		ldr	r3, [r0]     status reg test
  164 00c6 1B06      		lsls	r3, r3, #24  works now!
  165 00c8 FCD5     		bpl	.L15

  166 00ca A242     		cmp     r2, r4   Here in the middle
  167 00cc F8D1     		bne	.L13     the test for end of the loop

  168 00ce 4160     		str	r1, [r0, #4] Write (dr=t) is here,
  169              	.L11:                        AFTER the loop

  170 00d0 03B0     		add	sp, sp, #12
  171              		

  172 00d2 5DF8044B 		ldr	r4, [sp], #4
  173 00d6 7047     		bx	lr




More information about the D.gnu mailing list