• wolfgang's avatar
    [project @ 2004-10-07 15:54:03 by wolfgang] · b4d045ae
    wolfgang authored
    Position Independent Code and Dynamic Linking Support, Part 1
    
    This commit allows generation of position independent code (PIC) that fully supports dynamic linking on Mac OS X and PowerPC Linux.
    Other platforms are not yet supported, and there is no support for actually linking or using dynamic libraries - so if you use the -fPIC or -dynamic code generation flags, you have to type your (platform-specific) linker command lines yourself.
    
    
    nativeGen/PositionIndependentCode.hs:
    New file. Look here for some more comments on how this works.
    
    cmm/CLabel.hs:
    Add support for DynamicLinkerLabels and PIC base labels - for use inside the NCG.
    needsCDecl: Case alternative labels now need C decls, see the codeGen/CgInfoTbls.hs below for details
    
    cmm/Cmm.hs:
    Add CmmPicBaseReg (used in NCG),
    and CmmLabelDiffOff (used in NCG and for offsets in info tables)
    
    cmm/CmmParse.y:
    support offsets in info tables
    
    cmm/PprC.hs:
    support CmmLabelDiffOff
    Case alternative labels now need C decls (see the codeGen/CgInfoTbls.hs for details), so we need to pprDataExterns for info tables.
    
    cmm/PprCmm.hs:
    support CmmLabelDiffOff
    
    codeGen/CgInfoTbls.hs:
    no longer store absolute addresses in info tables, instead, we store offsets.
    Also, for vectored return points, emit the alternatives _after_ the vector table. This is to work around a limitation in Apple's as, which refuses to handle label differences where one label is at the end of a section. Emitting alternatives after vector info tables makes sure this never happens in GHC generated code. Case alternatives now require prototypes in hc code, though (see changes in PprC.hs, CLabel.hs).
    
    main/CmdLineOpts.lhs:
    Add a new option, -fPIC.
    
    main/DriverFlags.hs:
    Pass the correct options for PIC to gcc, depending on the platform. Only for powerpc for now.
    
    nativeGen/AsmCodeGen.hs:
    Many changes...
    Mac OS X-specific management of import stubs is no longer, it's now part of a general mechanism to handle such things for all platforms that need it (Darwin [both ppc and x86], Linux on ppc, and some platforms we don't support).
    Move cmmToCmm into its own monad which can accumulate a list of imported symbols. Make it call cmmMakeDynamicReference at the right places.
    
    nativeGen/MachCodeGen.hs:
    nativeGen/MachInstrs.hs:
    nativeGen/MachRegs.lhs:
    nativeGen/PprMach.hs:
    nativeGen/RegAllocInfo.hs:
    Too many changes to enumerate here, PowerPC specific.
    
    nativeGen/NCGMonad.hs:
    NatM still tracks imported symbols, as more labels can be created during code generation (float literals, jump tables; on some platforms all data access has to go through the dynamic linking mechanism).
    
    driver/mangler/ghc-asm.lprl:
    Mangle absolute addresses in info tables to offsets.
    Correctly pass through GCC-generated PIC for Mac OS X and powerpc linux.
    
    includes/Cmm.h:
    includes/InfoTables.h:
    includes/Storage.h:
    includes/mkDerivedConstants.c:
    rts/GC.c:
    rts/GCCompact.c:
    rts/HeapStackCheck.cmm:
    rts/Printer.c:
    rts/RetainerProfile.c:
    rts/Sanity.c:
    Adapt to the fact that info tables now contain offsets.
    
    rts/Linker.c:
    Mac-specific: change machoInitSymbolsWithoutUnderscore to support PIC.
    b4d045ae
Linker.c 118 KB