summaryrefslogtreecommitdiffstats
path: root/discover/parser-utils.h
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-03-18 14:23:23 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-04-29 14:41:04 +1000
commit45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef (patch)
tree2753fb3912c07d23f3e2f622c05043f55c8f24c9 /discover/parser-utils.h
parent5444648fe1ff9b79f3db5ee6feadd51341f59d71 (diff)
downloadtalos-petitboot-45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef.tar.gz
talos-petitboot-45e92aa32a80fdbbf5ad3ad64e34b1ac872018ef.zip
parsers: dynamically register parsers
Currently, we require all parsers to be defined in an array in parsers.c. This change removes this requirement, by introducting a register_parser() macro, which adds a constructor to register the parser with the core parser infrastructure. Because each parser no longer resolves an undefined symbol, we need to use a `ld -r` object for libparser, instead of using libtool, which creates a .a (and hence has no parsers included). Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'discover/parser-utils.h')
-rw-r--r--discover/parser-utils.h17
1 files changed, 11 insertions, 6 deletions
diff --git a/discover/parser-utils.h b/discover/parser-utils.h
index 107f4f3..9096b31 100644
--- a/discover/parser-utils.h
+++ b/discover/parser-utils.h
@@ -8,12 +8,17 @@
#define artwork_pathname(file) (PKG_SHARE_DIR "/artwork/" file)
-#define define_parser(__name, __parse_fn) \
- struct parser \
- __ ## __name ## _parser = { \
- .name = #__name, \
- .parse = __parse_fn, \
- };
+#define __parser_funcname(_n) __register_parser ## _ ## _n
+#define _parser_funcname(_n) __parser_funcname(_n)
+
+#define register_parser(_parser) \
+ static __attribute__((constructor)) \
+ void _parser_funcname(__COUNTER__)(void) \
+ { \
+ __register_parser(&_parser); \
+ }
+
+void __register_parser(struct parser *parser);
void device_add_boot_option(struct device *device,
struct boot_option *boot_option);
OpenPOWER on IntegriCloud