From e82e703e065f00f8c4a6a39be4751b80754fd5e2 Mon Sep 17 00:00:00 2001 From: David Terei Date: Sun, 1 May 2011 19:50:03 +1000 Subject: [PATCH] LLVM: Fix bug with osx mangler and jump tables. --- compiler/llvmGen/LlvmMangler.hs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/compiler/llvmGen/LlvmMangler.hs b/compiler/llvmGen/LlvmMangler.hs index 7b38ed8..ac187e0 100644 --- a/compiler/llvmGen/LlvmMangler.hs +++ b/compiler/llvmGen/LlvmMangler.hs @@ -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 -- 1.7.10.4