Avoid generating empty llvm.used definitions.
authorGeoffrey Mainland <gmainlan@microsoft.com>
Wed, 12 Jun 2013 13:31:49 +0000 (14:31 +0100)
committerGeoffrey Mainland <gmainlan@microsoft.com>
Wed, 12 Jun 2013 13:31:49 +0000 (14:31 +0100)
LLVM 3.3rc3 complains when the llvm.used global is an empty array, so don't
define llvm.used at all when it would be empty.

compiler/llvmGen/LlvmCodeGen.hs

index a157a25..4f2bded 100644 (file)
@@ -117,19 +117,19 @@ cmmProcLlvmGens :: DynFlags -> BufHandle -> UniqSupply -> LlvmEnv -> [RawCmmDecl
       -> [[LlvmVar]] -- ^ info tables that need to be marked as 'used'
       -> IO ()
 
-cmmProcLlvmGens _ _ _ _ [] _ []
-  = return ()
-
 cmmProcLlvmGens dflags h _ _ [] _ ivars
-  = let ivars' = concat ivars
-        cast x = LMBitc (LMStaticPointer (pVarLift x)) i8Ptr
-        ty     = (LMArray (length ivars') i8Ptr)
-        usedArray = LMStaticArray (map cast ivars') ty
-        lmUsed = (LMGlobalVar (fsLit "llvm.used") ty Appending
-                  (Just $ fsLit "llvm.metadata") Nothing False, Just usedArray)
-    in Prt.bufLeftRender h $ {-# SCC "llvm_used_ppr" #-}
-                             withPprStyleDoc dflags (mkCodeStyle CStyle) $
-                             pprLlvmData ([lmUsed], [])
+    | null ivars' = return ()
+    | otherwise   = Prt.bufLeftRender h $
+                        {-# SCC "llvm_used_ppr" #-}
+                        withPprStyleDoc dflags (mkCodeStyle CStyle) $
+                        pprLlvmData ([lmUsed], [])
+  where
+    ivars' = concat ivars
+    cast x = LMBitc (LMStaticPointer (pVarLift x)) i8Ptr
+    ty     = (LMArray (length ivars') i8Ptr)
+    usedArray = LMStaticArray (map cast ivars') ty
+    lmUsed = (LMGlobalVar (fsLit "llvm.used") ty Appending
+              (Just $ fsLit "llvm.metadata") Nothing False, Just usedArray)
 
 cmmProcLlvmGens dflags h us env ((CmmData _ _) : cmms) count ivars
  = cmmProcLlvmGens dflags h us env cmms count ivars