diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py --- a/lldb/packages/Python/lldbsuite/test/lldbtest.py +++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -1243,6 +1243,8 @@ return self.isAArch64() and "mte" in self.getCPUInfo() def isAArch64PAuth(self): + if self.getArchitecture() == "arm64e": + return True return self.isAArch64() and "paca" in self.getCPUInfo() def getArchitecture(self): diff --git a/lldb/source/Interpreter/OptionArgParser.cpp b/lldb/source/Interpreter/OptionArgParser.cpp --- a/lldb/source/Interpreter/OptionArgParser.cpp +++ b/lldb/source/Interpreter/OptionArgParser.cpp @@ -8,6 +8,7 @@ #include "lldb/Interpreter/OptionArgParser.h" #include "lldb/DataFormatters/FormatManager.h" +#include "lldb/Target/ABI.h" #include "lldb/Target/Target.h" #include "lldb/Utility/Status.h" #include "lldb/Utility/StreamString.h" @@ -157,6 +158,10 @@ if (!s.getAsInteger(0, addr)) { if (error_ptr) error_ptr->Clear(); + Process *process = exe_ctx->GetProcessPtr(); + if (process) + if (ABISP abi_sp = process->GetABI()) + addr = abi_sp->FixCodeAddress(addr); return addr; } diff --git a/lldb/test/API/macosx/ptrauth-address-expressions/Makefile b/lldb/test/API/macosx/ptrauth-address-expressions/Makefile new file mode 100644 --- /dev/null +++ b/lldb/test/API/macosx/ptrauth-address-expressions/Makefile @@ -0,0 +1,3 @@ +C_SOURCES := main.c + +include Makefile.rules diff --git a/lldb/test/API/macosx/ptrauth-address-expressions/TestPtrauthAddressExpressions.py b/lldb/test/API/macosx/ptrauth-address-expressions/TestPtrauthAddressExpressions.py new file mode 100644 --- /dev/null +++ b/lldb/test/API/macosx/ptrauth-address-expressions/TestPtrauthAddressExpressions.py @@ -0,0 +1,28 @@ +"""Test that AArch64 PAC bits are stripped from address expression arguments""" + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class TestPtrauthAddressExpressions(TestBase): + + NO_DEBUG_INFO_TESTCASE = True + + # On Darwin systems, arch arm64e means ARMv8.3 with ptrauth + # ABI used. + @skipIf(archs=no_match(['arm64e'])) + + def test(self): + + # Skip this test if not running on AArch64 target that supports PAC + if not self.isAArch64PAuth(): + self.skipTest('Target must support pointer authentication.') + self.source = 'main.c' + self.build() + (self.target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(self, + "break here", lldb.SBFileSpec(self.source, False)) + + self.expect("p fptr", substrs=[self.source]) + self.expect("ima loo -va fptr", substrs=[self.source]) + self.expect("break set -a fptr", substrs=[self.source]) diff --git a/lldb/test/API/macosx/ptrauth-address-expressions/main.c b/lldb/test/API/macosx/ptrauth-address-expressions/main.c new file mode 100644 --- /dev/null +++ b/lldb/test/API/macosx/ptrauth-address-expressions/main.c @@ -0,0 +1,10 @@ +#include + +int foo () { return 10; } + +int main () +{ + int (*fptr)() = foo; + printf ("%p\n", fptr); // break here + return fptr(); +}