[llvm] a8c3d98 - [DebugInfo] Teach LLVM and LLDB about ptrauth in DWARF
Jonas Devlieghere via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 27 11:49:07 PDT 2022
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:
More information about the llvm-commits
mailing list