[Bug 84] New: Writes to struct members marked as shared are not volatile

gdc-bugzilla at gdcproject.org gdc-bugzilla at gdcproject.org
Sat Nov 9 11:03:45 PST 2013


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

             Bug #: 84
           Summary: Writes to struct members marked as shared are not
                    volatile
    Classification: Unclassified
           Product: GDC
           Version: development
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: Normal
         Component: gdc
        AssignedTo: ibuclaw at gdcproject.org
        ReportedBy: johannespfau at gmail.com


As originally reported by Timo Sintonen in the D.gnu newsgroup, see
http://forum.dlang.org/thread/cbdjfujryokvvwvetyuj@forum.dlang.org#post-tzakpzaooenwrkpdbxgw:40forum.dlang.org

Test case in D
---------------------------------------------
struct Register
{
    shared size_t a;
}

Register* reg = cast(Register*)0xFFDDCCAA;

void main()
{
     for(size_t i = 0; i < 10; i++)
         reg.a = i;
}
---------------------------------------------


Same test case in C (working):
---------------------------------------------
#include <stdlib.h>

struct Register
{
    volatile size_t a;
};
typedef struct Register reg_t;

reg_t* reg = (reg_t*)0xFFDDCCAA;

void main()
{
     size_t i;
     for(i = 0; i < 10; i++)
         reg->a = i;
}

---------------------------------------------

Compile with
gdc -O3 test.d -S
gcc -O3 test.c -S

Of course the code won't run but the wrong optimization is obvious in
the generated ASM. I had a quick look at the fdump-tree-original-raw
output but I didn't see a obvious difference between the C/D output.

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


More information about the D.gnu mailing list