aboutsummaryrefslogtreecommitdiff
path: root/libyasm/module.in
diff options
context:
space:
mode:
authorPeter Johnson <peter@tortall.net>2004-12-01 07:49:18 +0000
committerPeter Johnson <peter@tortall.net>2004-12-01 07:49:18 +0000
commit882738b2349e777dc5d1c3326471d4b7f906c8ed (patch)
tree1a3d7b26625080e7a9453b4c07b974193f71af3f /libyasm/module.in
parent35304f54272352c54ca277ea63ada9a859339d04 (diff)
downloadyasm-882738b2349e777dc5d1c3326471d4b7f906c8ed.tar.gz
Greatly simplify build system by removing libtool and integrating formerly
dynamically loaded modules into the now-static libyasm. I now anticipate that there would be very few users of the dynamic loading features, and it yielded a lot of instability and build headaches for very little benefit. The new build should now be much more cross-platform and faster (there was a lot of overhead in finding and loading modules). * libtool.m4, ltdl.m4: Delete. * m4/Makefile.am: Rename to m4/Makefile.inc and remove references to above. Change to use subdirectory (flat) build rather than recursive build. * Makefile.am: Include m4/Makefile.inc rather than having it in SUBDIRS. * libltdl: Delete. * frontends/yasm/yasm-module.c: Delete. * basename.c, dirname.c: Delete (no longer needed by yasm-module.c). * genmodule.c, module.in: Generator and template for new module.c included in libyasm that replaces the old yasm-module.c (module.in is a modified rename of yasm-module.c). * module.h: Modified rename of old yasm-module.h. * libyasm.h: Include libyasm/module.h. * libyasm/Makefile.inc: Build generator and include module.c in libyasm. * yasm.c: Use new libyasm module interface. * (many) Makefile.inc: Remove libtool libraries, build all modules into libyasm library. * configure.ac: Remove libtool/libltdl references. * Mkfiles/vc/yasm-module.c: Remove. Still need to fix some of the other Mkfiles/ build files for these changes. svn path=/trunk/yasm/; revision=1183
Diffstat (limited to 'libyasm/module.in')
-rw-r--r--libyasm/module.in145
1 files changed, 145 insertions, 0 deletions
diff --git a/libyasm/module.in b/libyasm/module.in
new file mode 100644
index 00000000..c87414a4
--- /dev/null
+++ b/libyasm/module.in
@@ -0,0 +1,145 @@
+/*
+ * YASM module loader
+ *
+ * Copyright (C) 2004 Peter Johnson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <util.h>
+/*@unused@*/ RCSID("$Id$");
+
+#include <libyasm.h>
+
+
+typedef struct module {
+ const char *keyword; /* module keyword */
+ void *data; /* associated data */
+} module;
+
+EXTERN_LIST
+
+static module arch_modules[] = {
+MODULES_arch_
+};
+
+static module dbgfmt_modules[] = {
+MODULES_dbgfmt_
+};
+
+static module objfmt_modules[] = {
+MODULES_objfmt_
+};
+
+static module listfmt_modules[] = {
+MODULES_listfmt_
+};
+
+static module optimizer_modules[] = {
+MODULES_optimizer_
+};
+
+static module parser_modules[] = {
+MODULES_parser_
+};
+
+static module preproc_modules[] = {
+MODULES_preproc_
+};
+
+static struct {
+ module *m;
+ size_t n;
+} module_types[] = {
+ {arch_modules, sizeof(arch_modules)/sizeof(module)},
+ {dbgfmt_modules, sizeof(dbgfmt_modules)/sizeof(module)},
+ {objfmt_modules, sizeof(objfmt_modules)/sizeof(module)},
+ {listfmt_modules, sizeof(listfmt_modules)/sizeof(module)},
+ {optimizer_modules, sizeof(optimizer_modules)/sizeof(module)},
+ {parser_modules, sizeof(parser_modules)/sizeof(module)},
+ {preproc_modules, sizeof(preproc_modules)/sizeof(module)},
+};
+
+void *
+yasm_load_module(yasm_module_type type, const char *keyword)
+{
+ size_t i;
+ module *modules = module_types[type].m;
+ size_t n = module_types[type].n;
+
+ /* Look for the module/symbol. */
+ for (i=0; i<n; i++) {
+ if (yasm__strcasecmp(modules[i].keyword, keyword) == 0)
+ return modules[i].data;
+ }
+
+ return NULL;
+}
+
+void
+yasm_list_modules(yasm_module_type type,
+ void (*printfunc) (const char *name, const char *keyword))
+{
+ size_t i;
+ module *modules = module_types[type].m;
+ size_t n = module_types[type].n;
+ yasm_arch_module *arch;
+ yasm_dbgfmt_module *dbgfmt;
+ yasm_objfmt_module *objfmt;
+ yasm_listfmt_module *listfmt;
+ yasm_optimizer_module *optimizer;
+ yasm_parser_module *parser;
+ yasm_preproc_module *preproc;
+
+ /* Go through available list, and try to load each one */
+ for (i=0; i<n; i++) {
+ switch (type) {
+ case YASM_MODULE_ARCH:
+ arch = modules[i].data;
+ printfunc(arch->name, arch->keyword);
+ break;
+ case YASM_MODULE_DBGFMT:
+ dbgfmt = modules[i].data;
+ printfunc(dbgfmt->name, dbgfmt->keyword);
+ break;
+ case YASM_MODULE_OBJFMT:
+ objfmt = modules[i].data;
+ printfunc(objfmt->name, objfmt->keyword);
+ break;
+ case YASM_MODULE_LISTFMT:
+ listfmt = modules[i].data;
+ printfunc(listfmt->name, listfmt->keyword);
+ break;
+ case YASM_MODULE_OPTIMIZER:
+ optimizer = modules[i].data;
+ printfunc(optimizer->name, optimizer->keyword);
+ break;
+ case YASM_MODULE_PARSER:
+ parser = modules[i].data;
+ printfunc(parser->name, parser->keyword);
+ break;
+ case YASM_MODULE_PREPROC:
+ preproc = modules[i].data;
+ printfunc(preproc->name, preproc->keyword);
+ break;
+ }
+ }
+}