Skip to content

[Dwarf] Complete the list of type tags. #577

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 15, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
180 changes: 95 additions & 85 deletions llvm/include/llvm/BinaryFormat/Dwarf.def
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,17 @@
#endif

#ifndef HANDLE_DW_TAG
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR)
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND)
#endif

// Note that DW_KIND is not a DWARF concept, but rather a way for us to
// generate a list of tags that belong together.
#ifndef DW_KIND_NONE
#define DW_KIND_NONE 0
#endif

#ifndef DW_KIND_TYPE
#define DW_KIND_TYPE 1
#endif

#ifndef HANDLE_DW_AT
Expand Down Expand Up @@ -109,94 +119,94 @@
#define HANDLE_DW_END(ID, NAME)
#endif

HANDLE_DW_TAG(0x0000, null, 2, DWARF)
HANDLE_DW_TAG(0x0001, array_type, 2, DWARF)
HANDLE_DW_TAG(0x0002, class_type, 2, DWARF)
HANDLE_DW_TAG(0x0003, entry_point, 2, DWARF)
HANDLE_DW_TAG(0x0004, enumeration_type, 2, DWARF)
HANDLE_DW_TAG(0x0005, formal_parameter, 2, DWARF)
HANDLE_DW_TAG(0x0008, imported_declaration, 2, DWARF)
HANDLE_DW_TAG(0x000a, label, 2, DWARF)
HANDLE_DW_TAG(0x000b, lexical_block, 2, DWARF)
HANDLE_DW_TAG(0x000d, member, 2, DWARF)
HANDLE_DW_TAG(0x000f, pointer_type, 2, DWARF)
HANDLE_DW_TAG(0x0010, reference_type, 2, DWARF)
HANDLE_DW_TAG(0x0011, compile_unit, 2, DWARF)
HANDLE_DW_TAG(0x0012, string_type, 2, DWARF)
HANDLE_DW_TAG(0x0013, structure_type, 2, DWARF)
HANDLE_DW_TAG(0x0015, subroutine_type, 2, DWARF)
HANDLE_DW_TAG(0x0016, typedef, 2, DWARF)
HANDLE_DW_TAG(0x0017, union_type, 2, DWARF)
HANDLE_DW_TAG(0x0018, unspecified_parameters, 2, DWARF)
HANDLE_DW_TAG(0x0019, variant, 2, DWARF)
HANDLE_DW_TAG(0x001a, common_block, 2, DWARF)
HANDLE_DW_TAG(0x001b, common_inclusion, 2, DWARF)
HANDLE_DW_TAG(0x001c, inheritance, 2, DWARF)
HANDLE_DW_TAG(0x001d, inlined_subroutine, 2, DWARF)
HANDLE_DW_TAG(0x001e, module, 2, DWARF)
HANDLE_DW_TAG(0x001f, ptr_to_member_type, 2, DWARF)
HANDLE_DW_TAG(0x0020, set_type, 2, DWARF)
HANDLE_DW_TAG(0x0021, subrange_type, 2, DWARF)
HANDLE_DW_TAG(0x0022, with_stmt, 2, DWARF)
HANDLE_DW_TAG(0x0023, access_declaration, 2, DWARF)
HANDLE_DW_TAG(0x0024, base_type, 2, DWARF)
HANDLE_DW_TAG(0x0025, catch_block, 2, DWARF)
HANDLE_DW_TAG(0x0026, const_type, 2, DWARF)
HANDLE_DW_TAG(0x0027, constant, 2, DWARF)
HANDLE_DW_TAG(0x0028, enumerator, 2, DWARF)
HANDLE_DW_TAG(0x0029, file_type, 2, DWARF)
HANDLE_DW_TAG(0x002a, friend, 2, DWARF)
HANDLE_DW_TAG(0x002b, namelist, 2, DWARF)
HANDLE_DW_TAG(0x002c, namelist_item, 2, DWARF)
HANDLE_DW_TAG(0x002d, packed_type, 2, DWARF)
HANDLE_DW_TAG(0x002e, subprogram, 2, DWARF)
HANDLE_DW_TAG(0x002f, template_type_parameter, 2, DWARF)
HANDLE_DW_TAG(0x0030, template_value_parameter, 2, DWARF)
HANDLE_DW_TAG(0x0031, thrown_type, 2, DWARF)
HANDLE_DW_TAG(0x0032, try_block, 2, DWARF)
HANDLE_DW_TAG(0x0033, variant_part, 2, DWARF)
HANDLE_DW_TAG(0x0034, variable, 2, DWARF)
HANDLE_DW_TAG(0x0035, volatile_type, 2, DWARF)
HANDLE_DW_TAG(0x0000, null, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0001, array_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0002, class_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0003, entry_point, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0004, enumeration_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0005, formal_parameter, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0008, imported_declaration, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x000a, label, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x000b, lexical_block, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x000d, member, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x000f, pointer_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0010, reference_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0011, compile_unit, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0012, string_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0013, structure_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0015, subroutine_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0016, typedef, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0017, union_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0018, unspecified_parameters, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0019, variant, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x001a, common_block, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x001b, common_inclusion, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x001c, inheritance, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x001d, inlined_subroutine, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x001e, module, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x001f, ptr_to_member_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0020, set_type, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0021, subrange_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0022, with_stmt, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0023, access_declaration, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0024, base_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0025, catch_block, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0026, const_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0027, constant, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0028, enumerator, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0029, file_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x002a, friend, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x002b, namelist, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x002c, namelist_item, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x002d, packed_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x002e, subprogram, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x002f, template_type_parameter, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0030, template_value_parameter, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0031, thrown_type, 2, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0032, try_block, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0033, variant_part, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0034, variable, 2, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0035, volatile_type, 2, DWARF, DW_KIND_TYPE)
// New in DWARF v3:
HANDLE_DW_TAG(0x0036, dwarf_procedure, 3, DWARF)
HANDLE_DW_TAG(0x0037, restrict_type, 3, DWARF)
HANDLE_DW_TAG(0x0038, interface_type, 3, DWARF)
HANDLE_DW_TAG(0x0039, namespace, 3, DWARF)
HANDLE_DW_TAG(0x003a, imported_module, 3, DWARF)
HANDLE_DW_TAG(0x003b, unspecified_type, 3, DWARF)
HANDLE_DW_TAG(0x003c, partial_unit, 3, DWARF)
HANDLE_DW_TAG(0x003d, imported_unit, 3, DWARF)
HANDLE_DW_TAG(0x003f, condition, 3, DWARF)
HANDLE_DW_TAG(0x0040, shared_type, 3, DWARF)
HANDLE_DW_TAG(0x0036, dwarf_procedure, 3, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0037, restrict_type, 3, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0038, interface_type, 3, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0039, namespace, 3, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x003a, imported_module, 3, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x003b, unspecified_type, 3, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x003c, partial_unit, 3, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x003d, imported_unit, 3, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x003f, condition, 3, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0040, shared_type, 3, DWARF, DW_KIND_TYPE)
// New in DWARF v4:
HANDLE_DW_TAG(0x0041, type_unit, 4, DWARF)
HANDLE_DW_TAG(0x0042, rvalue_reference_type, 4, DWARF)
HANDLE_DW_TAG(0x0043, template_alias, 4, DWARF)
HANDLE_DW_TAG(0x0041, type_unit, 4, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0042, rvalue_reference_type, 4, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0043, template_alias, 4, DWARF, DW_KIND_NONE)
// New in DWARF v5:
HANDLE_DW_TAG(0x0044, coarray_type, 5, DWARF)
HANDLE_DW_TAG(0x0045, generic_subrange, 5, DWARF)
HANDLE_DW_TAG(0x0046, dynamic_type, 5, DWARF)
HANDLE_DW_TAG(0x0047, atomic_type, 5, DWARF)
HANDLE_DW_TAG(0x0048, call_site, 5, DWARF)
HANDLE_DW_TAG(0x0049, call_site_parameter, 5, DWARF)
HANDLE_DW_TAG(0x004a, skeleton_unit, 5, DWARF)
HANDLE_DW_TAG(0x004b, immutable_type, 5, DWARF)
HANDLE_DW_TAG(0x0044, coarray_type, 5, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0045, generic_subrange, 5, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0046, dynamic_type, 5, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0047, atomic_type, 5, DWARF, DW_KIND_TYPE)
HANDLE_DW_TAG(0x0048, call_site, 5, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x0049, call_site_parameter, 5, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x004a, skeleton_unit, 5, DWARF, DW_KIND_NONE)
HANDLE_DW_TAG(0x004b, immutable_type, 5, DWARF, DW_KIND_TYPE)
// Vendor extensions:
HANDLE_DW_TAG(0x4081, MIPS_loop, 0, MIPS)
HANDLE_DW_TAG(0x4101, format_label, 0, GNU)
HANDLE_DW_TAG(0x4102, function_template, 0, GNU)
HANDLE_DW_TAG(0x4103, class_template, 0, GNU)
HANDLE_DW_TAG(0x4106, GNU_template_template_param, 0, GNU)
HANDLE_DW_TAG(0x4107, GNU_template_parameter_pack, 0, GNU)
HANDLE_DW_TAG(0x4108, GNU_formal_parameter_pack, 0, GNU)
HANDLE_DW_TAG(0x4109, GNU_call_site, 0, GNU)
HANDLE_DW_TAG(0x410a, GNU_call_site_parameter, 0, GNU)
HANDLE_DW_TAG(0x4200, APPLE_property, 0, APPLE)
HANDLE_DW_TAG(0xb000, BORLAND_property, 0, BORLAND)
HANDLE_DW_TAG(0xb001, BORLAND_Delphi_string, 0, BORLAND)
HANDLE_DW_TAG(0xb002, BORLAND_Delphi_dynamic_array, 0, BORLAND)
HANDLE_DW_TAG(0xb003, BORLAND_Delphi_set, 0, BORLAND)
HANDLE_DW_TAG(0xb004, BORLAND_Delphi_variant, 0, BORLAND)
HANDLE_DW_TAG(0x4081, MIPS_loop, 0, MIPS, DW_KIND_NONE)
HANDLE_DW_TAG(0x4101, format_label, 0, GNU, DW_KIND_NONE)
HANDLE_DW_TAG(0x4102, function_template, 0, GNU, DW_KIND_NONE)
HANDLE_DW_TAG(0x4103, class_template, 0, GNU, DW_KIND_NONE)
HANDLE_DW_TAG(0x4106, GNU_template_template_param, 0, GNU, DW_KIND_NONE)
HANDLE_DW_TAG(0x4107, GNU_template_parameter_pack, 0, GNU, DW_KIND_NONE)
HANDLE_DW_TAG(0x4108, GNU_formal_parameter_pack, 0, GNU, DW_KIND_NONE)
HANDLE_DW_TAG(0x4109, GNU_call_site, 0, GNU, DW_KIND_NONE)
HANDLE_DW_TAG(0x410a, GNU_call_site_parameter, 0, GNU, DW_KIND_NONE)
HANDLE_DW_TAG(0x4200, APPLE_property, 0, APPLE, DW_KIND_NONE)
HANDLE_DW_TAG(0xb000, BORLAND_property, 0, BORLAND, DW_KIND_NONE)
HANDLE_DW_TAG(0xb001, BORLAND_Delphi_string, 0, BORLAND, DW_KIND_TYPE)
HANDLE_DW_TAG(0xb002, BORLAND_Delphi_dynamic_array, 0, BORLAND, DW_KIND_TYPE)
HANDLE_DW_TAG(0xb003, BORLAND_Delphi_set, 0, BORLAND, DW_KIND_TYPE)
HANDLE_DW_TAG(0xb004, BORLAND_Delphi_variant, 0, BORLAND, DW_KIND_TYPE)

