Skip to content

Commit a34910a

Browse files
committed
[AArch64][PAC][CodeGen] Fix emitting DW_AT_LLVM_ptrauth_address_discriminated
The Dwarf attribute `DW_AT_LLVM_ptrauth_address_discriminated` was emitted for all ptrauth-qualified types, even if the address discrimination was disabled. This was related to incorrect usage of `std::optional<bool>` holding the value of the attribute.
1 parent 62ce88f commit a34910a

File tree

2 files changed

+39
-30
lines changed

2 files changed

+39
-30
lines changed

llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,7 @@ void DwarfUnit::constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy) {
805805
if (auto Key = DTy->getPtrAuthKey())
806806
addUInt(Buffer, dwarf::DW_AT_LLVM_ptrauth_key, dwarf::DW_FORM_data1, *Key);
807807
if (auto AddrDisc = DTy->isPtrAuthAddressDiscriminated())
808-
if (AddrDisc)
808+
if (AddrDisc.value())
809809
addFlag(Buffer, dwarf::DW_AT_LLVM_ptrauth_address_discriminated);
810810
if (auto Disc = DTy->getPtrAuthExtraDiscriminator())
811811
addUInt(Buffer, dwarf::DW_AT_LLVM_ptrauth_extra_discriminator,
Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,70 @@
11
; RUN: llc %s -filetype=obj -mtriple arm64e-apple-darwin -o - \
22
; RUN: | llvm-dwarfdump - | FileCheck %s
33

4-
; CHECK: DW_AT_type (0x{{0+}}[[TY:.*]] "void *__ptrauth(4, 1, 0x04d2)")
4+
; CHECK: DW_AT_type (0x{{0+}}[[TY:.*]] "void *__ptrauth(4, 0, 0x04d2)")
55
; CHECK: 0x{{0+}}[[TY]]: DW_TAG_LLVM_ptrauth_type
66
; CHECK-NEXT: DW_AT_type {{.*}}"void *"
77
; CHECK-NEXT: DW_AT_LLVM_ptrauth_key (0x04)
8-
; CHECK-NEXT: DW_AT_LLVM_ptrauth_address_discriminated (true)
98
; CHECK-NEXT: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d2)
109

11-
; CHECK: DW_AT_type (0x{{0+}}[[TY:.*]] "void *__ptrauth(4, 1, 0x04d3, "isa-pointer")")
10+
; CHECK: DW_AT_type (0x{{0+}}[[TY:.*]] "void *__ptrauth(4, 1, 0x04d3)")
1211
; CHECK: 0x{{0+}}[[TY]]: DW_TAG_LLVM_ptrauth_type
1312
; CHECK-NEXT: DW_AT_type {{.*}}"void *"
1413
; CHECK-NEXT: DW_AT_LLVM_ptrauth_key (0x04)
1514
; CHECK-NEXT: DW_AT_LLVM_ptrauth_address_discriminated (true)
1615
; CHECK-NEXT: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d3)
17-
; CHECK-NEXT: DW_AT_LLVM_ptrauth_isa_pointer (true)
1816

19-
; CHECK: DW_AT_type (0x{{0+}}[[TY:.*]] "void *__ptrauth(4, 1, 0x04d4, "authenticates-null-values")")
17+
; CHECK: DW_AT_type (0x{{0+}}[[TY:.*]] "void *__ptrauth(4, 1, 0x04d4, "isa-pointer")")
2018
; CHECK: 0x{{0+}}[[TY]]: DW_TAG_LLVM_ptrauth_type
2119
; CHECK-NEXT: DW_AT_type {{.*}}"void *"
2220
; CHECK-NEXT: DW_AT_LLVM_ptrauth_key (0x04)
2321
; CHECK-NEXT: DW_AT_LLVM_ptrauth_address_discriminated (true)
2422
; CHECK-NEXT: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d4)
25-
; CHECK-NEXT: DW_AT_LLVM_ptrauth_authenticates_null_values (true)
23+
; CHECK-NEXT: DW_AT_LLVM_ptrauth_isa_pointer (true)
2624

27-
; CHECK: DW_AT_type (0x{{0+}}[[TY:.*]] "void *__ptrauth(4, 1, 0x04d5, "isa-pointer,authenticates-null-values")")
25+
; CHECK: DW_AT_type (0x{{0+}}[[TY:.*]] "void *__ptrauth(4, 1, 0x04d5, "authenticates-null-values")")
2826
; CHECK: 0x{{0+}}[[TY]]: DW_TAG_LLVM_ptrauth_type
2927
; CHECK-NEXT: DW_AT_type {{.*}}"void *"
3028
; CHECK-NEXT: DW_AT_LLVM_ptrauth_key (0x04)
3129
; CHECK-NEXT: DW_AT_LLVM_ptrauth_address_discriminated (true)
3230
; CHECK-NEXT: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d5)
31+
; CHECK-NEXT: DW_AT_LLVM_ptrauth_authenticates_null_values (true)
32+
33+
; CHECK: DW_AT_type (0x{{0+}}[[TY:.*]] "void *__ptrauth(4, 1, 0x04d6, "isa-pointer,authenticates-null-values")")
34+
; CHECK: 0x{{0+}}[[TY]]: DW_TAG_LLVM_ptrauth_type
35+
; CHECK-NEXT: DW_AT_type {{.*}}"void *"
36+
; CHECK-NEXT: DW_AT_LLVM_ptrauth_key (0x04)
37+
; CHECK-NEXT: DW_AT_LLVM_ptrauth_address_discriminated (true)
38+
; CHECK-NEXT: DW_AT_LLVM_ptrauth_extra_discriminator (0x04d6)
3339
; CHECK-NEXT: DW_AT_LLVM_ptrauth_isa_pointer (true)
3440
; CHECK-NEXT: DW_AT_LLVM_ptrauth_authenticates_null_values (true)
3541

