llvm-build: Validate information on the loaded components and form the topological ordering among them (as well as validating that there are no cycles).
 - Currently we require that all references between components (except the parent relation) fit into a DAG -- this could be relaxed later if it ever proves to be useful.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143623 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/utils/llvm-build/llvmbuild/componentinfo.py b/utils/llvm-build/llvmbuild/componentinfo.py
index e15dbda..22ce0b4 100644
--- a/utils/llvm-build/llvmbuild/componentinfo.py
+++ b/utils/llvm-build/llvmbuild/componentinfo.py
@@ -37,6 +37,17 @@
         # under.
         self.parent = parent
 
+    def get_component_references(self):
+        """get_component_references() -> iter
+
+        Return an iterator over the named references to other components from
+        this object. Items are of the form (reference-type, component-name).
+        """
+
+        # Parent references are handled specially.
+        for r in self.dependencies:
+            yield ('dependency', r)
+
 class GroupComponentInfo(ComponentInfo):
     """
     Group components have no semantics as far as the build system are concerned,
@@ -81,6 +92,14 @@
         # considered part of.
         self.add_to_library_groups = list(add_to_library_groups)
 
+    def get_component_references(self):
+        for r in ComponentInfo.get_component_references(self):
+            yield r
+        for r in self.required_libraries:
+            yield ('required library', r)
+        for r in self.add_to_library_groups:
+            yield ('library group', r)
+
 class LibraryGroupComponentInfo(ComponentInfo):
     type_name = 'LibraryGroup'
 
@@ -104,6 +123,14 @@
         # considered part of.
         self.add_to_library_groups = list(add_to_library_groups)
 
+    def get_component_references(self):
+        for r in ComponentInfo.get_component_references(self):
+            yield r
+        for r in self.required_libraries:
+            yield ('required library', r)
+        for r in self.add_to_library_groups:
+            yield ('library group', r)
+
 class ToolComponentInfo(ComponentInfo):
     type_name = 'Tool'
 
@@ -121,6 +148,12 @@
         # tool.
         self.required_libraries = list(required_libraries)
 
+    def get_component_references(self):
+        for r in ComponentInfo.get_component_references(self):
+            yield r
+        for r in self.required_libraries:
+            yield ('required library', r)
+
 class BuildToolComponentInfo(ToolComponentInfo):
     type_name = 'BuildTool'