Matthew Pickering pushed to branch wip/gdc-files at Glasgow Haskell Compiler / GHC
Commits:
-
39d7bac3
by Matthew Pickering at 2025-08-13T14:18:05+01:00
-
5fb137ef
by Matthew Pickering at 2025-08-14T14:53:22+01:00
10 changed files:
- compiler/GHC.hs
- compiler/GHC/Driver/Backend.hs
- compiler/GHC/Driver/Backend/Internal.hs
- compiler/GHC/Driver/Downsweep.hs
- compiler/GHC/Driver/Main.hs
- compiler/GHC/Driver/Pipeline.hs
- compiler/GHC/Driver/Session.hs
- docs/users_guide/phases.rst
- docs/users_guide/separate_compilation.rst
- ghc/Main.hs
Changes:
| ... | ... | @@ -30,7 +30,7 @@ module GHC ( |
| 30 | 30 | |
| 31 | 31 | -- * Flags and settings
|
| 32 | 32 | DynFlags(..), GeneralFlag(..), Severity(..), Backend, gopt,
|
| 33 | - ncgBackend, llvmBackend, viaCBackend, interpreterBackend, noBackend,
|
|
| 33 | + ncgBackend, llvmBackend, viaCBackend, bytecodeBackend, noBackend,
|
|
| 34 | 34 | GhcMode(..), GhcLink(..),
|
| 35 | 35 | parseDynamicFlags, parseTargetFiles,
|
| 36 | 36 | getSessionDynFlags,
|
| ... | ... | @@ -47,7 +47,7 @@ module GHC.Driver.Backend |
| 47 | 47 | , llvmBackend
|
| 48 | 48 | , jsBackend
|
| 49 | 49 | , viaCBackend
|
| 50 | - , interpreterBackend
|
|
| 50 | + , bytecodeBackend
|
|
| 51 | 51 | , noBackend
|
| 52 | 52 | , allBackends
|
| 53 | 53 | |
| ... | ... | @@ -252,7 +252,7 @@ instance Show Backend where |
| 252 | 252 | show = backendDescription
|
| 253 | 253 | |
| 254 | 254 | |
| 255 | -ncgBackend, llvmBackend, viaCBackend, interpreterBackend, jsBackend, noBackend
|
|
| 255 | +ncgBackend, llvmBackend, viaCBackend, bytecodeBackend, jsBackend, noBackend
|
|
| 256 | 256 | :: Backend
|
| 257 | 257 | |
| 258 | 258 | -- | The native code generator.
|
| ... | ... | @@ -310,7 +310,7 @@ viaCBackend = Named ViaC |
| 310 | 310 | -- (foreign primops).
|
| 311 | 311 | --
|
| 312 | 312 | -- See "GHC.StgToByteCode"
|
| 313 | -interpreterBackend = Named Interpreter
|
|
| 313 | +bytecodeBackend = Named Bytecode
|
|
| 314 | 314 | |
| 315 | 315 | -- | A dummy back end that generates no code.
|
| 316 | 316 | --
|
| ... | ... | @@ -419,7 +419,7 @@ backendDescription (Named NCG) = "native code generator" |
| 419 | 419 | backendDescription (Named LLVM) = "LLVM"
|
| 420 | 420 | backendDescription (Named ViaC) = "compiling via C"
|
| 421 | 421 | backendDescription (Named JavaScript) = "compiling to JavaScript"
|
| 422 | -backendDescription (Named Interpreter) = "byte-code interpreter"
|
|
| 422 | +backendDescription (Named Bytecode) = "byte-code interpreter"
|
|
| 423 | 423 | backendDescription (Named NoBackend) = "no code generated"
|
| 424 | 424 | |
| 425 | 425 | -- | This flag tells the compiler driver whether the back
|
| ... | ... | @@ -431,7 +431,7 @@ backendWritesFiles (Named NCG) = True |
| 431 | 431 | backendWritesFiles (Named LLVM) = True
|
| 432 | 432 | backendWritesFiles (Named ViaC) = True
|
| 433 | 433 | backendWritesFiles (Named JavaScript) = True
|
| 434 | -backendWritesFiles (Named Interpreter) = False
|
|
| 434 | +backendWritesFiles (Named Bytecode) = False
|
|
| 435 | 435 | backendWritesFiles (Named NoBackend) = False
|
| 436 | 436 | |
| 437 | 437 | -- | When the back end does write files, this value tells
|
| ... | ... | @@ -442,7 +442,7 @@ backendPipelineOutput (Named NCG) = Persistent |
| 442 | 442 | backendPipelineOutput (Named LLVM) = Persistent
|
| 443 | 443 | backendPipelineOutput (Named ViaC) = Persistent
|
| 444 | 444 | backendPipelineOutput (Named JavaScript) = Persistent
|
| 445 | -backendPipelineOutput (Named Interpreter) = NoOutputFile
|
|
| 445 | +backendPipelineOutput (Named Bytecode) = NoOutputFile
|
|
| 446 | 446 | backendPipelineOutput (Named NoBackend) = NoOutputFile
|
| 447 | 447 | |
| 448 | 448 | -- | This flag tells the driver whether the back end can
|
| ... | ... | @@ -453,7 +453,7 @@ backendCanReuseLoadedCode (Named NCG) = False |
| 453 | 453 | backendCanReuseLoadedCode (Named LLVM) = False
|
| 454 | 454 | backendCanReuseLoadedCode (Named ViaC) = False
|
| 455 | 455 | backendCanReuseLoadedCode (Named JavaScript) = False
|
| 456 | -backendCanReuseLoadedCode (Named Interpreter) = True
|
|
| 456 | +backendCanReuseLoadedCode (Named Bytecode) = True
|
|
| 457 | 457 | backendCanReuseLoadedCode (Named NoBackend) = False
|
| 458 | 458 | |
| 459 | 459 | -- | It is is true of every back end except @-fno-code@
|
| ... | ... | @@ -478,7 +478,7 @@ backendGeneratesCode (Named NCG) = True |
| 478 | 478 | backendGeneratesCode (Named LLVM) = True
|
| 479 | 479 | backendGeneratesCode (Named ViaC) = True
|
| 480 | 480 | backendGeneratesCode (Named JavaScript) = True
|
| 481 | -backendGeneratesCode (Named Interpreter) = True
|
|
| 481 | +backendGeneratesCode (Named Bytecode) = True
|
|
| 482 | 482 | backendGeneratesCode (Named NoBackend) = False
|
| 483 | 483 | |
| 484 | 484 | backendGeneratesCodeForHsBoot :: Backend -> Bool
|
| ... | ... | @@ -486,7 +486,7 @@ backendGeneratesCodeForHsBoot (Named NCG) = True |
| 486 | 486 | backendGeneratesCodeForHsBoot (Named LLVM) = True
|
| 487 | 487 | backendGeneratesCodeForHsBoot (Named ViaC) = True
|
| 488 | 488 | backendGeneratesCodeForHsBoot (Named JavaScript) = True
|
| 489 | -backendGeneratesCodeForHsBoot (Named Interpreter) = False
|
|
| 489 | +backendGeneratesCodeForHsBoot (Named Bytecode) = False
|
|
| 490 | 490 | backendGeneratesCodeForHsBoot (Named NoBackend) = False
|
| 491 | 491 | |
| 492 | 492 | -- | When set, this flag turns on interface writing for
|
| ... | ... | @@ -498,7 +498,7 @@ backendSupportsInterfaceWriting (Named NCG) = True |
| 498 | 498 | backendSupportsInterfaceWriting (Named LLVM) = True
|
| 499 | 499 | backendSupportsInterfaceWriting (Named ViaC) = True
|
| 500 | 500 | backendSupportsInterfaceWriting (Named JavaScript) = True
|
| 501 | -backendSupportsInterfaceWriting (Named Interpreter) = True
|
|
| 501 | +backendSupportsInterfaceWriting (Named Bytecode) = True
|
|
| 502 | 502 | backendSupportsInterfaceWriting (Named NoBackend) = False
|
| 503 | 503 | |
| 504 | 504 | -- | When preparing code for this back end, the type
|
| ... | ... | @@ -510,7 +510,7 @@ backendRespectsSpecialise (Named NCG) = True |
| 510 | 510 | backendRespectsSpecialise (Named LLVM) = True
|
| 511 | 511 | backendRespectsSpecialise (Named ViaC) = True
|
| 512 | 512 | backendRespectsSpecialise (Named JavaScript) = True
|
| 513 | -backendRespectsSpecialise (Named Interpreter) = False
|
|
| 513 | +backendRespectsSpecialise (Named Bytecode) = False
|
|
| 514 | 514 | backendRespectsSpecialise (Named NoBackend) = False
|
| 515 | 515 | |
| 516 | 516 | -- | This back end wants the `mi_top_env` field of a
|
| ... | ... | @@ -522,7 +522,7 @@ backendWantsGlobalBindings (Named LLVM) = False |
| 522 | 522 | backendWantsGlobalBindings (Named ViaC) = False
|
| 523 | 523 | backendWantsGlobalBindings (Named JavaScript) = False
|
| 524 | 524 | backendWantsGlobalBindings (Named NoBackend) = False
|
| 525 | -backendWantsGlobalBindings (Named Interpreter) = True
|
|
| 525 | +backendWantsGlobalBindings (Named Bytecode) = True
|
|
| 526 | 526 | |
| 527 | 527 | -- | The back end targets a technology that implements
|
| 528 | 528 | -- `switch` natively. (For example, LLVM or C.) Therefore
|
| ... | ... | @@ -534,7 +534,7 @@ backendHasNativeSwitch (Named NCG) = False |
| 534 | 534 | backendHasNativeSwitch (Named LLVM) = True
|
| 535 | 535 | backendHasNativeSwitch (Named ViaC) = True
|
| 536 | 536 | backendHasNativeSwitch (Named JavaScript) = True
|
| 537 | -backendHasNativeSwitch (Named Interpreter) = False
|
|
| 537 | +backendHasNativeSwitch (Named Bytecode) = False
|
|
| 538 | 538 | backendHasNativeSwitch (Named NoBackend) = False
|
| 539 | 539 | |
| 540 | 540 | -- | As noted in the documentation for
|
| ... | ... | @@ -548,7 +548,7 @@ backendPrimitiveImplementation (Named NCG) = NcgPrimitives |
| 548 | 548 | backendPrimitiveImplementation (Named LLVM) = LlvmPrimitives
|
| 549 | 549 | backendPrimitiveImplementation (Named JavaScript) = JSPrimitives
|
| 550 | 550 | backendPrimitiveImplementation (Named ViaC) = GenericPrimitives
|
| 551 | -backendPrimitiveImplementation (Named Interpreter) = GenericPrimitives
|
|
| 551 | +backendPrimitiveImplementation (Named Bytecode) = GenericPrimitives
|
|
| 552 | 552 | backendPrimitiveImplementation (Named NoBackend) = GenericPrimitives
|
| 553 | 553 | |
| 554 | 554 | -- | When this value is `IsValid`, the back end is
|
| ... | ... | @@ -560,7 +560,7 @@ backendSimdValidity (Named NCG) = IsValid |
| 560 | 560 | backendSimdValidity (Named LLVM) = IsValid
|
| 561 | 561 | backendSimdValidity (Named ViaC) = NotValid $ unlines ["SIMD vector instructions require using the NCG or the LLVM backend."]
|
| 562 | 562 | backendSimdValidity (Named JavaScript) = NotValid $ unlines ["SIMD vector instructions require using the NCG or the LLVM backend."]
|
| 563 | -backendSimdValidity (Named Interpreter) = NotValid $ unlines ["SIMD vector instructions require using the NCG or the LLVM backend."]
|
|
| 563 | +backendSimdValidity (Named Bytecode) = NotValid $ unlines ["SIMD vector instructions require using the NCG or the LLVM backend."]
|
|
| 564 | 564 | backendSimdValidity (Named NoBackend) = NotValid $ unlines ["SIMD vector instructions require using the NCG or the LLVM backend."]
|
| 565 | 565 | |
| 566 | 566 | -- | This flag says whether the back end supports large
|
| ... | ... | @@ -571,7 +571,7 @@ backendSupportsEmbeddedBlobs (Named NCG) = True |
| 571 | 571 | backendSupportsEmbeddedBlobs (Named LLVM) = False
|
| 572 | 572 | backendSupportsEmbeddedBlobs (Named ViaC) = False
|
| 573 | 573 | backendSupportsEmbeddedBlobs (Named JavaScript) = False
|
| 574 | -backendSupportsEmbeddedBlobs (Named Interpreter) = False
|
|
| 574 | +backendSupportsEmbeddedBlobs (Named Bytecode) = False
|
|
| 575 | 575 | backendSupportsEmbeddedBlobs (Named NoBackend) = False
|
| 576 | 576 | |
| 577 | 577 | -- | This flag tells the compiler driver that the back end
|
| ... | ... | @@ -586,7 +586,7 @@ backendNeedsPlatformNcgSupport (Named NCG) = True |
| 586 | 586 | backendNeedsPlatformNcgSupport (Named LLVM) = False
|
| 587 | 587 | backendNeedsPlatformNcgSupport (Named ViaC) = False
|
| 588 | 588 | backendNeedsPlatformNcgSupport (Named JavaScript) = False
|
| 589 | -backendNeedsPlatformNcgSupport (Named Interpreter) = False
|
|
| 589 | +backendNeedsPlatformNcgSupport (Named Bytecode) = False
|
|
| 590 | 590 | backendNeedsPlatformNcgSupport (Named NoBackend) = False
|
| 591 | 591 | |
| 592 | 592 | -- | This flag is set if the back end can generate code
|
| ... | ... | @@ -598,7 +598,7 @@ backendSupportsUnsplitProcPoints (Named NCG) = True |
| 598 | 598 | backendSupportsUnsplitProcPoints (Named LLVM) = False
|
| 599 | 599 | backendSupportsUnsplitProcPoints (Named ViaC) = False
|
| 600 | 600 | backendSupportsUnsplitProcPoints (Named JavaScript) = False
|
| 601 | -backendSupportsUnsplitProcPoints (Named Interpreter) = False
|
|
| 601 | +backendSupportsUnsplitProcPoints (Named Bytecode) = False
|
|
| 602 | 602 | backendSupportsUnsplitProcPoints (Named NoBackend) = False
|
| 603 | 603 | |
| 604 | 604 | -- | This flag guides the driver in resolving issues about
|
| ... | ... | @@ -616,7 +616,7 @@ backendSwappableWithViaC (Named NCG) = True |
| 616 | 616 | backendSwappableWithViaC (Named LLVM) = True
|
| 617 | 617 | backendSwappableWithViaC (Named ViaC) = False
|
| 618 | 618 | backendSwappableWithViaC (Named JavaScript) = False
|
| 619 | -backendSwappableWithViaC (Named Interpreter) = False
|
|
| 619 | +backendSwappableWithViaC (Named Bytecode) = False
|
|
| 620 | 620 | backendSwappableWithViaC (Named NoBackend) = False
|
| 621 | 621 | |
| 622 | 622 | -- | This flag is true if the back end works *only* with
|
| ... | ... | @@ -626,7 +626,7 @@ backendUnregisterisedAbiOnly (Named NCG) = False |
| 626 | 626 | backendUnregisterisedAbiOnly (Named LLVM) = False
|
| 627 | 627 | backendUnregisterisedAbiOnly (Named ViaC) = True
|
| 628 | 628 | backendUnregisterisedAbiOnly (Named JavaScript) = False
|
| 629 | -backendUnregisterisedAbiOnly (Named Interpreter) = False
|
|
| 629 | +backendUnregisterisedAbiOnly (Named Bytecode) = False
|
|
| 630 | 630 | backendUnregisterisedAbiOnly (Named NoBackend) = False
|
| 631 | 631 | |
| 632 | 632 | -- | This flag is set if the back end generates C code in
|
| ... | ... | @@ -637,7 +637,7 @@ backendGeneratesHc (Named NCG) = False |
| 637 | 637 | backendGeneratesHc (Named LLVM) = False
|
| 638 | 638 | backendGeneratesHc (Named ViaC) = True
|
| 639 | 639 | backendGeneratesHc (Named JavaScript) = False
|
| 640 | -backendGeneratesHc (Named Interpreter) = False
|
|
| 640 | +backendGeneratesHc (Named Bytecode) = False
|
|
| 641 | 641 | backendGeneratesHc (Named NoBackend) = False
|
| 642 | 642 | |
| 643 | 643 | -- | This flag says whether SPT (static pointer table)
|
| ... | ... | @@ -649,7 +649,7 @@ backendSptIsDynamic (Named NCG) = False |
| 649 | 649 | backendSptIsDynamic (Named LLVM) = False
|
| 650 | 650 | backendSptIsDynamic (Named ViaC) = False
|
| 651 | 651 | backendSptIsDynamic (Named JavaScript) = False
|
| 652 | -backendSptIsDynamic (Named Interpreter) = True
|
|
| 652 | +backendSptIsDynamic (Named Bytecode) = True
|
|
| 653 | 653 | backendSptIsDynamic (Named NoBackend) = False
|
| 654 | 654 | |
| 655 | 655 | -- | If this flag is unset, then the driver ignores the flag @-fbreak-points@,
|
| ... | ... | @@ -660,7 +660,7 @@ backendSupportsBreakpoints = \case |
| 660 | 660 | Named LLVM -> False
|
| 661 | 661 | Named ViaC -> False
|
| 662 | 662 | Named JavaScript -> False
|
| 663 | - Named Interpreter -> True
|
|
| 663 | + Named Bytecode -> True
|
|
| 664 | 664 | Named NoBackend -> False
|
| 665 | 665 | |
| 666 | 666 | -- | If this flag is set, then the driver forces the
|
| ... | ... | @@ -671,7 +671,7 @@ backendForcesOptimization0 (Named NCG) = False |
| 671 | 671 | backendForcesOptimization0 (Named LLVM) = False
|
| 672 | 672 | backendForcesOptimization0 (Named ViaC) = False
|
| 673 | 673 | backendForcesOptimization0 (Named JavaScript) = False
|
| 674 | -backendForcesOptimization0 (Named Interpreter) = True
|
|
| 674 | +backendForcesOptimization0 (Named Bytecode) = True
|
|
| 675 | 675 | backendForcesOptimization0 (Named NoBackend) = False
|
| 676 | 676 | |
| 677 | 677 | -- | I don't understand exactly how this works. But if
|
| ... | ... | @@ -683,7 +683,7 @@ backendNeedsFullWays (Named NCG) = False |
| 683 | 683 | backendNeedsFullWays (Named LLVM) = False
|
| 684 | 684 | backendNeedsFullWays (Named ViaC) = False
|
| 685 | 685 | backendNeedsFullWays (Named JavaScript) = False
|
| 686 | -backendNeedsFullWays (Named Interpreter) = True
|
|
| 686 | +backendNeedsFullWays (Named Bytecode) = True
|
|
| 687 | 687 | backendNeedsFullWays (Named NoBackend) = False
|
| 688 | 688 | |
| 689 | 689 | -- | This flag is also special for the interpreter: if a
|
| ... | ... | @@ -695,7 +695,7 @@ backendSpecialModuleSource (Named NCG) = const Nothing |
| 695 | 695 | backendSpecialModuleSource (Named LLVM) = const Nothing
|
| 696 | 696 | backendSpecialModuleSource (Named ViaC) = const Nothing
|
| 697 | 697 | backendSpecialModuleSource (Named JavaScript) = const Nothing
|
| 698 | -backendSpecialModuleSource (Named Interpreter) = \b -> if b then Just "interpreted" else Nothing
|
|
| 698 | +backendSpecialModuleSource (Named Bytecode) = \b -> if b then Just "interpreted" else Nothing
|
|
| 699 | 699 | backendSpecialModuleSource (Named NoBackend) = const (Just "nothing")
|
| 700 | 700 | |
| 701 | 701 | -- | This flag says whether the back end supports Haskell
|
| ... | ... | @@ -707,7 +707,7 @@ backendSupportsHpc (Named NCG) = True |
| 707 | 707 | backendSupportsHpc (Named LLVM) = True
|
| 708 | 708 | backendSupportsHpc (Named ViaC) = True
|
| 709 | 709 | backendSupportsHpc (Named JavaScript) = False
|
| 710 | -backendSupportsHpc (Named Interpreter) = False
|
|
| 710 | +backendSupportsHpc (Named Bytecode) = False
|
|
| 711 | 711 | backendSupportsHpc (Named NoBackend) = True
|
| 712 | 712 | |
| 713 | 713 | -- | This flag says whether the back end supports foreign
|
| ... | ... | @@ -718,7 +718,7 @@ backendSupportsCImport (Named NCG) = True |
| 718 | 718 | backendSupportsCImport (Named LLVM) = True
|
| 719 | 719 | backendSupportsCImport (Named ViaC) = True
|
| 720 | 720 | backendSupportsCImport (Named JavaScript) = True
|
| 721 | -backendSupportsCImport (Named Interpreter) = True
|
|
| 721 | +backendSupportsCImport (Named Bytecode) = True
|
|
| 722 | 722 | backendSupportsCImport (Named NoBackend) = True
|
| 723 | 723 | |
| 724 | 724 | -- | This flag says whether the back end supports foreign
|
| ... | ... | @@ -728,7 +728,7 @@ backendSupportsCExport (Named NCG) = True |
| 728 | 728 | backendSupportsCExport (Named LLVM) = True
|
| 729 | 729 | backendSupportsCExport (Named ViaC) = True
|
| 730 | 730 | backendSupportsCExport (Named JavaScript) = True
|
| 731 | -backendSupportsCExport (Named Interpreter) = False
|
|
| 731 | +backendSupportsCExport (Named Bytecode) = False
|
|
| 732 | 732 | backendSupportsCExport (Named NoBackend) = True
|
| 733 | 733 | |
| 734 | 734 | -- | When using this back end, it may be necessary or
|
| ... | ... | @@ -749,7 +749,7 @@ backendCDefs (Named NCG) = NoCDefs |
| 749 | 749 | backendCDefs (Named LLVM) = LlvmCDefs
|
| 750 | 750 | backendCDefs (Named ViaC) = NoCDefs
|
| 751 | 751 | backendCDefs (Named JavaScript) = NoCDefs
|
| 752 | -backendCDefs (Named Interpreter) = NoCDefs
|
|
| 752 | +backendCDefs (Named Bytecode) = NoCDefs
|
|
| 753 | 753 | backendCDefs (Named NoBackend) = NoCDefs
|
| 754 | 754 | |
| 755 | 755 | -- | This (defunctionalized) function generates code and
|
| ... | ... | @@ -768,7 +768,7 @@ backendCodeOutput (Named NCG) = NcgCodeOutput |
| 768 | 768 | backendCodeOutput (Named LLVM) = LlvmCodeOutput
|
| 769 | 769 | backendCodeOutput (Named ViaC) = ViaCCodeOutput
|
| 770 | 770 | backendCodeOutput (Named JavaScript) = JSCodeOutput
|
| 771 | -backendCodeOutput (Named Interpreter) = panic "backendCodeOutput: interpreterBackend"
|
|
| 771 | +backendCodeOutput (Named Bytecode) = panic "backendCodeOutput: interpreterBackend"
|
|
| 772 | 772 | backendCodeOutput (Named NoBackend) = panic "backendCodeOutput: noBackend"
|
| 773 | 773 | |
| 774 | 774 | backendUseJSLinker :: Backend -> Bool
|
| ... | ... | @@ -776,7 +776,7 @@ backendUseJSLinker (Named NCG) = False |
| 776 | 776 | backendUseJSLinker (Named LLVM) = False
|
| 777 | 777 | backendUseJSLinker (Named ViaC) = False
|
| 778 | 778 | backendUseJSLinker (Named JavaScript) = True
|
| 779 | -backendUseJSLinker (Named Interpreter) = False
|
|
| 779 | +backendUseJSLinker (Named Bytecode) = False
|
|
| 780 | 780 | backendUseJSLinker (Named NoBackend) = False
|
| 781 | 781 | |
| 782 | 782 | -- | This (defunctionalized) function tells the compiler
|
| ... | ... | @@ -795,7 +795,7 @@ backendPostHscPipeline (Named NCG) = NcgPostHscPipeline |
| 795 | 795 | backendPostHscPipeline (Named LLVM) = LlvmPostHscPipeline
|
| 796 | 796 | backendPostHscPipeline (Named ViaC) = ViaCPostHscPipeline
|
| 797 | 797 | backendPostHscPipeline (Named JavaScript) = JSPostHscPipeline
|
| 798 | -backendPostHscPipeline (Named Interpreter) = NoPostHscPipeline
|
|
| 798 | +backendPostHscPipeline (Named Bytecode) = NoPostHscPipeline
|
|
| 799 | 799 | backendPostHscPipeline (Named NoBackend) = NoPostHscPipeline
|
| 800 | 800 | |
| 801 | 801 | -- | Somewhere in the compiler driver, when compiling
|
| ... | ... | @@ -809,7 +809,7 @@ backendNormalSuccessorPhase (Named NCG) = As False |
| 809 | 809 | backendNormalSuccessorPhase (Named LLVM) = LlvmOpt
|
| 810 | 810 | backendNormalSuccessorPhase (Named ViaC) = HCc
|
| 811 | 811 | backendNormalSuccessorPhase (Named JavaScript) = StopLn
|
| 812 | -backendNormalSuccessorPhase (Named Interpreter) = StopLn
|
|
| 812 | +backendNormalSuccessorPhase (Named Bytecode) = StopLn
|
|
| 813 | 813 | backendNormalSuccessorPhase (Named NoBackend) = StopLn
|
| 814 | 814 | |
| 815 | 815 | -- | Name of the back end, if any. Used to migrate legacy
|
| ... | ... | @@ -820,7 +820,7 @@ backendName (Named NCG) = NCG |
| 820 | 820 | backendName (Named LLVM) = LLVM
|
| 821 | 821 | backendName (Named ViaC) = ViaC
|
| 822 | 822 | backendName (Named JavaScript) = JavaScript
|
| 823 | -backendName (Named Interpreter) = Interpreter
|
|
| 823 | +backendName (Named Bytecode) = Bytecode
|
|
| 824 | 824 | backendName (Named NoBackend) = NoBackend
|
| 825 | 825 | |
| 826 | 826 | |
| ... | ... | @@ -833,7 +833,7 @@ allBackends = [ ncgBackend |
| 833 | 833 | , llvmBackend
|
| 834 | 834 | , viaCBackend
|
| 835 | 835 | , jsBackend
|
| 836 | - , interpreterBackend
|
|
| 836 | + , bytecodeBackend
|
|
| 837 | 837 | , noBackend
|
| 838 | 838 | ]
|
| 839 | 839 |
| ... | ... | @@ -28,6 +28,6 @@ data BackendName |
| 28 | 28 | | LLVM -- ^ Names the LLVM backend.
|
| 29 | 29 | | ViaC -- ^ Names the Via-C backend.
|
| 30 | 30 | | JavaScript -- ^ Names the JS backend.
|
| 31 | - | Interpreter -- ^ Names the ByteCode interpreter.
|
|
| 31 | + | Bytecode -- ^ Names the ByteCode interpreter.
|
|
| 32 | 32 | | NoBackend -- ^ Names the `-fno-code` backend.
|
| 33 | 33 | deriving (Eq, Show) |
| ... | ... | @@ -916,7 +916,7 @@ enableCodeGenWhen logger tmpfs staticLife dynLife unit_env mod_graph = do |
| 916 | 916 | else (,) <$> (new_temp_file (hiSuf_ dflags) (dynHiSuf_ dflags))
|
| 917 | 917 | <*> (new_temp_file (objectSuf_ dflags) (dynObjectSuf_ dflags))
|
| 918 | 918 | let new_dflags = case enable_spec of
|
| 919 | - EnableByteCode -> dflags { backend = interpreterBackend }
|
|
| 919 | + EnableByteCode -> dflags { backend = bytecodeBackend }
|
|
| 920 | 920 | EnableObject -> dflags { backend = defaultBackendOf ms }
|
| 921 | 921 | EnableByteCodeAndObject -> (gopt_set dflags Opt_ByteCodeAndObjectCode) { backend = defaultBackendOf ms}
|
| 922 | 922 | let ms' = ms
|
| ... | ... | @@ -105,7 +105,6 @@ module GHC.Driver.Main |
| 105 | 105 | , showModuleIndex
|
| 106 | 106 | , hscAddSptEntries
|
| 107 | 107 | , writeInterfaceOnlyMode
|
| 108 | - , loadByteCode
|
|
| 109 | 108 | , genModDetails
|
| 110 | 109 | ) where
|
| 111 | 110 | |
| ... | ... | @@ -869,25 +868,24 @@ hscRecompStatus |
| 869 | 868 | return $ HscRecompNeeded $ Just $ mi_iface_hash $ checked_iface
|
| 870 | 869 | |
| 871 | 870 | | otherwise -> do
|
| 872 | - -- Do need linkable
|
|
| 873 | - -- 1. Just check whether we have bytecode/object linkables and then
|
|
| 874 | - -- we will decide if we need them or not.
|
|
| 875 | - bc_linkable <- checkByteCode hsc_env checked_iface mod_details mod_summary (homeMod_bytecode old_linkable)
|
|
| 871 | + -- Check the status of all the linkable types we might need.
|
|
| 872 | + -- 1. The in-memory linkable we had at hand.
|
|
| 873 | + bc_in_memory_linkable <- checkByteCodeInMemory hsc_env mod_summary (homeMod_bytecode old_linkable)
|
|
| 874 | + -- 2. The bytecode object file
|
|
| 875 | + bc_obj_linkable <- checkByteCodeFromObject hsc_env mod_summary
|
|
| 876 | + -- 3. Bytecode from an interface whole core bindings.
|
|
| 877 | + bc_core_linkable <- checkByteCodeFromCoreBindings hsc_env checked_iface mod_details mod_summary
|
|
| 878 | + -- 4. The object file.
|
|
| 876 | 879 | obj_linkable <- liftIO $ checkObjects lcl_dflags (homeMod_object old_linkable) mod_summary
|
| 877 | - trace_if (hsc_logger hsc_env) (vcat [text "BCO linkable", nest 2 (ppr bc_linkable), text "Object Linkable", ppr obj_linkable])
|
|
| 880 | + trace_if (hsc_logger hsc_env)
|
|
| 881 | + (vcat [text "BCO linkable", nest 2 (ppr bc_in_memory_linkable)
|
|
| 882 | + , text "BCO obj linkable", ppr bc_obj_linkable
|
|
| 883 | + , text "BCO core linkable", ppr bc_core_linkable
|
|
| 884 | + , text "Object Linkable", ppr obj_linkable])
|
|
| 878 | 885 | |
| 879 | - let just_bc = justBytecode <$> bc_linkable
|
|
| 880 | - just_o = justObjects <$> obj_linkable
|
|
| 881 | - _maybe_both_os = case (bc_linkable, obj_linkable) of
|
|
| 882 | - (UpToDateItem bc, UpToDateItem o) -> UpToDateItem (bytecodeAndObjects bc o)
|
|
| 883 | - -- If missing object code, just say we need to recompile because of object code.
|
|
| 884 | - (_, OutOfDateItem reason _) -> OutOfDateItem reason Nothing
|
|
| 885 | - -- If just missing byte code, just use the object code
|
|
| 886 | - -- so you should use -fprefer-byte-code with -fwrite-if-simplified-core or you'll
|
|
| 887 | - -- end up using bytecode on recompilation
|
|
| 888 | - (_, UpToDateItem {} ) -> just_o
|
|
| 886 | + let just_o = justObjects <$> obj_linkable
|
|
| 889 | 887 | |
| 890 | - definitely_both_os = case (bc_linkable, obj_linkable) of
|
|
| 888 | + definitely_both_os = case (definitely_bc, obj_linkable) of
|
|
| 891 | 889 | (UpToDateItem bc, UpToDateItem o) -> UpToDateItem (bytecodeAndObjects bc o)
|
| 892 | 890 | -- If missing object code, just say we need to recompile because of object code.
|
| 893 | 891 | (_, OutOfDateItem reason _) -> OutOfDateItem reason Nothing
|
| ... | ... | @@ -896,17 +894,21 @@ hscRecompStatus |
| 896 | 894 | -- end up using bytecode on recompilation
|
| 897 | 895 | (OutOfDateItem reason _, _ ) -> OutOfDateItem reason Nothing
|
| 898 | 896 | |
| 897 | + -- When -fwrite-byte-code, we definitely need to have up-to-date bytecode.
|
|
| 898 | + definitely_bc = bc_obj_linkable `prefer` bc_in_memory_linkable
|
|
| 899 | + |
|
| 900 | + -- If not -fwrite-byte-code, then we could use core bindings or object code if that's available.
|
|
| 901 | + maybe_bc = ((bc_obj_linkable `choose` bc_core_linkable) `prefer` bc_in_memory_linkable)
|
|
| 902 | + `choose` obj_linkable
|
|
| 903 | + |
|
| 899 | 904 | -- pprTraceM "recomp" (ppr just_bc <+> ppr just_o)
|
| 900 | 905 | -- 2. Decide which of the products we will need
|
| 901 | 906 | let recomp_linkable_result = case () of
|
| 902 | 907 | _ | backendCanReuseLoadedCode (backend lcl_dflags) ->
|
| 903 | - case bc_linkable of
|
|
| 904 | - -- If bytecode is available for Interactive then don't load object code
|
|
| 905 | - UpToDateItem _ -> just_bc
|
|
| 906 | - _ -> case obj_linkable of
|
|
| 907 | - -- If o is availabe, then just use that
|
|
| 908 | - UpToDateItem _ -> just_o
|
|
| 909 | - _ -> outOfDateItemBecause MissingBytecode Nothing
|
|
| 908 | + if gopt Opt_WriteByteCode lcl_dflags
|
|
| 909 | + -- If the byte-code artifact needs to be produced, then we certainly need bytecode.
|
|
| 910 | + then justBytecode <$> definitely_bc
|
|
| 911 | + else justBytecode <$> maybe_bc
|
|
| 910 | 912 | -- Need object files for making object files
|
| 911 | 913 | | backendWritesFiles (backend lcl_dflags) ->
|
| 912 | 914 | if gopt Opt_ByteCodeAndObjectCode lcl_dflags
|
| ... | ... | @@ -924,6 +926,20 @@ hscRecompStatus |
| 924 | 926 | msg $ NeedsRecompile reason
|
| 925 | 927 | return $ HscRecompNeeded $ Just $ mi_iface_hash $ checked_iface
|
| 926 | 928 | |
| 929 | +-- | Prefer requires both arguments to be up-to-date.
|
|
| 930 | +-- but prefers to use the second argument.
|
|
| 931 | +prefer :: MaybeValidated Linkable -> MaybeValidated Linkable -> MaybeValidated Linkable
|
|
| 932 | +prefer (UpToDateItem _) (UpToDateItem l2) = UpToDateItem l2
|
|
| 933 | +prefer r1 _ = r1
|
|
| 934 | + |
|
| 935 | +-- | Disjunction, choose either argument, but prefer the first one.
|
|
| 936 | +-- Report the failure of the first argument.
|
|
| 937 | +choose :: MaybeValidated Linkable -> MaybeValidated Linkable -> MaybeValidated Linkable
|
|
| 938 | +choose (UpToDateItem l1) _ = UpToDateItem l1
|
|
| 939 | +choose _ (UpToDateItem l2) = UpToDateItem l2
|
|
| 940 | +choose l1 _ = l1
|
|
| 941 | + |
|
| 942 | + |
|
| 927 | 943 | -- | Check that the .o files produced by compilation are already up-to-date
|
| 928 | 944 | -- or not.
|
| 929 | 945 | checkObjects :: DynFlags -> Maybe Linkable -> ModSummary -> IO (MaybeValidated Linkable)
|
| ... | ... | @@ -959,34 +975,24 @@ checkObjects dflags mb_old_linkable summary = do |
| 959 | 975 | -- | Check to see if we can reuse the old linkable, by this point we will
|
| 960 | 976 | -- have just checked that the old interface matches up with the source hash, so
|
| 961 | 977 | -- no need to check that again here
|
| 962 | -checkByteCode :: HscEnv -> ModIface -> ModDetails -> ModSummary -> Maybe Linkable -> IO (MaybeValidated Linkable)
|
|
| 963 | -checkByteCode hsc_env iface mod_details mod_sum mb_old_linkable =
|
|
| 978 | +checkByteCodeInMemory :: HscEnv -> ModSummary -> Maybe Linkable -> IO (MaybeValidated Linkable)
|
|
| 979 | +checkByteCodeInMemory hsc_env mod_sum mb_old_linkable =
|
|
| 964 | 980 | case mb_old_linkable of
|
| 965 | 981 | Just old_linkable
|
| 966 | 982 | | not (linkableIsNativeCodeOnly old_linkable)
|
| 983 | + -- If `-fwrite-byte-code` is enabled, then check that the .gbc file is
|
|
| 984 | + -- up-to-date with the linkable we have in our hand.
|
|
| 985 | + -- If ms_bytecode_date is Nothing, then the .gbc file does not exist yet.
|
|
| 986 | + -- Otherwise, check that the date matches the linkable date exactly.
|
|
| 987 | + , if gopt Opt_WriteByteCode (hsc_dflags hsc_env)
|
|
| 988 | + then maybe False (linkableTime old_linkable ==) (ms_bytecode_date mod_sum)
|
|
| 989 | + else True
|
|
| 967 | 990 | -> return $ (UpToDateItem old_linkable)
|
| 968 | - _ -> do
|
|
| 969 | - load_result <- loadByteCodeFromCoreBindings hsc_env iface mod_details mod_sum
|
|
| 970 | - case load_result of
|
|
| 971 | - Just linkable -> return $ UpToDateItem linkable
|
|
| 972 | - Nothing -> loadByteCode hsc_env iface mod_details mod_sum
|
|
| 973 | - |
|
| 974 | --- | First attempt to use the bytecode object linkable if it exists.
|
|
| 975 | --- If that doesn't exist, then try to load bytecode from whole core bindings.
|
|
| 976 | -loadByteCode :: HscEnv -> ModIface -> ModDetails -> ModSummary -> IO (MaybeValidated Linkable)
|
|
| 977 | -loadByteCode hsc_env iface mod_details mod_sum = do
|
|
| 978 | - obj_result <- loadByteCodeFromObject hsc_env mod_sum
|
|
| 979 | - case obj_result of
|
|
| 980 | - Just linkable -> return $ UpToDateItem linkable
|
|
| 981 | - Nothing -> do
|
|
| 982 | - core_result <- loadByteCodeFromCoreBindings hsc_env iface mod_details mod_sum
|
|
| 983 | - case core_result of
|
|
| 984 | - Just linkable -> return $ UpToDateItem linkable
|
|
| 985 | - Nothing -> return $ outOfDateItemBecause MissingBytecode Nothing
|
|
| 991 | + _ -> return $ outOfDateItemBecause MissingBytecode Nothing
|
|
| 986 | 992 | |
| 987 | 993 | -- | Load bytecode from a ".gbc" object file if it exists and is up-to-date
|
| 988 | -loadByteCodeFromObject :: HscEnv -> ModSummary -> IO (Maybe Linkable)
|
|
| 989 | -loadByteCodeFromObject hsc_env mod_sum = do
|
|
| 994 | +checkByteCodeFromObject :: HscEnv -> ModSummary -> IO (MaybeValidated Linkable)
|
|
| 995 | +checkByteCodeFromObject hsc_env mod_sum = do
|
|
| 990 | 996 | let
|
| 991 | 997 | obj_fn = ml_bytecode_file (ms_location mod_sum)
|
| 992 | 998 | obj_date = ms_bytecode_date mod_sum
|
| ... | ... | @@ -994,14 +1000,18 @@ loadByteCodeFromObject hsc_env mod_sum = do |
| 994 | 1000 | case (,) <$> obj_date <*> if_date of
|
| 995 | 1001 | Just (obj_date, if_date)
|
| 996 | 1002 | | obj_date >= if_date -> do
|
| 997 | - bco <- readBinByteCode hsc_env obj_fn
|
|
| 998 | - Just <$> loadByteCodeObjectLinkable hsc_env obj_date (ms_location mod_sum) bco
|
|
| 999 | - _ -> return Nothing
|
|
| 1003 | + -- Don't force this if we reuse the linkable already loaded into memory, but we have to check
|
|
| 1004 | + -- that the one we have on disk would be suitable as well.
|
|
| 1005 | + linkable <- unsafeInterleaveIO $ do
|
|
| 1006 | + bco <- readBinByteCode hsc_env obj_fn
|
|
| 1007 | + loadByteCodeObjectLinkable hsc_env obj_date (ms_location mod_sum) bco
|
|
| 1008 | + return $ UpToDateItem linkable
|
|
| 1009 | + _ -> return $ outOfDateItemBecause MissingBytecode Nothing
|
|
| 1000 | 1010 | |
| 1001 | 1011 | -- | Attempt to load bytecode from whole core bindings in the interface if they exist.
|
| 1002 | 1012 | -- This is a legacy code-path, these days it should be preferred to use the bytecode object linkable.
|
| 1003 | -loadByteCodeFromCoreBindings :: HscEnv -> ModIface -> ModDetails -> ModSummary -> IO (Maybe Linkable)
|
|
| 1004 | -loadByteCodeFromCoreBindings hsc_env iface mod_details mod_sum = do
|
|
| 1013 | +checkByteCodeFromCoreBindings :: HscEnv -> ModIface -> ModDetails -> ModSummary -> IO (MaybeValidated Linkable)
|
|
| 1014 | +checkByteCodeFromCoreBindings hsc_env iface mod_details mod_sum = do
|
|
| 1005 | 1015 | let
|
| 1006 | 1016 | this_mod = ms_mod mod_sum
|
| 1007 | 1017 | if_date = fromJust $ ms_iface_date mod_sum
|
| ... | ... | @@ -1010,8 +1020,8 @@ loadByteCodeFromCoreBindings hsc_env iface mod_details mod_sum = do |
| 1010 | 1020 | ~(bco, fos) <- unsafeInterleaveIO $
|
| 1011 | 1021 | compileWholeCoreBindings hsc_env (md_types mod_details) fi
|
| 1012 | 1022 | let bco' = LazyBCOs bco fos
|
| 1013 | - return (Just (Linkable if_date this_mod (NE.singleton bco')))
|
|
| 1014 | - _ -> return Nothing
|
|
| 1023 | + return $ UpToDateItem (Linkable if_date this_mod (NE.singleton bco'))
|
|
| 1024 | + _ -> return $ outOfDateItemBecause MissingBytecode Nothing
|
|
| 1015 | 1025 | |
| 1016 | 1026 | --------------------------------------------------------------
|
| 1017 | 1027 | -- Compilers
|
| ... | ... | @@ -2231,8 +2241,11 @@ generateAndWriteByteCode hsc_env cgguts mod_location = do |
| 2231 | 2241 | |
| 2232 | 2242 | generateAndWriteByteCodeLinkable :: HscEnv -> CgInteractiveGuts -> ModLocation -> IO Linkable
|
| 2233 | 2243 | generateAndWriteByteCodeLinkable hsc_env cgguts mod_location = do
|
| 2234 | - bco_time <- getCurrentTime
|
|
| 2235 | 2244 | bco_object <- generateAndWriteByteCode hsc_env cgguts mod_location
|
| 2245 | + -- Either, get the same time as the .gbc file if it exists, or just the current time.
|
|
| 2246 | + -- It's important the time of the linkable matches the time of the .gbc file for recompilation
|
|
| 2247 | + -- checking.
|
|
| 2248 | + bco_time <- maybe getCurrentTime pure =<< modificationTimeIfExists (ml_bytecode_file mod_location)
|
|
| 2236 | 2249 | loadByteCodeObjectLinkable hsc_env bco_time mod_location bco_object
|
| 2237 | 2250 | |
| 2238 | 2251 | -- | Write foreign sources and foreign stubs to temporary files and compile them.
|
| ... | ... | @@ -279,8 +279,8 @@ compileOne' mHscMessage |
| 279 | 279 | -- was set), force it to generate byte-code. This is NOT transitive and
|
| 280 | 280 | -- only applies to direct targets.
|
| 281 | 281 | | loadAsByteCode
|
| 282 | - = ( interpreterBackend
|
|
| 283 | - , gopt_set (lcl_dflags { backend = interpreterBackend }) Opt_ForceRecomp
|
|
| 282 | + = ( bytecodeBackend
|
|
| 283 | + , gopt_set (lcl_dflags { backend = bytecodeBackend }) Opt_ForceRecomp
|
|
| 284 | 284 | )
|
| 285 | 285 | |
| 286 | 286 | | otherwise
|
| ... | ... | @@ -1925,9 +1925,9 @@ dynamic_flags_deps = [ |
| 1925 | 1925 | , make_ord_flag defFlag "fno-code" (NoArg ((upd $ \d ->
|
| 1926 | 1926 | d { ghcLink=NoLink }) >> setBackend noBackend))
|
| 1927 | 1927 | , make_ord_flag defFlag "fbyte-code"
|
| 1928 | - (noArgM $ \dflags -> do
|
|
| 1929 | - setBackend interpreterBackend
|
|
| 1930 | - pure $ flip gopt_unset Opt_ByteCodeAndObjectCode (gopt_set dflags Opt_ByteCode))
|
|
| 1928 | + (NoArg $ do
|
|
| 1929 | + setBackend bytecodeBackend
|
|
| 1930 | + upd $ \dflags -> flip gopt_unset Opt_ByteCodeAndObjectCode (gopt_set dflags Opt_ByteCode))
|
|
| 1931 | 1931 | , make_ord_flag defFlag "fobject-code" $ noArgM $ \dflags -> do
|
| 1932 | 1932 | setBackend $ platformDefaultBackend (targetPlatform dflags)
|
| 1933 | 1933 | dflags' <- liftEwM getCmdLineState
|
| ... | ... | @@ -3185,10 +3185,8 @@ parseReexportedModule str |
| 3185 | 3185 | -- If we're linking a binary, then only backends that produce object
|
| 3186 | 3186 | -- code are allowed (requests for other target types are ignored).
|
| 3187 | 3187 | setBackend :: Backend -> DynP ()
|
| 3188 | -setBackend l = upd $ \ dfs ->
|
|
| 3189 | - if ghcLink dfs /= LinkBinary || backendWritesFiles l
|
|
| 3190 | - then dfs{ backend = l }
|
|
| 3191 | - else dfs
|
|
| 3188 | +setBackend l = do
|
|
| 3189 | + upd $ \ dfs -> dfs{ backend = l }
|
|
| 3192 | 3190 | |
| 3193 | 3191 | -- Changes the target only if we're compiling object code. This is
|
| 3194 | 3192 | -- used by -fasm and -fllvm, which switch from one to the other, but
|
| ... | ... | @@ -3707,6 +3705,11 @@ makeDynFlagsConsistent dflags |
| 3707 | 3705 | setGeneralFlag' Opt_ExternalInterpreter $
|
| 3708 | 3706 | addWay' WayDyn dflags
|
| 3709 | 3707 | |
| 3708 | + | LinkBinary <- ghcLink dflags
|
|
| 3709 | + , gopt Opt_ByteCode dflags
|
|
| 3710 | + = loop (dflags { ghcLink = NoLink })
|
|
| 3711 | + "Byte-code linking does not currently support linking an executable, enabling -no-link"
|
|
| 3712 | + |
|
| 3710 | 3713 | | LinkInMemory <- ghcLink dflags
|
| 3711 | 3714 | , not (gopt Opt_ExternalInterpreter dflags)
|
| 3712 | 3715 | , targetWays_ dflags /= hostFullWays
|
| ... | ... | @@ -860,6 +860,19 @@ Options affecting code generation |
| 860 | 860 | then any modules which are required to be compiled for Template Haskell evaluation
|
| 861 | 861 | will generate byte-code rather than object code.
|
| 862 | 862 | |
| 863 | +.. ghc-flag:: -fwrite-byte-code
|
|
| 864 | + :shortdesc: Write byte-code object files
|
|
| 865 | + :type: dynamic
|
|
| 866 | + :category: codegen
|
|
| 867 | + |
|
| 868 | + Write byte-code files (``.gbc``) when byte-code is generated.
|
|
| 869 | + These files can be used to avoid recompiling modules when using the byte-code
|
|
| 870 | + interpreter.
|
|
| 871 | + |
|
| 872 | + By default when using :ghc-flag:`-fbyte-code` no byte-code files are written.
|
|
| 873 | + This flag is implied by :ghc-flag:`-fbyte-code-and-object-code`.
|
|
| 874 | + |
|
| 875 | + |
|
| 863 | 876 | |
| 864 | 877 | .. _options-linker:
|
| 865 | 878 |
| ... | ... | @@ -423,6 +423,25 @@ Redirecting the compilation output(s) |
| 423 | 423 | Finally, the option ``-hcsuf`` ⟨suffix⟩ will change the ``.hc`` file
|
| 424 | 424 | suffix for compiler-generated intermediate C files.
|
| 425 | 425 | |
| 426 | +.. ghc-flag:: -gbcsuf ⟨suffix⟩
|
|
| 427 | + :shortdesc: set the suffix to use for bytecode files
|
|
| 428 | + :type: dynamic
|
|
| 429 | + :category:
|
|
| 430 | + |
|
| 431 | + The option ``-gbcsuf`` ⟨suffix⟩ will change the ``.gbc`` file
|
|
| 432 | + suffix for bytecode files to whatever you specify. This is useful
|
|
| 433 | + when you want to avoid conflicts between different bytecode versions
|
|
| 434 | + or when building with different flags.
|
|
| 435 | + |
|
| 436 | +.. ghc-flag:: -gbcdir ⟨dir⟩
|
|
| 437 | + :shortdesc: set the directory for bytecode files
|
|
| 438 | + :type: dynamic
|
|
| 439 | + :category:
|
|
| 440 | + |
|
| 441 | + The option ``-gbcdir`` ⟨dir⟩ will change the directory where
|
|
| 442 | + bytecode files (``.gbc``) are placed. By default, bytecode files
|
|
| 443 | + are placed in the same directory as the source files.
|
|
| 444 | + |
|
| 426 | 445 | .. _keeping-intermediates:
|
| 427 | 446 | |
| 428 | 447 | Keeping Intermediate Files
|
| ... | ... | @@ -169,9 +169,9 @@ main' postLoadMode units dflags0 args flagWarnings = do |
| 169 | 169 | let dflt_backend = backend dflags0
|
| 170 | 170 | (mode, bcknd, link)
|
| 171 | 171 | = case postLoadMode of
|
| 172 | - DoInteractive -> (CompManager, interpreterBackend, LinkInMemory)
|
|
| 173 | - DoEval _ -> (CompManager, interpreterBackend, LinkInMemory)
|
|
| 174 | - DoRun -> (CompManager, interpreterBackend, LinkInMemory)
|
|
| 172 | + DoInteractive -> (CompManager, bytecodeBackend, LinkInMemory)
|
|
| 173 | + DoEval _ -> (CompManager, bytecodeBackend, LinkInMemory)
|
|
| 174 | + DoRun -> (CompManager, bytecodeBackend, LinkInMemory)
|
|
| 175 | 175 | DoMake -> (CompManager, dflt_backend, LinkBinary)
|
| 176 | 176 | DoBackpack -> (CompManager, dflt_backend, LinkBinary)
|
| 177 | 177 | DoMkDependHS -> (MkDepend, dflt_backend, LinkBinary)
|