From 8803c5e58254b27b217359bbb87dba5d4490c823 Mon Sep 17 00:00:00 2001 From: Rainer Schuetze Date: Tue, 2 May 2017 13:15:57 +0200 Subject: [PATCH 1/2] allow precise scanning of DATA/TLS segment: buffers for preallocated class instances should be typed void[], not ubyte[] and must be properly aligned --- std/experimental/logger/core.d | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/std/experimental/logger/core.d b/std/experimental/logger/core.d index ab63a7e793a..56741bbbc1f 100644 --- a/std/experimental/logger/core.d +++ b/std/experimental/logger/core.d @@ -1631,7 +1631,7 @@ private @property Logger defaultSharedLoggerImpl() @trusted import std.conv : emplace; import std.stdio : stderr; - static __gshared ubyte[__traits(classInstanceSize, FileLogger)] _buffer; + static __gshared align(FileLogger.alignof) void[__traits(classInstanceSize, FileLogger)] _buffer; synchronized (stdSharedLoggerMutex) { @@ -1763,7 +1763,7 @@ private @property Logger stdThreadLocalLogImpl() @trusted { import std.conv : emplace; - static ubyte[__traits(classInstanceSize, StdForwardLogger)] _buffer; + static align(StdForwardLogger.alignof) void[__traits(classInstanceSize, StdForwardLogger)] _buffer; auto buffer = cast(ubyte[]) _buffer; From a3e7298686f97e58d6fe44d8c0ee3a15444ac632 Mon Sep 17 00:00:00 2001 From: Rainer Schuetze Date: Tue, 2 May 2017 15:03:24 +0200 Subject: [PATCH 2/2] workaround ld rejecting explicit alignment --- std/experimental/logger/core.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/experimental/logger/core.d b/std/experimental/logger/core.d index 56741bbbc1f..22ba7d25283 100644 --- a/std/experimental/logger/core.d +++ b/std/experimental/logger/core.d @@ -1763,7 +1763,7 @@ private @property Logger stdThreadLocalLogImpl() @trusted { import std.conv : emplace; - static align(StdForwardLogger.alignof) void[__traits(classInstanceSize, StdForwardLogger)] _buffer; + static void*[(__traits(classInstanceSize, StdForwardLogger) - 1) / (void*).sizeof + 1] _buffer; auto buffer = cast(ubyte[]) _buffer;