diff options
| author | Sylvain Henry <sylvain@haskus.fr> | 2020-02-17 16:21:11 +0100 |
|---|---|---|
| committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-02-18 20:18:12 -0500 |
| commit | 1500f0898e85316c7c97a2f759d83278a072ab0e (patch) | |
| tree | 7246f4905a279679b1c5106ba6989d6e0e637f6b /compiler/llvmGen/LlvmCodeGen/Data.hs | |
| parent | 192caf58ca1fc42806166872260d30bdb34dbace (diff) | |
| download | haskell-1500f0898e85316c7c97a2f759d83278a072ab0e.tar.gz | |
Modules: Llvm (#13009)
Diffstat (limited to 'compiler/llvmGen/LlvmCodeGen/Data.hs')
| -rw-r--r-- | compiler/llvmGen/LlvmCodeGen/Data.hs | 196 |
1 files changed, 0 insertions, 196 deletions
diff --git a/compiler/llvmGen/LlvmCodeGen/Data.hs b/compiler/llvmGen/LlvmCodeGen/Data.hs deleted file mode 100644 index d44ecaea20..0000000000 --- a/compiler/llvmGen/LlvmCodeGen/Data.hs +++ /dev/null @@ -1,196 +0,0 @@ -{-# LANGUAGE CPP #-} --- ---------------------------------------------------------------------------- --- | Handle conversion of CmmData to LLVM code. --- - -module LlvmCodeGen.Data ( - genLlvmData, genData - ) where - -#include "HsVersions.h" - -import GhcPrelude - -import Llvm -import LlvmCodeGen.Base - -import GHC.Cmm.BlockId -import GHC.Cmm.CLabel -import GHC.Cmm -import DynFlags -import GHC.Platform - -import FastString -import Outputable -import qualified Data.ByteString as BS - --- ---------------------------------------------------------------------------- --- * Constants --- - --- | The string appended to a variable name to create its structure type alias -structStr :: LMString -structStr = fsLit "_struct" - --- | The LLVM visibility of the label -linkage :: CLabel -> LlvmLinkageType -linkage lbl = if externallyVisibleCLabel lbl - then ExternallyVisible else Internal - --- ---------------------------------------------------------------------------- --- * Top level --- - --- | Pass a CmmStatic section to an equivalent Llvm code. -genLlvmData :: (Section, RawCmmStatics) -> LlvmM LlvmData --- See note [emit-time elimination of static indirections] in CLabel. -genLlvmData (_, RawCmmStatics alias [CmmStaticLit (CmmLabel lbl), CmmStaticLit ind, _, _]) - | lbl == mkIndStaticInfoLabel - , let labelInd (CmmLabelOff l _) = Just l - labelInd (CmmLabel l) = Just l - labelInd _ = Nothing - , Just ind' <- labelInd ind - , alias `mayRedirectTo` ind' = do - label <- strCLabel_llvm alias - label' <- strCLabel_llvm ind' - let link = linkage alias - link' = linkage ind' - -- the LLVM type we give the alias is an empty struct type - -- but it doesn't really matter, as the pointer is only - -- used for (bit/int)casting. - tyAlias = LMAlias (label `appendFS` structStr, LMStructU []) - - aliasDef = LMGlobalVar label tyAlias link Nothing Nothing Alias - -- we don't know the type of the indirectee here - indType = panic "will be filled by 'aliasify', later" - orig = LMStaticPointer $ LMGlobalVar label' indType link' Nothing Nothing Alias - - pure ([LMGlobal aliasDef $ Just orig], [tyAlias]) - -genLlvmData (sec, RawCmmStatics lbl xs) = do - label <- strCLabel_llvm lbl - static <- mapM genData xs - lmsec <- llvmSection sec - platform <- getLlvmPlatform - let types = map getStatType static - - strucTy = LMStruct types - tyAlias = LMAlias (label `appendFS` structStr, strucTy) - - struct = Just $ LMStaticStruc static tyAlias - link = linkage lbl - align = case sec of - Section CString _ -> if (platformArch platform == ArchS390X) - then Just 2 else Just 1 - _ -> Nothing - const = if isSecConstant sec then Constant else Global - varDef = LMGlobalVar label tyAlias link lmsec align const - globDef = LMGlobal varDef struct - - return ([globDef], [tyAlias]) - --- | Format the section type part of a Cmm Section -llvmSectionType :: Platform -> SectionType -> FastString -llvmSectionType p t = case t of - Text -> fsLit ".text" - ReadOnlyData -> case platformOS p of - OSMinGW32 -> fsLit ".rdata" - _ -> fsLit ".rodata" - RelocatableReadOnlyData -> case platformOS p of - OSMinGW32 -> fsLit ".rdata$rel.ro" - _ -> fsLit ".data.rel.ro" - ReadOnlyData16 -> case platformOS p of - OSMinGW32 -> fsLit ".rdata$cst16" - _ -> fsLit ".rodata.cst16" - Data -> fsLit ".data" - UninitialisedData -> fsLit ".bss" - CString -> case platformOS p of - OSMinGW32 -> fsLit ".rdata$str" - _ -> fsLit ".rodata.str" - (OtherSection _) -> panic "llvmSectionType: unknown section type" - --- | Format a Cmm Section into a LLVM section name -llvmSection :: Section -> LlvmM LMSection -llvmSection (Section t suffix) = do - dflags <- getDynFlags - let splitSect = gopt Opt_SplitSections dflags - platform = targetPlatform dflags - if not splitSect - then return Nothing - else do - lmsuffix <- strCLabel_llvm suffix - let result sep = Just (concatFS [llvmSectionType platform t - , fsLit sep, lmsuffix]) - case platformOS platform of - OSMinGW32 -> return (result "$") - _ -> return (result ".") - --- ---------------------------------------------------------------------------- --- * Generate static data --- - --- | Handle static data -genData :: CmmStatic -> LlvmM LlvmStatic - -genData (CmmString str) = do - let v = map (\x -> LMStaticLit $ LMIntLit (fromIntegral x) i8) - (BS.unpack str) - ve = v ++ [LMStaticLit $ LMIntLit 0 i8] - return $ LMStaticArray ve (LMArray (length ve) i8) - -genData (CmmUninitialised bytes) - = return $ LMUninitType (LMArray bytes i8) - -genData (CmmStaticLit lit) - = genStaticLit lit - --- | Generate Llvm code for a static literal. --- --- Will either generate the code or leave it unresolved if it is a 'CLabel' --- which isn't yet known. -genStaticLit :: CmmLit -> LlvmM LlvmStatic -genStaticLit (CmmInt i w) - = return $ LMStaticLit (LMIntLit i (LMInt $ widthInBits w)) - -genStaticLit (CmmFloat r w) - = return $ LMStaticLit (LMFloatLit (fromRational r) (widthToLlvmFloat w)) - -genStaticLit (CmmVec ls) - = do sls <- mapM toLlvmLit ls - return $ LMStaticLit (LMVectorLit sls) - where - toLlvmLit :: CmmLit -> LlvmM LlvmLit - toLlvmLit lit = do - slit <- genStaticLit lit - case slit of - LMStaticLit llvmLit -> return llvmLit - _ -> panic "genStaticLit" - --- Leave unresolved, will fix later -genStaticLit cmm@(CmmLabel l) = do - var <- getGlobalPtr =<< strCLabel_llvm l - dflags <- getDynFlags - let ptr = LMStaticPointer var - lmty = cmmToLlvmType $ cmmLitType dflags cmm - return $ LMPtoI ptr lmty - -genStaticLit (CmmLabelOff label off) = do - dflags <- getDynFlags - var <- genStaticLit (CmmLabel label) - let offset = LMStaticLit $ LMIntLit (toInteger off) (llvmWord dflags) - return $ LMAdd var offset - -genStaticLit (CmmLabelDiffOff l1 l2 off w) = do - dflags <- getDynFlags - var1 <- genStaticLit (CmmLabel l1) - var2 <- genStaticLit (CmmLabel l2) - let var - | w == wordWidth dflags = LMSub var1 var2 - | otherwise = LMTrunc (LMSub var1 var2) (widthToLlvmInt w) - offset = LMStaticLit $ LMIntLit (toInteger off) (LMInt $ widthInBits w) - return $ LMAdd var offset - -genStaticLit (CmmBlock b) = genStaticLit $ CmmLabel $ infoTblLbl b - -genStaticLit (CmmHighStackMark) - = panic "genStaticLit: CmmHighStackMark unsupported!" |
