blob: 34556a774049fddb2e127dbebb2e6fc64bb2ef70 [file] [log] [blame]
"""
Test that clang produces the __apple accelerator tables, for example, __apple_types, correctly.
"""
import os, time
import unittest2
import lldb
from lldbtest import *
from lldbutil import symbol_type_to_str
class AppleTypesTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
#rdar://problem/11166975
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
def test_debug_info_for_apple_types(self):
"""Test that __apple_types section does get produced by clang."""
if not self.getCompiler().endswith('clang'):
self.skipTest("clang compiler only test")
self.buildDefault()
self.apple_types(dot_o=True)
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
def test_debug_info_for_apple_types_dsym(self):
"""Test that __apple_types section does get produced by dsymutil.
This is supposed to succeed even with rdar://problem/11166975."""
if not self.getCompiler().endswith('clang'):
self.skipTest("clang compiler only test")
self.buildDsym()
self.apple_types(dot_o=False)
def apple_types(self, dot_o):
"""Test that __apple_types section does get produced by clang."""
if dot_o:
exe = os.path.join(os.getcwd(), "main.o")
else:
exe = os.path.join(os.getcwd(), "a.out.dSYM/Contents/Resources/DWARF/a.out")
target = self.dbg.CreateTarget(exe)
self.assertTrue(target, VALID_TARGET)
self.assertTrue(target.GetNumModules() > 0)
# Hide stdout if not running with '-t' option.
if not self.TraceOn():
self.HideStdout()
print "Number of modules for the target: %d" % target.GetNumModules()
for module in target.module_iter():
print module
# Get the executable module at index 0.
exe_module = target.GetModuleAtIndex(0)
dwarf_section = exe_module.FindSection("__DWARF")
self.assertTrue(dwarf_section)
print "__DWARF section:", dwarf_section
print "Number of sub-sections: %d" % dwarf_section.GetNumSubSections()
INDENT = ' ' * 4
for subsec in dwarf_section:
print INDENT + str(subsec)
debug_str_sub_section = dwarf_section.FindSubSection("__debug_str")
self.assertTrue(debug_str_sub_section)
print "__debug_str sub-section:", debug_str_sub_section
# Find our __apple_types section by name.
apple_types_sub_section = dwarf_section.FindSubSection("__apple_types")
self.assertTrue(apple_types_sub_section)
print "__apple_types sub-section:", apple_types_sub_section
# These other three all important subsections should also be present.
self.assertTrue(dwarf_section.FindSubSection("__apple_names") and
dwarf_section.FindSubSection("__apple_namespac") and
dwarf_section.FindSubSection("__apple_objc"))
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()