Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
R
rtree
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
chrg
rtree
Commits
211f5ac9
Commit
211f5ac9
authored
2 weeks ago
by
chrg
Browse files
Options
Downloads
Patches
Plain Diff
Small cleanup operation
parent
5c35709f
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
rtree-c/src/ReduceC.hs
+136
-105
136 additions, 105 deletions
rtree-c/src/ReduceC.hs
with
136 additions
and
105 deletions
rtree-c/src/ReduceC.hs
+
136
−
105
View file @
211f5ac9
...
...
@@ -26,21 +26,52 @@ module ReduceC (
prettyIdent
,
)
where
import
Control.Applicative
import
Control.Monad
import
Control.Applicative
(
Alternative
(
empty
,
(
<|>
)))
import
Control.Monad
(
MonadPlus
(
mzero
),
foldM
,
forM
,
forM_
,
guard
,
join
,
mapAndUnzipM
,
unless
,
void
,
when
,
)
import
qualified
Control.Monad.IRTree
as
IRTree
import
Control.Monad.Reduce
import
Control.Monad.State
import
Control.Monad.Trans.Maybe
import
Data.Function
import
Data.Functor
import
Control.Monad.Reduce
(
MonadReduce
(
split
),
collect
,
exceptIf
,
liftMaybe
,
)
import
Control.Monad.State
(
MonadState
(
get
,
state
),
MonadTrans
(
lift
),
State
,
StateT
(
runStateT
),
evalState
,
evalStateT
,
gets
,
modify'
,
runState
,
)
import
Control.Monad.Trans.Maybe
(
MaybeT
(
runMaybeT
))
import
Data.Function
((
&
))
import
Data.Functor
((
$>
),
(
<&>
))
import
qualified
Data.List
as
List
import
qualified
Data.List.NonEmpty
as
NonEmpty
import
qualified
Data.Map.Strict
as
Map
import
Data.Maybe
import
Data.Maybe
(
catMaybes
,
fromMaybe
,
isJust
,
isNothing
,
mapMaybe
,
)
import
qualified
Data.Set
as
Set
import
Data.Vector.Internal.Check
(
HasCallStack
)
import
Debug.Pretty.Simple
import
qualified
Language.C
as
C
import
qualified
Language.C.Data.Ident
as
C
import
qualified
Language.C.Data.Node
as
C
...
...
@@ -53,11 +84,11 @@ defaultReduceC :: (MonadReduce (String, C.Position) m) => C.CTranslUnit -> m C.C
defaultReduceC
a
=
reduceCTranslUnit
a
defaultContext
{-# SPECIALIZE defaultReduceC :: C.CTranslUnit -> IRTree.IRTree (String, C.Position) C.CTranslUnit #-}
reduceCTranslUnit
::
(
MonadReduce
Lab
m
)
=>
C
.
CTranslationUnit
C
.
NodeInfo
->
Context
->
m
(
C
.
CTranslationUnit
C
.
NodeInfo
)
reduceCTranslUnit
::
(
MonadReduce
Lab
m
)
=>
C
.
CTranslationUnit
C
.
NodeInfo
->
Context
->
m
(
C
.
CTranslationUnit
C
.
NodeInfo
)
reduceCTranslUnit
(
C
.
CTranslUnit
es
ni
)
ctx
=
do
let
_functions
=
foldMap
(
findFunctions
(
:
[]
))
es
...
...
@@ -153,24 +184,24 @@ keepAll = SpecifierFilter{sfKeepStatic = True}
{- | Update the CDeclarationSpecifier's to match the context. Specifically, update
the typedefs and the structs. Alos return a base type.
-}
updateCDeclarationSpecifiers
::
(
MonadState
Context
m
,
MonadPlus
m
)
=>
SpecifierFilter
->
[
C
.
CDeclarationSpecifier
C
.
NodeInfo
]
->
m
(
Voidable
,
[
C
.
CDeclarationSpecifier
C
.
NodeInfo
])
updateCDeclarationSpecifiers
::
(
MonadState
Context
m
,
MonadPlus
m
)
=>
SpecifierFilter
->
[
C
.
CDeclarationSpecifier
C
.
NodeInfo
]
->
m
(
Voidable
,
[
C
.
CDeclarationSpecifier
C
.
NodeInfo
])
updateCDeclarationSpecifiers
sf
spec
=
do
ctx
<-
get
spec'
<-
concat
<$>
mapM
(
updateSpec
ctx
)
spec
bt
<-
baseType
ctx
spec'
pure
(
bt
,
spec'
)
where
baseType
::
(
MonadPlus
m
)
=>
Context
->
[
C
.
CDeclarationSpecifier
C
.
NodeInfo
]
->
m
Voidable
baseType
::
(
MonadPlus
m
)
=>
Context
->
[
C
.
CDeclarationSpecifier
C
.
NodeInfo
]
->
m
Voidable
baseType
ctx
=
liftMaybe
.
exactlyOne
...
...
@@ -305,23 +336,23 @@ updateCDeclarationSpecifiers sf spec = do
a'
->
notSupportedYet'
a'
pure
$
catMaybes
declrs'
updateCDerivedDeclarators
::
forall
m
.
(
MonadState
Context
m
,
MonadPlus
m
)
=>
Voidable
->
[
Bool
]
->
[
C
.
CDerivedDeclarator
C
.
NodeInfo
]
->
m
(
Voidable
,
[
C
.
CDerivedDeclarator
C
.
NodeInfo
])
updateCDerivedDeclarators
::
forall
m
.
(
MonadState
Context
m
,
MonadPlus
m
)
=>
Voidable
->
[
Bool
]
->
[
C
.
CDerivedDeclarator
C
.
NodeInfo
]
->
m
(
Voidable
,
[
C
.
CDerivedDeclarator
C
.
NodeInfo
])
updateCDerivedDeclarators
bt
ff
dd
=
do
foldM
applyDD
(
bt
,
[]
)
(
reverse
dd
)
where
applyDD
::
(
r
~
(
Voidable
,
[
C
.
CDerivedDeclarator
C
.
NodeInfo
]))
=>
r
->
C
.
CDerivedDeclarator
C
.
NodeInfo
->
m
r
applyDD
::
(
r
~
(
Voidable
,
[
C
.
CDerivedDeclarator
C
.
NodeInfo
]))
=>
r
->
C
.
CDerivedDeclarator
C
.
NodeInfo
->
m
r
applyDD
(
t
,
dd'
)
d
=
case
d
of
C
.
CPtrDeclr
_
_
->
do
pure
(
NonVoid
.
TPointer
$
t
,
d
:
dd'
)
...
...
@@ -335,10 +366,10 @@ updateCDerivedDeclarators bt ff dd = do
pure
(
t'
,
C
.
CFunDeclr
(
C
.
CFunParamsNew
params''
varadic
)
arr
ni
:
dd'
)
b
->
notSupportedYet
b
ni
findParams
::
Bool
->
[
C
.
CDeclaration
C
.
NodeInfo
]
->
State
Context
(
Params
,
[
C
.
CDeclaration
C
.
NodeInfo
])
findParams
::
Bool
->
[
C
.
CDeclaration
C
.
NodeInfo
]
->
State
Context
(
Params
,
[
C
.
CDeclaration
C
.
NodeInfo
])
findParams
varadic
decls
=
case
decls
of
[
C
.
CDecl
[
C
.
CTypeSpec
(
C
.
CVoidType
_
)]
[]
_
]
->
pure
(
VoidParams
,
decls
)
...
...
@@ -374,10 +405,10 @@ updateCDerivedDeclarators bt ff dd = do
Nothing
->
(
Nothing
,
[]
)
pure
(
Params
ts
varadic
,
concat
decls'
)
reduceCExternalDeclaration
::
(
HasCallStack
,
MonadReduce
Lab
m
)
=>
C
.
CExternalDeclaration
C
.
NodeInfo
->
StateT
Context
m
(
Maybe
(
C
.
CExternalDeclaration
C
.
NodeInfo
))
reduceCExternalDeclaration
::
(
HasCallStack
,
MonadReduce
Lab
m
)
=>
C
.
CExternalDeclaration
C
.
NodeInfo
->
StateT
Context
m
(
Maybe
(
C
.
CExternalDeclaration
C
.
NodeInfo
))
reduceCExternalDeclaration
r
=
case
r
of
C
.
CFDefExt
(
C
.
CFunDef
spec
declr
[]
stmt
ni
)
->
runMaybeT
do
ctx
<-
get
...
...
@@ -499,13 +530,13 @@ isStaticFromSpecs = any \case
{- | This checks the current declaration and reduces any new struct found here.
Returns true if the specifier is requried.
-}
reduceStructDeclaration
::
(
MonadReduce
Lab
m
,
MonadState
Context
m
,
MonadPlus
m
)
=>
[
C
.
CDeclarationSpecifier
C
.
NodeInfo
]
->
m
Bool
reduceStructDeclaration
::
(
MonadReduce
Lab
m
,
MonadState
Context
m
,
MonadPlus
m
)
=>
[
C
.
CDeclarationSpecifier
C
.
NodeInfo
]
->
m
Bool
reduceStructDeclaration
=
fmap
or
.
mapM
\
case
C
.
CTypeSpec
(
C
.
CEnumType
(
C
.
CEnum
mid
mf
_
_
)
ni
)
->
do
...
...
@@ -583,14 +614,14 @@ reduceStructDeclaration =
)
a
@
(
C
.
CStaticAssert
{})
->
notSupportedYet'
a
reduceCDeclarationItem
::
(
MonadReduce
Lab
m
,
MonadState
Context
m
,
MonadPlus
m
)
=>
Voidable
->
C
.
CDeclarationItem
C
.
NodeInfo
->
m
(
C
.
CDeclarationItem
C
.
NodeInfo
)
reduceCDeclarationItem
::
(
MonadReduce
Lab
m
,
MonadState
Context
m
,
MonadPlus
m
)
=>
Voidable
->
C
.
CDeclarationItem
C
.
NodeInfo
->
m
(
C
.
CDeclarationItem
C
.
NodeInfo
)
reduceCDeclarationItem
bt
=
\
case
di
@
(
C
.
CDeclarationItem
(
C
.
CDeclr
mid
dd
Nothing
[]
ni
)
einit
Nothing
)
->
do
ctx
<-
get
...
...
@@ -622,12 +653,12 @@ reduceCDeclarationItem bt = \case
pure
di
a
->
notSupportedYet
a
C
.
undefNode
reduceCInitializer
::
(
MonadReduce
Lab
m
)
=>
Type
->
C
.
CInitializer
C
.
NodeInfo
->
Context
->
m
(
C
.
CInitializer
C
.
NodeInfo
,
Maybe
C
.
CExpr
)
reduceCInitializer
::
(
MonadReduce
Lab
m
)
=>
Type
->
C
.
CInitializer
C
.
NodeInfo
->
Context
->
m
(
C
.
CInitializer
C
.
NodeInfo
,
Maybe
C
.
CExpr
)
reduceCInitializer
t
einit
ctx
=
case
einit
of
C
.
CInitExpr
e
ni2
->
do
e'
<-
fromMaybe
(
pure
zeroExpr
)
$
reduceCExpr
e
(
exactly
t
)
ctx
...
...
@@ -655,11 +686,11 @@ reduceCInitializer t einit ctx = case einit of
pure
items
pure
(
C
.
CInitList
(
C
.
CInitializerList
items'
)
ni2
,
Nothing
)
reduceCCompoundBlockItem
::
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
StmtContext
->
C
.
CCompoundBlockItem
C
.
NodeInfo
->
StateT
Context
m
[
C
.
CCompoundBlockItem
C
.
NodeInfo
]
reduceCCompoundBlockItem
::
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
StmtContext
->
C
.
CCompoundBlockItem
C
.
NodeInfo
->
StateT
Context
m
[
C
.
CCompoundBlockItem
C
.
NodeInfo
]
reduceCCompoundBlockItem
lab
r
=
do
case
r
of
C
.
CBlockStmt
smt
->
do
...
...
@@ -701,24 +732,24 @@ markDeleted = mapM_ \case
modify'
(
addInlineExpr
ix
IEDelete
)
_a
->
pure
()
reduceCStatementOrEmptyBlock
::
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
C
.
CStatement
C
.
NodeInfo
->
StmtContext
->
Context
->
m
(
C
.
CStatement
C
.
NodeInfo
)
reduceCStatementOrEmptyBlock
::
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
C
.
CStatement
C
.
NodeInfo
->
StmtContext
->
Context
->
m
(
C
.
CStatement
C
.
NodeInfo
)
reduceCStatementOrEmptyBlock
stmt
ids
ctx
=
do
fromMaybe
emptyBlock
<$>
runMaybeT
(
wrapCCompound
<$>
reduceCStatement
stmt
ids
ctx
)
reduceCStatementOrEmptyExpr
::
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
C
.
CStatement
C
.
NodeInfo
->
StmtContext
->
Context
->
m
(
C
.
CStatement
C
.
NodeInfo
)
reduceCStatementOrEmptyExpr
::
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
C
.
CStatement
C
.
NodeInfo
->
StmtContext
->
Context
->
m
(
C
.
CStatement
C
.
NodeInfo
)
reduceCStatementOrEmptyExpr
stmt
ids
ctx
=
do
fromMaybe
(
C
.
CExpr
Nothing
C
.
undefNode
)
<$>
runMaybeT
(
reduceCStatement
stmt
ids
ctx
)
...
...
@@ -742,13 +773,13 @@ exactly :: Type -> EType
exactly
c
=
EType
(
ETExactly
c
)
False
-- | Reduce given a list of required labels reduce a c statement, possibly into nothingness.
reduceCStatement
::
forall
m
.
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
C
.
CStatement
C
.
NodeInfo
->
StmtContext
->
Context
->
MaybeT
m
(
C
.
CStatement
C
.
NodeInfo
)
reduceCStatement
::
forall
m
.
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
C
.
CStatement
C
.
NodeInfo
->
StmtContext
->
Context
->
MaybeT
m
(
C
.
CStatement
C
.
NodeInfo
)
reduceCStatement
smt
labs
ctx
=
case
smt
of
C
.
CCompound
is
cbi
ni
->
do
cbi'
<-
lift
$
evalStateT
(
mapM
(
reduceCCompoundBlockItem
labs
)
cbi
)
ctx
...
...
@@ -1046,13 +1077,13 @@ inferType ctx = \case
inferType
ctx
(
List
.
last
items
)
a
->
notSupportedYet'
a
reduceCExpr
::
forall
m
.
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
C
.
CExpr
->
EType
->
Context
->
Maybe
(
m
C
.
CExpr
)
reduceCExpr
::
forall
m
.
(
MonadReduce
Lab
m
,
HasCallStack
)
=>
C
.
CExpr
->
EType
->
Context
->
Maybe
(
m
C
.
CExpr
)
reduceCExpr
expr
t
ctx
=
case
expr
of
C
.
CBinary
o
elhs
erhs
ni
->
do
msplit
(
"reduce to left"
,
C
.
posOf
elhs
)
(
reduceCExpr
elhs
t
ctx
)
do
...
...
@@ -1365,11 +1396,11 @@ data Function = Function
}
deriving
(
Show
,
Eq
)
findFunctions
::
(
Monoid
m
)
=>
(
Function
->
m
)
->
C
.
CExternalDeclaration
C
.
NodeInfo
->
m
findFunctions
::
(
Monoid
m
)
=>
(
Function
->
m
)
->
C
.
CExternalDeclaration
C
.
NodeInfo
->
m
findFunctions
inject
=
\
case
C
.
CFDefExt
(
C
.
CFunDef
spec
declr
[]
_
ni
)
->
findFunctionsInDeclarator
ni
spec
declr
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment