]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
basic: more optimizable IN_SET macro 660/head
authorMichal Schmidt <mschmidt@redhat.com>
Wed, 22 Jul 2015 15:50:44 +0000 (17:50 +0200)
committerMichal Schmidt <mschmidt@redhat.com>
Wed, 22 Jul 2015 17:31:17 +0000 (19:31 +0200)
Making the array static allows gcc -O2 to generate smaller code:

"size systemd" before:
   text    data     bss     dec     hex filename
1377286  128608    2632 1508526  1704ae systemd

After:
   text    data     bss     dec     hex filename
1374326  128572    2664 1505562  16f91a systemd

(IN_SET still results in worse generated code than using
 "x == FOO || x == BAR || ...". I don't think we'll be able to match
 that with the C preprocessor.)

This change limits the use of IN_SET to sets with constant elements. All
present callers use constants. The compiler would report an "initializer
element is not constant" error otherwise.

src/basic/macro.h

index 8fae4d0eded250f91eedd97029d4be5df8d9bd03..ea01d701d29e789d23e36d887462069de8cfd181 100644 (file)
@@ -406,7 +406,7 @@ do {                                                                    \
 
 #define IN_SET(x, y, ...)                                               \
         ({                                                              \
-                const typeof(y) _array[] = { (y), __VA_ARGS__ };        \
+                static const typeof(y) _array[] = { (y), __VA_ARGS__ }; \
                 const typeof(y) _x = (x);                               \
                 unsigned _i;                                            \
                 bool _found = false;                                    \