From d6ad0ba202fffbd4107c7b6e8701e1cecc8984f2 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Fri, 3 Apr 2009 10:25:55 +0000 Subject: [PATCH] Made the name of record-copying PROCs different for each file that generates them, to avoid clashes at link time --- data/CompState.hs | 2 +- frontends/PreprocessOccam.hs | 2 ++ transformations/SimplifyProcs.hs | 10 +++++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/data/CompState.hs b/data/CompState.hs index 7ed17b7..bbe830d 100644 --- a/data/CompState.hs +++ b/data/CompState.hs @@ -117,7 +117,7 @@ data CompState = CompState { csUnknownStackSize :: Int, -- Set by preprocessor - csCurrentFile :: String, + csCurrentFile :: String, -- Also used by some later passes! csUsedFiles :: Set String, csDefinitions :: Map String PreprocDef, diff --git a/frontends/PreprocessOccam.hs b/frontends/PreprocessOccam.hs index d1e6d12..e7c473f 100644 --- a/frontends/PreprocessOccam.hs +++ b/frontends/PreprocessOccam.hs @@ -393,6 +393,8 @@ runPreprocParser m prod s preprocessOccamProgram :: String -> PassM [Token] preprocessOccamProgram filename = do toks <- preprocessFile emptyMeta filename + -- Leave the main file name in the csCurrentFile slot: + modify $ \cs -> cs { csCurrentFile = filename } veryDebug $ "{{{ tokenised source" veryDebug $ pshow toks veryDebug $ "}}}" diff --git a/transformations/SimplifyProcs.hs b/transformations/SimplifyProcs.hs index 6d2b264..f5bd411 100644 --- a/transformations/SimplifyProcs.hs +++ b/transformations/SimplifyProcs.hs @@ -107,6 +107,10 @@ flattenAssign = pass "Flatten assignment" assign m t@(A.Record _) v m' e = complexAssign m t v m' e assign m _ v m' e = return $ A.Assign m [v] (A.ExpressionList m' [e]) + makeCopyProcName :: A.Name -> PassM A.Name + makeCopyProcName n = do file <- getCompState >>* csCurrentFile + return $ n {A.nameName = "copy_" ++ file ++ A.nameName n} + complexAssign :: Meta -> A.Type -> A.Variable -> Meta -> A.Expression -> PassM A.Process complexAssign m t v m' e = do -- Abbreviate the source and destination, to avoid doing the @@ -138,8 +142,8 @@ flattenAssign = pass "Flatten assignment" (A.ExprVariable m' (A.SubscriptedVariable m' sub srcV)) return $ A.Spec m (A.Specification m counter (A.Rep m rep)) $ A.Only m inner - A.Record n -> - return $ A.Only m $ A.ProcCall m (n {A.nameName = "copy_" ++ A.nameName n}) + A.Record n -> makeCopyProcName n >>= \n' -> + return $ A.Only m $ A.ProcCall m n' [A.ActualVariable destV, A.ActualVariable srcV] return $ A.Seq m $ A.Spec m src $ A.Spec m dest body @@ -161,8 +165,8 @@ flattenAssign = pass "Flatten assignment" (A.ExprVariable m (A.SubscriptedVariable m sub srcV)) | (fName, fType) <- fs] + n' <- makeCopyProcName n let code = A.Seq m $ A.Several m $ map (A.Only m) assigns - n' = n {A.nameName = "copy_" ++ A.nameName n} proc = A.Proc m (A.InlineSpec, A.PlainRec) [A.Formal A.Abbrev t nonceLHS, A.Formal A.ValAbbrev t nonceRHS] code