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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 ||
|
||||
|
||||
2
lldb/test/API/macosx/arm64e-attach/Makefile
Normal file
2
lldb/test/API/macosx/arm64e-attach/Makefile
Normal file
@@ -0,0 +1,2 @@
|
||||
C_SOURCES := main.c
|
||||
include Makefile.rules
|
||||
28
lldb/test/API/macosx/arm64e-attach/TestArm64eAttach.py
Normal file
28
lldb/test/API/macosx/arm64e-attach/TestArm64eAttach.py
Normal 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)
|
||||
2
lldb/test/API/macosx/arm64e-attach/main.c
Normal file
2
lldb/test/API/macosx/arm64e-attach/main.c
Normal file
@@ -0,0 +1,2 @@
|
||||
int getchar();
|
||||
int main() { return getchar(); }
|
||||
Reference in New Issue
Block a user