Skip to content

Commit 9f6e13a

Browse files
committed
Decode source language name
1 parent 7e2a813 commit 9f6e13a

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

dwarview.c

+51
Original file line numberDiff line numberDiff line change
@@ -378,3 +378,54 @@ char *dwarview_inline_name(unsigned int code)
378378
}
379379

380380
#undef DWARF_INLINE
381+
382+
/* DWARF language encodings. */
383+
struct lang_name {
384+
unsigned code;
385+
char *name;
386+
};
387+
388+
#define DWARF_LANGUAGE(_lang) { DW_LANG_##_lang, #_lang }
389+
#define DWARF_LANG_Cpp(pre_, _year, name) { DW_LANG_##pre_##C_plus_plus##_year, name }
390+
391+
static const struct lang_name language_names[] = {
392+
DWARF_LANGUAGE(C89),
393+
DWARF_LANGUAGE(C),
394+
DWARF_LANGUAGE(Ada83),
395+
DWARF_LANG_Cpp( , , "C++"),
396+
DWARF_LANGUAGE(Cobol74),
397+
DWARF_LANGUAGE(Cobol85),
398+
DWARF_LANGUAGE(Fortran77),
399+
DWARF_LANGUAGE(Fortran90),
400+
DWARF_LANGUAGE(Pascal83),
401+
DWARF_LANGUAGE(Modula2),
402+
DWARF_LANGUAGE(Java),
403+
DWARF_LANGUAGE(C99),
404+
DWARF_LANGUAGE(Ada95),
405+
DWARF_LANGUAGE(Fortran95),
406+
DWARF_LANGUAGE(PLI),
407+
DWARF_LANGUAGE(ObjC),
408+
DWARF_LANG_Cpp(Obj, , "ObjC++"),
409+
DWARF_LANGUAGE(UPC),
410+
DWARF_LANGUAGE(D),
411+
DWARF_LANGUAGE(Python),
412+
DWARF_LANGUAGE(Go),
413+
DWARF_LANGUAGE(Haskell),
414+
DWARF_LANG_Cpp( , _11, "C++11"),
415+
DWARF_LANGUAGE(C11),
416+
DWARF_LANG_Cpp( , _14, "C++14"),
417+
};
418+
419+
char *dwarview_language_name(unsigned int code)
420+
{
421+
unsigned i;
422+
423+
for (i = 0; i < ARRAY_SIZE(language_names); i++)
424+
if (language_names[i].code == code)
425+
return language_names[i].name;
426+
427+
return "unknown";
428+
}
429+
430+
#undef DWARF_LANGUAGE
431+
#undef DWARF_LANG_Cpp

dwarview.h

+1
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@ char *dwarview_tag_name(int tag);
3434
char *dwarview_attr_name(unsigned int attr);
3535
char *dwarview_form_name(unsigned int form);
3636
char *dwarview_inline_name(unsigned int code);
37+
char *dwarview_language_name(unsigned int code);
3738

3839
#endif /* DWARVIEW_H */

main.c

+2
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,8 @@ static int attr_callback(Dwarf_Attribute *attr, void *_arg)
450450
val_str = g_strdup(dwarview_inline_name(raw_value));
451451
else if (name == DW_AT_ranges)
452452
val_str = print_addr_ranges(arg->diep);
453+
else if (name == DW_AT_language)
454+
val_str = g_strdup(dwarview_language_name(raw_value));
453455
else
454456
val_str = g_strdup_printf("%#x", raw_value);
455457
break;

0 commit comments

Comments
 (0)