From 1b72f09150b1333e33773882e9c035ac896acc5e Mon Sep 17 00:00:00 2001
From: Johnny Chen <johnny.chen@apple.com>
Date: Fri, 16 Mar 2012 21:55:42 +0000
Subject: [PATCH] Export the APIs submitted by Dawn to the Python bindings. 
 Add a simple test case for the SBModule.compile_unit_iter() API.

llvm-svn: 152952
---
 lldb/scripts/Python/interface/SBCompileUnit.i |  9 ++++++
 lldb/scripts/Python/interface/SBModule.i      |  6 ++++
 lldb/scripts/Python/modify-python-lldb.py     |  6 +++-
 lldb/test/python_api/module_section/Makefile  |  2 +-
 .../module_section/TestModuleAndSection.py    | 32 +++++++++++++++++++
 lldb/test/python_api/module_section/b.cpp     |  3 ++
 lldb/test/python_api/module_section/c.cpp     |  3 ++
 7 files changed, 59 insertions(+), 2 deletions(-)
 create mode 100644 lldb/test/python_api/module_section/b.cpp
 create mode 100644 lldb/test/python_api/module_section/c.cpp

diff --git a/lldb/scripts/Python/interface/SBCompileUnit.i b/lldb/scripts/Python/interface/SBCompileUnit.i
index be4f740c12ee..6f9d023295e2 100644
--- a/lldb/scripts/Python/interface/SBCompileUnit.i
+++ b/lldb/scripts/Python/interface/SBCompileUnit.i
@@ -77,6 +77,15 @@ public:
                         lldb::SBFileSpec *inline_file_spec,
 			bool exact) const;
 
+    SBFileSpec
+    GetSupportFileAtIndex (uint32_t idx) const;
+
+    uint32_t
+    GetNumSupportFiles () const;
+
+    uint32_t
+    FindSupportFileIndex (uint32_t start_idx, const SBFileSpec &sb_file, bool full);
+
     bool
     GetDescription (lldb::SBStream &description);
     
diff --git a/lldb/scripts/Python/interface/SBModule.i b/lldb/scripts/Python/interface/SBModule.i
index c826134ff420..1b6d4ecac432 100644
--- a/lldb/scripts/Python/interface/SBModule.i
+++ b/lldb/scripts/Python/interface/SBModule.i
@@ -165,6 +165,12 @@ public:
     bool
     GetDescription (lldb::SBStream &description);
 
+    uint32_t
+    GetNumCompileUnits();
+
+    lldb::SBCompileUnit
+    GetCompileUnitAtIndex (uint32_t);
+
     size_t
     GetNumSymbols ();
     
diff --git a/lldb/scripts/Python/modify-python-lldb.py b/lldb/scripts/Python/modify-python-lldb.py
index 034e2add86e5..75f97e78ba9e 100644
--- a/lldb/scripts/Python/modify-python-lldb.py
+++ b/lldb/scripts/Python/modify-python-lldb.py
@@ -175,6 +175,7 @@ module_iter = "    def module_iter(self): return lldb_iter(self, '%s', '%s')"
 breakpoint_iter = "    def breakpoint_iter(self): return lldb_iter(self, '%s', '%s')"
 watchpoint_iter = "    def watchpoint_iter(self): return lldb_iter(self, '%s', '%s')"
 section_iter = "    def section_iter(self): return lldb_iter(self, '%s', '%s')"
+compile_unit_iter = "    def compile_unit_iter(self): return lldb_iter(self, '%s', '%s')"
 
 # Called to implement the built-in function len().
 # Eligible objects are those containers with unambiguous iteration support.
@@ -227,6 +228,8 @@ d = { 'SBBreakpoint':  ('GetNumLocations',   'GetLocationAtIndex'),
 
       # SBModule has an additional section_iter(), see below.
       'SBModule-section': ('GetNumSections', 'GetSectionAtIndex'),
+      # And compile_unit_iter().
+      'SBModule-compile-unit': ('GetNumCompileUnits', 'GetCompileUnitAtIndex'),
       # As well as symbol_in_section_iter().
       'SBModule-symbol-in-section': symbol_in_section_iter_def
       }
@@ -378,9 +381,10 @@ for line in content.splitlines():
                     new_content.add_line(eq_def % (cls, list_to_frag(e[cls])))
                     new_content.add_line(ne_def)
 
-            # SBModule has an extra SBSection iterator and symbol_in_section_iter()!
+            # SBModule has extra SBSection, SBCompileUnit iterators and symbol_in_section_iter()!
             if cls == "SBModule":
                 new_content.add_line(section_iter % d[cls+'-section'])
+                new_content.add_line(compile_unit_iter % d[cls+'-compile-unit'])
                 new_content.add_line(d[cls+'-symbol-in-section'])
             
             # This special purpose iterator is for SBValue only!!!
diff --git a/lldb/test/python_api/module_section/Makefile b/lldb/test/python_api/module_section/Makefile
index 86af2f4bc70e..5738d5684daf 100644
--- a/lldb/test/python_api/module_section/Makefile
+++ b/lldb/test/python_api/module_section/Makefile
@@ -1,6 +1,6 @@
 LEVEL = ../../make
 
-CXX_SOURCES := main.cpp
+CXX_SOURCES := main.cpp b.cpp c.cpp
 MAKE_DSYM :=NO
 
 include $(LEVEL)/Makefile.rules
diff --git a/lldb/test/python_api/module_section/TestModuleAndSection.py b/lldb/test/python_api/module_section/TestModuleAndSection.py
index ebd0ea04909f..7038d6e71090 100644
--- a/lldb/test/python_api/module_section/TestModuleAndSection.py
+++ b/lldb/test/python_api/module_section/TestModuleAndSection.py
@@ -25,6 +25,12 @@ class ModuleAndSectionAPIsTestCase(TestBase):
         self.buildDefault()
         self.module_and_section_boundary_condition()
 
+    @python_api_test
+    def test_module_compile_unit_iter(self):
+        """Test module's compile unit iterator APIs."""
+        self.buildDefault()
+        self.module_compile_unit_iter()
+
     def module_and_section(self):
         exe = os.path.join(os.getcwd(), "a.out")
 
@@ -100,6 +106,32 @@ class ModuleAndSectionAPIsTestCase(TestBase):
         if sec1:
             sec1.FindSubSection(None)
 
+    def module_compile_unit_iter(self):
+        exe = os.path.join(os.getcwd(), "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)
+
+        print "Exe module: %s" % str(exe_module)
+        print "Number of compile units: %d" % exe_module.GetNumCompileUnits()
+        INDENT = ' ' * 4
+        INDENT2 = INDENT * 2
+        for cu in exe_module.compile_unit_iter():
+            print cu
+
+
 if __name__ == '__main__':
     import atexit
     lldb.SBDebugger.Initialize()
diff --git a/lldb/test/python_api/module_section/b.cpp b/lldb/test/python_api/module_section/b.cpp
new file mode 100644
index 000000000000..4e3e54138e5b
--- /dev/null
+++ b/lldb/test/python_api/module_section/b.cpp
@@ -0,0 +1,3 @@
+int b_function(int input) {
+    return input * 2;
+}
diff --git a/lldb/test/python_api/module_section/c.cpp b/lldb/test/python_api/module_section/c.cpp
new file mode 100644
index 000000000000..3c87bfe30c6c
--- /dev/null
+++ b/lldb/test/python_api/module_section/c.cpp
@@ -0,0 +1,3 @@
+int c_function(int input) {
+    return input * 3;
+}