Skip to content

Commit a8c3d98

Browse files
committed
[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
1 parent e8ceadd commit a8c3d98

File tree

4 files changed

+362
-1
lines changed

4 files changed

+362
-1
lines changed

lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,18 @@ void DWARFDIE::AppendTypeName(Stream &s) const {
320320
case DW_TAG_volatile_type:
321321
s.PutCString("volatile ");
322322
break;
323+
case DW_TAG_LLVM_ptrauth_type: {
324+
unsigned key = GetAttributeValueAsUnsigned(DW_AT_LLVM_ptrauth_key, 0);
325+
bool isAddressDiscriminated = GetAttributeValueAsUnsigned(
326+
DW_AT_LLVM_ptrauth_address_discriminated, 0);
327+
unsigned extraDiscriminator =
328+
GetAttributeValueAsUnsigned(DW_AT_LLVM_ptrauth_extra_discriminator, 0);
329+
bool isaPointer =
330+
GetAttributeValueAsUnsigned(DW_AT_LLVM_ptrauth_isa_pointer, 0);
331+
s.Printf("__ptrauth(%d, %d, 0x0%x, %d)", key, isAddressDiscriminated,
332+
extraDiscriminator, isaPointer);
333+
break;
334+
}
323335
default:
324336
return;
325337
}

llvm/include/llvm/BinaryFormat/Dwarf.def

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,9 @@ HANDLE_DW_TAG(0x420c, SUN_f90_interface, 0, SUN, DW_KIND_NONE)
241241
HANDLE_DW_TAG(0x420d, SUN_fortran_vax_structure, 0, SUN, DW_KIND_NONE)
242242
HANDLE_DW_TAG(0x42ff, SUN_hi, 0, SUN, DW_KIND_NONE)
243243

244+
// LLVM
245+
HANDLE_DW_TAG(0x4300, LLVM_ptrauth_type, 0, LLVM, DW_KIND_NONE)
246+
244247
// DSP-C/Starcore __circ, _rev
245248
HANDLE_DW_TAG(0x5101, ALTIUM_circ_type, 0, ALTIUM, DW_KIND_NONE)
246249
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)
597600
HANDLE_DW_AT(0x3e01, LLVM_config_macros, 0, LLVM)
598601
HANDLE_DW_AT(0x3e02, LLVM_sysroot, 0, LLVM)
599602
HANDLE_DW_AT(0x3e03, LLVM_tag_offset, 0, LLVM)
600-
// The missing numbers here are reserved for ptrauth support.
603+
HANDLE_DW_AT(0x3e04, LLVM_ptrauth_key, 0, LLVM)
604+
HANDLE_DW_AT(0x3e05, LLVM_ptrauth_address_discriminated, 0, LLVM)
605+
HANDLE_DW_AT(0x3e06, LLVM_ptrauth_extra_discriminator, 0, LLVM)
601606
HANDLE_DW_AT(0x3e07, LLVM_apinotes, 0, APPLE)
607+
HANDLE_DW_AT(0x3e08, LLVM_ptrauth_isa_pointer, 0, LLVM)
608+
HANDLE_DW_AT(0x3e09, LLVM_ptrauth_authenticates_null_values, 0, LLVM)
602609

603610
// Apple extensions.
604611

llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ DWARFTypePrinter::appendUnqualifiedNameBefore(DWARFDie D,
143143
Word = false;
144144
break;
145145
}
146+
case DW_TAG_LLVM_ptrauth_type:
147+
appendQualifiedNameBefore(Inner());
148+
break;
146149
case DW_TAG_const_type:
147150
case DW_TAG_volatile_type:
148151
appendConstVolatileQualifierBefore(D);
@@ -237,6 +240,35 @@ void DWARFTypePrinter::appendUnqualifiedNameAfter(
237240
/*SkipFirstParamIfArtificial=*/D.getTag() ==
238241
DW_TAG_ptr_to_member_type);
239242
break;
243+
}
244+
case DW_TAG_LLVM_ptrauth_type: {
245+
auto getValOrNull = [&](dwarf::Attribute Attr) -> uint64_t {
246+
if (auto Form = D.find(Attr))
247+
return *Form->getAsUnsignedConstant();
248+
return 0;
249+
};
250+
SmallVector<const char *, 2> optionsVec;
251+
if (getValOrNull(DW_AT_LLVM_ptrauth_isa_pointer))
252+
optionsVec.push_back("isa-pointer");
253+
if (getValOrNull(DW_AT_LLVM_ptrauth_authenticates_null_values))
254+
optionsVec.push_back("authenticates-null-values");
255+
std::string options;
256+
for (auto option : optionsVec) {
257+
if (options.size())
258+
options += ",";
259+
options += option;
260+
}
261+
if (options.size())
262+
options = ", \"" + options + "\"";
263+
std::string PtrauthString;
264+
llvm::raw_string_ostream PtrauthStream(PtrauthString);
265+
PtrauthStream
266+
<< "__ptrauth(" << getValOrNull(DW_AT_LLVM_ptrauth_key) << ", "
267+
<< getValOrNull(DW_AT_LLVM_ptrauth_address_discriminated) << ", 0x0"
268+
<< utohexstr(getValOrNull(DW_AT_LLVM_ptrauth_extra_discriminator), true)
269+
<< options << ")";
270+
OS << PtrauthStream.str();
271+
break;
240272
}
241273
/*
242274
case DW_TAG_structure_type:

0 commit comments

Comments
 (0)