diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp index 06cdd877f7dcd4..e1d0efa844c34f 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp @@ -320,6 +320,18 @@ void DWARFDIE::AppendTypeName(Stream &s) const { case DW_TAG_volatile_type: s.PutCString("volatile "); break; + case DW_TAG_LLVM_ptrauth_type: { + unsigned key = GetAttributeValueAsUnsigned(DW_AT_LLVM_ptrauth_key, 0); + bool isAddressDiscriminated = GetAttributeValueAsUnsigned( + DW_AT_LLVM_ptrauth_address_discriminated, 0); + unsigned extraDiscriminator = + GetAttributeValueAsUnsigned(DW_AT_LLVM_ptrauth_extra_discriminator, 0); + bool isaPointer = + GetAttributeValueAsUnsigned(DW_AT_LLVM_ptrauth_isa_pointer, 0); + s.Printf("__ptrauth(%d, %d, 0x0%x, %d)", key, isAddressDiscriminated, + extraDiscriminator, isaPointer); + break; + } default: return; } diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.def b/llvm/include/llvm/BinaryFormat/Dwarf.def index 76e51b3157d3fc..ef328ccde09b38 100644 --- a/llvm/include/llvm/BinaryFormat/Dwarf.def +++ b/llvm/include/llvm/BinaryFormat/Dwarf.def @@ -241,6 +241,9 @@ HANDLE_DW_TAG(0x420c, SUN_f90_interface, 0, SUN, DW_KIND_NONE) HANDLE_DW_TAG(0x420d, SUN_fortran_vax_structure, 0, SUN, DW_KIND_NONE) HANDLE_DW_TAG(0x42ff, SUN_hi, 0, SUN, DW_KIND_NONE) +// LLVM +HANDLE_DW_TAG(0x4300, LLVM_ptrauth_type, 0, LLVM, DW_KIND_NONE) + // DSP-C/Starcore __circ, _rev HANDLE_DW_TAG(0x5101, ALTIUM_circ_type, 0, ALTIUM, DW_KIND_NONE) HANDLE_DW_TAG(0x5102, ALTIUM_mwa_circ_type, 0, ALTIUM, DW_KIND_NONE) @@ -597,8 +600,12 @@ HANDLE_DW_AT(0x3e00, LLVM_include_path, 0, LLVM) HANDLE_DW_AT(0x3e01, LLVM_config_macros, 0, LLVM) HANDLE_DW_AT(0x3e02, LLVM_sysroot, 0, LLVM) HANDLE_DW_AT(0x3e03, LLVM_tag_offset, 0, LLVM) -// The missing numbers here are reserved for ptrauth support. +HANDLE_DW_AT(0x3e04, LLVM_ptrauth_key, 0, LLVM) +HANDLE_DW_AT(0x3e05, LLVM_ptrauth_address_discriminated, 0, LLVM) +HANDLE_DW_AT(0x3e06, LLVM_ptrauth_extra_discriminator, 0, LLVM) HANDLE_DW_AT(0x3e07, LLVM_apinotes, 0, APPLE) +HANDLE_DW_AT(0x3e08, LLVM_ptrauth_isa_pointer, 0, LLVM) +HANDLE_DW_AT(0x3e09, LLVM_ptrauth_authenticates_null_values, 0, LLVM) // Apple extensions. diff --git a/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp b/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp index 86cc07b0d0f295..83711552ebd957 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp @@ -143,6 +143,9 @@ DWARFTypePrinter::appendUnqualifiedNameBefore(DWARFDie D, Word = false; break; } + case DW_TAG_LLVM_ptrauth_type: + appendQualifiedNameBefore(Inner()); + break; case DW_TAG_const_type: case DW_TAG_volatile_type: appendConstVolatileQualifierBefore(D); @@ -237,6 +240,35 @@ void DWARFTypePrinter::appendUnqualifiedNameAfter( /*SkipFirstParamIfArtificial=*/D.getTag() == DW_TAG_ptr_to_member_type); break; + } + case DW_TAG_LLVM_ptrauth_type: { + auto getValOrNull = [&](dwarf::Attribute Attr) -> uint64_t { + if (auto Form = D.find(Attr)) + return *Form->getAsUnsignedConstant(); + return 0; + }; + SmallVector optionsVec; + if (getValOrNull(DW_AT_LLVM_ptrauth_isa_pointer)) + optionsVec.push_back("isa-pointer"); + if (getValOrNull(DW_AT_LLVM_ptrauth_authenticates_null_values)) + optionsVec.push_back("authenticates-null-values"); + std::string options; + for (auto option : optionsVec) { + if (options.size()) + options += ","; + options += option; + } + if (options.size()) + options = ", \"" + options + "\""; + std::string PtrauthString; + llvm::raw_string_ostream PtrauthStream(PtrauthString); + PtrauthStream + << "__ptrauth(" << getValOrNull(DW_AT_LLVM_ptrauth_key) << ", " + << getValOrNull(DW_AT_LLVM_ptrauth_address_discriminated) << ", 0x0" + << utohexstr(getValOrNull(DW_AT_LLVM_ptrauth_extra_discriminator), true) + << options << ")"; + OS << PtrauthStream.str(); + break; } /* case DW_TAG_structure_type: diff --git a/llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s b/llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s new file mode 100644 index 00000000000000..4d93528557cb95 --- /dev/null +++ b/llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s @@ -0,0 +1,310 @@ +# RUN: llvm-mc %s -filetype obj -triple arm64-apple-darwin -o - \ +# RUN: | llvm-dwarfdump --debug-info - \ +# RUN: | FileCheck %s + +# CHECK: 0x0000001e: DW_TAG_variable +# CHECK: DW_AT_name ("p1") +# CHECK: DW_AT_type (0x00000033 "void *__ptrauth(4, 1, 0x04d2)") + +# CHECK: 0x00000033: DW_TAG_LLVM_ptrauth_type +# CHECK: DW_AT_LLVM_ptrauth_key (0x04) +# CHECK: DW_AT_LLVM_ptrauth_address_discriminated (true) +# CHECK: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d2) + +# CHECK: 0x0000003c: DW_TAG_variable +# CHECK: DW_AT_name ("p2") +# CHECK: DW_AT_type (0x00000047 "void *__ptrauth(4, 1, 0x04d3, "isa-pointer")") + +# CHECK: 0x00000047: DW_TAG_LLVM_ptrauth_type +# CHECK: DW_AT_LLVM_ptrauth_key (0x04) +# CHECK: DW_AT_LLVM_ptrauth_address_discriminated (true) +# CHECK: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d3) +# CHECK: DW_AT_LLVM_ptrauth_isa_pointer (true) + +# CHECK: 0x0000004f: DW_TAG_variable +# CHECK: DW_AT_name ("p3") +# CHECK: DW_AT_type (0x0000005a "void *__ptrauth(4, 1, 0x04d4, "authenticates-null-values")") + +# CHECK: 0x0000005a: DW_TAG_LLVM_ptrauth_type +# CHECK: DW_AT_LLVM_ptrauth_key (0x04) +# CHECK: DW_AT_LLVM_ptrauth_address_discriminated (true) +# CHECK: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d4) +# CHECK: DW_AT_LLVM_ptrauth_authenticates_null_values (true) + +# CHECK: 0x00000062: DW_TAG_variable +# CHECK: DW_AT_name ("p4") +# CHECK: DW_AT_type (0x0000006d "void *__ptrauth(4, 1, 0x04d5, "isa-pointer,authenticates-null-values")") + +# CHECK: 0x0000006d: DW_TAG_LLVM_ptrauth_type +# CHECK: DW_AT_LLVM_ptrauth_key (0x04) +# CHECK: DW_AT_LLVM_ptrauth_address_discriminated (true) +# CHECK: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d5) +# CHECK: DW_AT_LLVM_ptrauth_isa_pointer (true) +# CHECK: DW_AT_LLVM_ptrauth_authenticates_null_values (true) + + .section __TEXT,__text,regular,pure_instructions + .file 1 "/" "/tmp/p.c" + .comm _p,8 ; @p + .section __DWARF,__debug_abbrev,regular,debug +Lsection_abbrev: + .byte 1 ; Abbreviation Code + .byte 17 ; DW_TAG_compile_unit + .byte 1 ; DW_CHILDREN_yes + .byte 37 ; DW_AT_producer + .byte 14 ; DW_FORM_strp + .byte 19 ; DW_AT_language + .byte 5 ; DW_FORM_data2 + .byte 3 ; DW_AT_name + .byte 14 ; DW_FORM_strp + .byte 16 ; DW_AT_stmt_list + .byte 23 ; DW_FORM_sec_offset + .byte 27 ; DW_AT_comp_dir + .byte 14 ; DW_FORM_strp + .byte 0 ; EOM(1) + .byte 0 ; EOM(2) + .byte 2 ; Abbreviation Code + .byte 52 ; DW_TAG_variable + .byte 0 ; DW_CHILDREN_no + .byte 3 ; DW_AT_name + .byte 14 ; DW_FORM_strp + .byte 73 ; DW_AT_type + .byte 19 ; DW_FORM_ref4 + .byte 63 ; DW_AT_external + .byte 25 ; DW_FORM_flag_present + .byte 58 ; DW_AT_decl_file + .byte 11 ; DW_FORM_data1 + .byte 59 ; DW_AT_decl_line + .byte 11 ; DW_FORM_data1 + .byte 2 ; DW_AT_location + .byte 24 ; DW_FORM_exprloc + .byte 0 ; EOM(1) + .byte 0 ; EOM(2) + .byte 3 ; Abbreviation Code + .ascii "\200\206\001" ; DW_TAG_LLVM_ptrauth_type + .byte 0 ; DW_CHILDREN_no + .byte 73 ; DW_AT_type + .byte 19 ; DW_FORM_ref4 + .ascii "\204|" ; DW_AT_LLVM_ptrauth_key + .byte 11 ; DW_FORM_data1 + .ascii "\205|" ; DW_AT_LLVM_ptrauth_address_discriminated + .byte 25 ; DW_FORM_flag_present + .ascii "\206|" ; DW_AT_LLVM_ptrauth_extra_discriminator + .byte 5 ; DW_FORM_data2 + .byte 0 ; EOM(1) + .byte 0 ; EOM(2) + .byte 4 ; Abbreviation Code + .byte 15 ; DW_TAG_pointer_type + .byte 0 ; DW_CHILDREN_no + .byte 0 ; EOM(1) + .byte 0 ; EOM(2) + .byte 5 ; Abbreviation Code + .byte 52 ; DW_TAG_variable + .byte 0 ; DW_CHILDREN_no + .byte 3 ; DW_AT_name + .byte 14 ; DW_FORM_strp + .byte 73 ; DW_AT_type + .byte 19 ; DW_FORM_ref4 + .byte 63 ; DW_AT_external + .byte 25 ; DW_FORM_flag_present + .byte 58 ; DW_AT_decl_file + .byte 11 ; DW_FORM_data1 + .byte 59 ; DW_AT_decl_line + .byte 11 ; DW_FORM_data1 + .byte 0 ; EOM(1) + .byte 0 ; EOM(2) + .byte 6 ; Abbreviation Code + .ascii "\200\206\001" ; DW_TAG_LLVM_ptrauth_type + .byte 0 ; DW_CHILDREN_no + .byte 73 ; DW_AT_type + .byte 19 ; DW_FORM_ref4 + .ascii "\204|" ; DW_AT_LLVM_ptrauth_key + .byte 11 ; DW_FORM_data1 + .ascii "\205|" ; DW_AT_LLVM_ptrauth_address_discriminated + .byte 25 ; DW_FORM_flag_present + .ascii "\206|" ; DW_AT_LLVM_ptrauth_extra_discriminator + .byte 5 ; DW_FORM_data2 + .ascii "\210|" ; DW_AT_LLVM_ptrauth_isa_pointer + .byte 25 ; DW_FORM_flag_present + .byte 0 ; EOM(1) + .byte 0 ; EOM(2) + .byte 7 ; Abbreviation Code + .ascii "\200\206\001" ; DW_TAG_LLVM_ptrauth_type + .byte 0 ; DW_CHILDREN_no + .byte 73 ; DW_AT_type + .byte 19 ; DW_FORM_ref4 + .ascii "\204|" ; DW_AT_LLVM_ptrauth_key + .byte 11 ; DW_FORM_data1 + .ascii "\205|" ; DW_AT_LLVM_ptrauth_address_discriminated + .byte 25 ; DW_FORM_flag_present + .ascii "\206|" ; DW_AT_LLVM_ptrauth_extra_discriminator + .byte 5 ; DW_FORM_data2 + .ascii "\211|" ; DW_AT_LLVM_ptrauth_authenticates_null_values + .byte 25 ; DW_FORM_flag_present + .byte 0 ; EOM(1) + .byte 0 ; EOM(2) + .byte 8 ; Abbreviation Code + .ascii "\200\206\001" ; DW_TAG_LLVM_ptrauth_type + .byte 0 ; DW_CHILDREN_no + .byte 73 ; DW_AT_type + .byte 19 ; DW_FORM_ref4 + .ascii "\204|" ; DW_AT_LLVM_ptrauth_key + .byte 11 ; DW_FORM_data1 + .ascii "\205|" ; DW_AT_LLVM_ptrauth_address_discriminated + .byte 25 ; DW_FORM_flag_present + .ascii "\206|" ; DW_AT_LLVM_ptrauth_extra_discriminator + .byte 5 ; DW_FORM_data2 + .ascii "\210|" ; DW_AT_LLVM_ptrauth_isa_pointer + .byte 25 ; DW_FORM_flag_present + .ascii "\211|" ; DW_AT_LLVM_ptrauth_authenticates_null_values + .byte 25 ; DW_FORM_flag_present + .byte 0 ; EOM(1) + .byte 0 ; EOM(2) + .byte 0 ; EOM(3) + .section __DWARF,__debug_info,regular,debug +Lsection_info: +Lcu_begin0: +.set Lset0, Ldebug_info_end0-Ldebug_info_start0 ; Length of Unit + .long Lset0 +Ldebug_info_start0: + .short 4 ; DWARF version number +.set Lset1, Lsection_abbrev-Lsection_abbrev ; Offset Into Abbrev. Section + .long Lset1 + .byte 8 ; Address Size (in bytes) + .byte 1 ; Abbrev [1] 0xb:0x6b DW_TAG_compile_unit + .long 0 ; DW_AT_producer + .short 12 ; DW_AT_language + .long 1 ; DW_AT_name +.set Lset2, Lline_table_start0-Lsection_line ; DW_AT_stmt_list + .long Lset2 + .long 10 ; DW_AT_comp_dir + .byte 2 ; Abbrev [2] 0x1e:0x15 DW_TAG_variable + .long 12 ; DW_AT_name + .long 51 ; DW_AT_type + ; DW_AT_external + .byte 1 ; DW_AT_decl_file + .byte 1 ; DW_AT_decl_line + .byte 9 ; DW_AT_location + .byte 3 + .quad _p + .byte 3 ; Abbrev [3] 0x33:0x8 DW_TAG_LLVM_ptrauth_type + .long 59 ; DW_AT_type + .byte 4 ; DW_AT_LLVM_ptrauth_key + ; DW_AT_LLVM_ptrauth_address_discriminated + .short 1234 ; DW_AT_LLVM_ptrauth_extra_discriminator + .byte 4 ; Abbrev [4] 0x3b:0x1 DW_TAG_pointer_type + .byte 5 ; Abbrev [5] 0x3c:0xb DW_TAG_variable + .long 15 ; DW_AT_name + .long 71 ; DW_AT_type + ; DW_AT_external + .byte 1 ; DW_AT_decl_file + .byte 1 ; DW_AT_decl_line + .byte 6 ; Abbrev [6] 0x47:0x8 DW_TAG_LLVM_ptrauth_type + .long 59 ; DW_AT_type + .byte 4 ; DW_AT_LLVM_ptrauth_key + ; DW_AT_LLVM_ptrauth_address_discriminated + .short 1235 ; DW_AT_LLVM_ptrauth_extra_discriminator + ; DW_AT_LLVM_ptrauth_isa_pointer + .byte 5 ; Abbrev [5] 0x4f:0xb DW_TAG_variable + .long 18 ; DW_AT_name + .long 90 ; DW_AT_type + ; DW_AT_external + .byte 1 ; DW_AT_decl_file + .byte 1 ; DW_AT_decl_line + .byte 7 ; Abbrev [7] 0x5a:0x8 DW_TAG_LLVM_ptrauth_type + .long 59 ; DW_AT_type + .byte 4 ; DW_AT_LLVM_ptrauth_key + ; DW_AT_LLVM_ptrauth_address_discriminated + .short 1236 ; DW_AT_LLVM_ptrauth_extra_discriminator + ; DW_AT_LLVM_ptrauth_authenticates_null_values + .byte 5 ; Abbrev [5] 0x62:0xb DW_TAG_variable + .long 21 ; DW_AT_name + .long 109 ; DW_AT_type + ; DW_AT_external + .byte 1 ; DW_AT_decl_file + .byte 1 ; DW_AT_decl_line + .byte 8 ; Abbrev [8] 0x6d:0x8 DW_TAG_LLVM_ptrauth_type + .long 59 ; DW_AT_type + .byte 4 ; DW_AT_LLVM_ptrauth_key + ; DW_AT_LLVM_ptrauth_address_discriminated + .short 1237 ; DW_AT_LLVM_ptrauth_extra_discriminator + ; DW_AT_LLVM_ptrauth_isa_pointer + ; DW_AT_LLVM_ptrauth_authenticates_null_values + .byte 0 ; End Of Children Mark +Ldebug_info_end0: + .section __DWARF,__debug_str,regular,debug +Linfo_string: + .byte 0 ; string offset=0 + .asciz "/tmp/p.c" ; string offset=1 + .asciz "/" ; string offset=10 + .asciz "p1" ; string offset=12 + .asciz "p2" ; string offset=15 + .asciz "p3" ; string offset=18 + .asciz "p4" ; string offset=21 + .section __DWARF,__apple_names,regular,debug +Lnames_begin: + .long 1212240712 ; Header Magic + .short 1 ; Header Version + .short 0 ; Header Hash Function + .long 1 ; Header Bucket Count + .long 1 ; Header Hash Count + .long 12 ; Header Data Length + .long 0 ; HeaderData Die Offset Base + .long 1 ; HeaderData Atom Count + .short 1 ; DW_ATOM_die_offset + .short 6 ; DW_FORM_data4 + .long 0 ; Bucket 0 + .long 5863654 ; Hash in Bucket 0 +.set Lset3, LNames0-Lnames_begin ; Offset in Bucket 0 + .long Lset3 +LNames0: + .long 12 ; p1 + .long 1 ; Num DIEs + .long 30 + .long 0 + .section __DWARF,__apple_objc,regular,debug +Lobjc_begin: + .long 1212240712 ; Header Magic + .short 1 ; Header Version + .short 0 ; Header Hash Function + .long 1 ; Header Bucket Count + .long 0 ; Header Hash Count + .long 12 ; Header Data Length + .long 0 ; HeaderData Die Offset Base + .long 1 ; HeaderData Atom Count + .short 1 ; DW_ATOM_die_offset + .short 6 ; DW_FORM_data4 + .long -1 ; Bucket 0 + .section __DWARF,__apple_namespac,regular,debug +Lnamespac_begin: + .long 1212240712 ; Header Magic + .short 1 ; Header Version + .short 0 ; Header Hash Function + .long 1 ; Header Bucket Count + .long 0 ; Header Hash Count + .long 12 ; Header Data Length + .long 0 ; HeaderData Die Offset Base + .long 1 ; HeaderData Atom Count + .short 1 ; DW_ATOM_die_offset + .short 6 ; DW_FORM_data4 + .long -1 ; Bucket 0 + .section __DWARF,__apple_types,regular,debug +Ltypes_begin: + .long 1212240712 ; Header Magic + .short 1 ; Header Version + .short 0 ; Header Hash Function + .long 1 ; Header Bucket Count + .long 0 ; Header Hash Count + .long 20 ; Header Data Length + .long 0 ; HeaderData Die Offset Base + .long 3 ; HeaderData Atom Count + .short 1 ; DW_ATOM_die_offset + .short 6 ; DW_FORM_data4 + .short 3 ; DW_ATOM_die_tag + .short 5 ; DW_FORM_data2 + .short 4 ; DW_ATOM_type_flags + .short 11 ; DW_FORM_data1 + .long -1 ; Bucket 0 +.subsections_via_symbols + .section __DWARF,__debug_line,regular,debug +Lsection_line: +Lline_table_start0: