busybox: get rid of nested functions in find
authorMuhammad Tauqir Ahmad <mian.muhammad.tauqir.ahmad@gmail.com>
Fri, 13 Dec 2013 19:25:57 +0000 (14:25 -0500)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 16 Dec 2013 12:13:58 +0000 (12:13 +0000)
This allows us to compile busybox using clang. Nested functions is
a gcc extension not supported by clang.

(From OE-Core rev: d2bf599f36ed1a04c661fc0a71e664e219532cbc)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/recipes-core/busybox/busybox/find-get-rid-of-nested-functions.patch [new file with mode: 0644]
meta/recipes-core/busybox/busybox_1.21.1.bb

diff --git a/meta/recipes-core/busybox/busybox/find-get-rid-of-nested-functions.patch b/meta/recipes-core/busybox/busybox/find-get-rid-of-nested-functions.patch
new file mode 100644 (file)
index 0000000..d66ef79
--- /dev/null
@@ -0,0 +1,117 @@
+Upstream-Status: Accepted
+
+commit 6db5f679a21342249e6a6eb06ec70a337bf0d0b0
+Author: Denys Vlasenko <vda.linux@googlemail.com>
+Date:   Thu May 16 18:36:42 2013 +0200
+
+find:: get rid of nested function (it's a gcc-ism)
+
+function                                             old     new   delta
+alloc_action                                           -      80     +80
+parse_params                                        1459    1445     -14
+static.alloc_action                                   98       -     -98
+
+(add/remove: 1/1 grow/shrink: 0/1 up/down: 80/-112)           Total: -32 bytes
+
+Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
+
+diff --git a/findutils/find.c b/findutils/find.c
+index d4b7c8e..af913cc 100644
+--- a/findutils/find.c
++++ b/findutils/find.c
+@@ -815,6 +815,31 @@ static const char* plus_minus_num(const char* str)
+ }
+ #endif
++/* Say no to GCCism */
++#define USE_NESTED_FUNCTION 0
++
++#if !USE_NESTED_FUNCTION
++struct pp_locals {
++      action*** appp;
++      unsigned cur_group;
++      unsigned cur_action;
++      IF_FEATURE_FIND_NOT( bool invert_flag; )
++};
++static action* alloc_action(struct pp_locals *ppl, int sizeof_struct, action_fp f)
++{
++      action *ap = xzalloc(sizeof_struct);
++      action **app;
++      action ***group = &ppl->appp[ppl->cur_group];
++      *group = app = xrealloc(*group, (ppl->cur_action+2) * sizeof(ppl->appp[0][0]));
++      app[ppl->cur_action++] = ap;
++      app[ppl->cur_action] = NULL;
++      ap->f = f;
++      IF_FEATURE_FIND_NOT( ap->invert = ppl->invert_flag; )
++      IF_FEATURE_FIND_NOT( ppl->invert_flag = 0; )
++      return ap;
++}
++#endif
++
+ static action*** parse_params(char **argv)
+ {
+       enum {
+@@ -901,10 +926,18 @@ static action*** parse_params(char **argv)
+       IF_FEATURE_FIND_MAXDEPTH("-mindepth\0""-maxdepth\0")
+       ;
++#if !USE_NESTED_FUNCTION
++      struct pp_locals ppl;
++#define appp        (ppl.appp       )
++#define cur_group   (ppl.cur_group  )
++#define cur_action  (ppl.cur_action )
++#define invert_flag (ppl.invert_flag)
++#define ALLOC_ACTION(name) (action_##name*)alloc_action(&ppl, sizeof(action_##name), (action_fp) func_##name)
++#else
+       action*** appp;
+-      unsigned cur_group = 0;
+-      unsigned cur_action = 0;
+-      IF_FEATURE_FIND_NOT( bool invert_flag = 0; )
++      unsigned cur_group;
++      unsigned cur_action;
++      IF_FEATURE_FIND_NOT( bool invert_flag; )
+       /* This is the only place in busybox where we use nested function.
+        * So far more standard alternatives were bigger. */
+@@ -913,7 +946,7 @@ static action*** parse_params(char **argv)
+       action* alloc_action(int sizeof_struct, action_fp f)
+       {
+               action *ap;
+-              appp[cur_group] = xrealloc(appp[cur_group], (cur_action+2) * sizeof(*appp));
++              appp[cur_group] = xrealloc(appp[cur_group], (cur_action+2) * sizeof(appp[0][0]));
+               appp[cur_group][cur_action++] = ap = xzalloc(sizeof_struct);
+               appp[cur_group][cur_action] = NULL;
+               ap->f = f;
+@@ -921,9 +954,12 @@ static action*** parse_params(char **argv)
+               IF_FEATURE_FIND_NOT( invert_flag = 0; )
+               return ap;
+       }
+-
+ #define ALLOC_ACTION(name) (action_##name*)alloc_action(sizeof(action_##name), (action_fp) func_##name)
++#endif
++      cur_group = 0;
++      cur_action = 0;
++      IF_FEATURE_FIND_NOT( invert_flag = 0; )
+       appp = xzalloc(2 * sizeof(appp[0])); /* appp[0],[1] == NULL */
+       while (*argv) {
+@@ -988,7 +1024,7 @@ static action*** parse_params(char **argv)
+                       dbg("%d", __LINE__);
+                       /* start new OR group */
+                       cur_group++;
+-                      appp = xrealloc(appp, (cur_group+2) * sizeof(*appp));
++                      appp = xrealloc(appp, (cur_group+2) * sizeof(appp[0]));
+                       /*appp[cur_group] = NULL; - already NULL */
+                       appp[cur_group+1] = NULL;
+                       cur_action = 0;
+@@ -1246,6 +1282,9 @@ static action*** parse_params(char **argv)
+       dbg("exiting %s", __func__);
+       return appp;
+ #undef ALLOC_ACTION
++#undef appp
++#undef cur_action
++#undef invert_flag
+ }
+ int find_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
index 8b91e63..267604a 100644 (file)
@@ -34,6 +34,7 @@ SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \
            file://login-utilities.cfg \
            file://busybox-list-suid-and-non-suid-app-configs.patch \
            file://busybox-sed-fix-sed-clusternewline-testcase.patch \
+           file://find-get-rid-of-nested-functions.patch \
 "
 
 SRC_URI[tarball.md5sum] = "795394f83903b5eec6567d51eebb417e"