summaryrefslogtreecommitdiffstats
path: root/libdw
diff options
context:
space:
mode:
Diffstat (limited to 'libdw')
-rw-r--r--libdw/ChangeLog77
-rw-r--r--libdw/Makefile.am26
-rw-r--r--libdw/dwarf.h150
-rw-r--r--libdw/dwarf_aggregate_size.c42
-rw-r--r--libdw/dwarf_default_lower_bound.c91
-rw-r--r--libdw/dwarf_error.c1
-rw-r--r--libdw/dwarf_getmacros.c27
-rw-r--r--libdw/dwarf_line_file.c52
-rw-r--r--libdw/dwarf_peel_type.c7
-rw-r--r--libdw/libdw.h39
-rw-r--r--libdw/libdw.map6
-rw-r--r--libdw/libdwP.h4
12 files changed, 425 insertions, 97 deletions
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 1e282e4e..6533eb50 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,80 @@
+2017-07-26 Mark Wielaard <[email protected]>
+
+ * dwarf.h: Add DW_MACRO_* and compat defines for DW_MACRO_GNU_*.
+ * dwarf_getmacros.c (get_table_for_offset): Accept either version
+ 4 or 5. Use DW_MACRO names instead of DW_MACRO_GNU names.
+ (read_macros): Use table version for fake_cu.
+
+2017-07-26 Mark Wielaard <[email protected]>
+
+ * dwarf_peel_type.c (dwarf_peel_type): Handle DW_TAG_immutable_type,
+ DW_TAG_packed_type and DW_TAG_shared_type.
+ * libdw.h (dwarf_peel_type): Extend documentation.
+
+2017-07-26 Mark Wielaard <[email protected]>
+
+ * dwarf.h: Add DW_DEFAULTED_no, DW_DEFAULTED_in_class and
+ DW_DEFAULTED_out_of_class.
+
+2017-07-26 Mark Wielaard <[email protected]>
+
+ * dwarf.h: Add DW_CC_pass_by_reference and DW_CC_pass_by_reference.
+
+2017-07-26 Mark Wielaard <[email protected]>
+
+ * dwarf_default_lower_bound.c: New file.
+ * Makefile.am (libdw_a_SOURCES): Add dwarf_default_lower_bound.c.
+ * dwarf_aggregate_size.c (array_size): Use dwarf_default_lower_bound.
+ * dwarf_error.c (errmsgs): Add DWARF_E_UNKNOWN_LANGUAGE.
+ * libdw.h: Add dwarf_default_lower_bound.
+ * libdw.map (ELFUTILS_0.170): Add dwarf_default_lower_bound.
+ * libdwP.h: Add DWARF_E_UNKNOWN_LANGUAGE and
+ dwarf_default_lower_bound INTDECL.
+
+2017-07-26 Mark Wielaard <[email protected]>
+
+ * dwarf.h: Add DW_LANG_OpenCL, DW_LANG_Modula3,
+ DW_LANG_C_plus_plus_03, DW_LANG_OCaml, DW_LANG_Rust, DW_LANG_Swift,
+ DW_LANG_Julia, DW_LANG_Dylan, DW_LANG_RenderScript, DW_LANG_BLISS.
+ * dwarf_aggregate_size.c (array_size): Add lower bound for
+ DW_LANG_C_plus_plus_03, DW_LANG_Python, DW_LANG_OpenCL,
+ DW_LANG_Haskell, DW_LANG_OCaml, DW_LANG_Rust, DW_LANG_Swift,
+ DW_LANG_Dylan, DW_LANG_RenderScript, DW_LANG_Modula3,
+ DW_LANG_Julia and DW_LANG_BLISS.
+
+2017-07-26 Mark Wielaard <[email protected]>
+
+ * dwarf.h: Add DW_ATE_UCS and DW_ATE_ASCII.
+
+2017-07-25 Mark Wielaard <[email protected]>
+
+ * dwarf.h: Add DW_TAG_coarray_type, DW_TAG_generic_subrange,
+ DW_TAG_dynamic_type, DW_TAG_call_site, DW_TAG_call_site_parameter,
+ DW_TAG_skeleton_unit, DW_TAG_immutable_type. Add reserved comments
+ for currently unused numbers.
+
+2017-07-25 Mark Wielaard <[email protected]>
+
+ * dwarf.h (DWARF attributes enum): Remove DW_AT_subscr_data,
+ DW_AT_element_list and DW_AT_member. Add DWARF5 attribute constants.
+ (DW_AT_subscr_data, DW_AT_element_list, DW_AT_member): New defines.
+
+2017-07-21 Mark Wielaard <[email protected]>
+
+ * dwarf_line_file.c: New file.
+ * Makefile.am (libdw_a_SOURCES): Add dwarf_line_file.c.
+ * libdw.h (dwarf_line_file): New function declaration.
+ * libdw.map (ELFUTILS_0.170): New. Add dwarf_line_file.
+
+2017-02-17 Ulf Hermann <[email protected]>
+
+ * Makefile.am: Add libdw_so_LIBS to specify the archives libdw is is
+ made of, libdw_so_DEPS for libraries it depends on (including
+ libeu.a), libdw_so_LDLIBS to specify libraries libdw links against.
+ (libdw.so$(EXEEXT)): Add $(libdw_so_LDLIBS), remove enumeration of
+ library dependencies, use libdw_so_LIBS rather than relying on the
+ order of dependencies specified, add -z,relro.
+
2017-04-20 Ulf Hermann <[email protected]>
* libdw.h: Remove attribute macro declarations and use
diff --git a/libdw/Makefile.am b/libdw/Makefile.am
index 4cb36716..b3e781d8 100644
--- a/libdw/Makefile.am
+++ b/libdw/Makefile.am
@@ -1,6 +1,6 @@
## Process this file with automake to create Makefile.in
##
-## Copyright (C) 2002-2010, 2012, 2014 Red Hat, Inc.
+## Copyright (C) 2002-2010, 2012, 2014, 2016 Red Hat, Inc.
## This file is part of elfutils.
##
## This file is free software; you can redistribute it and/or modify
@@ -66,7 +66,7 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
dwarf_lineendsequence.c dwarf_lineblock.c \
dwarf_lineprologueend.c dwarf_lineepiloguebegin.c \
dwarf_lineisa.c dwarf_linediscriminator.c \
- dwarf_lineop_index.c \
+ dwarf_lineop_index.c dwarf_line_file.c \
dwarf_onesrcline.c dwarf_formblock.c \
dwarf_getsrcfiles.c dwarf_filesrc.c dwarf_getsrcdirs.c \
dwarf_getlocation.c dwarf_getstring.c dwarf_offabbrev.c \
@@ -90,7 +90,7 @@ libdw_a_SOURCES = dwarf_begin.c dwarf_begin_elf.c dwarf_end.c dwarf_getelf.c \
dwarf_aggregate_size.c dwarf_getlocation_implicit_pointer.c \
dwarf_getlocation_die.c dwarf_getlocation_attr.c \
dwarf_getalt.c dwarf_setalt.c dwarf_cu_getdwarf.c \
- dwarf_cu_die.c dwarf_peel_type.c
+ dwarf_cu_die.c dwarf_peel_type.c dwarf_default_lower_bound.c
# Minimal library with symbols needed by those libebl backends that we
# ship statically. This is so that e.g. strip doesn't end up bringing
@@ -104,7 +104,8 @@ libdw_static_pic_a_SOURCES = libdw_form.c dwarf_child.c dwarf_attr.c \
dwarf_hasattr_integrate.c dwarf_hasattr.c \
dwarf_aggregate_size.c dwarf_siblingof.c dwarf_formsdata.c \
dwarf_srclang.c dwarf_formflag.c dwarf_diecu.c \
- dwarf_bytesize.c dwarf_bitsize.c dwarf_peel_type.c
+ dwarf_bytesize.c dwarf_bitsize.c dwarf_peel_type.c \
+ dwarf_default_lower_bound.c
if MAINTAINER_MODE
BUILT_SOURCES = $(srcdir)/known-dwarf.h
@@ -118,19 +119,22 @@ libdw_pic_a_SOURCES =
am_libdw_pic_a_OBJECTS = $(libdw_a_SOURCES:.c=.os)
am_libdw_static_pic_a_OBJECTS = $(libdw_static_pic_a_SOURCES:.c=.os)
-libdw_so_SOURCES =
-libdw.so$(EXEEXT): $(srcdir)/libdw.map libdw_pic.a ../libdwelf/libdwelf_pic.a \
+libdw_so_LIBS = libdw_pic.a ../libdwelf/libdwelf_pic.a \
../libdwfl/libdwfl_pic.a ../libebl/libebl.a \
../backends/libebl_static_pic.a \
- ../libcpu/libcpu_static_pic.a \
- ../libelf/libelf.so
+ ../libcpu/libcpu_static_pic.a
+libdw_so_DEPS = ../lib/libeu.a ../libelf/libelf.so
+libdw_so_LDLIBS = $(libdw_so_DEPS) -ldl -lz $(argp_LDADD) $(zip_LIBS)
+libdw_so_SOURCES =
+libdw.so$(EXEEXT): $(srcdir)/libdw.map $(libdw_so_LIBS) $(libdw_so_DEPS)
# The rpath is necessary for libebl because its $ORIGIN use will
# not fly in a setuid executable that links in libdw.
- $(AM_V_CCLD)$(LINK) -shared -o $@ -Wl,--soname,$@.$(VERSION),-z,defs \
+ $(AM_V_CCLD)$(LINK) -shared -o $@ \
+ -Wl,--soname,$@.$(VERSION),-z,defs,-z,relro \
-Wl,--enable-new-dtags,-rpath,$(pkglibdir) \
-Wl,--version-script,$<,--no-undefined \
- -Wl,--whole-archive $(filter-out $<,$^) -Wl,--no-whole-archive\
- -ldl -lz $(argp_LDADD) $(zip_LIBS)
+ -Wl,--whole-archive $(libdw_so_LIBS) -Wl,--no-whole-archive \
+ $(libdw_so_LDLIBS)
@$(textrel_check)
$(AM_V_at)ln -fs $@ $@.$(VERSION)
diff --git a/libdw/dwarf.h b/libdw/dwarf.h
index 169b53e5..902d2617 100644
--- a/libdw/dwarf.h
+++ b/libdw/dwarf.h
@@ -1,5 +1,5 @@
/* This file defines standard DWARF types, structures, and macros.
- Copyright (C) 2000-2011, 2014, 2016 Red Hat, Inc.
+ Copyright (C) 2000-2011, 2014, 2016, 2017 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -37,15 +37,21 @@ enum
DW_TAG_entry_point = 0x03,
DW_TAG_enumeration_type = 0x04,
DW_TAG_formal_parameter = 0x05,
+ /* 0x06 reserved. */
+ /* 0x07 reserved. */
DW_TAG_imported_declaration = 0x08,
+ /* 0x09 reserved. */
DW_TAG_label = 0x0a,
DW_TAG_lexical_block = 0x0b,
+ /* 0x0c reserved. */
DW_TAG_member = 0x0d,
+ /* 0x0e reserved. */
DW_TAG_pointer_type = 0x0f,
DW_TAG_reference_type = 0x10,
DW_TAG_compile_unit = 0x11,
DW_TAG_string_type = 0x12,
DW_TAG_structure_type = 0x13,
+ /* 0x14 reserved. */
DW_TAG_subroutine_type = 0x15,
DW_TAG_typedef = 0x16,
DW_TAG_union_type = 0x17,
@@ -87,15 +93,20 @@ enum
DW_TAG_unspecified_type = 0x3b,
DW_TAG_partial_unit = 0x3c,
DW_TAG_imported_unit = 0x3d,
- /* 0x3e reserved. */
+ /* 0x3e reserved. Was DW_TAG_mutable_type. */
DW_TAG_condition = 0x3f,
DW_TAG_shared_type = 0x40,
DW_TAG_type_unit = 0x41,
DW_TAG_rvalue_reference_type = 0x42,
DW_TAG_template_alias = 0x43,
-
- /* DWARF 5. */
+ DW_TAG_coarray_type = 0x44,
+ DW_TAG_generic_subrange = 0x45,
+ DW_TAG_dynamic_type = 0x46,
DW_TAG_atomic_type = 0x47,
+ DW_TAG_call_site = 0x48,
+ DW_TAG_call_site_parameter = 0x49,
+ DW_TAG_skeleton_unit = 0x4a,
+ DW_TAG_immutable_type = 0x4b,
DW_TAG_lo_user = 0x4080,
@@ -131,17 +142,23 @@ enum
DW_AT_sibling = 0x01,
DW_AT_location = 0x02,
DW_AT_name = 0x03,
+ /* 0x04 reserved. */
+ /* 0x05 reserved. */
+ /* 0x06 reserved. */
+ /* 0x07 reserved. */
+ /* 0x08 reserved. */
DW_AT_ordering = 0x09,
- DW_AT_subscr_data = 0x0a,
+ /* 0x0a reserved. */
DW_AT_byte_size = 0x0b,
- DW_AT_bit_offset = 0x0c,
+ DW_AT_bit_offset = 0x0c, /* Deprecated in DWARF4. */
DW_AT_bit_size = 0x0d,
- DW_AT_element_list = 0x0f,
+ /* 0x0e reserved. */
+ /* 0x0f reserved. */
DW_AT_stmt_list = 0x10,
DW_AT_low_pc = 0x11,
DW_AT_high_pc = 0x12,
DW_AT_language = 0x13,
- DW_AT_member = 0x14,
+ /* 0x14 reserved. */
DW_AT_discr = 0x15,
DW_AT_discr_value = 0x16,
DW_AT_visibility = 0x17,
@@ -152,15 +169,24 @@ enum
DW_AT_const_value = 0x1c,
DW_AT_containing_type = 0x1d,
DW_AT_default_value = 0x1e,
+ /* 0x1f reserved. */
DW_AT_inline = 0x20,
DW_AT_is_optional = 0x21,
DW_AT_lower_bound = 0x22,
+ /* 0x23 reserved. */
+ /* 0x24 reserved. */
DW_AT_producer = 0x25,
+ /* 0x26 reserved. */
DW_AT_prototyped = 0x27,
+ /* 0x28 reserved. */
+ /* 0x29 reserved. */
DW_AT_return_addr = 0x2a,
+ /* 0x2b reserved. */
DW_AT_start_scope = 0x2c,
+ /* 0x2d reserved. */
DW_AT_bit_stride = 0x2e,
DW_AT_upper_bound = 0x2f,
+ /* 0x30 reserved. */
DW_AT_abstract_origin = 0x31,
DW_AT_accessibility = 0x32,
DW_AT_address_class = 0x33,
@@ -179,7 +205,7 @@ enum
DW_AT_frame_base = 0x40,
DW_AT_friend = 0x41,
DW_AT_identifier_case = 0x42,
- DW_AT_macro_info = 0x43,
+ DW_AT_macro_info = 0x43, /* Deprecated in DWARF5. */
DW_AT_namelist_item = 0x44,
DW_AT_priority = 0x45,
DW_AT_segment = 0x46,
@@ -223,9 +249,36 @@ enum
DW_AT_const_expr = 0x6c,
DW_AT_enum_class = 0x6d,
DW_AT_linkage_name = 0x6e,
-
- /* DWARF5 attribute values. */
+ DW_AT_string_length_bit_size = 0x6f,
+ DW_AT_string_length_byte_size = 0x70,
+ DW_AT_rank = 0x71,
+ DW_AT_str_offsets_base = 0x72,
+ DW_AT_addr_base = 0x73,
+ DW_AT_rnglists_base = 0x74,
+ /* 0x75 reserved. */
+ DW_AT_dwo_name = 0x76,
+ DW_AT_reference = 0x77,
+ DW_AT_rvalue_reference = 0x78,
+ DW_AT_macros = 0x79,
+ DW_AT_call_all_calls = 0x7a,
+ DW_AT_call_all_source_calls = 0x7b,
+ DW_AT_call_all_tail_calls = 0x7c,
+ DW_AT_call_return_pc = 0x7d,
+ DW_AT_call_value = 0x7e,
+ DW_AT_call_origin = 0x7f,
+ DW_AT_call_parameter = 0x80,
+ DW_AT_call_pc = 0x81,
+ DW_AT_call_tail_call = 0x82,
+ DW_AT_call_target = 0x83,
+ DW_AT_call_target_clobbered = 0x84,
+ DW_AT_call_data_location = 0x85,
+ DW_AT_call_data_value = 0x86,
DW_AT_noreturn = 0x87,
+ DW_AT_alignment = 0x88,
+ DW_AT_export_symbols = 0x89,
+ DW_AT_deleted = 0x8a,
+ DW_AT_defaulted = 0x8b,
+ DW_AT_loclists_base = 0x8c,
DW_AT_lo_user = 0x2000,
@@ -278,6 +331,15 @@ enum
DW_AT_hi_user = 0x3fff
};
+/* Old unofficially attribute names. Should not be used.
+ Will not appear in known-dwarf.h */
+
+/* DWARF1 array subscripts and element data types. */
+#define DW_AT_subscr_data 0x0a
+/* DWARF1 enumeration literals. */
+#define DW_AT_element_list 0x0f
+/* DWARF1 reference for variable to member structure, class or union. */
+#define DW_AT_member 0x14
/* DWARF form encodings. */
enum
@@ -509,6 +571,8 @@ enum
DW_ATE_unsigned_fixed = 0xe,
DW_ATE_decimal_float = 0xf,
DW_ATE_UTF = 0x10,
+ DW_ATE_UCS = 0x11,
+ DW_ATE_ASCII = 0x12,
DW_ATE_lo_user = 0x80,
DW_ATE_hi_user = 0xff
@@ -588,14 +652,23 @@ enum
DW_LANG_UPC = 0x0012, /* Unified Parallel C */
DW_LANG_D = 0x0013, /* D */
DW_LANG_Python = 0x0014, /* Python */
+ DW_LANG_OpenCL = 0x0015, /* OpenCL */
DW_LANG_Go = 0x0016, /* Go */
+ DW_LANG_Modula3 = 0x0017, /* Modula-3 */
DW_LANG_Haskell = 0x0018, /* Haskell */
+ DW_LANG_C_plus_plus_03 = 0x0019, /* ISO C++:2003 */
DW_LANG_C_plus_plus_11 = 0x001a, /* ISO C++:2011 */
+ DW_LANG_OCaml = 0x001b, /* OCaml */
+ DW_LANG_Rust = 0x001c, /* Rust */
DW_LANG_C11 = 0x001d, /* ISO C:2011 */
+ DW_LANG_Swift = 0x001e, /* Swift */
+ DW_LANG_Julia = 0x001f, /* Julia */
+ DW_LANG_Dylan = 0x0020, /* Dylan */
DW_LANG_C_plus_plus_14 = 0x0021, /* ISO C++:2014 */
DW_LANG_Fortran03 = 0x0022, /* ISO/IEC 1539-1:2004 */
DW_LANG_Fortran08 = 0x0023, /* ISO/IEC 1539-1:2010 */
-
+ DW_LANG_RenderScript = 0x0024, /* RenderScript Kernal Language */
+ DW_LANG_BLISS = 0x0025, /* BLISS */
DW_LANG_lo_user = 0x8000,
DW_LANG_Mips_Assembler = 0x8001, /* Assembler */
@@ -615,12 +688,17 @@ enum
};
-/* DWARF calling conventions encodings. */
+/* DWARF calling conventions encodings.
+ Used as values of DW_AT_calling_convention for subroutines
+ (normal, program or nocall) or structures, unions and class types
+ (normal, reference or value). */
enum
{
DW_CC_normal = 0x1,
DW_CC_program = 0x2,
DW_CC_nocall = 0x3,
+ DW_CC_pass_by_reference = 0x4,
+ DW_CC_pass_by_value = 0x5,
DW_CC_lo_user = 0x40,
DW_CC_hi_user = 0xff
};
@@ -651,6 +729,14 @@ enum
DW_DSC_range = 1
};
+/* DWARF defaulted member function encodings. */
+enum
+ {
+ DW_DEFAULTED_no = 0,
+ DW_DEFAULTED_in_class = 1,
+ DW_DEFAULTED_out_of_class = 2
+ };
+
/* DWARF standard opcode encodings. */
enum
@@ -694,20 +780,38 @@ enum
};
-/* DWARF debug_macro type encodings. GNU/DWARF5 extension. */
+/* DWARF debug_macro type encodings. */
enum
{
- DW_MACRO_GNU_define = 0x01,
- DW_MACRO_GNU_undef = 0x02,
- DW_MACRO_GNU_start_file = 0x03,
- DW_MACRO_GNU_end_file = 0x04,
- DW_MACRO_GNU_define_indirect = 0x05,
- DW_MACRO_GNU_undef_indirect = 0x06,
- DW_MACRO_GNU_transparent_include = 0x07,
- DW_MACRO_GNU_lo_user = 0xe0,
- DW_MACRO_GNU_hi_user = 0xff
+ DW_MACRO_define = 0x01,
+ DW_MACRO_undef = 0x02,
+ DW_MACRO_start_file = 0x03,
+ DW_MACRO_end_file = 0x04,
+ DW_MACRO_define_strp = 0x05,
+ DW_MACRO_undef_strp = 0x06,
+ DW_MACRO_import = 0x07,
+ DW_MACRO_define_sup = 0x08,
+ DW_MACRO_undef_sup = 0x09,
+ DW_MACRO_import_sup = 0x0a,
+ DW_MACRO_define_strx = 0x0b,
+ DW_MACRO_undef_strx = 0x0c,
+ DW_MACRO_lo_user = 0xe0,
+ DW_MACRO_hi_user = 0xff
};
+/* Old GNU extension names for DWARF5 debug_macro type encodings.
+ There are no equivalents for the supplementary object file (sup)
+ and indirect string references (strx). */
+#define DW_MACRO_GNU_define DW_MACRO_define
+#define DW_MACRO_GNU_undef DW_MACRO_undef
+#define DW_MACRO_GNU_start_file DW_MACRO_start_file
+#define DW_MACRO_GNU_end_file DW_MACRO_end_file
+#define DW_MACRO_GNU_define_indirect DW_MACRO_define_strp
+#define DW_MACRO_GNU_undef_indirect DW_MACRO_undef_strp
+#define DW_MACRO_GNU_transparent_include DW_MACRO_import
+#define DW_MACRO_GNU_lo_user DW_MACRO_lo_user
+#define DW_MACRO_GNU_hi_user DW_MACRO_hi_user
+
/* DWARF call frame instruction encodings. */
enum
diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c
index 52ef0067..838468dd 100644
--- a/libdw/dwarf_aggregate_size.c
+++ b/libdw/dwarf_aggregate_size.c
@@ -95,45 +95,11 @@ array_size (Dwarf_Die *die, Dwarf_Word *size,
}
else
{
- /* Determine default lower bound from language,
- as per "4.12 Subrange Type Entries". */
Dwarf_Die cu = CUDIE (die->cu);
- switch (INTUSE(dwarf_srclang) (&cu))
- {
- case DW_LANG_C:
- case DW_LANG_C89:
- case DW_LANG_C99:
- case DW_LANG_C11:
- case DW_LANG_C_plus_plus:
- case DW_LANG_C_plus_plus_11:
- case DW_LANG_C_plus_plus_14:
- case DW_LANG_ObjC:
- case DW_LANG_ObjC_plus_plus:
- case DW_LANG_Java:
- case DW_LANG_D:
- case DW_LANG_UPC:
- case DW_LANG_Go:
- lower = 0;
- break;
-
- case DW_LANG_Ada83:
- case DW_LANG_Ada95:
- case DW_LANG_Cobol74:
- case DW_LANG_Cobol85:
- case DW_LANG_Fortran77:
- case DW_LANG_Fortran90:
- case DW_LANG_Fortran95:
- case DW_LANG_Fortran03:
- case DW_LANG_Fortran08:
- case DW_LANG_Pascal83:
- case DW_LANG_Modula2:
- case DW_LANG_PLI:
- lower = 1;
- break;
-
- default:
- return -1;
- }
+ int lang = INTUSE(dwarf_srclang) (&cu);
+ if (lang == -1
+ || INTUSE(dwarf_default_lower_bound) (lang, &lower) != 0)
+ return -1;
}
if (unlikely (lower > upper))
return -1;
diff --git a/libdw/dwarf_default_lower_bound.c b/libdw/dwarf_default_lower_bound.c
new file mode 100644
index 00000000..a33a3433
--- /dev/null
+++ b/libdw/dwarf_default_lower_bound.c
@@ -0,0 +1,91 @@
+/* Get the default subrange lower bound for a given language.
+ Copyright (C) 2016 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <dwarf.h>
+#include "libdwP.h"
+
+/* Determine default lower bound from language, as per the DWARF5
+ "Subrange Type Entries" table. */
+int
+dwarf_default_lower_bound (int lang, Dwarf_Sword *result)
+{
+ switch (lang)
+ {
+ case DW_LANG_C:
+ case DW_LANG_C89:
+ case DW_LANG_C99:
+ case DW_LANG_C11:
+ case DW_LANG_C_plus_plus:
+ case DW_LANG_C_plus_plus_03:
+ case DW_LANG_C_plus_plus_11:
+ case DW_LANG_C_plus_plus_14:
+ case DW_LANG_ObjC:
+ case DW_LANG_ObjC_plus_plus:
+ case DW_LANG_Java:
+ case DW_LANG_D:
+ case DW_LANG_Python:
+ case DW_LANG_UPC:
+ case DW_LANG_OpenCL:
+ case DW_LANG_Go:
+ case DW_LANG_Haskell:
+ case DW_LANG_OCaml:
+ case DW_LANG_Rust:
+ case DW_LANG_Swift:
+ case DW_LANG_Dylan:
+ case DW_LANG_RenderScript:
+ case DW_LANG_BLISS:
+ *result = 0;
+ return 0;
+
+ case DW_LANG_Ada83:
+ case DW_LANG_Ada95:
+ case DW_LANG_Cobol74:
+ case DW_LANG_Cobol85:
+ case DW_LANG_Fortran77:
+ case DW_LANG_Fortran90:
+ case DW_LANG_Fortran95:
+ case DW_LANG_Fortran03:
+ case DW_LANG_Fortran08:
+ case DW_LANG_Pascal83:
+ case DW_LANG_Modula2:
+ case DW_LANG_Modula3:
+ case DW_LANG_PLI:
+ case DW_LANG_Julia:
+ *result = 1;
+ return 0;
+
+ default:
+ __libdw_seterrno (DWARF_E_UNKNOWN_LANGUAGE);
+ return -1;
+ }
+}
+INTDEF (dwarf_default_lower_bound)
diff --git a/libdw/dwarf_error.c b/libdw/dwarf_error.c
index 66fdc81a..939ec047 100644
--- a/libdw/dwarf_error.c
+++ b/libdw/dwarf_error.c
@@ -95,6 +95,7 @@ static const char *errmsgs[] =
[DWARF_E_NO_ALT_DEBUGLINK] = N_("no alternative debug link found"),
[DWARF_E_INVALID_OPCODE] = N_("invalid opcode"),
[DWARF_E_NOT_CUDIE] = N_("not a CU (unit) DIE"),
+ [DWARF_E_UNKNOWN_LANGUAGE] = N_("unknown language code")
};
#define nerrmsgs (sizeof (errmsgs) / sizeof (errmsgs[0]))
diff --git a/libdw/dwarf_getmacros.c b/libdw/dwarf_getmacros.c
index eb505085..db6582b6 100644
--- a/libdw/dwarf_getmacros.c
+++ b/libdw/dwarf_getmacros.c
@@ -158,7 +158,7 @@ get_table_for_offset (Dwarf *dbg, Dwarf_Word macoff,
}
uint16_t version = read_2ubyte_unaligned_inc (dbg, readp);
- if (version != 4)
+ if (version != 4 && version != 5)
{
__libdw_seterrno (DWARF_E_INVALID_VERSION);
return NULL;
@@ -198,15 +198,17 @@ get_table_for_offset (Dwarf *dbg, Dwarf_Word macoff,
Dwarf_Macro_Op_Proto op_protos[255] =
{
- [DW_MACRO_GNU_define - 1] = p_udata_str,
- [DW_MACRO_GNU_undef - 1] = p_udata_str,
- [DW_MACRO_GNU_define_indirect - 1] = p_udata_strp,
- [DW_MACRO_GNU_undef_indirect - 1] = p_udata_strp,
- [DW_MACRO_GNU_start_file - 1] = p_udata_udata,
- [DW_MACRO_GNU_end_file - 1] = p_none,
- [DW_MACRO_GNU_transparent_include - 1] = p_secoffset,
- /* N.B. DW_MACRO_undef_indirectx, DW_MACRO_define_indirectx
- should be added when 130313.1 is supported. */
+ [DW_MACRO_define - 1] = p_udata_str,
+ [DW_MACRO_undef - 1] = p_udata_str,
+ [DW_MACRO_define_strp - 1] = p_udata_strp,
+ [DW_MACRO_undef_strp - 1] = p_udata_strp,
+ [DW_MACRO_start_file - 1] = p_udata_udata,
+ [DW_MACRO_end_file - 1] = p_none,
+ [DW_MACRO_import - 1] = p_secoffset,
+ /* When adding support for DWARF5 supplementary object files and
+ indirect string tables also add support for DW_MACRO_define_sup,
+ DW_MACRO_undef_sup, DW_MACRO_import_sup, DW_MACRO_define_strx
+ and DW_MACRO_undef_strx. */
};
if ((flags & 0x4) != 0)
@@ -354,10 +356,11 @@ read_macros (Dwarf *dbg, int sec_index,
/* A fake CU with bare minimum data to fool dwarf_formX into
doing the right thing with the attributes that we put out.
- We arbitrarily pretend it's version 4. */
+ We pretend it is the same version as the actual table.
+ Version 4 for the old GNU extension, version 5 for DWARF5. */
Dwarf_CU fake_cu = {
.dbg = dbg,
- .version = 4,
+ .version = table->version,
.offset_size = table->is_64bit ? 8 : 4,
.startp = (void *) startp + offset,
.endp = (void *) endp,
diff --git a/libdw/dwarf_line_file.c b/libdw/dwarf_line_file.c
new file mode 100644
index 00000000..e2df642a
--- /dev/null
+++ b/libdw/dwarf_line_file.c
@@ -0,0 +1,52 @@
+/* Find line information for address.
+ Copyright (C) 2017 Red Hat, Inc.
+ This file is part of elfutils.
+
+ This file is free software; you can redistribute it and/or modify
+ it under the terms of either
+
+ * the GNU Lesser General Public License as published by the Free
+ Software Foundation; either version 3 of the License, or (at
+ your option) any later version
+
+ or
+
+ * the GNU General Public License as published by the Free
+ Software Foundation; either version 2 of the License, or (at
+ your option) any later version
+
+ or both in parallel, as here.
+
+ elfutils is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received copies of the GNU General Public License and
+ the GNU Lesser General Public License along with this program. If
+ not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libdwP.h"
+
+
+int
+dwarf_line_file (Dwarf_Line *line, Dwarf_Files **files, size_t *idx)
+{
+ if (line == NULL)
+ return -1;
+
+ if (line->file >= line->files->nfiles)
+ {
+ __libdw_seterrno (DWARF_E_INVALID_DWARF);
+ return -1;
+ }
+
+ *files = line->files;
+ *idx = line->file;
+
+ return 0;
+}
diff --git a/libdw/dwarf_peel_type.c b/libdw/dwarf_peel_type.c
index 97356944..6bbfd424 100644
--- a/libdw/dwarf_peel_type.c
+++ b/libdw/dwarf_peel_type.c
@@ -1,5 +1,5 @@
/* Peel type aliases and qualifier tags from a type DIE.
- Copyright (C) 2014, 2015 Red Hat, Inc.
+ Copyright (C) 2014, 2015, 2016 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -50,7 +50,10 @@ dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result)
|| tag == DW_TAG_const_type
|| tag == DW_TAG_volatile_type
|| tag == DW_TAG_restrict_type
- || tag == DW_TAG_atomic_type)
+ || tag == DW_TAG_atomic_type
+ || tag == DW_TAG_immutable_type
+ || tag == DW_TAG_packed_type
+ || tag == DW_TAG_shared_type)
{
Dwarf_Attribute attr_mem;
Dwarf_Attribute *attr = INTUSE (dwarf_attr_integrate) (result, DW_AT_type,
diff --git a/libdw/libdw.h b/libdw/libdw.h
index 9ae80ebb..63a38ff9 100644
--- a/libdw/libdw.h
+++ b/libdw/libdw.h
@@ -1,5 +1,5 @@
/* Interfaces for libdw.
- Copyright (C) 2002-2010, 2013, 2014 Red Hat, Inc.
+ Copyright (C) 2002-2010, 2013, 2014, 2016 Red Hat, Inc.
This file is part of elfutils.
This file is free software; you can redistribute it and/or modify
@@ -378,8 +378,11 @@ extern int dwarf_child (Dwarf_Die *die, Dwarf_Die *result)
extern int dwarf_siblingof (Dwarf_Die *die, Dwarf_Die *result)
__nonnull_attribute__ (2);
-/* For type aliases and qualifier type DIEs follow the DW_AT_type
- attribute (recursively) and return the underlying type Dwarf_Die.
+/* For type aliases and qualifier type DIEs, which don't modify or
+ change the structural layout of the underlying type, follow the
+ DW_AT_type attribute (recursively) and return the underlying type
+ Dwarf_Die.
+
Returns 0 when RESULT contains a Dwarf_Die (possibly equal to the
given DIE) that isn't a type alias or qualifier type. Returns 1
when RESULT contains a type alias or qualifier Dwarf_Die that
@@ -387,13 +390,18 @@ extern int dwarf_siblingof (Dwarf_Die *die, Dwarf_Die *result)
attribute). Returns -1 when an error occured.
The current DWARF specification defines one type alias tag
- (DW_TAG_typedef) and three qualifier type tags (DW_TAG_const_type,
- DW_TAG_volatile_type, DW_TAG_restrict_type). DWARF5 defines one
- other qualifier type tag (DW_TAG_atomic_type). A future version of
- this function might peel other alias or qualifier type tags if a
- future DWARF version or GNU extension defines other type aliases or
- qualifier type tags that don't modify or change the structural
- layout of the underlying type. */
+ (DW_TAG_typedef) and seven modifier/qualifier type tags
+ (DW_TAG_const_type, DW_TAG_volatile_type, DW_TAG_restrict_type,
+ DW_TAG_atomic_type, DW_TAG_immutable_type, DW_TAG_packed_type and
+ DW_TAG_shared_type). This function won't peel modifier type
+ tags that change the way the underlying type is accessed such
+ as the pointer or reference type tags (DW_TAG_pointer_type,
+ DW_TAG_reference_type or DW_TAG_rvalue_reference_type).
+
+ A future version of this function might peel other alias or
+ qualifier type tags if a future DWARF version or GNU extension
+ defines other type aliases or qualifier type tags that don't modify,
+ change the structural layout or the way to access the underlying type. */
extern int dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result)
__nonnull_attribute__ (2);
@@ -640,6 +648,11 @@ extern const char *dwarf_linesrc (Dwarf_Line *line,
extern const char *dwarf_filesrc (Dwarf_Files *file, size_t idx,
Dwarf_Word *mtime, Dwarf_Word *length);
+/* Return the Dwarf_Files and index associated with the given Dwarf_Line. */
+extern int dwarf_line_file (Dwarf_Line *line,
+ Dwarf_Files **files, size_t *idx)
+ __nonnull_attribute__ (2, 3);
+
/* Return the directory list used in the file information extracted.
(*RESULT)[0] is the CU's DW_AT_comp_dir value, and may be null.
(*RESULT)[0..*NDIRS-1] are the compile-time include directory path
@@ -728,6 +741,12 @@ extern int dwarf_getlocation_attr (Dwarf_Attribute *attr,
For DW_TAG_array_type it can apply much more complex rules. */
extern int dwarf_aggregate_size (Dwarf_Die *die, Dwarf_Word *size);
+/* Given a language code, as returned by dwarf_srclan, get the default
+ lower bound for a subrange type without a lower bound attribute.
+ Returns zero on success or -1 on failure when the given language
+ wasn't recognized. */
+extern int dwarf_default_lower_bound (int lang, Dwarf_Sword *result)
+ __nonnull_attribute__ (2);
/* Return scope DIEs containing PC address.
Sets *SCOPES to a malloc'd array of Dwarf_Die structures,
diff --git a/libdw/libdw.map b/libdw/libdw.map
index 83cb1d97..14307056 100644
--- a/libdw/libdw.map
+++ b/libdw/libdw.map
@@ -338,3 +338,9 @@ ELFUTILS_0.167 {
dwelf_strent_str;
dwelf_strtab_free;
} ELFUTILS_0.165;
+
+ELFUTILS_0.170 {
+ global:
+ dwarf_default_lower_bound;
+ dwarf_line_file;
+} ELFUTILS_0.167;
diff --git a/libdw/libdwP.h b/libdw/libdwP.h
index 5d095a7e..6ad322c1 100644
--- a/libdw/libdwP.h
+++ b/libdw/libdwP.h
@@ -1,5 +1,5 @@
/* Internal definitions for libdwarf.
- Copyright (C) 2002-2011, 2013-2015 Red Hat, Inc.
+ Copyright (C) 2002-2011, 2013-2016 Red Hat, Inc.
This file is part of elfutils.
Written by Ulrich Drepper <[email protected]>, 2002.
@@ -130,6 +130,7 @@ enum
DWARF_E_NO_ALT_DEBUGLINK,
DWARF_E_INVALID_OPCODE,
DWARF_E_NOT_CUDIE,
+ DWARF_E_UNKNOWN_LANGUAGE,
};
@@ -764,6 +765,7 @@ INTDECL (dwarf_attr_integrate)
INTDECL (dwarf_begin)
INTDECL (dwarf_begin_elf)
INTDECL (dwarf_child)
+INTDECL (dwarf_default_lower_bound)
INTDECL (dwarf_dieoffset)
INTDECL (dwarf_diename)
INTDECL (dwarf_end)