diff options
author | Ben Gamari <ben@smart-cactus.org> | 2020-10-17 15:20:46 -0400 |
---|---|---|
committer | Moritz Angermann <moritz.angermann@gmail.com> | 2020-11-23 14:38:38 +0000 |
commit | 170bd49df03989d2e9c976181ea6ac0856cd6853 (patch) | |
tree | 58ebdcb25703240e7899e7e7927b59bc555d4f6e /compiler | |
parent | f49dfc83766508a47b3e0d3e964e2fb39c5590a4 (diff) | |
download | haskell-wip/T18857.tar.gz |
CmmToLlvm: Declare signature for memcmpwip/T18857
Otherwise `opt` fails with:
error: use of undefined value '@memcmp$def'
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/GHC/CmmToLlvm/Base.hs | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/compiler/GHC/CmmToLlvm/Base.hs b/compiler/GHC/CmmToLlvm/Base.hs index 43eaab424e..d68b5d5c8e 100644 --- a/compiler/GHC/CmmToLlvm/Base.hs +++ b/compiler/GHC/CmmToLlvm/Base.hs @@ -476,13 +476,15 @@ ghcInternalFunctions :: LlvmM () ghcInternalFunctions = do platform <- getPlatform let w = llvmWord platform + cint = LMInt $ widthInBits $ cIntWidth platform + mk "memcmp" cint [i8Ptr, i8Ptr, w] mk "memcpy" i8Ptr [i8Ptr, i8Ptr, w] mk "memmove" i8Ptr [i8Ptr, i8Ptr, w] mk "memset" i8Ptr [i8Ptr, w, w] mk "newSpark" w [i8Ptr, i8Ptr] where mk n ret args = do - let n' = llvmDefLabel $ fsLit n + let n' = fsLit n decl = LlvmFunctionDecl n' ExternallyVisible CC_Ccc ret FixedArgs (tysToParams args) Nothing renderLlvm $ ppLlvmFunctionDecl decl @@ -516,7 +518,10 @@ getGlobalPtr llvmLbl = do let mkGlbVar lbl ty = LMGlobalVar lbl (LMPointer ty) Private Nothing Nothing case m_ty of -- Directly reference if we have seen it already - Just ty -> return $ mkGlbVar (llvmDefLabel llvmLbl) ty Global + Just ty -> do + if llvmLbl `elem` (map fsLit ["newSpark", "memmove", "memcpy", "memcmp", "memset"]) + then return $ mkGlbVar (llvmLbl) ty Global + else return $ mkGlbVar (llvmDefLabel llvmLbl) ty Global -- Otherwise use a forward alias of it Nothing -> do saveAlias llvmLbl |