1*ebf24906SJason Molenda""" 2*ebf24906SJason MolendaAn SBTarget with no arch, call AddModule, SBTarget's arch should be set. 3*ebf24906SJason Molenda""" 4*ebf24906SJason Molenda 5*ebf24906SJason Molendaimport os 6*ebf24906SJason Molendaimport subprocess 7*ebf24906SJason Molendaimport re 8*ebf24906SJason Molendaimport lldb 9*ebf24906SJason Molendafrom lldbsuite.test.decorators import * 10*ebf24906SJason Molendafrom lldbsuite.test.lldbtest import * 11*ebf24906SJason Molendafrom lldbsuite.test import lldbutil 12*ebf24906SJason Molenda 13*ebf24906SJason Molenda 14*ebf24906SJason Molendaclass TargetArchFromModule(TestBase): 15*ebf24906SJason Molenda @skipIf( 16*ebf24906SJason Molenda debug_info=no_match(["dsym"]), 17*ebf24906SJason Molenda bugnumber="This test is looking explicitly for a dSYM", 18*ebf24906SJason Molenda ) 19*ebf24906SJason Molenda @skipUnlessDarwin 20*ebf24906SJason Molenda @skipIfRemote 21*ebf24906SJason Molenda def test_target_arch_init(self): 22*ebf24906SJason Molenda self.build() 23*ebf24906SJason Molenda aout_exe = self.getBuildArtifact("a.out") 24*ebf24906SJason Molenda aout_dsym = self.getBuildArtifact("a.out.dSYM") 25*ebf24906SJason Molenda hidden_dir = self.getBuildArtifact("hide.noindex") 26*ebf24906SJason Molenda hidden_aout_exe = self.getBuildArtifact("hide.noindex/a.out") 27*ebf24906SJason Molenda hidden_aout_dsym = self.getBuildArtifact("hide.noindex/a.out.dSYM") 28*ebf24906SJason Molenda dsym_for_uuid = self.getBuildArtifact("dsym-for-uuid.sh") 29*ebf24906SJason Molenda 30*ebf24906SJason Molenda # We can hook in our dsym-for-uuid shell script to lldb with 31*ebf24906SJason Molenda # this env var instead of requiring a defaults write. 32*ebf24906SJason Molenda os.environ["LLDB_APPLE_DSYMFORUUID_EXECUTABLE"] = dsym_for_uuid 33*ebf24906SJason Molenda self.addTearDownHook( 34*ebf24906SJason Molenda lambda: os.environ.pop("LLDB_APPLE_DSYMFORUUID_EXECUTABLE", None) 35*ebf24906SJason Molenda ) 36*ebf24906SJason Molenda 37*ebf24906SJason Molenda dwarfdump_uuid_regex = re.compile("UUID: ([-0-9a-fA-F]+) \(([^\(]+)\) .*") 38*ebf24906SJason Molenda dwarfdump_cmd_output = subprocess.check_output( 39*ebf24906SJason Molenda ('/usr/bin/dwarfdump --uuid "%s"' % aout_exe), shell=True 40*ebf24906SJason Molenda ).decode("utf-8") 41*ebf24906SJason Molenda aout_uuid = None 42*ebf24906SJason Molenda for line in dwarfdump_cmd_output.splitlines(): 43*ebf24906SJason Molenda match = dwarfdump_uuid_regex.search(line) 44*ebf24906SJason Molenda if match: 45*ebf24906SJason Molenda aout_uuid = match.group(1) 46*ebf24906SJason Molenda self.assertNotEqual(aout_uuid, None, "Could not get uuid of built a.out") 47*ebf24906SJason Molenda 48*ebf24906SJason Molenda ### Create our dsym-for-uuid shell script which returns self.hidden_aout_exe. 49*ebf24906SJason Molenda shell_cmds = [ 50*ebf24906SJason Molenda "#! /bin/sh", 51*ebf24906SJason Molenda "# the last argument is the uuid", 52*ebf24906SJason Molenda "while [ $# -gt 1 ]", 53*ebf24906SJason Molenda "do", 54*ebf24906SJason Molenda " shift", 55*ebf24906SJason Molenda "done", 56*ebf24906SJason Molenda "ret=0", 57*ebf24906SJason Molenda 'echo "<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>"', 58*ebf24906SJason Molenda 'echo "<!DOCTYPE plist PUBLIC \\"-//Apple//DTD PLIST 1.0//EN\\" \\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\\">"', 59*ebf24906SJason Molenda 'echo "<plist version=\\"1.0\\">"', 60*ebf24906SJason Molenda "", 61*ebf24906SJason Molenda 'if [ "$1" = "%s" ]' % aout_uuid, 62*ebf24906SJason Molenda "then", 63*ebf24906SJason Molenda " uuid=%s" % aout_uuid, 64*ebf24906SJason Molenda " bin=%s" % hidden_aout_exe, 65*ebf24906SJason Molenda " dsym=%s.dSYM/Contents/Resources/DWARF/%s" 66*ebf24906SJason Molenda % (hidden_aout_exe, os.path.basename(hidden_aout_exe)), 67*ebf24906SJason Molenda "fi", 68*ebf24906SJason Molenda 'echo " <dict>"', 69*ebf24906SJason Molenda 'echo " <key>$1</key>"', 70*ebf24906SJason Molenda 'echo " <dict>"', 71*ebf24906SJason Molenda 'if [ -z "$uuid" -o -z "$bin" -o ! -f "$bin" ]', 72*ebf24906SJason Molenda "then", 73*ebf24906SJason Molenda ' echo " <key>DBGError</key>"', 74*ebf24906SJason Molenda ' echo " <string>not found by $0</string>"', 75*ebf24906SJason Molenda ' echo " </dict>"', 76*ebf24906SJason Molenda ' echo " </dict>"', 77*ebf24906SJason Molenda ' echo "</plist>"', 78*ebf24906SJason Molenda " exit 0", 79*ebf24906SJason Molenda "fi", 80*ebf24906SJason Molenda "", 81*ebf24906SJason Molenda 'echo "<key>DBGDSYMPath</key><string>$dsym</string>"', 82*ebf24906SJason Molenda 'echo "<key>DBGSymbolRichExecutable</key><string>$bin</string>"', 83*ebf24906SJason Molenda 'echo "</dict></dict></plist>"', 84*ebf24906SJason Molenda "exit $ret", 85*ebf24906SJason Molenda ] 86*ebf24906SJason Molenda 87*ebf24906SJason Molenda with open(dsym_for_uuid, "w") as writer: 88*ebf24906SJason Molenda for l in shell_cmds: 89*ebf24906SJason Molenda writer.write(l + "\n") 90*ebf24906SJason Molenda 91*ebf24906SJason Molenda os.chmod(dsym_for_uuid, 0o755) 92*ebf24906SJason Molenda 93*ebf24906SJason Molenda # Move the main binary and its dSYM into the hide.noindex 94*ebf24906SJason Molenda # directory. Now the only way lldb can find them is with 95*ebf24906SJason Molenda # the LLDB_APPLE_DSYMFORUUID_EXECUTABLE shell script - 96*ebf24906SJason Molenda # so we're testing that this dSYM discovery method works. 97*ebf24906SJason Molenda lldbutil.mkdir_p(hidden_dir) 98*ebf24906SJason Molenda os.rename(aout_exe, hidden_aout_exe) 99*ebf24906SJason Molenda os.rename(aout_dsym, hidden_aout_dsym) 100*ebf24906SJason Molenda 101*ebf24906SJason Molenda target = self.dbg.CreateTarget("") 102*ebf24906SJason Molenda self.assertTrue(target.IsValid()) 103*ebf24906SJason Molenda self.expect("target list", matching=False, substrs=["arch="]) 104*ebf24906SJason Molenda 105*ebf24906SJason Molenda m = target.AddModule(None, None, aout_uuid) 106*ebf24906SJason Molenda self.assertTrue(m.IsValid()) 107*ebf24906SJason Molenda self.expect("target list", substrs=["arch="]) 108