https://github.com/JDevlieghere created https://github.com/llvm/llvm-project/pull/82272
Teach LLVM & LLDB about `DW_AT_LLVM_ptrauth_authentication_mode` >From 36cdd0e2991e9ed28bdd023630a81595ec3c70bf Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere <jo...@devlieghere.com> Date: Mon, 19 Feb 2024 11:11:05 -0800 Subject: [PATCH] [ptrauth] Teach LLVM & LLDB about LLVM_ptrauth_authentication_mode --- .../Plugins/SymbolFile/DWARF/DWARFDIE.cpp | 10 +++++-- llvm/include/llvm/BinaryFormat/Dwarf.def | 1 + llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp | 15 +++++++++++ .../tools/llvm-dwarfdump/AArch64/ptrauth.s | 26 ++++++++++++------- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp index d4446befd83b05..4884374ef94729 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp @@ -316,8 +316,14 @@ void DWARFDIE::AppendTypeName(Stream &s) const { 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); + bool authenticatesNullValues = GetAttributeValueAsUnsigned( + DW_AT_LLVM_ptrauth_authenticates_null_values, 0); + unsigned authenticationMode = + GetAttributeValueAsUnsigned(DW_AT_LLVM_ptrauth_authentication_mode, 3); + + s.Printf("__ptrauth(%d, %d, 0x0%x, %d, %d, %d)", key, + isAddressDiscriminated, extraDiscriminator, isaPointer, + authenticatesNullValues, authenticationMode); break; } default: diff --git a/llvm/include/llvm/BinaryFormat/Dwarf.def b/llvm/include/llvm/BinaryFormat/Dwarf.def index 3a08eeaa791aa6..e70b58d5ea50fc 100644 --- a/llvm/include/llvm/BinaryFormat/Dwarf.def +++ b/llvm/include/llvm/BinaryFormat/Dwarf.def @@ -611,6 +611,7 @@ 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) +HANDLE_DW_AT(0x3e0a, LLVM_ptrauth_authentication_mode, 0, LLVM) // Apple extensions. diff --git a/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp b/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp index ef8ded8ebb66c1..05dee8a3d71298 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp @@ -251,6 +251,21 @@ void DWARFTypePrinter::appendUnqualifiedNameAfter( optionsVec.push_back("isa-pointer"); if (getValOrNull(DW_AT_LLVM_ptrauth_authenticates_null_values)) optionsVec.push_back("authenticates-null-values"); + if (auto AuthenticationMode = + D.find(DW_AT_LLVM_ptrauth_authentication_mode)) { + switch (*AuthenticationMode->getAsUnsignedConstant()) { + case 0: + case 1: + optionsVec.push_back("strip"); + break; + case 2: + optionsVec.push_back("sign-and-strip"); + break; + default: + // Default authentication policy + break; + } + } std::string options; for (const auto *option : optionsVec) { if (options.size()) diff --git a/llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s b/llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s index d24a60d99bdac3..befd0fa86ef99c 100644 --- a/llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s +++ b/llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s @@ -23,7 +23,7 @@ # CHECK: 0x0000004f: DW_TAG_variable # CHECK: DW_AT_name ("p3") -# CHECK: DW_AT_type (0x0000005a "void *__ptrauth(4, 1, 0x04d4, "authenticates-null-values")") +# CHECK: DW_AT_type (0x0000005a "void *__ptrauth(4, 1, 0x04d4, "authenticates-null-values,strip")") # CHECK: 0x0000005a: DW_TAG_LLVM_ptrauth_type # CHECK: DW_AT_LLVM_ptrauth_key (0x04) @@ -31,11 +31,11 @@ # CHECK: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d4) # CHECK: DW_AT_LLVM_ptrauth_authenticates_null_values (true) -# CHECK: 0x00000062: DW_TAG_variable +# CHECK: 0x00000063: DW_TAG_variable # CHECK: DW_AT_name ("p4") -# CHECK: DW_AT_type (0x0000006d "void *__ptrauth(4, 1, 0x04d5, "isa-pointer,authenticates-null-values")") +# CHECK: DW_AT_type (0x0000006e "void *__ptrauth(4, 1, 0x04d5, "isa-pointer,authenticates-null-values,sign-and-strip")") -# CHECK: 0x0000006d: DW_TAG_LLVM_ptrauth_type +# CHECK: 0x0000006e: 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) @@ -44,7 +44,7 @@ .section __TEXT,__text,regular,pure_instructions .file 1 "/" "/tmp/p.c" - .comm _p,8 ; @p + .comm _p,8,3 ; @p .section __DWARF,__debug_abbrev,regular,debug Lsection_abbrev: .byte 1 ; Abbreviation Code @@ -140,6 +140,8 @@ Lsection_abbrev: .byte 5 ; DW_FORM_data2 .ascii "\211|" ; DW_AT_LLVM_ptrauth_authenticates_null_values .byte 25 ; DW_FORM_flag_present + .ascii "\212|" ; DW_AT_LLVM_ptrauth_authentication_mode + .byte 11 ; DW_FORM_data1 .byte 0 ; EOM(1) .byte 0 ; EOM(2) .byte 8 ; Abbreviation Code @@ -157,6 +159,8 @@ Lsection_abbrev: .byte 25 ; DW_FORM_flag_present .ascii "\211|" ; DW_AT_LLVM_ptrauth_authenticates_null_values .byte 25 ; DW_FORM_flag_present + .ascii "\212|" ; DW_AT_LLVM_ptrauth_authentication_mode + .byte 11 ; DW_FORM_data1 .byte 0 ; EOM(1) .byte 0 ; EOM(2) .byte 0 ; EOM(3) @@ -170,7 +174,7 @@ Ldebug_info_start0: .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 + .byte 1 ; Abbrev [1] 0xb:0x6d DW_TAG_compile_unit .long 0 ; DW_AT_producer .short 12 ; DW_AT_language .long 1 ; DW_AT_name @@ -210,25 +214,27 @@ Ldebug_info_start0: ; 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 + .byte 7 ; Abbrev [7] 0x5a:0x9 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 + .byte 1 ; DW_AT_LLVM_ptrauth_authentication_mode + .byte 5 ; Abbrev [5] 0x63:0xb DW_TAG_variable .long 21 ; DW_AT_name - .long 109 ; DW_AT_type + .long 110 ; 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 + .byte 8 ; Abbrev [8] 0x6e:0x9 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 2 ; DW_AT_LLVM_ptrauth_authentication_mode .byte 0 ; End Of Children Mark Ldebug_info_end0: .section __DWARF,__debug_str,regular,debug _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits