Skip to content

Commit b41de21

Browse files
committed
build fixes
1 parent 684d764 commit b41de21

File tree

6 files changed

+109
-41
lines changed

6 files changed

+109
-41
lines changed

scripts/ci.sh

+7-4
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,17 @@ else
3838
./bc-string-release-test
3939

4040
echo "Building betterC unittest runner"
41-
# $DC -version=CI_MAIN -debug -unittest -g -w -vcolumns -betterC -of=bc-string-bc-test $SRC_FILES
4241
$DC -c -version=CI_MAIN -debug -unittest -g -w -vcolumns -betterC -of=bc-string.o $SRC_FILES
43-
$DC -ofbc-string-bc-test bc-string.o -L--no-as-needed -g
42+
$DC -ofbc-string-bc-test bc-string.o -g -betterC
4443
./bc-string-bc-test
4544

4645
echo "Building betterC test build"
47-
# $DC -version=CI_MAIN -debug -g -w -vcolumns -betterC -of=bc-string-bc-test $SRC_FILES
4846
$DC -c -version=CI_MAIN -debug -g -w -vcolumns -betterC -of=bc-string.o $SRC_FILES
49-
$DC -ofbc-string-bc-test bc-string.o -L--no-as-needed -g
47+
$DC -ofbc-string-bc-test bc-string.o -g -betterC
48+
./bc-string-bc-test
49+
50+
echo "Building betterC release build"
51+
$DC -c -version=CI_MAIN -release -g -O -boundscheck=off -w -vcolumns -betterC -of=bc-string.o $SRC_FILES
52+
$DC -ofbc-string-bc-test bc-string.o -g -betterC
5053
./bc-string-bc-test
5154
fi

source/bc/core/demangle.d

-12
Original file line numberDiff line numberDiff line change
@@ -2045,16 +2045,4 @@ char[] demangle( const(char)[] buf, char[] dst = null ) nothrow pure @safe @nogc
20452045
extern (C) private
20462046
{
20472047
pure @trusted @nogc nothrow pragma(mangle, "fakePureReprintReal") void pureReprintReal(char[] nptr);
2048-
2049-
void fakePureReprintReal(char[] nptr)
2050-
{
2051-
import core.stdc.stdlib : strtold;
2052-
import core.stdc.stdio : snprintf;
2053-
import core.stdc.errno : errno;
2054-
2055-
const err = errno;
2056-
real val = strtold(nptr.ptr, null);
2057-
snprintf(nptr.ptr, nptr.length, "%#Lg", val);
2058-
errno = err;
2059-
}
20602048
}

source/bc/core/intrinsics.d

+38
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,41 @@ else
2626
return val;
2727
}
2828
}
29+
30+
// Workarounds for betterC
31+
version (D_BetterC)
32+
{
33+
pragma(mangle, "_D4core8lifetime16testEmplaceChunkFNaNbNiNfAvmmZv")
34+
nothrow @nogc @safe pure void testEmplaceChunk(void[] chunk, size_t typeSize, size_t typeAlignment) {}
35+
36+
version (DigitalMars)
37+
{
38+
extern (C)
39+
nothrow @nogc
40+
short* _memset16(short *p, short value, size_t count)
41+
{
42+
short *pstart = p;
43+
short *ptop;
44+
45+
for (ptop = &p[count]; p < ptop; p++)
46+
*p = value;
47+
return pstart;
48+
}
49+
}
50+
51+
version (assert)
52+
{
53+
version (LDC)
54+
{
55+
// See: https://github.com/ldc-developers/ldc/issues/2425
56+
// See: https://forum.dlang.org/post/heksucpdamkgwnztyitr@forum.dlang.org
57+
extern(C)
58+
nothrow @nogc
59+
void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen, size_t elemsz)
60+
{
61+
import ldc.intrinsics : llvm_memcpy;
62+
llvm_memcpy!size_t(dst, src, dstlen * elemsz, 0);
63+
}
64+
}
65+
}
66+
}

source/bc/core/system/backtrace.d

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
module bc.core.system.backtrace;
22

