This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH v2 9/13] D: D2 Testsuite Dejagnu files.


On 28 May 2017 at 23:16, Iain Buclaw <ibuclaw@gdcproject.org> wrote:
> This patch adds D language support to the GCC testsuite.
>
> As well as generating the DejaGNU options for compile and link tests,
> handles the conversion from DMD-style compiler options to GDC.
>
> ---

Added a few extra comments for procedures, altering dmd2dg to write
out flags converted to dejagnu in-place, instead on newlines.

In the other testsuite patch, added new tests to accompany fixes that
have been made since the last patch.

Regards
Iain.

---
diff --git a/gcc/testsuite/gdc.test/d_do_test.exp b/gcc/testsuite/gdc.test/d_do_test.exp
new file mode 100644
index 00000000000..7a9da72037e
--- /dev/null
+++ b/gcc/testsuite/gdc.test/d_do_test.exp
@@ -0,0 +1,385 @@
+#   Copyright (C) 2012-2017 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# Test using the DMD testsuite.
+# Load support procs.
+load_lib gdc-dg.exp
+
+#
+# Convert DMD arguments to GDC equivalent
+#
+
+proc gdc-convert-args { base args } {
+    set out ""
+
+    foreach arg [split [lindex $args 0] " "] {
+        # List of switches kept in ASCII collated order.
+        if { [regexp -- {^-I([\w+/-]+)} $arg pattern path] } {
+            lappend out "-I$base/$path"
+
+        } elseif { [regexp -- {^-J([\w+/-]+)} $arg pattern path] } {
+            lappend out "-J$base/$path"
+
+        } elseif [string match "-allinst" $arg] {
+            lappend out "-fall-instantiations"
+
+        } elseif { [string match "-boundscheck" $arg]
+                 || [string match "-boundscheck=on" $arg] } {
+            lappend out "-fbounds-check"
+
+        } elseif { [string match "-boundscheck=off" $arg]
+                   || [string match "-noboundscheck" $arg] } {
+            lappend out "-fno-bounds-check"
+
+        } elseif [string match "-boundscheck=safeonly" $arg] {
+            lappend out "-fbounds-check=safeonly"
+
+        } elseif [string match "-c" $arg] {
+            lappend out "-c"
+
+        } elseif [string match "-d" $arg] {
+            lappend out "-Wno-deprecated"
+
+        } elseif [string match "-de" $arg] {
+            lappend out "-Wdeprecated"
+            lappend out "-Werror"
+
+        } elseif [string match "-debug" $arg] {
+            lappend out "-fdebug"
+
+        } elseif [string match "-dip1000" $arg] {
+            lappend out "-ftransition=safe"
+
+        } elseif [string match "-dip25" $arg] {
+            lappend out "-ftransition=dip25"
+
+        } elseif [string match "-dw" $arg] {
+            lappend out "-Wdeprecated"
+            lappend out "-Wno-error"
+
+        } elseif [string match "-fPIC" $arg] {
+            lappend out "-fPIC"
+
+        } elseif { [string match "-g" $arg]
+                   || [string match "-gc" $arg] } {
+            lappend out "-g"
+
+        } elseif [string match "-inline" $arg] {
+            lappend out "-finline-functions"
+
+        } elseif [regexp -- {^-mv=([\w+=./-]+)} $arg pattern value] {
+            lappend out "-fmodule-filepath=$value"
+
+        } elseif [string match "-O" $arg] {
+            lappend out "-O2"
+
+        } elseif [string match "-property" $arg] {
+            lappend out "-fproperty"
+
+        } elseif [string match "-release" $arg] {
+            lappend out "-frelease"
+
+        } elseif [regexp -- {^-transition=(\w+)} $arg pattern value] {
+            lappend out "-ftransition=$value"
+
+        } elseif [string match "-unittest" $arg] {
+            lappend out "-funittest"
+
+        } elseif [string match "-verrors=spec" $arg] {
+            lappend out "-Wspeculative"
+
+        } elseif [regexp -- {^-verrors=(\d+)} $arg pattern num] {
+            lappend out "-fmax-errors=$num"
+
+        } elseif [regexp -- {^-version=(\w+)} $arg pattern value] {
+            lappend out "-fversion=$value"
+
+        } elseif [string match "-w" $arg] {
+            lappend out "-Wall"
+            lappend out "-Werror"
+
+        } elseif [string match "-wi" $arg] {
+            lappend out "-Wall"
+            lappend out "-Wno-error"
+
+        } else {
+            # print "Unhandled Argument: $arg"
+        }
+    }
+
+    return $out
+}
+
+proc gdc-copy-extra { base extra } {
+    # Split base, folder/file.
+    set type [file dirname $extra]
+
+    # print "Filename: $base - $extra"
+
+    set fdin [open $base/$extra r]
+    fconfigure $fdin -encoding binary
+
+    file mkdir $type
+    set fdout [open $extra w]
+    fconfigure $fdout -encoding binary
+
+    while { [gets $fdin copy_line] >= 0 } {
+        set out_line $copy_line
+        puts $fdout $out_line
+    }
+
+    close $fdin
+    close $fdout
+
+    return $extra
+}
+
+#
+# Translate DMD test directives to dejagnu equivalent.
+#
+#   COMPILE_SEPARATELY: Not handled.
+#   EXECUTE_ARGS:       Parameters to add to the execution of the test.
+#   EXTRA_SOURCES:      List of extra sources to build and link along with
+#                       the test.
+#   EXTRA_FILES:        List of extra files to copy for the test runs.
+#   PERMUTE_ARGS:       The set of arguments to permute in multiple compiler
+#                       invocations.  An empty set means only one permutation
+#                       with no arguments.
+#   TEST_OUTPUT:        The output expected from the compilation.
+#   POST_SCRIPT:        Not handled.
+#   REQUIRED_ARGS:      Arguments to add to the compiler command line.
+#   DISABLED:           Not handled.
+#
+
+proc dmd2dg { base test } {
+    global DEFAULT_DFLAGS
+    global PERMUTE_ARGS
+    global EXECUTE_ARGS
+
+    set PERMUTE_ARGS $DEFAULT_DFLAGS
+    set EXECUTE_ARGS ""
+
+    # Split base, folder/file.
+    set type [file dirname $test]
+
+    # print "Filename: $base - $test"
+
+    set fdin [open $base/$test r]
+    #fconfigure $fdin -encoding binary
+
+    file mkdir $type
+    set fdout [open $test w]
+    #fconfigure $fdout -encoding binary
+
+    while { [gets $fdin copy_line] >= 0 } {
+        set out_line $copy_line
+
+        if [regexp -- {COMPILE_SEPARATELY} $copy_line] {
+            # COMPILE_SEPARATELY is not handled.
+            regsub -- {COMPILE_SEPARATELY.*$} $copy_line "" out_line
+
+        } elseif [regexp -- {DISABLED} $copy_line] {
+            # DISABLED is not handled.
+            regsub -- {DISABLED.*$} $copy_line "" out_line
+
+        } elseif [regexp -- {POST_SCRIPT} $copy_line] {
+            # POST_SCRIPT is not handled
+            regsub -- {POST_SCRIPT.*$} $copy_line "" out_line
+
+        } elseif [regexp -- {PERMUTE_ARGS\s*:\s*(.*)} $copy_line match args] {
+            # PERMUTE_ARGS is handled by gdc-do-test.
+            set PERMUTE_ARGS [gdc-convert-args $base $args]
+            regsub -- {PERMUTE_ARGS.*$} $copy_line "" out_line
+
+        } elseif [regexp -- {EXECUTE_ARGS\s*:\s*(.*)} $copy_line match args] {
+            # EXECUTE_ARGS is handled by gdc_load.
+            foreach arg $args {
+                lappend EXECUTE_ARGS $arg
+            }
+            regsub -- {EXECUTE_ARGS.*$} $copy_line "" out_line
+
+        } elseif [regexp -- {REQUIRED_ARGS\s*:\s*(.*)} $copy_line match args] {
+            # Convert all listed arguments to from dmd to gdc-style.
+            set new_option "{ dg-additional-options \"[gdc-convert-args $base $args]\" }"
+            regsub -- {REQUIRED_ARGS.*$} $copy_line $new_option out_line
+
+        } elseif [regexp -- {EXTRA_SOURCES\s*:\s*(.*)} $copy_line match sources] {
+            # Copy all sources to the testsuite build directory.
+            foreach import $sources {
+                # print "Import: $base $type/$import"
+                gdc-copy-extra $base "$type/$import"
+            }
+            set new_option "{ dg-additional-sources \"$sources\" }"
+            regsub -- {EXTRA_SOURCES.*$} $copy_line $new_option out_line
+
+        } elseif [regexp -- {EXTRA_CPP_SOURCES\s*:\s*(.*)} $copy_line match sources] {
+            # Copy all sources to the testsuite build directory.
+            foreach import $sources {
+                # print "Import: $base $type/$import"
+                gdc-copy-extra $base "$type/$import"
+            }
+            set new_option "{ dg-additional-sources \"$sources\" }"
+            regsub -- {EXTRA_CPP_SOURCES.*$} $copy_line $new_option out_line
+
+        } elseif [regexp -- {EXTRA_FILES\s*:\s*(.*)} $copy_line match files] {
+            # Copy all sources to the testsuite build directory.
+            foreach import $files {
+                # print "Import: $base $type/$import"
+                gdc-copy-extra $base "$type/$import"
+            }
+            set new_option "{ dg-additional-files \"$files\" }"
+            regsub -- {EXTRA_FILES.*$} $copy_line $new_option out_line
+
+        }
+
+        puts $fdout $out_line
+    }
+
+    # Add specific options for test type
+
+    # DMD's testsuite is extremely verbose, compiler messages from constructs
+    # such as pragma(msg, ...) would otherwise cause tests to fail.
+    set out_line "// { dg-prune-output .* }"
+    puts $fdout $out_line
+
+    # Since GCC 6-20160131 blank lines are not allowed in the output by default.
+    dg-allow-blank-lines-in-output { 1 }
+
+    # Compilable files are successful if an output is generated.
+    # Fail compilable are successful if an output is not generated.
+    # Runnable must compile, link, and return 0 to be successful by default.
+    switch [file dirname $test] {
+        compilable {
+            set out_line "// { dg-final { output-exists } }"
+            puts $fdout $out_line
+        }
+
+        fail_compilation {
+            set out_line "// { dg-final { output-exists-not } }"
+            puts $fdout $out_line
+        }
+    }
+
+    close $fdin
+    close $fdout
+
+    return $test
+}
+
+proc gdc-permute-options { options } {
+    set result { }
+    set n [expr 1<<[llength $options]]
+    for { set i 0 } { $i<$n } { incr i } {
+        set option ""
+        for { set j 0 } { $j<[llength $options] } { incr j } {
+            if [expr $i & 1 << $j] {
+                append option [lindex $options $j]
+                append option " "
+            }
+        }
+        lappend result $option
+
+    }
+    return $result
+}
+
+
+proc gdc-do-test { } {
+    global TORTURE_OPTIONS
+    global SHARED_OPTION
+    global srcdir subdir
+    global dg-do-what-default
+    global verbose
+
+    # If a testcase doesn't have special options, use these.
+    global DEFAULT_DFLAGS
+    if ![info exists DEFAULT_DFLAGS] then {
+        set DEFAULT_DFLAGS "-g -O2 -frelease"
+        #set DEFAULT_DFLAGS "-O2"
+    }
+
+    # These are special options to use on testcase, and override DEFAULT_DFLAGS
+    global PERMUTE_ARGS
+
+    # Additional arguments for gdc_load
+    global EXECUTE_ARGS
+
+    # Initialize `dg'.
+    dg-init
+
+    # Main loop.
+
+    # set verbose 1
+    # set dg-final-code ""
+    # Find all tests and pass to routine.
+    foreach test [lsort [find $srcdir/$subdir *]] {
+        regexp -- "(.*)/(.+)/(.+)\.(.+)$" $test match base dir name ext
+
+        # Skip invalid test directory
+        if { [lsearch "runnable compilable fail_compilation" $dir] == -1 } {
+            continue
+        }
+
+        # Skip invalid test extensions
+        if { [lsearch "d" $ext] == -1 } {
+            continue
+        }
+        # Convert to DG test.
+        set imports [format "-I%s/%s" $base $dir]
+        set filename [dmd2dg $base $dir/$name.$ext]
+
+        if { $dir == "runnable" } {
+            append PERMUTE_ARGS " $SHARED_OPTION"
+        }
+        set options [gdc-permute-options $PERMUTE_ARGS]
+
+        switch $dir {
+            runnable {
+                for { set i 0 } { $i<[llength $options] } { incr i } {
+                    set TORTURE_OPTIONS [lindex $options $i]
+                    set dg-do-what-default "run"
+                    gdc-dg-runtest $filename $imports
+                }
+            }
+
+            compilable {
+                for { set i 0 } { $i<[llength $options] } { incr i } {
+                    set TORTURE_OPTIONS [lindex $options $i]
+                    set dg-do-what-default "assemble"
+                    gdc-dg-runtest $filename "$imports"
+                }
+            }
+
+            fail_compilation {
+                for { set i 0 } { $i<[llength $options] } { incr i } {
+                    set TORTURE_OPTIONS [lindex $options $i]
+                    set dg-do-what-default "assemble"
+                    #set dg-do-what-default "compile"
+                    gdc-dg-runtest $filename $imports
+                }
+            }
+        }
+
+        # Cleanup
+        #file delete $filename
+    }
+
+    # All done.
+    dg-finish
+}
+
+gdc-do-test
+
diff --git a/gcc/testsuite/lib/gdc-dg.exp b/gcc/testsuite/lib/gdc-dg.exp
new file mode 100644
index 00000000000..66a3cb2e8a1
--- /dev/null
+++ b/gcc/testsuite/lib/gdc-dg.exp
@@ -0,0 +1,85 @@
+#   Copyright (C) 2012-2017 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+load_lib gcc-dg.exp
+
+# Define gdc callbacks for dg.exp.
+
+proc gdc-dg-test { prog do_what extra_tool_flags } {
+    set result \
+        [gcc-dg-test-1 gdc_target_compile $prog $do_what $extra_tool_flags]
+    
+    set comp_output [lindex $result 0]
+    set output_file [lindex $result 1]
+
+    return [list $comp_output $output_file]
+}
+
+proc gdc-dg-prune { system text } {
+    return [gcc-dg-prune $system $text]
+}
+
+# Utility routines.
+
+#
+# Modified dg-runtest that can cycle through a list of optimization options
+# as c-torture does.
+#
+
+proc gdc-dg-runtest { testcases default-extra-flags } {
+    global runtests
+    global TORTURE_OPTIONS
+
+    foreach test $testcases {
+        # If we're only testing specific files and this isn't one of
+        # them, skip it.
+        if ![runtest_file_p $runtests $test] {
+            continue
+        }
+
+        if [expr [search_for $test "dg-do run"]] {
+            set flags ""
+        } else {
+            set flags $TORTURE_OPTIONS
+        }
+
+        # Use dg-options if specified
+        #dg-options
+
+        set nshort [file tail [file dirname $test]]/[file tail $test]
+        verbose "Testing $nshort, $TORTURE_OPTIONS" 1
+        dg-test $test $TORTURE_OPTIONS ${default-extra-flags}
+    }
+}
+
+#
+# gdc_load -- wrapper around default gdc_load to handle tests that
+# require program arguments passed to them.
+#
+
+if { [info procs gdc_load] != [list] \
+      && [info procs prev_gdc_load] == [list] } {
+    rename gdc_load prev_gdc_load
+
+    proc gdc_load { program args } {
+        global EXECUTE_ARGS
+        set args [concat "{$EXECUTE_ARGS}"]
+        #print "Running: $program [lindex $args 0]"
+        set result [eval [list prev_gdc_load $program] $args ] 
+        return $result
+    }
+}
+
diff --git a/gcc/testsuite/lib/gdc.exp b/gcc/testsuite/lib/gdc.exp
new file mode 100644
index 00000000000..66a6c42dc47
--- /dev/null
+++ b/gcc/testsuite/lib/gdc.exp
@@ -0,0 +1,274 @@
+# Copyright (C) 2012-2017 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+#
+# gdc support library routines
+#
+
+load_lib prune.exp
+load_lib gcc-defs.exp
+load_lib timeout.exp
+load_lib target-libpath.exp
+
+#
+# GDC_UNDER_TEST is the compiler under test.
+#
+
+set gdc_compile_options ""
+
+
+#
+# gdc_version -- extract and print the version number of the compiler
+#
+
+proc gdc_version { } {
+    global GDC_UNDER_TEST
+    
+    gdc_init
+
+    # ignore any arguments after the command
+    set compiler [lindex $GDC_UNDER_TEST 0]
+    
+    # verify that the compiler exists
+    if { [is_remote host] || [which $compiler] != 0 } then {
+        set tmp [remote_exec host "$compiler -v"]
+        set status [lindex $tmp 0]
+        set output [lindex $tmp 1]
+        regexp " version \[^\n\r\]*" $output version
+        if { $status == 0 && [info exists version] } then {
+            if [is_remote host] {
+                clone_output "$compiler $version\n"
+            } else {
+                clone_output "[which $compiler] $version\n"
+            }
+        } else {
+            clone_output "Couldn't determine version of [which $compiler]\n"
+        }
+    } else {
+        # compiler does not exist (this should have already been detected)
+        warning "$compiler does not exist"
+    }
+}
+
+#
+# gdc_include_flags -- include flags for the gcc tree structure
+#
+
+proc gdc_include_flags { paths } {
+    global srcdir
+    global TESTING_IN_BUILD_TREE
+
+    set flags ""
+
+    if { [is_remote host] || ![info exists TESTING_IN_BUILD_TREE] } {
+        return "${flags}"
+    }
+
+    set gccpath ${paths}
+    set target [file tail [file normalize ${paths}]]
+
+    if { $gccpath != "" } {
+        if [file exists "${gccpath}/libphobos/libdruntime"] {
+            append flags "-I${gccpath}/libphobos/libdruntime "
+        }
+    }
+    append flags "-I${srcdir}/../../libphobos/libdruntime "
+    append flags "-I${srcdir}/../../libphobos/src "
+
+    # For the tests that mix C++ and D, we should try and handle this better.
+    if { $gccpath != "" } {
+        if [file exists "${gccpath}/libstdc++-v3/include"] {
+            append flags "-I${gccpath}/libstdc++-v3/include "
+            append flags "-I${gccpath}/libstdc++-v3/include/$target "
+        }
+    }
+    append flags "-I${srcdir}/../../libstdc++-v3/libsupc++"
+}
+
+#
+# gdc_link_flags -- linker flags for the gcc tree structure
+#
+
+proc gdc_link_flags { paths } {
+    global srcdir
+    global ld_library_path
+    global GDC_UNDER_TEST
+    global shlib_ext
+    global SHARED_OPTION
+
+    set gccpath ${paths}
+    set libio_dir ""
+    set flags ""
+    set ld_library_path "."
+    set shlib_ext [get_shlib_extension]
+    set SHARED_OPTION ""
+    verbose "shared lib extension: $shlib_ext"
+
+    if { $gccpath != "" } {
+      if { [file exists "${gccpath}/libphobos/src/.libs/libgphobos.a"] \
+           || [file exists "${gccpath}/libphobos/src/.libs/libgphobos.${shlib_ext}"] } {
+          append flags "-L${gccpath}/libphobos/src/.libs -B${gccpath}/libphobos/src "
+          append ld_library_path ":${gccpath}/libphobos/src/.libs"
+      }
+      if { [file exists "${gccpath}/libphobos/libdruntime/.libs/libgdruntime.a"] \
+           || [file exists "${gccpath}/libphobos/libdruntime/.libs/libgdruntime.${shlib_ext}"] } {
+          append flags "-L${gccpath}/libphobos/libdruntime/.libs "
+          append ld_library_path ":${gccpath}/libphobos/libdruntime/.libs"
+      }
+      # Static linking is default. If only the shared lib is available adjust
+      # flags to always use it. If both are available, set SHARED_OPTION which
+      # will be added to PERMUTE_ARGS
+      if { [file exists "${gccpath}/libphobos/libdruntime/.libs/libgdruntime.${shlib_ext}"] } {
+          if { [file exists "${gccpath}/libphobos/libdruntime/.libs/libgdruntime.a"] } {
+              set SHARED_OPTION "-shared-libphobos"
+          } else {
+              append flags "-shared-libphobos "
+          }
+      }
+      if [file exists "${gccpath}/libiberty/libiberty.a"] {
+          append flags "-L${gccpath}/libiberty "
+      }
+      # For the tests that mix C++ and D, we should try and handle this better.
+      if { [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"] \
+           || [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.${shlib_ext}"] } {
+          append flags "-L${gccpath}/libstdc++-v3/src/.libs "
+          append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
+      }
+      append ld_library_path [gcc-set-multilib-library-path $GDC_UNDER_TEST]
+    } else {
+      global tool_root_dir
+
+      set libphobos [lookfor_file ${tool_root_dir} libgphobos]
+      if { $libphobos != "" } {
+          append flags "-L${libphobos} "
+          append ld_library_path ":${libphobos}"
+      }
+      set libdruntime [lookfor_file ${tool_root_dir} libgdruntime]
+      if { $libdruntime != "" } {
+          append flags "-L${libdruntime} "
+          append ld_library_path ":${libdruntime}"
+      }
+      set libiberty [lookfor_file ${tool_root_dir} libiberty]
+      if { $libiberty != "" } {
+          append flags "-L${libiberty} "
+      }
+    }
+
+    set_ld_library_path_env_vars
+
+    return "$flags"
+}
+
+#
+# gdc_init -- called at the start of each subdir of tests
+#
+
+proc gdc_init { args } {
+    global subdir
+    global gdc_initialized
+    global base_dir
+    global tmpdir
+    global libdir
+    global gluefile wrap_flags
+    global objdir srcdir
+    global ALWAYS_DFLAGS
+    global TOOL_EXECUTABLE TOOL_OPTIONS
+    global GDC_UNDER_TEST
+    global TESTING_IN_BUILD_TREE
+    global TEST_ALWAYS_FLAGS
+
+    # We set LC_ALL and LANG to C so that we get the same error messages as expected.
+    setenv LC_ALL C
+    setenv LANG C
+
+    if ![info exists GDC_UNDER_TEST] then {
+        if [info exists TOOL_EXECUTABLE] {
+            set GDC_UNDER_TEST $TOOL_EXECUTABLE
+        } else {
+            if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
+                set GDC_UNDER_TEST [transform gdc]
+            } else {
+                set GDC_UNDER_TEST [findfile $base_dir/../../gdc "$base_dir/../../gdc -B$base_dir/../../" [findfile $base_dir/gdc "$base_dir/gdc -B$base_dir/" [transform gdc]]]
+            }
+        }
+    }
+
+    if ![is_remote host] {
+        if { [which $GDC_UNDER_TEST] == 0 } then {
+            perror "GDC_UNDER_TEST ($GDC_UNDER_TEST) does not exist"
+            exit 1
+        }
+    }
+    if ![info exists tmpdir] {
+        set tmpdir "/tmp"
+    }
+
+    if [info exists gluefile] {
+        unset gluefile
+    }
+
+    gdc_maybe_build_wrapper "${tmpdir}/d-testglue.o"
+
+    set ALWAYS_DFLAGS ""
+
+    # TEST_ALWAYS_FLAGS are flags that should be passed to every
+    # compilation.  They are passed first to allow individual
+    # tests to override them.
+    if [info exists TEST_ALWAYS_FLAGS] {
+        lappend ALWAYS_DFLAGS "additional_flags=$TEST_ALWAYS_FLAGS"
+    }
+
+    if ![is_remote host] {
+        if [info exists TOOL_OPTIONS] {
+            lappend ALWAYS_DFLAGS "additional_flags=[gdc_include_flags [get_multilibs ${TOOL_OPTIONS}] ]"
+            lappend ALWAYS_DFLAGS "ldflags=[gdc_link_flags [get_multilibs ${TOOL_OPTIONS}] ]"
+        } else {
+            lappend ALWAYS_DFLAGS "additional_flags=[gdc_include_flags [get_multilibs] ]"
+            lappend ALWAYS_DFLAGS "ldflags=[gdc_link_flags [get_multilibs] ]"
+        }
+    }
+
+    if [info exists TOOL_OPTIONS] {
+        lappend ALWAYS_DFLAGS "additional_flags=$TOOL_OPTIONS"
+    }
+
+    verbose -log "ALWAYS_DFLAGS set to $ALWAYS_DFLAGS"
+
+    verbose "gdc is initialized" 3
+}
+
+#
+# gdc_target_compile -- compile a source file
+#
+
+proc gdc_target_compile { source dest type options } {
+    global tmpdir
+    global gluefile wrap_flags
+    global ALWAYS_DFLAGS
+    global GDC_UNDER_TEST
+
+    if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
+        lappend options "libs=${gluefile}"
+        lappend options "ldflags=${wrap_flags}"
+    }
+
+    lappend options "timeout=[timeout_value]"
+    lappend options "compiler=$GDC_UNDER_TEST"
+
+    set options [concat "$ALWAYS_DFLAGS" $options]
+    set options [dg-additional-files-options $options $source]
+    return [target_compile $source $dest $type $options]
+}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]