3642
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
3743

3844
@p = common global i8* null, align 8, !dbg !0
3945

40-
!llvm.dbg.cu = !{!8}
41-
!llvm.module.flags = !{!16, !17}
42-
43-
!0 = !DIGlobalVariableExpression(var: !4, expr: !DIExpression())
44-
!1 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression())
45-
!2 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression())
46-
!3 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())
47-
!4 = distinct !DIGlobalVariable(name: "p1", scope: !8, file: !9, line: 1, type: !12, isLocal: false, isDefinition: true)
48-
!5 = distinct !DIGlobalVariable(name: "p2", scope: !8, file: !9, line: 1, type: !13, isLocal: false, isDefinition: true)
49-
!6 = distinct !DIGlobalVariable(name: "p3", scope: !8, file: !9, line: 1, type: !14, isLocal: false, isDefinition: true)
50-
!7 = distinct !DIGlobalVariable(name: "p4", scope: !8, file: !9, line: 1, type: !15, isLocal: false, isDefinition: true)
51-
!8 = distinct !DICompileUnit(language: DW_LANG_C99, file: !9, emissionKind: FullDebug, globals: !11)
52-
!9 = !DIFile(filename: "/tmp/p.c", directory: "/")
53-
!10 = !{}
54-
!11 = !{!0,!1,!2,!3}
55-
!12 = !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type, baseType: !18, ptrAuthKey: 4, ptrAuthIsAddressDiscriminated: true, ptrAuthExtraDiscriminator: 1234)
56-
!13 = !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type, baseType: !18, ptrAuthKey: 4, ptrAuthIsAddressDiscriminated: true, ptrAuthExtraDiscriminator: 1235, ptrAuthIsaPointer: true)
57-
!14 = !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type, baseType: !18, ptrAuthKey: 4, ptrAuthIsAddressDiscriminated: true, ptrAuthExtraDiscriminator: 1236, ptrAuthAuthenticatesNullValues: true)
58-
!15 = !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type, baseType: !18, ptrAuthKey: 4, ptrAuthIsAddressDiscriminated: true, ptrAuthExtraDiscriminator: 1237, ptrAuthIsaPointer: true, ptrAuthAuthenticatesNullValues: true)
59-
!16 = !{i32 2, !"Dwarf Version", i32 4}
60-
!17 = !{i32 2, !"Debug Info Version", i32 3}
61-
!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null)
46+
!llvm.dbg.cu = !{!10}
47+
!llvm.module.flags = !{!19, !20}
48+
49+
!0 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression())
50+
!1 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression())
51+
!2 = !DIGlobalVariableExpression(var: !7, expr: !DIExpression())
52+
!3 = !DIGlobalVariableExpression(var: !8, expr: !DIExpression())
53+
!4 = !DIGlobalVariableExpression(var: !9, expr: !DIExpression())
54+
!5 = distinct !DIGlobalVariable(name: "p1", scope: !10, file: !11, line: 1, type: !14, isLocal: false, isDefinition: true)
55+
!6 = distinct !DIGlobalVariable(name: "p2", scope: !10, file: !11, line: 1, type: !15, isLocal: false, isDefinition: true)
56+
!7 = distinct !DIGlobalVariable(name: "p3", scope: !10, file: !11, line: 1, type: !16, isLocal: false, isDefinition: true)
57+
!8 = distinct !DIGlobalVariable(name: "p4", scope: !10, file: !11, line: 1, type: !17, isLocal: false, isDefinition: true)
58+
!9 = distinct !DIGlobalVariable(name: "p5", scope: !10, file: !11, line: 1, type: !18, isLocal: false, isDefinition: true)
59+
!10 = distinct !DICompileUnit(language: DW_LANG_C99, file: !11, emissionKind: FullDebug, globals: !13)
60+
!11 = !DIFile(filename: "/tmp/p.c", directory: "/")
61+
!12 = !{}
62+
!13 = !{!0,!1,!2,!3,!4}
63+
!14 = !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type, baseType: !21, ptrAuthKey: 4, ptrAuthIsAddressDiscriminated: false, ptrAuthExtraDiscriminator: 1234)
64+
!15 = !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type, baseType: !21, ptrAuthKey: 4, ptrAuthIsAddressDiscriminated: true, ptrAuthExtraDiscriminator: 1235)
65+
!16 = !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type, baseType: !21, ptrAuthKey: 4, ptrAuthIsAddressDiscriminated: true, ptrAuthExtraDiscriminator: 1236, ptrAuthIsaPointer: true)
66+
!17 = !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type, baseType: !21, ptrAuthKey: 4, ptrAuthIsAddressDiscriminated: true, ptrAuthExtraDiscriminator: 1237, ptrAuthAuthenticatesNullValues: true)
67+
!18 = !DIDerivedType(tag: DW_TAG_LLVM_ptrauth_type, baseType: !21, ptrAuthKey: 4, ptrAuthIsAddressDiscriminated: true, ptrAuthExtraDiscriminator: 1238, ptrAuthIsaPointer: true, ptrAuthAuthenticatesNullValues: true)
68+
!19 = !{i32 2, !"Dwarf Version", i32 4}
69+
!20 = !{i32 2, !"Debug Info Version", i32 3}
70+
!21 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: null)

0 commit comments

Comments
 (0)