ghc-9.2.1: The GHC API
Safe HaskellSafe-Inferred



Native code generator

The native-code generator has machine-independent and machine-dependent modules.

This module (GHC.CmmToAsm) is the top-level machine-independent module. Before entering machine-dependent land, we do some machine-independent optimisations (defined below) on the CmmStmtss.

We convert to the machine-specific Instr datatype with cmmCodeGen, assuming an infinite supply of registers. We then use a machine-independent register allocator (regAlloc) to rejoin reality. Obviously, regAlloc has machine-specific helper functions (see about RegAllocInfo below).

Finally, we order the basic blocks of the function so as to minimise the number of jumps between blocks, by utilising fallthrough wherever possible.

The machine-dependent bits break down as follows:

  • [MachRegs] Everything about the target platform's machine registers (and immediate operands, and addresses, which tend to intermingle/interact with registers).
  • [MachInstrs] Includes the Instr datatype (possibly should have a module of its own), plus a miscellany of other things (e.g., targetDoubleSize, smStablePtrTable, ...)
  • [MachCodeGen] is where Cmm stuff turns into machine instructions.
  • [PprMach] pprInstr turns an Instr into text (well, really a SDoc).
  • [RegAllocInfo] In the register allocator, we manipulate MRegsStates, which are BitSets, one bit per machine register. When we want to say something about a specific machine register (e.g., ``it gets clobbered by this instruction''), we set/unset its bit. Obviously, we do this BitSet thing for efficiency reasons.

The RegAllocInfo module collects together the machine-specific info needed to do register allocation.



Test-only exports: see trac #12744

cmmNativeGen Source #


:: forall statics instr jumpDest. (Instruction instr, OutputableP Platform statics, Outputable jumpDest) 
=> Logger 
-> DynFlags 
-> ModLocation 
-> NcgImpl statics instr jumpDest 
-> UniqSupply 
-> DwarfFiles 
-> LabelMap DebugBlock 
-> RawCmmDecl

the cmm to generate code for

-> Int

sequence number of this top thing

-> IO (UniqSupply, DwarfFiles, [NatCmmDecl statics instr], [CLabel], Maybe [RegAllocStats statics instr], Maybe [RegAllocStats], LabelMap [UnwindPoint]) 

Complete native code generation phase for a single top-level chunk of Cmm. Dumping the output of each stage along the way. Global conflict graph and NGC stats

data NcgImpl statics instr jumpDest Source #




initNCGConfig :: DynFlags -> Module -> NCGConfig Source #

Initialize the native code generator configuration from the DynFlags