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: ibuc...@gdcproject.org ReportedBy: po...@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.