On 6/9/11, Janis Johnson <[email protected]> wrote:
> On 06/08/2011 01:54 PM, Lawrence Crowl wrote:
>> On 6/6/11, Janis Johnson <[email protected]> wrote:
>>> On 06/03/2011 11:14 AM, Lawrence Crowl wrote:
>>>> The PPH project has tests that compile two different ways, and
>>>> then compare the assembly. If either of the compiles fails, the
>>>> comparison will fail. We'd like to simply not run the comparison.
>>>>
>>>> We currently have:
>>>>
>>>> set have_errs [llength [grep $test "{\[ \t\]\+dg-error\[\t\]\+.*\[
>>>> \t\]\+}"]]
>>>> # Compile the file the first time for a base case.
>>>> dg-test -keep-output $test "$options -I." ""
>>>>
>>>> if { $have_errs } {
>>>> verbose -log "regular compilation failed"
>>>> fail "$nshort $options, regular compilation failed"
>>>> return
>>>> }
>>>>
>>>> But that only stops subsequent actions when the test is known
>>>> a priori to have errors. How do we detect compilation errors,
>>>> so as to skip the remainder of the actions?
>>>
>>> Complicated GCC tests do this by using local procs instead of dg-runtest
>>> and dg-test. See, for example, gcc.dg/lto/lto.exp,
>>> gcc.dg/compat/compat.exp and gcc.dg/tree-prof/tree-prof.exp, which use
>>> lto.exp, compat.exp and profopt.exp from GCC's testsuite/lib. Those
>>> have scenarios in which further testing is skipped after a compile or
>>> link fails.
>>
>> So, I ended up changing the definition of fail from "reports test
>> failing" to "does not produce an assembly file". We really need
>> the latter for comparison, so it is the true measure. Once I made
>> that change in orientation, I was able to achieve what I wanted.
>>
>> The simple part is the regular compile.
>>
>> # Compile the file the first time for a base case.
>> set dg-do-what-default compile
>> dg-test -keep-output $test "$options -I." ""
>>
>> # Quit if it did not compile successfully.
>> if { ![file_on_host exists "$bname.s"] } {
>> # All regular compiles should pass.
>> fail "$nshort $options (regular assembly missing)"
>> return
>> }
>
> Don't use dg-test, use a new variant of it as is done with the lto,
> compat, and profopt tests. You'll have much more control that way
> and can better check the success of individual steps to decide what
> to do next.
I am having trouble identifying the variant. Does it have a name,
or is it inline code?
>> The complicated part is the compile we are comparing against, which
>> required knowing whether or not a compile failure is expected. For
>> that we grep for dg-xfail-if and the appropriate option.
>>
>> # Compile a second time using the pph files.
>> dg-test -keep-output $test "$options $mapflag -I." ""
>>
>> # Quit if it did not compile successfully.
>> if { ![file_on_host exists "$bname.s"] } {
>> # Expect assembly to be missing when the compile is an expected fail.
>> if { ![llength [grep $test "dg-xfail-if.*-fpph-map"]] } {
>> fail "$nshort $options (pph assembly missing)"
>> }
>> return
>> }
>
> Relying on the existence of dg-xfail-if won't work when an expected
> compilation failure starts working, or an unexpected one arises.
If the compilation starts working, I get an assembly file, and
continue to assembly comparisons. If the compilation fails,
but with a different error, then the other (typically dg-bogus)
directives should report the unexpected failure. In either case,
I think, I get proper notice. Am I missing something?
--
Lawrence Crowl