33
version (D_BetterC) {}
4-
else:
4+
else version (linux):
55

66
/**
77
* This struct us used to mimic private class in https://github.com/dlang/druntime/blob/master/src/core/runtime.d#L734

source/bc/string/format.d

+62-23
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
module bc.string.format;
77

88
import bc.core.intrinsics;
9+
import bc.core.system.backtrace;
910
import bc.core.traits;
1011
import bc.string.string;
11-
import core.time : Duration;
1212
import std.algorithm : among;
1313
import std.datetime.date : TimeOfDay;
1414
import std.traits :
@@ -18,21 +18,39 @@ import std.traits :
1818
import std.range : ElementEncodingType, isForwardRange, isInputRange;
1919
import std.typecons : Flag, Tuple, isTuple;
2020

21-
version (D_BetterC)
22-
{
23-
// can't import std.uuid, std.datetime.systime in betterC
24-
struct Fake {}
25-
alias UUID = Fake;
26-
alias SysTime = Fake;
27-
alias TraceInfo = Fake;
28-
}
21+
version (D_BetterC) {}
2922
else
3023
{
31-
import bc.core.system.backtrace : TraceInfo;
24+
import core.time : Duration;
3225
import std.datetime.systime : SysTime;
3326
import std.uuid : UUID;
3427
}
3528

29+
private template isUUID(T)
30+
{
31+
version (D_BetterC) enum isUUID = false;
32+
else enum isUUID = is(T == UUID);
33+
}
34+
35+
private template isSysTime(T)
36+
{
37+
version (D_BetterC) enum isSysTime = false;
38+
else enum isSysTime = is(T == SysTime);
39+
}
40+
41+
private template isDuration(T)
42+
{
43+
version (D_BetterC) enum isDuration = false;
44+
else enum isDuration = is(T == Duration);
45+
}
46+
47+
private template isTraceInfo(T)
48+
{
49+
version (D_BetterC) enum isTraceInfo = false;
50+
else version (linux) enum isTraceInfo = is(T == TraceInfo);
51+
else enum isTraceInfo = false;
52+
}
53+
3654
/**
3755
* Formats values to with fmt template into provided sink.
3856
* Note: it supports only a basic subset of format type specifiers, main usage is for nogc logging
@@ -43,9 +61,10 @@ else
4361
size_t nogcFormatTo(string fmt = "%s", S, ARGS...)(ref S sink, auto ref ARGS args) nothrow @nogc
4462
{
4563
// TODO: not pure because of float formatter
64+
// import std.conv : text;
4665
alias sfmt = splitFmt!fmt;
47-
static assert (sfmt.numFormatters == ARGS.length, "Expected " ~ text(sfmt.numFormatters) ~
48-
" arguments, got " ~ text(ARGS.length));
66+
static assert (sfmt.numFormatters == ARGS.length, "Expected " ~ sfmt.numFormatters.stringof ~
67+
" arguments, got " ~ ARGS.length.stringof);
4968

5069
mixin SinkWriter!S;
5170

@@ -105,11 +124,11 @@ size_t nogcFormatTo(string fmt = "%s", S, ARGS...)(ref S sink, auto ref ARGS arg
105124
auto tmp = enumToStr(val);
106125
if (_expect(tmp is null, false)) advance(s.nogcFormatTo!"%s(%d)"(Typ.stringof, val));
107126
else write(tmp);
108-
} else static if (is(Typ == UUID)) advance(s.formatUUID(val));
109-
else static if (is(Typ == SysTime)) advance(s.formatSysTime(val));
127+
} else static if (isUUID!Typ) advance(s.formatUUID(val));
128+
else static if (isSysTime!Typ) advance(s.formatSysTime(val));
110129
else static if (is(Typ == TimeOfDay))
111130
advance(s.nogcFormatTo!"%02d:%02d:%02d"(val.hour, val.minute, val.second));
112-
else static if (is(Typ == Duration)) advance(s.formatDuration(val));
131+
else static if (isDuration!Typ) advance(s.formatDuration(val));
113132
else static if (isArray!Typ || isInputRange!Typ) {
114133
import std.range : empty;
115134
if (!val.empty) advance(s.nogcFormatTo!"[%(%s%|, %)]"(val));
@@ -145,10 +164,15 @@ size_t nogcFormatTo(string fmt = "%s", S, ARGS...)(ref S sink, auto ref ARGS arg
145164
}
146165
else static if (is(Typ : Throwable)) {
147166
auto obj = cast(Object)val;
148-
advance(s.nogcFormatTo!"%s@%s(%d): %s\n----------------\n%s"(
149-
typeid(obj).name, val.file, val.line, val.msg, TraceInfo(val)));
167+
static if (__traits(compiles, TraceInfo(val))) {
168+
advance(s.nogcFormatTo!"%s@%s(%d): %s\n----------------\n%s"(
169+
typeid(obj).name, val.file, val.line, val.msg, TraceInfo(val)));
170+
}
171+
else
172+
advance(s.nogcFormatTo!"%s@%s(%d): %s"(
173+
typeid(obj).name, val.file, val.line, val.msg));
150174
}
151-
else static if (is(Typ == TraceInfo)) {
175+
else static if (isTraceInfo!Typ) {
152176
auto sw = sinkWrap(s);
153177
val.dumpTo(sw);
154178
advance(sw.totalLen);
@@ -385,7 +409,7 @@ const(char)[] nogcFormat(string fmt = "%s", ARGS...)(auto ref ARGS args)
385409
}
386410

387411
version (D_BetterC) {}
388-
else version (Posix)
412+
else version (linux)
389413
{
390414
// Only Posix is supported ATM
391415
@("Exception stack trace format")
@@ -453,6 +477,8 @@ private struct FmtParams
453477
int prec; // precision, if -1, use previous argument as precision value
454478
}
455479

480+
private bool isDigit()(immutable char c) { return c >= '0' && c <= '9'; }
481+
456482
// Parses format specifier in CTFE
457483
// See: https://dlang.org/phobos/std_format.html for details
458484
// Note: Just a subset of the specification is supported ATM. Parser here parses the spec, but
@@ -466,7 +492,6 @@ private struct FmtParams
466492
//
467493
auto formatSpec()(FMT f, string spec)
468494
{
469-
import std.ascii : isDigit;
470495
FmtParams res; int idx;
471496

472497
if (spec.length)
@@ -609,10 +634,22 @@ private ptrdiff_t indexOf()(string fmt, char c)
609634
// Phobos version has bug in CTFE, see: https://issues.dlang.org/show_bug.cgi?id=20783
610635
private ptrdiff_t fixedLastIndexOf()(string s, string sub)
611636
{
612-
for (ptrdiff_t i = s.length - sub.length; i >= 0; --i)
637+
if (!__ctfe) assert(0);
638+
639+
LOOP: for (ptrdiff_t i = s.length - sub.length; i >= 0; --i)
613640
{
614-
if (s[i .. i + sub.length] == sub[])
615-
return i;
641+
version (D_BetterC)
642+
{
643+
// workaround for missing symbol used by DMD
644+
for (ptrdiff_t j=0; j<sub.length; ++j)
645+
if (s[i+j] != sub[j]) continue LOOP;
646+
return i;
647+
}
648+
else
649+
{
650+
if (s[i .. i + sub.length] == sub[])
651+
return i;
652+
}
616653
}
617654
return -1;
618655
}
@@ -1236,6 +1273,8 @@ size_t formatDuration(S)(ref S sink, Duration val) @trusted nothrow @nogc pure
12361273
return totalLen;
12371274
}
12381275

1276+
version (D_BetterC) {}
1277+
else
12391278
@("duration")
12401279
@safe unittest
12411280
{

source/bc/string/package.d

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ version (CI_MAIN)
6161
import core.exception : RangeError;
6262
import std.exception : assertThrown;
6363
char[5] buf;
64-
assertThrown!RangeError(buf.nogcFormatTo!"123412341234");
64+
version (assert) assertThrown!RangeError(buf.nogcFormatTo!"123412341234");
6565
}();
6666
}
6767

0 commit comments

Comments
 (0)