www.digitalmars.com         C & C++   DMDScript  

D.gnu - [Bug 74] New: Wrong code generated (incorrect offset to static array)

http://bugzilla.gdcproject.org/show_bug.cgi?id=74

             Bug #: 74
           Summary: Wrong code generated (incorrect offset to static
                    array)
    Classification: Unclassified
           Product: GDC
           Version: 4.7.x
          Platform: ARM
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: Normal
         Component: gdc
        AssignedTo: ibuclaw gdcproject.org
        ReportedBy: power pobox.sk


Created attachment 48
  --> http://bugzilla.gdcproject.org/attachment.cgi?id=48
Result of: objdump -S -r test.o

Reduced example:
----------------
File colors.d:
----------------
module colors;

public class Colors {
  public static void getColor(int j, ref float[4] color) {
    color[0] = 0.7;
    color[1] = 0.6;
    color[2] = 0.5;
    color[3] = 0.8;
  }
}
----------------
File test.d:
----------------
module test;

private import colors;

public class Test {
  public static float[2] testData2 = [2.7, 2.6];
  private:
  static float[4*4][2][6] testColors;
  public static float[2] testData3;

  public static void prepare() {
    foreach (k; 0..6) {
      float[4] currentColor;

      Colors.getColor(k, currentColor);
      testColors[k][0] = currentColor ~ currentColor ~ currentColor ~
currentColor;

      Colors.getColor(k, currentColor);
      testColors[k][1] = currentColor ~ currentColor ~ currentColor ~
currentColor;
    }
  }

  public static float[2] spData = [1.7, 1.6];
}
----------------
File main.d:
----------------
module main;

private import test;
private import std.stdio;
private import std.conv;

public int main(string[] argv) {
    Test.prepare();
    writeln(to!string(Test.testData2[0]));
    return 0;
}
----------------

When the example is executed it should print 2.7 (and exit), but when I compile
it for ARM and run it, it prints 0.7, because the value gets overwritten in the
prepare method.

I'm using a GDC crosscompiler for ARM linux (running on x64 linux) - gcc
version 4.7.3 with gdc commit e63f8a7a5657684c0f2c3d2fd1a9c33eec0208c0 (last
commit in gdc-4.7 branch before merging D 2.063).

I couldn't reproduce the error on x86 and x64.

The result of "objdump -S -r test.o" is in the attachment.
In line 26 is an instruction which loads an offset from memory - relocation:
  10:    e59f31dc     ldr    r3, [pc, #476]    ; 1f4
<_D4test4Test7prepareFZv+0x1f4>

In lines 188 and 189 is the relocation:
 1f4:    00000050     .word    0x00000050
            1f4: R_ARM_TLS_LE32    _D4test4Test10testColorsG6G2G16f

The value in line 188 is 0x50, but it should be 0x40.

This bug appears in some specific conditions (e.g. when I add a writeln
statement into test.d, the bug disappears).

-- 
Configure bugmail: http://bugzilla.gdcproject.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching all bug changes.
Aug 08 2013