MOSTLYCLEANFILES = $(am_libdw_a_OBJECTS) $(am_libdw_pic_a_OBJECTS) libdw.so.$(VERSION)
CLEANFILES = libdw.so $(EXTRA_libdw_a_DEPENDENCIES)
MAINTAINERCLEANFILES = $(srcdir)/known-dwarf.h
+
+# Internal checks
+check_PROGRAMS = dwarf_srclang_check
+TESTS = $(check_PROGRAMS)
+
+CHECK_DEF_FLAGS = $(DEFS) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -DMAIN_CHECK=1
+
+.SECONDEXPANSION:
+dwarf_srclang_check$(EXEEXT): $$(filter-out $$(subst _check,,$$@).o,$(libdw_a_OBJECTS)) $$(subst _check,,$$@).c
+ $(AM_V_CC)$(CC) $(CHECK_DEF_FLAGS) -o $@ $^ $(filter-out libdw_pic.a,$(libdw_so_LIBS)) $(libdw_so_LDLIBS)
+nodist_dwarf_srclang_check_SOURCES = dwarf_srclang_check.c
DW_LANG_Hylo = 0x0042, /* Hylo */
DW_LANG_V = 0x0043, /* V Programming Language */
DW_LANG_Algol68 = 0x0044, /* Algol68 */
+ DW_LANG_Nim = 0x0045, /* Nim */
DW_LANG_lo_user = 0x8000,
DW_LANG_Mips_Assembler = 0x8001, /* Assembler */
DW_LNAME_Metal = 0x002c,
DW_LNAME_V = 0x002d,
DW_LNAME_Algol68 = 0x002e,
+ DW_LNAME_Nim = 0x002f,
DW_LNAME_lo_user = 0x8000,
DW_LNAME_hi_user = 0xffff
*lname = DW_LNAME_D;
*lversion = 0;
return 0;
+ case DW_LANG_Dylan:
+ *lname = DW_LNAME_Dylan;
+ *lversion = 0;
+ return 0;
case DW_LANG_Python:
*lname = DW_LNAME_Python;
*lversion = 0;
*lname = DW_LNAME_Hylo;
*lversion = 0;
return 0;
+ case DW_LANG_V:
+ *lname = DW_LNAME_V;
+ *lversion = 0;
+ return 0;
+ case DW_LANG_Algol68:
+ *lname = DW_LNAME_Algol68;
+ *lversion = 0;
+ return 0;
+ case DW_LANG_Nim:
+ *lname = DW_LNAME_Nim;
+ *lversion = 0;
+ return 0;
default:
__libdw_seterrno (DWARF_E_UNKNOWN_LANGUAGE);
return -1;
*value = DW_LANG_C_sharp;
return 0;
case DW_LNAME_Mojo:
- *value = DW_LANG_Move;
+ *value = DW_LANG_Mojo;
return 0;
case DW_LNAME_GLSL:
*value = DW_LANG_GLSL;
case DW_LNAME_Algol68:
*value = DW_LANG_Algol68;
return 0;
+ case DW_LNAME_Nim:
+ *value = DW_LANG_Nim;
+ return 0;
default:
__libdw_seterrno (DWARF_E_UNKNOWN_LANGUAGE);
return -1;
return res;
}
INTDEF (dwarf_language)
+
+#ifdef MAIN_CHECK
+#include "known-dwarf.h"
+#include <inttypes.h>
+#include <stdio.h>
+
+void
+test_lang (const char *name, Dwarf_Word lang)
+{
+ printf ("Testing %s: 0x%" PRIx64 "\n", name, lang);
+
+ Dwarf_Word lname;
+ Dwarf_Word lversion;
+ int res = srclang_to_language (lang, &lname, &lversion);
+ if (res != 0)
+ {
+ printf ("srclang_to_language failed (%d) for %s\n", res, name);
+ exit (-1);
+ }
+
+ Dwarf_Word rlang;
+ res = language_to_srclang (lname, lversion, &rlang);
+ if (res != 0)
+ {
+ printf ("language_to_srclang (%" PRId64 ", %" PRId64 ") failed (%d)\n",
+ lname, lversion, res);
+ exit (-1);
+ }
+
+ /* Most langs should roundtrip, but there are some exceptions. */
+ switch (lang)
+ {
+ case DW_LANG_Assembly:
+ if (rlang != DW_LANG_Mips_Assembler)
+ {
+ printf ("For compatibility Assembly should go to Mips_Assembler\n");
+ exit (-1);
+ }
+ break;
+ case DW_LANG_C_plus_plus_03:
+ if (rlang != DW_LANG_C_plus_plus)
+ {
+ printf ("For c++03 doesn't exist it is just c++\n");
+ exit (-1);
+ }
+ break;
+ default:
+ if (lang != rlang)
+ {
+ printf ("going from srclang to lang and back gives different name "
+ "for %s (%" PRId64 " != %" PRId64 ")\n", name, lang, rlang);
+ exit (-1);
+ }
+ }
+}
+
+int
+main (void)
+{
+ /* Test all known language codes. */
+#define DWARF_ONE_KNOWN_DW_LANG(NAME, CODE) test_lang (#NAME, CODE);
+ DWARF_ALL_KNOWN_DW_LANG
+#undef DWARF_ONE_KNOWN_DW_LANG
+ return 0;
+}
+#endif