Author: Jonas Devlieghere Date: 2022-07-27T11:48:35-07:00 New Revision: a8c3d9815e0443bacf5315536ad356e4acb184f2
URL: https://github.com/llvm/llvm-project/commit/a8c3d9815e0443bacf5315536ad356e4acb184f2 DIFF: https://github.com/llvm/llvm-project/commit/a8c3d9815e0443bacf5315536ad356e4acb184f2.diff LOG: [DebugInfo] Teach LLVM and LLDB about ptrauth in DWARF Teach libDebugInfo (llvm-dwarfdump) and lldb about DWARF tags and attributes for pointer authentication. These values have been emitted by Apple clang for several releases. Although upstream LLVM doesn't emit these values yet, we hope to upstream that part sometime soon. Differential revision: https://reviews.llvm.org/D130215 Added: llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s Modified: lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp llvm/include/llvm/BinaryFormat/Dwarf.def llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp index 06cdd877f7dcd..e1d0efa844c34 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 76e51b3157d3f..ef328ccde09b3 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 86cc07b0d0f29..83711552ebd95 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<const char *, 2> 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 0000000000000..4d93528557cb9 --- /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: _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits