Allow access via manually generated SymbolPtrs. Generalize pprImportedSymbol for...
[ghc-hetmet.git] / compiler / nativeGen / PositionIndependentCode.hs
index e2db9da..2571b5c 100644 (file)
@@ -48,7 +48,7 @@ module PositionIndependentCode (
 #include "nativeGen/NCG.h"
 
 import Cmm
-import MachOp           ( MachOp(MO_Add), wordRep )
+import MachOp           ( MachOp(MO_Add), wordRep, MachRep(..) )
 import CLabel           ( CLabel, pprCLabel,
                           mkDynamicLinkerLabel, DynamicLinkerLabelInfo(..),
                           dynamicLinkerLabelInfo, mkPicBaseLabel,
@@ -131,7 +131,7 @@ cmmMakePicReference :: CLabel -> CmmExpr
         -- everything gets relocated at runtime
 
 cmmMakePicReference lbl
-    | opt_PIC && absoluteLabel lbl = CmmMachOp (MO_Add wordRep) [
+    | (opt_PIC || not opt_Static) && absoluteLabel lbl = CmmMachOp (MO_Add wordRep) [
             CmmReg (CmmGlobal PicBaseReg),
             CmmLit $ picRelative lbl
         ]
@@ -372,6 +372,9 @@ pprGotDeclaration = Pretty.empty
 -- On Darwin, we have to generate our own stub code for lazy binding..
 -- For each processor architecture, there are two versions, one for PIC
 -- and one for non-PIC.
+--
+-- Whenever you change something in this assembler output, make sure
+-- the splitter in driver/split/ghc-split.lprl recognizes the new output
 pprImportedSymbol importedLbl
 #if powerpc_TARGET_ARCH
     | Just (CodeStub, lbl) <- dynamicLinkerLabelInfo importedLbl
@@ -527,7 +530,7 @@ pprGotDeclaration
         ptext SLIT(".LCTOC1 = .+32768")
     ]
 
--- We generate one .long literal for every symbol we import;
+-- We generate one .long/.quad literal for every symbol we import;
 -- the dynamic linker will relocate those addresses.
 
 pprImportedSymbol importedLbl
@@ -535,11 +538,16 @@ pprImportedSymbol importedLbl
     = vcat [
         ptext SLIT(".section \".got2\", \"aw\""),
         ptext SLIT(".LC_") <> pprCLabel_asm lbl <> char ':',
-        ptext SLIT("\t.long") <+> pprCLabel_asm lbl
+        ptext symbolSize <+> pprCLabel_asm lbl
     ]
 
 -- PLT code stubs are generated automatically be the dynamic linker.
     | otherwise = empty
+    where
+      symbolSize = case wordRep of
+                    I32 -> SLIT("\t.long")
+                    I64 -> SLIT("\t.quad")
+                    _ -> panic "Unknown wordRep in pprImportedSymbol"
 
 #else