libphobos/ChangeLog:
2019-04-25 Iain Buclaw <ibuclaw@gdcproject.org>
PR d/90250
* libdruntime/gcc/sections/elf_shared.d (initTLSRanges): Populate
_tlsRanges in every startup thread.
* testsuite/libphobos.thread/thread.exp: Load libphobos-dg.exp.
* testsuite/libphobos.thread/tlsgc_sections.d: New test.
From-SVN: r270576
+2019-04-25 Iain Buclaw <ibuclaw@gdcproject.org>
+
+ PR d/90250
+ * libdruntime/gcc/sections/elf_shared.d (initTLSRanges): Populate
+ _tlsRanges in every startup thread.
+ * testsuite/libphobos.thread/thread.exp: Load libphobos-dg.exp.
+ * testsuite/libphobos.thread/tlsgc_sections.d: New test.
+
2019-04-25 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* m4/druntime/cpu.m4 (DRUNTIME_CPU_SOURCES): Quote brackets.
*/
Array!(void[])* initTLSRanges() nothrow @nogc
{
- return &_tlsRanges();
+ auto rngs = &_tlsRanges();
+ if (rngs.empty)
+ {
+ foreach (ref pdso; _loadedDSOs)
+ rngs.insertBack(pdso.tlsRange());
+ }
+ return rngs;
}
void finiTLSRanges(Array!(void[])* rngs) nothrow @nogc
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
+load_lib libphobos-dg.exp
+
# Initialize dg.
dg-init
--- /dev/null
+final class Class
+{
+ // This gets triggered although the instance always stays referenced.
+ ~this()
+ {
+ import core.stdc.stdlib;
+ abort();
+ }
+}
+
+Class obj;
+
+static this()
+{
+ obj = new Class;
+}
+
+static ~this()
+{
+ // Free without destruction to avoid triggering abort()
+ import core.memory;
+ GC.free(cast(void*)obj);
+}
+
+void doit()
+{
+ foreach (i; 0 .. 10_000)
+ new ubyte[](100_000);
+}
+
+void main()
+{
+ import core.thread;
+ auto t = new Thread(&doit);
+ t.start();
+
+ // This triggers the GC that frees the still referenced Class instance.
+ doit();
+}