Opened 22 months ago

Last modified 8 months ago

#11495 new bug

TH_spliceE5_prof is failing with release candidate 8.0.1

Reported by: thomie Owned by:
Priority: normal Milestone: 8.4.1
Component: Compiler Version: 8.0.1-rc1
Keywords: Cc: simonmar
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:

Description (last modified by thomie)

TH_spliceE5_prof looks like this:

TH_spliceE5_prof::
	$(RM) TH_spliceE5_prof*.o TH_spliceE5_prof*.hi TH_spliceE5_prof*.dyn_o TH_spliceE5_prof*.dyn_hi TH_spliceE5_prof
	'$(TEST_HC)' $(TEST_HC_OPTS) $(HC_OPTS) $(ghcThWayFlags) --make -v0 TH_spliceE5_prof.hs -c
	'$(TEST_HC)' $(TEST_HC_OPTS) $(HC_OPTS) --make -v0 TH_spliceE5_prof.hs -prof -auto-all -osuf .p.o -o $@
	./$@

In 4905b83a2d448c65ccced385343d4e8124548a3b, Simon added that $(ghcThWayFlags) to the first compilation command. With a release compiler, ghcThWayFlags defaults to -dynamic. But compiling with -dynamic doesn't produce .dyn_o files (you need -dynamic-too for that, which is enabled by -XTemplateHaskell, but not when compiling with -dynamic), so the second compilation results in:

TH_spliceE5_prof.hs:8:17: fatal:
    cannot find object file ‘./TH_spliceE5_prof_Lib.dyn_o’
    while linking an interpreted expression
make[1]: *** [TH_spliceE5_prof] Error 1

*** unexpected failure for TH_spliceE5_prof(normal)

Not passing -dynamic fixes the test. But in the function failNonStd in compiler/ghci/Linker.hs Simon suggests that passing -dynamic is necessary:

    Cannot load -prof objects when GHC is built with -dynamic
    To fix this, either:
      (1) Use -fexternal-interprter, or
      (2) Build the program twice: once with -dynamic, and then
          with -prof using -osuf to set a different object file suffix.

Some ideas for a solution:

  • change that message to not mention -dynamic
  • always turn on -dynamic-too when -XTemplateHaskell is on, also when using -dynamic
  • find the place where .dyn_o is expected, and teach it that .o might also be ok.
  • make -fexternal-interpreter the default. Delete the test and a whole bunch of other stuff.

It's all such a mess.

Change History (7)

comment:1 Changed 22 months ago by thomie

Description: modified (diff)

comment:2 Changed 22 months ago by Thomas Miedema <thomasmiedema@…>

In eeb67c9b/ghc:

Testsuite: fixup req_profiling tests (#11496)

* T2552 (#10037) is failng for all threaded opt_ways, not for WAY=prof.
* TH_spliceE5_prof (#11495) is failing when ghc_dynamic
* Rename ghci_dynamic to ghc_dynamic. It's the same thing.

comment:3 Changed 22 months ago by simonmar

It's all such a mess.

Yup.

I guess we should not put -dynamic in ghcThWayFlags, because (a) it doesn't work with -prof and (b) It is sort-of handled magically by GHC turning on -dynamic-too when we need TH.

This crap is part of the reason I wanted to make -fexternal-interpreter.

comment:4 Changed 21 months ago by thomie

I guess we should not put -dynamic in ghcThWayFlags

That doesn't work in batch mode (edit: make test TEST='T7022b annth_compunits T2386 T7445 T2014' would fail).

Take this example:

A.hs:

{-# LANGUAGE TemplateHaskell #-}
module A where
import B
$(dec)

B.hs:

{-# LANGUAGE TemplateHaskell #-}
module B where
import Language.Haskell.TH
dec = [d| x = 1 |]

Result:

$ ghc -c B.hs
$ ghc -c A.hs
A.hs:1:1:
    cannot find normal object file ‘./B.dyn_o’
    while linking an interpreted expression

How about this: when compiling with -dynamic, create .dyn_o and .dyn_hi files by default instead of .o and .hi files. Is there any drawback to this? It would be more consistent with what -dynamic-too does as well.

-osuf and -hisuf could keep working as before.

Last edited 21 months ago by thomie (previous) (diff)

comment:5 Changed 21 months ago by simonmar

Would you also make -prof produce .p_o and .p_hi? This is quite a big change to make, and I suspect would break quite a lot of things (though I'm not sure exactly what).

comment:6 Changed 20 months ago by thoughtpolice

Milestone: 8.0.18.2.1

Punting to 8.2.1 (there's clearly more to discuss here that we don't have time for in the 8.x series).

comment:7 Changed 8 months ago by bgamari

Milestone: 8.2.18.4.1

Given that 8.2.1-rc1 is imminent, I'm bumping these off to the 8.4

Note: See TracTickets for help on using tickets.