Iain Buclaw via Gcc-patches <gcc-patches@gcc.gnu.org> writes:
> Hi,
>
> This patch adds an effect target d_runtime_has_std_library to
> target-supports.exp, and some preliminary uses of it.
>
> The current check_effective_target_d_runtime procedure returns false if
> the target is without any core runtime library for D.  This additional
> procedure is for targets where the core runtime library exists, but is
> without the higher level standard D library.
>
> OK for master?

OK.  FAOD though, D-related effective-target keywords are covered by the
D frontend maintainership.

Thanks,
Richard


>
> Regards
> Iain.
>
> ---
> gcc/testsuite/ChangeLog:
>
>       * gdc.dg/link.d: Use d_runtime_has_std_library effective target.
>       * gdc.dg/runnable.d: Move phobos tests to...
>       * gdc.dg/runnable2.d: ...here.  New test.
>       * lib/target-supports.exp
>       (check_effective_target_d_runtime_has_std_library): New.
>
> libphobos/ChangeLog:
>
>       * testsuite/libphobos.phobos/phobos.exp: Skip if effective target is
>       not d_runtime_has_std_library.
>       * testsuite/libphobos.phobos_shared/phobos_shared.exp: Likewise.
> ---
>  gcc/testsuite/gdc.dg/link.d                   |   2 +-
>  gcc/testsuite/gdc.dg/runnable.d               | 229 ----------------
>  gcc/testsuite/gdc.dg/runnable2.d              | 244 ++++++++++++++++++
>  gcc/testsuite/lib/target-supports.exp         |  15 ++
>  .../testsuite/libphobos.phobos/phobos.exp     |   5 +
>  .../libphobos.phobos_shared/phobos_shared.exp |   5 +
>  6 files changed, 270 insertions(+), 230 deletions(-)
>  create mode 100644 gcc/testsuite/gdc.dg/runnable2.d
>
> diff --git a/gcc/testsuite/gdc.dg/link.d b/gcc/testsuite/gdc.dg/link.d
> index a8ca4ed5cb6..5efd0ad347f 100644
> --- a/gcc/testsuite/gdc.dg/link.d
> +++ b/gcc/testsuite/gdc.dg/link.d
> @@ -1,4 +1,4 @@
> -// { dg-do link { target d_runtime } }
> +// { dg-do link { target d_runtime_has_std_library } }
>  
>  /******************************************/
>  
> diff --git a/gcc/testsuite/gdc.dg/runnable.d b/gcc/testsuite/gdc.dg/runnable.d
> index 484a9709bf3..7307e09a645 100644
> --- a/gcc/testsuite/gdc.dg/runnable.d
> +++ b/gcc/testsuite/gdc.dg/runnable.d
> @@ -9,20 +9,6 @@ import core.stdc.stdio;
>  import gcc.attribute;
>  
>  
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=2
> -
> -struct S
> -{
> -    string toString() { return "foo"; }
> -}
> -
> -void test2()
> -{
> -    import std.string : format;
> -    assert(format("%s", S()) == "foo");
> -}
> -
>  /******************************************/
>  // https://bugzilla.gdcproject.org/show_bug.cgi?id=4
>  
> @@ -33,35 +19,6 @@ void test4()
>      static assert(!__traits(compiles, str.sort));
>  }
>  
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=15
> -
> -class B
> -{
> -    class A { }
> -    A a;
> -}
> -
> -class C
> -{
> -    void visit(B b)
> -    {
> -        import std.algorithm : map;
> -        auto as = [b.a];
> -        as.map!(d => d);
> -    }
> -}
> -
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=16
> -
> -void test16()
> -{
> -    import std.parallelism : taskPool;
> -
> -    taskPool.reduce!"a+b"([0, 1, 2, 3]);
> -}
> -
>  /******************************************/
>  // https://bugzilla.gdcproject.org/show_bug.cgi?id=17
>  
> @@ -99,59 +56,6 @@ void test17()
>    (new ModuleWriter()).save ("test.0.mci");
>  }
>  
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=18
> -
> -class C18
> -{
> -    struct Link
> -    {
> -        int x;
> -        int y;
> -    }
> -
> -    void sort_links()
> -    {
> -        import std.algorithm : sort;
> -        import std.array : empty;
> -        import std.exception : enforce;
> -
> -        enforce(!_link.empty);
> -
> -        bool lt(Link a, Link b)
> -        {
> -            if(a.x > b.x)
> -                return false;
> -            if(a.x < b.x)
> -                return true;
> -            if(a.y >= b.y)
> -                return false;
> -            else
> -                return true;
> -        }
> -        sort!(lt)(_link);
> -    }
> -
> -    this()
> -    {
> -        _link ~= Link(8, 3);
> -        _link ~= Link(4, 7);
> -        _link ~= Link(4, 6);
> -        _link ~= Link(3, 7);
> -        _link ~= Link(2, 7);
> -        _link ~= Link(2, 2);
> -        _link ~= Link(4, 1);
> -    }
> -
> -    Link[] _link;
> -}
> -
> -void test18()
> -{
> -    C18 foo = new C18;
> -    foo.sort_links();
> -}
> -
>  /******************************************/
>  // https://bugzilla.gdcproject.org/show_bug.cgi?id=19
>  
> @@ -177,22 +81,6 @@ void test24()
>          return;
>  }
>  
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=29
> -
> -void test29()
> -{
> -    import std.string : format;
> -    import std.conv : text;
> -
> -    string s;
> -    for (auto i = 0; i < 100000; i++)
> -    {
> -        s = format("%d", i);
> -        s = text(i);
> -    }
> -}
> -
>  /******************************************/
>  // https://bugzilla.gdcproject.org/show_bug.cgi?id=31
>  
> @@ -499,54 +387,6 @@ void test51()
>      assert (s.x == 0);
>  }
>  
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=52
> -
> -class C52
> -{
> -    C52 a;
> -
> -    this()
> -    {
> -        printf("Construct: this=%p\n", cast(void*)this);
> -        a = this;
> -    }
> -
> -    bool check()
> -    {
> -        printf("Check: this=%p a=%p\n", cast(void*)this, cast(void*)a);
> -        return this is a;
> -    }
> -}
> -
> -auto test52a()
> -{
> -    import std.conv, std.traits;
> -
> -    struct Scoped
> -    {
> -        void[__traits (classInstanceSize, C52) ] Scoped_store = void;
> -
> -        inout(C52) Scoped_payload() inout
> -        {
> -            void* alignedStore = cast(void*) Scoped_store.ptr;
> -            return cast(inout (C52)) alignedStore;
> -        }
> -        alias Scoped_payload this;
> -    }
> -
> -    Scoped result;
> -    emplace!(Unqual!C52)(result.Scoped_store);
> -    assert(result.Scoped_payload().check);
> -    return result;
> -}
> -
> -void test52()
> -{
> -    auto a1 = test52a();
> -    assert(a1.Scoped_payload().check);
> -}
> -
>  /******************************************/
>  // https://bugzilla.gdcproject.org/show_bug.cgi?id=57
>  
> @@ -588,54 +428,6 @@ void test66()
>  __vector(float[4]) d[2];  // ICE
>  
>  
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=71
> -
> -struct Leaf
> -{
> -    ubyte symbol;
> -    ubyte codeLen;
> -}
> -
> -struct CanonicalHuffman
> -{
> -    Leaf[] table;
> -
> -    void print()
> -    {
> -        import std.algorithm;
> -        import std.range;
> -
> -        auto list = zip(iota(table.length), table.dup).array
> -            .sort!((a, b) => a[1].symbol < b[1].symbol)
> -            .uniq!((a, b) => (a[0] & (1 << a[1].codeLen) - 1) == (b[0] & (1 
> << b[1].codeLen) - 1));
> -    }
> -}
> -
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=77
> -
> -void fun(ubyte[3] buf)
> -{
> -    import std.bitmanip : bigEndianToNative;
> -    bigEndianToNative!ushort(buf[0..2]);
> -}
> -
> -void test77()
> -{
> -    fun([1,2,3]);
> -}
> -
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=108
> -
> -@attribute("forceinline")
> -void test108()
> -{
> -    import std.stdio : writeln;
> -    writeln("Here");
> -}
> -
>  /******************************************/
>  // https://bugzilla.gdcproject.org/show_bug.cgi?id=115
>  
> @@ -657,21 +449,6 @@ void test115()
>  
>  immutable char C121 = void; // ICE
>  
> -/******************************************/
> -// https://bugzilla.gdcproject.org/show_bug.cgi?id=122
> -
> -void test122()
> -{
> -    import std.algorithm : map;
> -    import std.parallelism : taskPool;
> -    import std.range : iota;
> -
> -    immutable n = 10000;
> -    enum delta = 1.0 / n;       // XBUG: was 'immutable delta' 
> https://issues.dlang.org/show_bug.cgi?id=17092
> -    immutable pi = 4.0 * delta * taskPool.reduce!"a + b"(
> -        map!((int i) { immutable x = (i - 0.5) * delta; return 1.0 / (1.0 + 
> x * x); })(iota(n)));
> -}
> -
>  /******************************************/
>  // https://bugzilla.gdcproject.org/show_bug.cgi?id=127
>  
> @@ -1584,20 +1361,14 @@ void test309()
>  
>  void main()
>  {
> -    test2();
>      test4();
> -    test16();
>      test17();
> -    test18();
>      test35();
>      test36();
>      test43();
>      test51();
> -    test52();
>      test57();
>      test66();
> -    test77();
> -    test108();
>      test115();
>      test131();
>      test133();
> diff --git a/gcc/testsuite/gdc.dg/runnable2.d 
> b/gcc/testsuite/gdc.dg/runnable2.d
> new file mode 100644
> index 00000000000..d9463e337c1
> --- /dev/null
> +++ b/gcc/testsuite/gdc.dg/runnable2.d
> @@ -0,0 +1,244 @@
> +// { dg-do run { target { hw && d_runtime_has_std_library } } }
> +
> +module runnable;
> +
> +import core.stdc.stdio;
> +import gcc.attribute;
> +
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=2
> +
> +struct S
> +{
> +    string toString() { return "foo"; }
> +}
> +
> +void test2()
> +{
> +    import std.string : format;
> +    assert(format("%s", S()) == "foo");
> +}
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=15
> +
> +class B
> +{
> +    class A { }
> +    A a;
> +}
> +
> +class C
> +{
> +    void visit(B b)
> +    {
> +        import std.algorithm : map;
> +        auto as = [b.a];
> +        as.map!(d => d);
> +    }
> +}
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=16
> +
> +void test16()
> +{
> +    import std.parallelism : taskPool;
> +
> +    taskPool.reduce!"a+b"([0, 1, 2, 3]);
> +}
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=18
> +
> +class C18
> +{
> +    struct Link
> +    {
> +        int x;
> +        int y;
> +    }
> +
> +    void sort_links()
> +    {
> +        import std.algorithm : sort;
> +        import std.array : empty;
> +        import std.exception : enforce;
> +
> +        enforce(!_link.empty);
> +
> +        bool lt(Link a, Link b)
> +        {
> +            if(a.x > b.x)
> +                return false;
> +            if(a.x < b.x)
> +                return true;
> +            if(a.y >= b.y)
> +                return false;
> +            else
> +                return true;
> +        }
> +        sort!(lt)(_link);
> +    }
> +
> +    this()
> +    {
> +        _link ~= Link(8, 3);
> +        _link ~= Link(4, 7);
> +        _link ~= Link(4, 6);
> +        _link ~= Link(3, 7);
> +        _link ~= Link(2, 7);
> +        _link ~= Link(2, 2);
> +        _link ~= Link(4, 1);
> +    }
> +
> +    Link[] _link;
> +}
> +
> +void test18()
> +{
> +    C18 foo = new C18;
> +    foo.sort_links();
> +}
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=29
> +
> +void test29()
> +{
> +    import std.string : format;
> +    import std.conv : text;
> +
> +    string s;
> +    for (auto i = 0; i < 100000; i++)
> +    {
> +        s = format("%d", i);
> +        s = text(i);
> +    }
> +}
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=52
> +
> +class C52
> +{
> +    C52 a;
> +
> +    this()
> +    {
> +        printf("Construct: this=%p\n", cast(void*)this);
> +        a = this;
> +    }
> +
> +    bool check()
> +    {
> +        printf("Check: this=%p a=%p\n", cast(void*)this, cast(void*)a);
> +        return this is a;
> +    }
> +}
> +
> +auto test52a()
> +{
> +    import std.conv, std.traits;
> +
> +    struct Scoped
> +    {
> +        void[__traits (classInstanceSize, C52) ] Scoped_store = void;
> +
> +        inout(C52) Scoped_payload() inout
> +        {
> +            void* alignedStore = cast(void*) Scoped_store.ptr;
> +            return cast(inout (C52)) alignedStore;
> +        }
> +        alias Scoped_payload this;
> +    }
> +
> +    Scoped result;
> +    emplace!(Unqual!C52)(result.Scoped_store);
> +    assert(result.Scoped_payload().check);
> +    return result;
> +}
> +
> +void test52()
> +{
> +    auto a1 = test52a();
> +    assert(a1.Scoped_payload().check);
> +}
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=71
> +
> +struct Leaf
> +{
> +    ubyte symbol;
> +    ubyte codeLen;
> +}
> +
> +struct CanonicalHuffman
> +{
> +    Leaf[] table;
> +
> +    void print()
> +    {
> +        import std.algorithm;
> +        import std.range;
> +
> +        auto list = zip(iota(table.length), table.dup).array
> +            .sort!((a, b) => a[1].symbol < b[1].symbol)
> +            .uniq!((a, b) => (a[0] & (1 << a[1].codeLen) - 1) == (b[0] & (1 
> << b[1].codeLen) - 1));
> +    }
> +}
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=77
> +
> +void fun(ubyte[3] buf)
> +{
> +    import std.bitmanip : bigEndianToNative;
> +    bigEndianToNative!ushort(buf[0..2]);
> +}
> +
> +void test77()
> +{
> +    fun([1,2,3]);
> +}
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=108
> +
> +@attribute("forceinline")
> +void test108()
> +{
> +    import std.stdio : writeln;
> +    writeln("Here");
> +}
> +
> +/******************************************/
> +// https://bugzilla.gdcproject.org/show_bug.cgi?id=122
> +
> +void test122()
> +{
> +    import std.algorithm : map;
> +    import std.parallelism : taskPool;
> +    import std.range : iota;
> +
> +    immutable n = 10000;
> +    enum delta = 1.0 / n;       // XBUG: was 'immutable delta' 
> https://issues.dlang.org/show_bug.cgi?id=17092
> +    immutable pi = 4.0 * delta * taskPool.reduce!"a + b"(
> +        map!((int i) { immutable x = (i - 0.5) * delta; return 1.0 / (1.0 + 
> x * x); })(iota(n)));
> +}
> +
> +/******************************************/
> +
> +void main()
> +{
> +    test2();
> +    test16();
> +    test18();
> +    test52();
> +    test77();
> +    test108();
> +
> +    printf("Success!\n");
> +}
> diff --git a/gcc/testsuite/lib/target-supports.exp 
> b/gcc/testsuite/lib/target-supports.exp
> index 3758bb3a91d..5704a2fc583 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -8069,6 +8069,21 @@ proc check_effective_target_d_runtime { } {
>      }]
>  }
>  
> +# Return 1 if the target provides the D standard library.
> +
> +proc check_effective_target_d_runtime_has_std_library { } {
> +    return [check_no_compiler_messages d_runtime_has_std_library executable {
> +     // D
> +     module mod;
> +
> +     extern(C) int main() {
> +         import std.math;
> +         real function(real) pcos = &cos;
> +         return 0;
> +     }
> +    }]
> +}
> +
>  # Return 1 if  target wchar_t is at least 4 bytes.
>  
>  proc check_effective_target_4byte_wchar_t { } {
> diff --git a/libphobos/testsuite/libphobos.phobos/phobos.exp 
> b/libphobos/testsuite/libphobos.phobos/phobos.exp
> index 3d876acf27b..aad877c24c2 100644
> --- a/libphobos/testsuite/libphobos.phobos/phobos.exp
> +++ b/libphobos/testsuite/libphobos.phobos/phobos.exp
> @@ -19,6 +19,11 @@ if { ![isnative] || ![is-effective-target static] } {
>      return
>  }
>  
> +# Skip running test if phobos was not built on the target.
> +if { ![is-effective-target d_runtime_has_std_library] } {
> +    return
> +}
> +
>  # Gather a list of all tests.
>  set tests [lsort [filter_libphobos_unittests [find $srcdir/../src "*.d"]]]
>  
> diff --git a/libphobos/testsuite/libphobos.phobos_shared/phobos_shared.exp 
> b/libphobos/testsuite/libphobos.phobos_shared/phobos_shared.exp
> index 43b9772d6f2..a00ecf11ac9 100644
> --- a/libphobos/testsuite/libphobos.phobos_shared/phobos_shared.exp
> +++ b/libphobos/testsuite/libphobos.phobos_shared/phobos_shared.exp
> @@ -19,6 +19,11 @@ if { ![isnative] || ![is-effective-target shared] } {
>      return
>  }
>  
> +# Skip running test if phobos was not built on the target.
> +if { ![is-effective-target d_runtime_has_std_library] } {
> +    return
> +}
> +
>  # Gather a list of all tests.
>  set tests [lsort [filter_libphobos_unittests [find $srcdir/../src "*.d"]]]

Reply via email to