1 """ 2 Test that clang produces the __apple accelerator tables, for example, __apple_types, correctly. 3 """ 4 5 import os, time 6 import unittest2 7 import lldb 8 from lldbtest import * 9 from lldbutil import symbol_type_to_str 10 11 class AppleTypesTestCase(TestBase): 12 13 mydir = os.path.join("macosx", "debug-info", "apple_types") 14 15 #rdar://problem/11166975 16 @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 17 def test_debug_info_for_apple_types(self): 18 """Test that __apple_types section does get produced by clang.""" 19 20 if not self.getCompiler().endswith('clang'): 21 self.skipTest("clang compiler only test") 22 23 self.buildDefault() 24 self.apple_types(dot_o=True) 25 26 @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 27 def test_debug_info_for_apple_types_dsym(self): 28 """Test that __apple_types section does get produced by dsymutil. 29 This is supposed to succeed even with rdar://problem/11166975.""" 30 31 if not self.getCompiler().endswith('clang'): 32 self.skipTest("clang compiler only test") 33 34 self.buildDsym() 35 self.apple_types(dot_o=False) 36 37 def apple_types(self, dot_o): 38 """Test that __apple_types section does get produced by clang.""" 39 if dot_o: 40 exe = os.path.join(os.getcwd(), "main.o") 41 else: 42 exe = os.path.join(os.getcwd(), "a.out.dSYM/Contents/Resources/DWARF/a.out") 43 44 target = self.dbg.CreateTarget(exe) 45 self.assertTrue(target, VALID_TARGET) 46 self.assertTrue(target.GetNumModules() > 0) 47 48 # Hide stdout if not running with '-t' option. 49 if not self.TraceOn(): 50 self.HideStdout() 51 52 print "Number of modules for the target: %d" % target.GetNumModules() 53 for module in target.module_iter(): 54 print module 55 56 # Get the executable module at index 0. 57 exe_module = target.GetModuleAtIndex(0) 58 59 dwarf_section = exe_module.FindSection("__DWARF") 60 self.assertTrue(dwarf_section) 61 print "__DWARF section:", dwarf_section 62 print "Number of sub-sections: %d" % dwarf_section.GetNumSubSections() 63 INDENT = ' ' * 4 64 for subsec in dwarf_section: 65 print INDENT + str(subsec) 66 67 debug_str_sub_section = dwarf_section.FindSubSection("__debug_str") 68 self.assertTrue(debug_str_sub_section) 69 print "__debug_str sub-section:", debug_str_sub_section 70 71 # Find our __apple_types section by name. 72 apple_types_sub_section = dwarf_section.FindSubSection("__apple_types") 73 self.assertTrue(apple_types_sub_section) 74 print "__apple_types sub-section:", apple_types_sub_section 75 76 # These other three all important subsections should also be present. 77 self.assertTrue(dwarf_section.FindSubSection("__apple_names") and 78 dwarf_section.FindSubSection("__apple_namespac") and 79 dwarf_section.FindSubSection("__apple_objc")) 80 81 82 if __name__ == '__main__': 83 import atexit 84 lldb.SBDebugger.Initialize() 85 atexit.register(lambda: lldb.SBDebugger.Terminate()) 86 unittest2.main() 87