Skip to content

Commit 9de3228

Browse files
committed
Generalise function/subroutine call matching / handling to deal with intrinsics as well as ordinary func/sub names.
1 parent 33d604a commit 9de3228

File tree

4 files changed

+22
-15
lines changed

4 files changed

+22
-15
lines changed

src/Language/Fortran/Analysis/BBlocks.hs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,13 +364,13 @@ perBlock b@(BlStatement _ _ _ (StReturn {})) =
364364
processLabel b >> addToBBlock b >> closeBBlock_
365365
perBlock b@(BlStatement _ _ _ (StGotoUnconditional {})) =
366366
processLabel b >> addToBBlock b >> closeBBlock_
367-
perBlock b@(BlStatement a s l (StCall a' s' cn@(ExpValue _ _ (ValVariable {})) Nothing)) = do
367+
perBlock b@(BlStatement a s l (StCall a' s' cn@(ExpValue _ _ _) Nothing)) = do
368368
(prevN, callN) <- closeBBlock
369369
-- put StCall in a bblock by itself
370370
addToBBlock b
371371
(_, nextN) <- closeBBlock
372372
createEdges [ (prevN, callN, ()), (callN, nextN, ()) ]
373-
perBlock b@(BlStatement a s l (StCall a' s' cn@(ExpValue _ _ (ValVariable {})) (Just aargs))) = do
373+
perBlock b@(BlStatement a s l (StCall a' s' cn@(ExpValue _ _ _) (Just aargs))) = do
374374
let exps = map extractExp . aStrip $ aargs
375375
(prevN, formalN) <- closeBBlock
376376

@@ -495,7 +495,7 @@ processFunctionCalls = transformBiM processFunctionCall -- work bottom-up
495495
-- Flatten out a single function call.
496496
processFunctionCall :: Data a => Expression (Analysis a) -> BBlocker (Analysis a) (Expression (Analysis a))
497497
-- precondition: there are no more nested function calls within the actual arguments
498-
processFunctionCall (ExpFunctionCall a s fn@(ExpValue a' s' (ValVariable _)) aargs) = do
498+
processFunctionCall (ExpFunctionCall a s fn@(ExpValue a' s' _) aargs) = do
499499
let a0 = head . initAnalysis $ [prevAnnotation a]
500500
(prevN, formalN) <- closeBBlock
501501

