summaryrefslogtreecommitdiff
path: root/gcc/testsuite/lib/dg-pch.exp
blob: 7efbdb50e71c18bdcd7fbfe44d02618cae4cbb9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# Copyright (C) 2003-2014 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 copy-file.exp

proc pch-init { args } {
    global pch_unsupported_debug pch_unsupported

    if [info exists pch_unsupported_debug] {
	error "pch-init: pch_unsupported_debug is not empty as expected"
    }
    if [info exists pch_unsupported] {
	error "pch-init: pch_unsupported is not empty as expected"
    }

    set result [check_compile pchtest object "int i;" "-g -x c-header"]
    set pch_unsupported_debug \
	[regexp "debug format cannot be used with pre-compiled headers" \
		[lindex $result 0]]

    set pch_unsupported 0
    if { $pch_unsupported_debug } {
	verbose -log "pch is unsupported with the debug info format"

	set result [check_compile pchtest object "int i;" "-x c-header"]
	    set pch_unsupported \
		[regexp "debug format cannot be used with pre-compiled headers" \
			[lindex $result 0]]
    }
}

proc pch-finish { args } {
    global pch_unsupported_debug pch_unsupported
    unset pch_unsupported_debug
    unset pch_unsupported
}

proc check_effective_target_pch_supported_debug { } {
    global pch_unsupported_debug
    if { $pch_unsupported_debug } {
	return 0
    }
    return 1
}

proc dg-flags-pch { subdir test otherflags options suffix } {
    global runtests dg-do-what-default
    global pch_unsupported_debug pch_unsupported

    # If we're only testing specific files and this isn't one of them, skip it.
    if ![runtest_file_p $runtests $test] {
	return
    }

    if { [istarget "powerpc-ibm-aix*"] } {
	set torture_execute_xfail "powerpc-ibm-aix*"
	return
    }

    set nshort "$subdir/[file tail $test]"
    set bname "[file rootname [file tail $nshort]]"

    catch { file_on_host delete "$bname$suffix.gch" }
    catch { file_on_host delete "$bname.s" }
    catch { file_on_host delete "$bname.s-gch" }

    # We don't try to use the loop-optimizing options, since they are highly
    # unlikely to make any difference to PCH.
    foreach flags $options {
	verbose "Testing $nshort, $otherflags $flags" 1

	if { $pch_unsupported != 0 \
	     || ( $pch_unsupported_debug != 0 && [regexp " -g" " $flags"] ) } {
	    verbose -log "$nshort unsupported because debug format conflicts with PCH"
	    unsupported "$nshort $flags"
	    continue
	}

	# For the header files, the default is to precompile.
	set dg-do-what-default precompile
	catch { file_on_host delete "$bname$suffix" }
	gcc_copy_files "[file rootname $test]${suffix}s" "$bname$suffix"
	dg-test -keep-output "./$bname$suffix" "$otherflags $flags" ""

	# For the rest, the default is to compile to .s.
	set dg-do-what-default compile

	set have_errs [llength [grep $test "{\[ \t\]\+dg-error\[ \t\]\+.*\[ \t\]\+}"]]

	if { [ file_on_host exists "$bname$suffix.gch" ] } {
	    # Ensure that the PCH file is used, not the original header.
	    file_on_host delete "$bname$suffix"

	    # The flags "-Dwith_PCH" and "-Dwithout_PCH" are to distinguish the
	    # two compiles in test summary lines.
	    dg-test -keep-output $test "$otherflags $flags -I. -Dwith_PCH" ""
	    file_on_host delete "$bname$suffix.gch"
	    if { !$have_errs } {
		if { [ file_on_host exists "$bname.s" ] } {
		    remote_upload host "$bname.s" "$bname.s-gch"
		    remote_download host "$bname.s-gch"
		    gcc_copy_files "[file rootname $test]${suffix}s" "$bname$suffix"
		    dg-test -keep-output $test "$otherflags $flags -I. -Dwithout_PCH" ""
		    remote_upload host "$bname.s"
		    set tmp [ diff "$bname.s" "$bname.s-gch" ]
		    if { $tmp == 0 } {
			verbose -log "assembly file '$bname.s', '$bname.s-gch' comparison error"
			fail "$nshort $otherflags $flags assembly comparison"
		    } elseif { $tmp == 1 } {
			pass "$nshort $otherflags $flags assembly comparison"
		    } else {
			fail "$nshort $otherflags $flags assembly comparison"
		    }
		    file_on_host delete "$bname$suffix"
		    file_on_host delete "$bname.s"
		    file_on_host delete "$bname.s-gch"
		} else {
		    verbose -log "assembly file '$bname.s' missing"
 		    fail "$nshort $flags assembly comparison"
		}
	    }
	} elseif { $pch_unsupported_debug == 0 \
		   || [llength [grep $test "{\[ \t\]\+dg-require-effective-target\[ \t\]\+pch_supported_debug\[ \t\]\+.*\[ \t\]\+}"]] > 0 } {
	    verbose -log "pch file '$bname$suffix.gch' missing"
	    fail "$nshort $flags"
	    if { !$have_errs } {
		verbose -log "assembly file '$bname.s' missing" 1
		fail "$nshort $flags assembly comparison"
	    }
	}
    }
}

proc dg-pch { subdir test options suffix } {
  return [dg-flags-pch $subdir $test "" $options $suffix]
}