From 34e7d5374122e3d5deb88e3a444b6e5df91dbd04 Mon Sep 17 00:00:00 2001 From: Christian Gram Kalhauge <chrg@dtu.dk> Date: Mon, 26 Feb 2024 15:40:10 +0100 Subject: [PATCH] Add declaration and definition case --- flake.nix | 18 ++++++++++++------ rtree-c/src/ReduceC.hs | 16 ++++++++++------ rtree-c/test/cases/small/declaration.c | 5 +++++ rtree-c/test/cases/small/definition.c | 7 +++++++ rtree-c/test/expected/declaration/main.c | 5 +++++ .../test/expected/declaration/reduction/r000.c | 9 +++++++++ .../test/expected/declaration/reduction/r001.c | 9 +++++++++ .../test/expected/declaration/reduction/r01.c | 7 +++++++ .../test/expected/declaration/reduction/r1.c | 5 +++++ rtree-c/test/expected/definition/main.c | 8 ++++++++ .../expected/definition/reduction/r00000.c | 14 ++++++++++++++ .../expected/definition/reduction/r00001.c | 14 ++++++++++++++ .../test/expected/definition/reduction/r0001.c | 12 ++++++++++++ .../expected/definition/reduction/r00100.c | 14 ++++++++++++++ .../expected/definition/reduction/r00101.c | 14 ++++++++++++++ .../test/expected/definition/reduction/r0011.c | 12 ++++++++++++ .../test/expected/definition/reduction/r0100.c | 12 ++++++++++++ .../test/expected/definition/reduction/r0101.c | 12 ++++++++++++ .../test/expected/definition/reduction/r011.c | 10 ++++++++++ .../test/expected/definition/reduction/r10.c | 7 +++++++ .../test/expected/definition/reduction/r11.c | 6 ++++++ 21 files changed, 204 insertions(+), 12 deletions(-) create mode 100644 rtree-c/test/cases/small/declaration.c create mode 100644 rtree-c/test/cases/small/definition.c create mode 100644 rtree-c/test/expected/declaration/main.c create mode 100644 rtree-c/test/expected/declaration/reduction/r000.c create mode 100644 rtree-c/test/expected/declaration/reduction/r001.c create mode 100644 rtree-c/test/expected/declaration/reduction/r01.c create mode 100644 rtree-c/test/expected/declaration/reduction/r1.c create mode 100644 rtree-c/test/expected/definition/main.c create mode 100644 rtree-c/test/expected/definition/reduction/r00000.c create mode 100644 rtree-c/test/expected/definition/reduction/r00001.c create mode 100644 rtree-c/test/expected/definition/reduction/r0001.c create mode 100644 rtree-c/test/expected/definition/reduction/r00100.c create mode 100644 rtree-c/test/expected/definition/reduction/r00101.c create mode 100644 rtree-c/test/expected/definition/reduction/r0011.c create mode 100644 rtree-c/test/expected/definition/reduction/r0100.c create mode 100644 rtree-c/test/expected/definition/reduction/r0101.c create mode 100644 rtree-c/test/expected/definition/reduction/r011.c create mode 100644 rtree-c/test/expected/definition/reduction/r10.c create mode 100644 rtree-c/test/expected/definition/reduction/r11.c diff --git a/flake.nix b/flake.nix index 17d5a3d..b02a825 100644 --- a/flake.nix +++ b/flake.nix @@ -16,10 +16,12 @@ nix-filter, ... } @ inputs: let - load = p: n: { + load = final: p: n: { "${n}" = - p.callCabal2nixWithOptions n - (nix-filter.lib {root = "${self}/${n}";}) "" {}; + final.haskell.lib.overrideCabal + (p.callCabal2nixWithOptions n (nix-filter.lib {root = "${self}/${n}";}) "" {}) { + doCheck = true; + }; }; packages = final: p: { @@ -29,8 +31,8 @@ doCheck = false; }; } - // load p "rtree" - // load p "rtree-c"; + // load final p "rtree" + // load final p "rtree-c"; overlays = final: prev: { haskellPackages = prev.haskellPackages.extend (p: _: packages final p); }; @@ -67,8 +69,12 @@ hpkgs.shellFor { name = "rtree-shells"; - packages = p: [p.rtree p.rtree-c]; + packages = p: [ + p.rtree + p.rtree-c + ]; doBenchmark = true; + doCheck = true; inherit nativeBuildInputs withHoogle; }; }; diff --git a/rtree-c/src/ReduceC.hs b/rtree-c/src/ReduceC.hs index a537682..68a211a 100644 --- a/rtree-c/src/ReduceC.hs +++ b/rtree-c/src/ReduceC.hs @@ -121,7 +121,9 @@ reduceCExternalDeclaration r cont ctx = do | otherwise -> split ("remove function " <> maybe "" C.identToString (functionName fun), C.posOf r) (cont ctx) do r' <- C.CFDefExt <$> reduceCFunDef fun ctx - (r' :) <$> cont ctx + (r' :) <$> case functionName fun of + Just fid -> cont (addInlineExpr fid (C.CVar fid C.undefNode) ctx) + Nothing -> cont ctx C.CDeclExt result -> case result of -- A typedef @@ -206,7 +208,7 @@ reduceCDeclarationItem d ma = case d of , addInlineExpr i (C.CVar i ni) ctx ) ) - C.CDeclarationItem (C.CDeclr (Just i) [] Nothing [] ni) Nothing Nothing -> do + C.CDeclarationItem (C.CDeclr (Just i) _ Nothing [] ni) Nothing Nothing -> do (ds, ctx) <- ma split ("remove variable " <> C.identToString i, C.posOf ni) @@ -417,12 +419,14 @@ reduceCExpr expr ctx = case expr of Just $ split ("reduce to operant", C.posOf expr) elhs' do e <- elhs' pure $ C.CUnary o e ni + C.CCall e es ni -> do + re <- reduceCExpr e (addKeyword DisallowVariableInlining ctx) + Just $ do + e' <- re + es' <- traverse (`reduceCExprOrZero` ctx) es + pure $ C.CCall e' es' ni a -> error (show a) --- C.CCall e es ni -> do --- e' <- reduce e --- es' <- traverse (fmap orZero reduce) es --- pure $ C.CCall e' es' ni -- C.CCond ec et ef ni -> do -- ec' <- reduce ec -- ef' <- reduce ef diff --git a/rtree-c/test/cases/small/declaration.c b/rtree-c/test/cases/small/declaration.c new file mode 100644 index 0000000..392baeb --- /dev/null +++ b/rtree-c/test/cases/small/declaration.c @@ -0,0 +1,5 @@ +int printf(const char *, ...); + +int main () { + printf("Hello, World!"); +} diff --git a/rtree-c/test/cases/small/definition.c b/rtree-c/test/cases/small/definition.c new file mode 100644 index 0000000..6f5c3c6 --- /dev/null +++ b/rtree-c/test/cases/small/definition.c @@ -0,0 +1,7 @@ +int f() { + return 0; +} + +int main() { + return f(); +} diff --git a/rtree-c/test/expected/declaration/main.c b/rtree-c/test/expected/declaration/main.c new file mode 100644 index 0000000..a4f1728 --- /dev/null +++ b/rtree-c/test/expected/declaration/main.c @@ -0,0 +1,5 @@ +int printf(const char *, ...); +int main() +{ + printf("Hello, World!"); +} diff --git a/rtree-c/test/expected/declaration/reduction/r000.c b/rtree-c/test/expected/declaration/reduction/r000.c new file mode 100644 index 0000000..5f46ee7 --- /dev/null +++ b/rtree-c/test/expected/declaration/reduction/r000.c @@ -0,0 +1,9 @@ +// 0 remove variable printf at ("test/cases/small/declaration.c": line 1) +// 0 remove statement at ("test/cases/small/declaration.c": line 4) +// 0 replace by zero at ("test/cases/small/declaration.c": line 4) + +int printf(const char *, ...); +int main() +{ + printf("Hello, World!"); +} diff --git a/rtree-c/test/expected/declaration/reduction/r001.c b/rtree-c/test/expected/declaration/reduction/r001.c new file mode 100644 index 0000000..bca00a7 --- /dev/null +++ b/rtree-c/test/expected/declaration/reduction/r001.c @@ -0,0 +1,9 @@ +// 0 remove variable printf at ("test/cases/small/declaration.c": line 1) +// 0 remove statement at ("test/cases/small/declaration.c": line 4) +// 1 replace by zero at ("test/cases/small/declaration.c": line 4) + +int printf(const char *, ...); +int main() +{ + printf(0); +} diff --git a/rtree-c/test/expected/declaration/reduction/r01.c b/rtree-c/test/expected/declaration/reduction/r01.c new file mode 100644 index 0000000..91b9bce --- /dev/null +++ b/rtree-c/test/expected/declaration/reduction/r01.c @@ -0,0 +1,7 @@ +// 0 remove variable printf at ("test/cases/small/declaration.c": line 1) +// 1 remove statement at ("test/cases/small/declaration.c": line 4) + +int printf(const char *, ...); +int main() +{ +} diff --git a/rtree-c/test/expected/declaration/reduction/r1.c b/rtree-c/test/expected/declaration/reduction/r1.c new file mode 100644 index 0000000..597b7b8 --- /dev/null +++ b/rtree-c/test/expected/declaration/reduction/r1.c @@ -0,0 +1,5 @@ +// 1 remove variable printf at ("test/cases/small/declaration.c": line 1) + +int main() +{ +} diff --git a/rtree-c/test/expected/definition/main.c b/rtree-c/test/expected/definition/main.c new file mode 100644 index 0000000..ab5b9c1 --- /dev/null +++ b/rtree-c/test/expected/definition/main.c @@ -0,0 +1,8 @@ +int f() +{ + return 0; +} +int main() +{ + return f(); +} diff --git a/rtree-c/test/expected/definition/reduction/r00000.c b/rtree-c/test/expected/definition/reduction/r00000.c new file mode 100644 index 0000000..6970d15 --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r00000.c @@ -0,0 +1,14 @@ +// 0 remove function f at ("test/cases/small/definition.c": line 1) +// 0 remove statement at ("test/cases/small/definition.c": line 2) +// 0 replace by zero at ("test/cases/small/definition.c": line 2) +// 0 remove statement at ("test/cases/small/definition.c": line 6) +// 0 replace by zero at ("test/cases/small/definition.c": line 6) + +int f() +{ + return 0; +} +int main() +{ + return f(); +} diff --git a/rtree-c/test/expected/definition/reduction/r00001.c b/rtree-c/test/expected/definition/reduction/r00001.c new file mode 100644 index 0000000..59d0bfe --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r00001.c @@ -0,0 +1,14 @@ +// 0 remove function f at ("test/cases/small/definition.c": line 1) +// 0 remove statement at ("test/cases/small/definition.c": line 2) +// 0 replace by zero at ("test/cases/small/definition.c": line 2) +// 0 remove statement at ("test/cases/small/definition.c": line 6) +// 1 replace by zero at ("test/cases/small/definition.c": line 6) + +int f() +{ + return 0; +} +int main() +{ + return 0; +} diff --git a/rtree-c/test/expected/definition/reduction/r0001.c b/rtree-c/test/expected/definition/reduction/r0001.c new file mode 100644 index 0000000..c6508aa --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r0001.c @@ -0,0 +1,12 @@ +// 0 remove function f at ("test/cases/small/definition.c": line 1) +// 0 remove statement at ("test/cases/small/definition.c": line 2) +// 0 replace by zero at ("test/cases/small/definition.c": line 2) +// 1 remove statement at ("test/cases/small/definition.c": line 6) + +int f() +{ + return 0; +} +int main() +{ +} diff --git a/rtree-c/test/expected/definition/reduction/r00100.c b/rtree-c/test/expected/definition/reduction/r00100.c new file mode 100644 index 0000000..0a6c0ed --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r00100.c @@ -0,0 +1,14 @@ +// 0 remove function f at ("test/cases/small/definition.c": line 1) +// 0 remove statement at ("test/cases/small/definition.c": line 2) +// 1 replace by zero at ("test/cases/small/definition.c": line 2) +// 0 remove statement at ("test/cases/small/definition.c": line 6) +// 0 replace by zero at ("test/cases/small/definition.c": line 6) + +int f() +{ + return 0; +} +int main() +{ + return f(); +} diff --git a/rtree-c/test/expected/definition/reduction/r00101.c b/rtree-c/test/expected/definition/reduction/r00101.c new file mode 100644 index 0000000..153f431 --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r00101.c @@ -0,0 +1,14 @@ +// 0 remove function f at ("test/cases/small/definition.c": line 1) +// 0 remove statement at ("test/cases/small/definition.c": line 2) +// 1 replace by zero at ("test/cases/small/definition.c": line 2) +// 0 remove statement at ("test/cases/small/definition.c": line 6) +// 1 replace by zero at ("test/cases/small/definition.c": line 6) + +int f() +{ + return 0; +} +int main() +{ + return 0; +} diff --git a/rtree-c/test/expected/definition/reduction/r0011.c b/rtree-c/test/expected/definition/reduction/r0011.c new file mode 100644 index 0000000..db521ec --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r0011.c @@ -0,0 +1,12 @@ +// 0 remove function f at ("test/cases/small/definition.c": line 1) +// 0 remove statement at ("test/cases/small/definition.c": line 2) +// 1 replace by zero at ("test/cases/small/definition.c": line 2) +// 1 remove statement at ("test/cases/small/definition.c": line 6) + +int f() +{ + return 0; +} +int main() +{ +} diff --git a/rtree-c/test/expected/definition/reduction/r0100.c b/rtree-c/test/expected/definition/reduction/r0100.c new file mode 100644 index 0000000..5527e63 --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r0100.c @@ -0,0 +1,12 @@ +// 0 remove function f at ("test/cases/small/definition.c": line 1) +// 1 remove statement at ("test/cases/small/definition.c": line 2) +// 0 remove statement at ("test/cases/small/definition.c": line 6) +// 0 replace by zero at ("test/cases/small/definition.c": line 6) + +int f() +{ +} +int main() +{ + return f(); +} diff --git a/rtree-c/test/expected/definition/reduction/r0101.c b/rtree-c/test/expected/definition/reduction/r0101.c new file mode 100644 index 0000000..473ba0f --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r0101.c @@ -0,0 +1,12 @@ +// 0 remove function f at ("test/cases/small/definition.c": line 1) +// 1 remove statement at ("test/cases/small/definition.c": line 2) +// 0 remove statement at ("test/cases/small/definition.c": line 6) +// 1 replace by zero at ("test/cases/small/definition.c": line 6) + +int f() +{ +} +int main() +{ + return 0; +} diff --git a/rtree-c/test/expected/definition/reduction/r011.c b/rtree-c/test/expected/definition/reduction/r011.c new file mode 100644 index 0000000..19abfa7 --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r011.c @@ -0,0 +1,10 @@ +// 0 remove function f at ("test/cases/small/definition.c": line 1) +// 1 remove statement at ("test/cases/small/definition.c": line 2) +// 1 remove statement at ("test/cases/small/definition.c": line 6) + +int f() +{ +} +int main() +{ +} diff --git a/rtree-c/test/expected/definition/reduction/r10.c b/rtree-c/test/expected/definition/reduction/r10.c new file mode 100644 index 0000000..9b79cd2 --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r10.c @@ -0,0 +1,7 @@ +// 1 remove function f at ("test/cases/small/definition.c": line 1) +// 0 remove statement at ("test/cases/small/definition.c": line 6) + +int main() +{ + return 0; +} diff --git a/rtree-c/test/expected/definition/reduction/r11.c b/rtree-c/test/expected/definition/reduction/r11.c new file mode 100644 index 0000000..69ee6fe --- /dev/null +++ b/rtree-c/test/expected/definition/reduction/r11.c @@ -0,0 +1,6 @@ +// 1 remove function f at ("test/cases/small/definition.c": line 1) +// 1 remove statement at ("test/cases/small/definition.c": line 6) + +int main() +{ +} -- GitLab