Replace ArchSpec::PiecewiseCompare() with Triple::operator==()

Looking ast the definition of both functions this is *almost* an NFC
change, except that Triple also looks at the SubArch (important) and
ObjectFormat (less so).

This fixes a bug that only manifests with how Xcode uses the SBAPI to
attach to a process by name: it guesses the architecture based on the
system. If the system is arm64 and the Process is arm64e Target fails
to update the triple because it deemed the two to be equivalent.

rdar://123338218
This commit is contained in:
Adrian Prantl
2024-02-23 09:58:17 -08:00
parent b876596a76
commit f9f331652d
6 changed files with 33 additions and 29 deletions

View File

@@ -505,11 +505,6 @@ public:
bool IsFullySpecifiedTriple() const;
void PiecewiseTripleCompare(const ArchSpec &other, bool &arch_different,
bool &vendor_different, bool &os_different,
bool &os_version_different,
bool &env_different) const;
/// Detect whether this architecture uses thumb code exclusively
///
/// Some embedded ARM chips (e.g. the ARM Cortex M0-7 line) can only execute

View File

@@ -1568,14 +1568,8 @@ bool Target::SetArchitecture(const ArchSpec &arch_spec, bool set_platform,
if (m_arch.GetSpec().IsCompatibleMatch(other)) {
compatible_local_arch = true;
bool arch_changed, vendor_changed, os_changed, os_ver_changed,
env_changed;
m_arch.GetSpec().PiecewiseTripleCompare(other, arch_changed,
vendor_changed, os_changed,
os_ver_changed, env_changed);
if (!arch_changed && !vendor_changed && !os_changed && !env_changed)
if (m_arch.GetSpec().GetTriple() == other.GetTriple())
replace_local_arch = false;
}
}

View File

@@ -1421,23 +1421,6 @@ bool ArchSpec::IsFullySpecifiedTriple() const {
return true;
}
void ArchSpec::PiecewiseTripleCompare(
const ArchSpec &other, bool &arch_different, bool &vendor_different,
bool &os_different, bool &os_version_different, bool &env_different) const {
const llvm::Triple &me(GetTriple());
const llvm::Triple &them(other.GetTriple());
arch_different = (me.getArch() != them.getArch());
vendor_different = (me.getVendor() != them.getVendor());
os_different = (me.getOS() != them.getOS());
os_version_different = (me.getOSMajorVersion() != them.getOSMajorVersion());
env_different = (me.getEnvironment() != them.getEnvironment());
}
bool ArchSpec::IsAlwaysThumbInstructions() const {
std::string Status;
if (GetTriple().getArch() == llvm::Triple::arm ||

View File

@@ -0,0 +1,2 @@
C_SOURCES := main.c
include Makefile.rules

View File

@@ -0,0 +1,28 @@
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class TestArm64eAttach(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.build()
popen = self.spawnSubprocess(self.getBuildArtifact(), [])
error = lldb.SBError()
# This simulates how Xcode attaches to a process by pid/name.
target = self.dbg.CreateTarget("", "arm64", "", True, error)
listener = lldb.SBListener("my.attach.listener")
process = target.AttachToProcessWithID(listener, popen.pid, error)
self.assertSuccess(error)
self.assertTrue(process, PROCESS_IS_VALID)
self.assertEqual(target.GetTriple().split('-')[0], "arm64e",
"target triple is updated correctly")
error = process.Kill()
self.assertSuccess(error)

View File

@@ -0,0 +1,2 @@
int getchar();
int main() { return getchar(); }