From 4b45720a9ec80d16af713164ccc56e649d3a83f6 Mon Sep 17 00:00:00 2001 From: Rainer Schuetze Date: Sun, 2 Apr 2017 10:01:53 +0200 Subject: [PATCH] fix issue 17291: relocations for pointer references might also need "back patches" --- src/ddmd/backend/cgobj.c | 5 +++-- src/ddmd/backend/mscoffobj.c | 2 +- test/runnable/testptrref.d | 13 ++++++++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ddmd/backend/cgobj.c b/src/ddmd/backend/cgobj.c index 1362aa143235..1e9927738ee3 100644 --- a/src/ddmd/backend/cgobj.c +++ b/src/ddmd/backend/cgobj.c @@ -756,10 +756,11 @@ void Obj::term(const char *objfilename) #if SCPP if (!errcnt) #endif - { obj_defaultlib(); + { + obj_defaultlib(); + objflush_pointerRefs(); outfixlist(); // backpatches } - objflush_pointerRefs(); if (config.fulltypes) cv_term(); // write out final debug info diff --git a/src/ddmd/backend/mscoffobj.c b/src/ddmd/backend/mscoffobj.c index 88c30d979183..c3a9fcea3ceb 100644 --- a/src/ddmd/backend/mscoffobj.c +++ b/src/ddmd/backend/mscoffobj.c @@ -683,8 +683,8 @@ void MsCoffObj::term(const char *objfilename) if (!errcnt) #endif { - outfixlist(); // backpatches objflush_pointerRefs(); + outfixlist(); // backpatches } if (configv.addlinenumbers) diff --git a/test/runnable/testptrref.d b/test/runnable/testptrref.d index 86830894fe92..ed2e1cc9c69e 100644 --- a/test/runnable/testptrref.d +++ b/test/runnable/testptrref.d @@ -53,6 +53,12 @@ class Class void* ptr; } +struct Struc(T) +{ + static T vtls; + static __gshared T vgshared; +} + __gshared Struct* gsharedStrctPtr2 = new Struct(7, new Struct(8, null)); int tlsInt; @@ -128,7 +134,7 @@ void testRefPtr() assert(findDataPtr(&gsharedStrct.next)); assert(findDataPtr(&(gsharedClss))); assert(findDataPtr(&(gsharedClss.ptr))); - + assert(findTlsPtr(&tlsVar)); assert(findTlsPtr(&tlsClss)); assert(findTlsPtr(&tlsStrcArr[0].next)); @@ -154,4 +160,9 @@ void testRefPtr() assert(findDataPtr(&gsharedStrctPtr)); assert(findDataPtr(&gsharedStrctPtr.next)); assert(findDataPtr(&gsharedStrctPtr.next.next)); + + assert(findDataPtr(&(Struc!(int*).vgshared))); + assert(!findDataPtr(&(Struc!(int).vgshared))); + assert(findTlsPtr(&(Struc!(int*).vtls))); + assert(!findTlsPtr(&(Struc!(int).vtls))); }