// Attributes.
HANDLE_DW_AT(0x01, sibling, 2, DWARF)
Expand Down
27 changes: 5 additions & 22 deletions llvm/include/llvm/BinaryFormat/Dwarf.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ const uint64_t DW64_CIE_ID = UINT64_MAX;
const uint32_t DW_INVALID_OFFSET = UINT32_MAX;

enum Tag : uint16_t {
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) DW_TAG_##NAME = ID,
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) DW_TAG_##NAME = ID,
#include "llvm/BinaryFormat/Dwarf.def"
DW_TAG_lo_user = 0x4080,
DW_TAG_hi_user = 0xffff,
Expand All @@ -89,29 +89,12 @@ enum Tag : uint16_t {

inline bool isType(Tag T) {
switch (T) {
case DW_TAG_array_type:
case DW_TAG_class_type:
case DW_TAG_interface_type:
case DW_TAG_enumeration_type:
case DW_TAG_pointer_type:
case DW_TAG_reference_type:
case DW_TAG_rvalue_reference_type:
case DW_TAG_string_type:
case DW_TAG_structure_type:
case DW_TAG_subroutine_type:
case DW_TAG_union_type:
case DW_TAG_ptr_to_member_type:
case DW_TAG_set_type:
case DW_TAG_subrange_type:
case DW_TAG_base_type:
case DW_TAG_const_type:
case DW_TAG_file_type:
case DW_TAG_packed_type:
case DW_TAG_volatile_type:
case DW_TAG_typedef:
return true;
default:
return false;
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \
case DW_TAG_##NAME: \
return (KIND == DW_KIND_TYPE);
#include "llvm/BinaryFormat/Dwarf.def"
}
}

Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/ObjectYAML/DWARFYAML.h
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ template <> struct MappingTraits<DWARFYAML::InitialLength> {
static void mapping(IO &IO, DWARFYAML::InitialLength &DWARF);
};

#define HANDLE_DW_TAG(unused, name, unused2, unused3) \
#define HANDLE_DW_TAG(unused, name, unused2, unused3, unused4) \
io.enumCase(value, "DW_TAG_" #name, dwarf::DW_TAG_##name);

template <> struct ScalarEnumerationTraits<dwarf::Tag> {
Expand Down
8 changes: 4 additions & 4 deletions llvm/lib/BinaryFormat/Dwarf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ StringRef llvm::dwarf::TagString(unsigned Tag) {
switch (Tag) {
default:
return StringRef();
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \
case DW_TAG_##NAME: \
return "DW_TAG_" #NAME;
#include "llvm/BinaryFormat/Dwarf.def"
Expand All @@ -31,7 +31,7 @@ StringRef llvm::dwarf::TagString(unsigned Tag) {

unsigned llvm::dwarf::getTag(StringRef TagString) {
return StringSwitch<unsigned>(TagString)
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \
.Case("DW_TAG_" #NAME, DW_TAG_##NAME)
#include "llvm/BinaryFormat/Dwarf.def"
.Default(DW_TAG_invalid);
Expand All @@ -41,7 +41,7 @@ unsigned llvm::dwarf::TagVersion(dwarf::Tag Tag) {
switch (Tag) {
default:
return 0;
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \
case DW_TAG_##NAME: \
return VERSION;
#include "llvm/BinaryFormat/Dwarf.def"
Expand All @@ -52,7 +52,7 @@ unsigned llvm::dwarf::TagVendor(dwarf::Tag Tag) {
switch (Tag) {
default:
return 0;
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR) \
#define HANDLE_DW_TAG(ID, NAME, VERSION, VENDOR, KIND) \
case DW_TAG_##NAME: \
return DWARF_VENDOR_##VENDOR;
#include "llvm/BinaryFormat/Dwarf.def"
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/DebugInfo/X86/template.ll
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
; REQUIRES: object-emission

; RUN: llc -mtriple=x86_64-linux -O0 -filetype=obj < %s | llvm-dwarfdump -v -debug-info - | FileCheck %s
; RUN: llc -mtriple=x86_64-linux -O0 -filetype=obj < %s | not llvm-dwarfdump -verify - | FileCheck %s --check-prefix VERIFY

; IR generated with `clang++ -g -emit-llvm -S` from the following code:
; template<int x, int*, template<typename> class y, decltype(nullptr) n, int ...z> int func() {
Expand All @@ -11,6 +12,9 @@
; int glbl = func<3, &glbl, y_impl, nullptr, 1, 2>();
; y_impl<int>::nested n;

; VERIFY-NOT: error: DIE has DW_AT_type with incompatible tag DW_TAG_unspecified_type
; VERIFY: error: DIEs have overlapping address ranges

; CHECK: [[INT:0x[0-9a-f]*]]:{{ *}}DW_TAG_base_type
; CHECK-NEXT: DW_AT_name{{.*}} = "int"

Expand Down