LLVM: Fix bug with osx mangler and jump tables.
[ghc-hetmet.git] / compiler / llvmGen / LlvmMangler.hs
index 7b38ed8..ac187e0 100644 (file)
@@ -29,7 +29,7 @@ jmpInst    = B.pack "\n\tjmp"
 infoLen, spFix, labelStart :: Int
 infoLen = B.length infoSec
 spFix   = 4
-labelStart = B.length jmpInst + 1
+labelStart = B.length jmpInst
 
 -- Search Predicates
 eolPred, dollarPred, commaPred :: Char -> Bool
@@ -114,11 +114,13 @@ fixupStack f f' =
         (a', n) = B.breakEnd dollarPred a
         (n', x) = B.break commaPred n
         num     = B.pack $ show $ readInt n' + spFix
+        -- We need to avoid processing jumps to labels, they are of the form:
+        -- jmp\tL..., jmp\t_f..., jmpl\t_f..., jmpl\t*%eax..., jmpl *L...
+        targ = B.dropWhile ((==)'*') $ B.drop 1 $ B.dropWhile ((/=)'\t') $
+                B.drop labelStart c
     in if B.null c
           then f' `B.append` f
-          -- We need to avoid processing jumps to labels, they are of the form:
-          -- jmp\tL..., jmp\t_f..., jmpl\t_f..., jmpl\t*%eax...
-          else if B.index c labelStart == 'L'
+          else if B.head targ == 'L'
                 then fixupStack b $ f' `B.append` a `B.append` l
                 else fixupStack b $ f' `B.append` a' `B.append` num `B.append`
                                     x `B.append` l