aboutsummaryrefslogtreecommitdiff
path: root/ld/ldwarn.c
diff options
context:
space:
mode:
Diffstat (limited to 'ld/ldwarn.c')
-rw-r--r--ld/ldwarn.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/ld/ldwarn.c b/ld/ldwarn.c
new file mode 100644
index 0000000..c22f36b
--- /dev/null
+++ b/ld/ldwarn.c
@@ -0,0 +1,72 @@
+#include "sysdep.h"
+#include "bfd.h"
+#include "ldsym.h"
+
+
+/* we keep all the warning symbols in a list, if we ever get a
+ warning, we'll search it the hard way. This won't be to bad since
+ warnings are infrequent, and never that many (true or false ?).
+
+*/
+
+typedef struct warning_list_struct {
+ struct warning_list_struct *next;
+ asymbol *sym;
+} warning_list_type;
+
+
+static warning_list_type *warning_list;
+
+
+
+/* This is a warning symbol, add the error text to a list we keep, and mark
+ the symbol referenced as requiring a warning */
+
+
+void
+DEFUN(add_warning,(sym),
+ asymbol *sym)
+{
+ CONST char *name = ((asymbol *)(sym->value))->name;
+ warning_list_type *new;
+
+ ldsym_type *lookup = ldsym_get(name);
+
+ lookup->flags |= SYM_WARNING;
+
+ new = (warning_list_type *)ldmalloc(sizeof(warning_list_type));
+ new->next = warning_list;
+ new->sym = sym;
+ warning_list = new;
+}
+
+/* run through the list we kept, and find the warning associated with
+ this symbol */
+CONST char *
+DEFUN(fetch_warning,(sym),
+asymbol *sym)
+{
+ warning_list_type *ptr = warning_list;
+ while (ptr != (warning_list_type *)NULL) {
+ if (strcmp(((asymbol*)(ptr->sym->value))->name, sym->name) == 0) {
+ return ptr->sym->name;
+ }
+ ptr = ptr->next;
+ }
+ return "This is a warning without a message !";
+}
+
+
+void
+DEFUN(produce_warnings,(lgs,it),
+ ldsym_type *lgs AND
+ asymbol *it)
+{
+ asymbol **ptr;
+ ptr = lgs->srefs_chain;
+ while (ptr != (asymbol **)NULL) {
+ asymbol *ref = *ptr;
+ info("%B: %s\n", ref->the_bfd, fetch_warning(it));
+ ptr = (asymbol **)(ref->udata);
+ }
+}