@@ -588,7 +588,7 @@ genSuperBBGr bbm = SuperBBGr { graph = superGraph'', clusters = cmap, entries =
588588
-- Assumption: all StCalls appear by themselves in a bblock.
589589
stCalls :: [(SuperNode, String)]
590590
stCalls = [ (getSuperNode n, sub) | (n, [BlStatement _ _ _ (StCall _ _ e Nothing)]) <- namedNodes
591-
, v@(ExpValue _ _ (ValVariable _)) <- [e]
591+
, v@(ExpValue _ _ _) <- [e]
592592
, let sub = varName v
593593
, Named sub `M.member` entryMap && Named sub `M.member` exitMap ]
594594
stCallCtxts :: [([SuperEdge], SuperNode, String, [SuperEdge])]
@@ -737,6 +737,7 @@ showLab Nothing = replicate 6 ' '
737737
showLab (Just (ExpValue _ _ (ValInteger l))) = ' ':l ++ replicate (5 - length l) ' '
738738

739739
showValue (ValVariable v) = v
740+
showValue (ValIntrinsic v) = v
740741
showValue (ValInteger v) = v
741742
showValue (ValReal v) = v
742743
showValue (ValComplex e1 e2) = "( " ++ showExpr e1 ++ " , " ++ showExpr e2 ++ " )"

src/Language/Fortran/Analysis/DataFlow.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -588,8 +588,8 @@ genCallMap pf = flip execState M.empty $ do
588588
let uE :: Data a => ProgramUnit a -> [Expression a]
589589
uE = universeBi
590590
m <- get
591-
let ns = [ varName v | StCall _ _ v@(ExpValue _ _ (ValVariable _ )) _ <- uS pu ] ++
592-
[ varName v | ExpFunctionCall _ _ v@(ExpValue _ _ (ValVariable _)) _ <- uE pu ]
591+
let ns = [ varName v | StCall _ _ v@(ExpValue _ _ _) _ <- uS pu ] ++
592+
[ varName v | ExpFunctionCall _ _ v@(ExpValue _ _ _) _ <- uE pu ]
593593
put $ M.insert n (S.fromList ns) m
594594

595595
--------------------------------------------------

src/Language/Fortran/Analysis/Renaming.hs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ rename pf = trPU fPU (trE fE pf)
7373
trE :: Data a => (Expression a -> Expression a) -> ProgramFile a -> ProgramFile a
7474
trE = transformBi
7575
fE :: Data a => Expression (Analysis a) -> Expression (Analysis a)
76-
fE (ExpValue a s (ValVariable v)) = ExpValue a s . ValVariable $ fromMaybe v (uniqueName a)
77-
fE x = x
76+
fE (ExpValue a s (ValVariable v)) = ExpValue a s . ValVariable $ fromMaybe v (uniqueName a)
77+
fE (ExpValue a s (ValIntrinsic v)) = ExpValue a s . ValIntrinsic $ fromMaybe v (uniqueName a)
78+
fE x = x
7879

7980
trPU :: Data a => (ProgramUnit a -> ProgramUnit a) -> ProgramFile a -> ProgramFile a
8081
trPU = transformBi
@@ -92,8 +93,9 @@ unrename pf = trPU fPU . trE fE $ pf
9293
trE :: Data a => (Expression (Analysis a) -> Expression (Analysis a)) -> ProgramFile (Analysis a) -> ProgramFile (Analysis a)
9394
trE = transformBi
9495
fE :: Data a => Expression (Analysis a) -> Expression (Analysis a)
95-
fE e@(ExpValue a s (ValVariable _)) = ExpValue a s (ValVariable (srcName e))
96-
fE e = e
96+
fE e@(ExpValue a s (ValVariable _)) = ExpValue a s (ValVariable (srcName e))
97+
fE e@(ExpValue a s (ValIntrinsic _)) = ExpValue a s (ValIntrinsic (srcName e))
98+
fE e = e
9799

98100
trPU :: Data a => (ProgramUnit (Analysis a) -> ProgramUnit (Analysis a)) -> ProgramFile (Analysis a) -> ProgramFile (Analysis a)
99101
trPU = transformBi
@@ -111,7 +113,7 @@ unrename pf = trPU fPU . trE fE $ pf
111113
extractNameMap :: Data a => ProgramFile (Analysis a) -> NameMap
112114
extractNameMap pf = eMap `union` puMap
113115
where
114-
eMap = fromList [ (un, n) | ExpValue (Analysis { uniqueName = Just un }) _ (ValVariable n) <- uniE pf ]
116+
eMap = fromList [ (un, srcName e) | e@(ExpValue (Analysis { uniqueName = Just un }) _ _) <- uniE pf ]
115117
puMap = fromList [ (un, n) | pu <- uniPU pf, Named un <- [puName pu], Named n <- [getName pu], n /= un ]
116118
uniE :: Data a => ProgramFile a -> [Expression a]
117119
uniE = universeBi
@@ -393,8 +395,10 @@ renameGenericDecls = trans renameExpDecl
393395
-- declaration that possibly requires the creation of a new unique
394396
-- mapping.
395397
renameExpDecl :: Data a => RenamerFunc (Expression (Analysis a))
396-
renameExpDecl e@(ExpValue _ _ (ValVariable v)) = flip setUniqueName (setSourceName v e) `fmap` maybeAddUnique v NTVariable
397-
renameExpDecl e = return e
398+
renameExpDecl e@(ExpValue _ _ (ValVariable v)) = flip setUniqueName (setSourceName v e) `fmap` maybeAddUnique v NTVariable
399+
-- Intrinsics get unique names for each use.
400+
renameExpDecl e@(ExpValue _ _ (ValIntrinsic v)) = flip setUniqueName (setSourceName v e) `fmap` addUnique v NTVariable
401+
renameExpDecl e = return e
398402

399403
-- Find all declarators within a value and then dive within those
400404
-- declarators to rename any ExpValue variables, assuming they might
@@ -429,6 +433,7 @@ renameEntryPointResultDecl b = return b
429433
-- reference to a previous declaration, possibly in an outer scope.
430434
renameExp :: Data a => RenamerFunc (Expression (Analysis a))
431435
renameExp e@(ExpValue _ _ (ValVariable v)) = maybe e (flip setUniqueName (setSourceName v e)) `fmap` getFromEnvs v
436+
-- FIXME: do Intrinsics need handling here?
432437
renameExp e = return e
433438

434439
-- Rename all ExpValue variables found within the block, assuming that

src/Language/Fortran/Analysis/Types.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,9 @@ statement (StDimension _ _ declAList) = do
159159
statement _ = return ()
160160

161161
annotateExpression :: Data a => Expression (Analysis a) -> Infer (Expression (Analysis a))
162-
annotateExpression e@(ExpValue _ _ (ValVariable _)) = maybe e (flip setIDType e) `fmap` getRecordedType (varName e)
163-
annotateExpression e = return e
162+
annotateExpression e@(ExpValue _ _ (ValVariable _)) = maybe e (flip setIDType e) `fmap` getRecordedType (varName e)
163+
annotateExpression e@(ExpValue _ _ (ValIntrinsic _)) = maybe e (flip setIDType e) `fmap` getRecordedType (varName e)
164+
annotateExpression e = return e
164165

165166
annotateProgramUnit :: Data a => ProgramUnit (Analysis a) -> Infer (ProgramUnit (Analysis a))
166167
annotateProgramUnit pu | Named n <- puName pu = maybe pu (flip setIDType pu) `fmap` getRecordedType n

0 commit comments

Comments
 (0)