Skip to content

[ptrauth] Teach LLVM & LLDB about LLVM_ptrauth_authentication_mode #82272

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

Conversation

JDevlieghere
Copy link
Member

Teach LLVM & LLDB about DW_AT_LLVM_ptrauth_authentication_mode

@llvmbot
Copy link
Member

llvmbot commented Feb 19, 2024

@llvm/pr-subscribers-llvm-binary-utilities

@llvm/pr-subscribers-lldb

Author: Jonas Devlieghere (JDevlieghere)

Changes

Teach LLVM & LLDB about DW_AT_LLVM_ptrauth_authentication_mode


Full diff: https://github.com/llvm/llvm-project/pull/82272.diff

4 Files Affected:

  • (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp (+8-2)
  • (modified) llvm/include/llvm/BinaryFormat/Dwarf.def (+1)
  • (modified) llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp (+15)
  • (modified) llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s (+16-10)
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

@llvmbot
Copy link
Member

llvmbot commented Feb 19, 2024

@llvm/pr-subscribers-debuginfo

Author: Jonas Devlieghere (JDevlieghere)

Changes

Teach LLVM & LLDB about DW_AT_LLVM_ptrauth_authentication_mode


Full diff: https://github.com/llvm/llvm-project/pull/82272.diff

4 Files Affected:

  • (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp (+8-2)
  • (modified) llvm/include/llvm/BinaryFormat/Dwarf.def (+1)
  • (modified) llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp (+15)
  • (modified) llvm/test/tools/llvm-dwarfdump/AArch64/ptrauth.s (+16-10)
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

@asl
Copy link
Collaborator

asl commented Feb 19, 2024

Tagging @kovdan01

@JDevlieghere JDevlieghere merged commit 513d9f2 into llvm:main Feb 19, 2024
@JDevlieghere JDevlieghere deleted the DW_AT_LLVM_ptrauth_authentication_mode branch February 19, 2024 23:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants