Merge in 156319 156837 156838.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_31@156863 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling committed 2012-05-15 22:06:08 +00:00
1 parent 1f3405800a
commit 02b87df98a
10 files changed
+122 -21

No files matched your search

+10
View File
@@ -268,11 +268,21 @@ set(LLVMCONFIGLIBRARYDEPENDENCIESINC
"${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc") "${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc")
set(LLVMBUILDCMAKEFRAG set(LLVMBUILDCMAKEFRAG
"${LLVM_BINARY_DIR}/LLVMBuild.cmake") "${LLVM_BINARY_DIR}/LLVMBuild.cmake")
# Create the list of optional components that are enabled
if (LLVM_USE_INTEL_JITEVENTS)
set(LLVMOPTIONALCOMPONENTS IntelJITEvents)
endif (LLVM_USE_INTEL_JITEVENTS)
if (LLVM_USE_OPROFILE)
set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT)
endif (LLVM_USE_OPROFILE)
message(STATUS "Constructing LLVMBuild project information") message(STATUS "Constructing LLVMBuild project information")
execute_process( execute_process(
COMMAND ${PYTHON_EXECUTABLE} ${LLVMBUILDTOOL} COMMAND ${PYTHON_EXECUTABLE} ${LLVMBUILDTOOL}
--native-target "${LLVM_NATIVE_ARCH}" --native-target "${LLVM_NATIVE_ARCH}"
--enable-targets "${LLVM_TARGETS_TO_BUILD}" --enable-targets "${LLVM_TARGETS_TO_BUILD}"
--enable-optional-components "${LLVMOPTIONALCOMPONENTS}"
--write-library-table ${LLVMCONFIGLIBRARYDEPENDENCIESINC} --write-library-table ${LLVMCONFIGLIBRARYDEPENDENCIESINC}
--write-cmake-fragment ${LLVMBUILDCMAKEFRAG} --write-cmake-fragment ${LLVMBUILDCMAKEFRAG}
ERROR_VARIABLE LLVMBUILDOUTPUT ERROR_VARIABLE LLVMBUILDOUTPUT
+7
View File
@@ -351,3 +351,10 @@ INTEL_JITEVENTS_LIBDIR := @INTEL_JITEVENTS_LIBDIR@
# Flags to control building support for OProfile JIT API # Flags to control building support for OProfile JIT API
USE_OPROFILE := @USE_OPROFILE@ USE_OPROFILE := @USE_OPROFILE@
ifeq ($(USE_INTEL_JITEVENTS), 1)
OPTIONAL_COMPONENTS += IntelJITEvents
endif
ifeq ($(USE_OPROFILE), 1)
OPTIONAL_COMPONENTS += OProfileJIT
endif
+1
View File
@@ -100,6 +100,7 @@ $(LLVMBuildMakeFrag): $(PROJ_SRC_ROOT)/Makefile.rules \
$(Verb) $(LLVMBuildTool) \ $(Verb) $(LLVMBuildTool) \
--native-target "$(TARGET_NATIVE_ARCH)" \ --native-target "$(TARGET_NATIVE_ARCH)" \
--enable-targets "$(TARGETS_TO_BUILD)" \ --enable-targets "$(TARGETS_TO_BUILD)" \
--enable-optional-components "$(OPTIONAL_COMPONENTS)" \
--write-library-table $(LLVMConfigLibraryDependenciesInc) \ --write-library-table $(LLVMConfigLibraryDependenciesInc) \
--write-make-fragment $(LLVMBuildMakeFrag) --write-make-fragment $(LLVMBuildMakeFrag)
+5
View File
@@ -272,6 +272,11 @@ required_libraries = Archive BitReader Core Support TransformUtils
components. For example, the <i>X86</i> target might define a library components. For example, the <i>X86</i> target might define a library
group for all of the <i>X86</i> components. That library group might group for all of the <i>X86</i> components. That library group might
then be included in the <i>all-targets</i> library group.</p></li> then be included in the <i>all-targets</i> library group.</p></li>
<li><i>installed</i> <b>[optional]</b> <b>[boolean]</b>
<p>Whether this library is installed. Libraries that are not installed
are only reported by <tt>llvm-config</tt> when it is run as part of a
development directory.</p></li>
</ul> </ul>
</li> </li>
@@ -18,6 +18,6 @@
[common] [common]
[component_0] [component_0]
type = Library type = OptionalLibrary
name = IntelJITEvents name = IntelJITEvents
parent = ExecutionEngine parent = ExecutionEngine
@@ -18,6 +18,6 @@
[common] [common]
[component_0] [component_0]
type = Library type = OptionalLibrary
name = OProfileJIT name = OProfileJIT
parent = ExecutionEngine parent = ExecutionEngine
+18 -5
View File
@@ -54,7 +54,8 @@ using namespace llvm;
static void VisitComponent(StringRef Name, static void VisitComponent(StringRef Name,
const StringMap<AvailableComponent*> &ComponentMap, const StringMap<AvailableComponent*> &ComponentMap,
std::set<AvailableComponent*> &VisitedComponents, std::set<AvailableComponent*> &VisitedComponents,
std::vector<StringRef> &RequiredLibs) { std::vector<StringRef> &RequiredLibs,
bool IncludeNonInstalled) {
// Lookup the component. // Lookup the component.
AvailableComponent *AC = ComponentMap.lookup(Name); AvailableComponent *AC = ComponentMap.lookup(Name);
assert(AC && "Invalid component name!"); assert(AC && "Invalid component name!");
@@ -65,10 +66,14 @@ static void VisitComponent(StringRef Name,
return; return;
} }
// Only include non-installed components if requested.
if (!AC->IsInstalled && !IncludeNonInstalled)
return;
// Otherwise, visit all the dependencies. // Otherwise, visit all the dependencies.
for (unsigned i = 0; AC->RequiredLibraries[i]; ++i) { for (unsigned i = 0; AC->RequiredLibraries[i]; ++i) {
VisitComponent(AC->RequiredLibraries[i], ComponentMap, VisitedComponents, VisitComponent(AC->RequiredLibraries[i], ComponentMap, VisitedComponents,
RequiredLibs); RequiredLibs, IncludeNonInstalled);
} }
// Add to the required library list. // Add to the required library list.
@@ -83,8 +88,11 @@ static void VisitComponent(StringRef Name,
/// \param Components - The names of the components to find libraries for. /// \param Components - The names of the components to find libraries for.
/// \param RequiredLibs [out] - On return, the ordered list of libraries that /// \param RequiredLibs [out] - On return, the ordered list of libraries that
/// are required to link the given components. /// are required to link the given components.
/// \param IncludeNonInstalled - Whether non-installed components should be
/// reported.
void ComputeLibsForComponents(const std::vector<StringRef> &Components, void ComputeLibsForComponents(const std::vector<StringRef> &Components,
std::vector<StringRef> &RequiredLibs) { std::vector<StringRef> &RequiredLibs,
bool IncludeNonInstalled) {
std::set<AvailableComponent*> VisitedComponents; std::set<AvailableComponent*> VisitedComponents;
// Build a map of component names to information. // Build a map of component names to information.
@@ -107,7 +115,7 @@ void ComputeLibsForComponents(const std::vector<StringRef> &Components,
} }
VisitComponent(ComponentLower, ComponentMap, VisitedComponents, VisitComponent(ComponentLower, ComponentMap, VisitedComponents,
RequiredLibs); RequiredLibs, IncludeNonInstalled);
} }
// The list is now ordered with leafs first, we want the libraries to printed // The list is now ordered with leafs first, we want the libraries to printed
@@ -278,6 +286,10 @@ int main(int argc, char **argv) {
PrintLibFiles = true; PrintLibFiles = true;
} else if (Arg == "--components") { } else if (Arg == "--components") {
for (unsigned j = 0; j != array_lengthof(AvailableComponents); ++j) { for (unsigned j = 0; j != array_lengthof(AvailableComponents); ++j) {
// Only include non-installed components when in a development tree.
if (!AvailableComponents[j].IsInstalled && !IsInDevelopmentTree)
continue;
OS << ' '; OS << ' ';
OS << AvailableComponents[j].Name; OS << AvailableComponents[j].Name;
} }
@@ -310,7 +322,8 @@ int main(int argc, char **argv) {
// Construct the list of all the required libraries. // Construct the list of all the required libraries.
std::vector<StringRef> RequiredLibs; std::vector<StringRef> RequiredLibs;
ComputeLibsForComponents(Components, RequiredLibs); ComputeLibsForComponents(Components, RequiredLibs,
/*IncludeNonInstalled=*/IsInDevelopmentTree);
for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) { for (unsigned i = 0, e = RequiredLibs.size(); i != e; ++i) {
StringRef Lib = RequiredLibs[i]; StringRef Lib = RequiredLibs[i];
+43 -3
View File
@@ -68,6 +68,21 @@ class ComponentInfo(object):
def get_llvmbuild_fragment(self): def get_llvmbuild_fragment(self):
abstract abstract
def get_parent_target_group(self):
"""get_parent_target_group() -> ComponentInfo or None
Return the nearest parent target group (if any), or None if the
component is not part of any target group.
"""
# If this is a target group, return it.
if self.type_name == 'TargetGroup':
return self
# Otherwise recurse on the parent, if any.
if self.parent_instance:
return self.parent_instance.get_parent_target_group()
class GroupComponentInfo(ComponentInfo): class GroupComponentInfo(ComponentInfo):
""" """
Group components have no semantics as far as the build system are concerned, Group components have no semantics as far as the build system are concerned,
@@ -95,16 +110,22 @@ class LibraryComponentInfo(ComponentInfo):
type_name = 'Library' type_name = 'Library'
@staticmethod @staticmethod
def parse(subpath, items): def parse_items(items):
kwargs = ComponentInfo.parse_items(items) kwargs = ComponentInfo.parse_items(items)
kwargs['library_name'] = items.get_optional_string('library_name') kwargs['library_name'] = items.get_optional_string('library_name')
kwargs['required_libraries'] = items.get_list('required_libraries') kwargs['required_libraries'] = items.get_list('required_libraries')
kwargs['add_to_library_groups'] = items.get_list( kwargs['add_to_library_groups'] = items.get_list(
'add_to_library_groups') 'add_to_library_groups')
kwargs['installed'] = items.get_optional_bool('installed', True)
return kwargs
@staticmethod
def parse(subpath, items):
kwargs = LibraryComponentInfo.parse_items(items)
return LibraryComponentInfo(subpath, **kwargs) return LibraryComponentInfo(subpath, **kwargs)
def __init__(self, subpath, name, dependencies, parent, library_name, def __init__(self, subpath, name, dependencies, parent, library_name,
required_libraries, add_to_library_groups): required_libraries, add_to_library_groups, installed):
ComponentInfo.__init__(self, subpath, name, dependencies, parent) ComponentInfo.__init__(self, subpath, name, dependencies, parent)
# If given, the name to use for the library instead of deriving it from # If given, the name to use for the library instead of deriving it from
@@ -119,6 +140,9 @@ class LibraryComponentInfo(ComponentInfo):
# considered part of. # considered part of.
self.add_to_library_groups = list(add_to_library_groups) self.add_to_library_groups = list(add_to_library_groups)
# Whether or not this library is installed.
self.installed = installed
def get_component_references(self): def get_component_references(self):
for r in ComponentInfo.get_component_references(self): for r in ComponentInfo.get_component_references(self):
yield r yield r
@@ -140,6 +164,8 @@ class LibraryComponentInfo(ComponentInfo):
if self.add_to_library_groups: if self.add_to_library_groups:
print >>result, 'add_to_library_groups = %s' % ' '.join( print >>result, 'add_to_library_groups = %s' % ' '.join(
self.add_to_library_groups) self.add_to_library_groups)
if not self.installed:
print >>result, 'installed = 0'
return result.getvalue() return result.getvalue()
def get_library_name(self): def get_library_name(self):
@@ -165,6 +191,20 @@ class LibraryComponentInfo(ComponentInfo):
def get_llvmconfig_component_name(self): def get_llvmconfig_component_name(self):
return self.get_library_name().lower() return self.get_library_name().lower()
class OptionalLibraryComponentInfo(LibraryComponentInfo):
type_name = "OptionalLibrary"
@staticmethod
def parse(subpath, items):
kwargs = LibraryComponentInfo.parse_items(items)
return OptionalLibraryComponentInfo(subpath, **kwargs)
def __init__(self, subpath, name, dependencies, parent, library_name,
required_libraries, add_to_library_groups, installed):
LibraryComponentInfo.__init__(self, subpath, name, dependencies, parent,
library_name, required_libraries,
add_to_library_groups, installed)
class LibraryGroupComponentInfo(ComponentInfo): class LibraryGroupComponentInfo(ComponentInfo):
type_name = 'LibraryGroup' type_name = 'LibraryGroup'
@@ -375,7 +415,7 @@ _component_type_map = dict(
for t in (GroupComponentInfo, for t in (GroupComponentInfo,
LibraryComponentInfo, LibraryGroupComponentInfo, LibraryComponentInfo, LibraryGroupComponentInfo,
ToolComponentInfo, BuildToolComponentInfo, ToolComponentInfo, BuildToolComponentInfo,
TargetGroupComponentInfo)) TargetGroupComponentInfo, OptionalLibraryComponentInfo))
def load_from_path(path, subpath): def load_from_path(path, subpath):
# Load the LLVMBuild.txt file as an .ini format file. # Load the LLVMBuild.txt file as an .ini format file.
parser = ConfigParser.RawConfigParser() parser = ConfigParser.RawConfigParser()
+34 -11
View File
@@ -312,15 +312,26 @@ subdirectories = %s
f.close() f.close()
def write_library_table(self, output_path): def write_library_table(self, output_path, enabled_optional_components):
# Write out the mapping from component names to required libraries. # Write out the mapping from component names to required libraries.
# #
# We do this in topological order so that we know we can append the # We do this in topological order so that we know we can append the
# dependencies for added library groups. # dependencies for added library groups.
entries = {} entries = {}
for c in self.ordered_component_infos: for c in self.ordered_component_infos:
# Skip optional components which are not enabled.
if c.type_name == 'OptionalLibrary' \
and c.name not in enabled_optional_components:
continue
# Skip target groups which are not enabled.
tg = c.get_parent_target_group()
if tg and not tg.enabled:
continue
# Only certain components are in the table. # Only certain components are in the table.
if c.type_name not in ('Library', 'LibraryGroup', 'TargetGroup'): if c.type_name not in ('Library', 'OptionalLibrary', \
'LibraryGroup', 'TargetGroup'):
continue continue
# Compute the llvm-config "component name". For historical reasons, # Compute the llvm-config "component name". For historical reasons,
@@ -328,10 +339,12 @@ subdirectories = %s
llvmconfig_component_name = c.get_llvmconfig_component_name() llvmconfig_component_name = c.get_llvmconfig_component_name()
# Get the library name, or None for LibraryGroups. # Get the library name, or None for LibraryGroups.
if c.type_name == 'Library': if c.type_name == 'Library' or c.type_name == 'OptionalLibrary':
library_name = c.get_prefixed_library_name() library_name = c.get_prefixed_library_name()
is_installed = c.installed
else: else:
library_name = None library_name = None
is_installed = True
# Get the component names of all the required libraries. # Get the component names of all the required libraries.
required_llvmconfig_component_names = [ required_llvmconfig_component_names = [
@@ -344,7 +357,8 @@ subdirectories = %s
# Add the entry. # Add the entry.
entries[c.name] = (llvmconfig_component_name, library_name, entries[c.name] = (llvmconfig_component_name, library_name,
required_llvmconfig_component_names) required_llvmconfig_component_names,
is_installed)
# Convert to a list of entries and sort by name. # Convert to a list of entries and sort by name.
entries = entries.values() entries = entries.values()
@@ -352,16 +366,16 @@ subdirectories = %s
# Create an 'all' pseudo component. We keep the dependency list small by # Create an 'all' pseudo component. We keep the dependency list small by
# only listing entries that have no other dependents. # only listing entries that have no other dependents.
root_entries = set(e[0] for e in entries) root_entries = set(e[0] for e in entries)
for _,_,deps in entries: for _,_,deps,_ in entries:
root_entries -= set(deps) root_entries -= set(deps)
entries.append(('all', None, root_entries)) entries.append(('all', None, root_entries, True))
entries.sort() entries.sort()
# Compute the maximum number of required libraries, plus one so there is # Compute the maximum number of required libraries, plus one so there is
# always a sentinel. # always a sentinel.
max_required_libraries = max(len(deps) max_required_libraries = max(len(deps)
for _,_,deps in entries) + 1 for _,_,deps,_ in entries) + 1
# Write out the library table. # Write out the library table.
make_install_dir(os.path.dirname(output_path)) make_install_dir(os.path.dirname(output_path))
@@ -382,18 +396,21 @@ subdirectories = %s
print >>f, ' /// The name of the library for this component (or NULL).' print >>f, ' /// The name of the library for this component (or NULL).'
print >>f, ' const char *Library;' print >>f, ' const char *Library;'
print >>f, '' print >>f, ''
print >>f, ' /// Whether the component is installed.'
print >>f, ' bool IsInstalled;'
print >>f, ''
print >>f, '\ print >>f, '\
/// The list of libraries required when linking this component.' /// The list of libraries required when linking this component.'
print >>f, ' const char *RequiredLibraries[%d];' % ( print >>f, ' const char *RequiredLibraries[%d];' % (
max_required_libraries) max_required_libraries)
print >>f, '} AvailableComponents[%d] = {' % len(entries) print >>f, '} AvailableComponents[%d] = {' % len(entries)
for name,library_name,required_names in entries: for name,library_name,required_names,is_installed in entries:
if library_name is None: if library_name is None:
library_name_as_cstr = '0' library_name_as_cstr = '0'
else: else:
library_name_as_cstr = '"lib%s.a"' % library_name library_name_as_cstr = '"lib%s.a"' % library_name
print >>f, ' { "%s", %s, { %s } },' % ( print >>f, ' { "%s", %s, %d, { %s } },' % (
name, library_name_as_cstr, name, library_name_as_cstr, is_installed,
', '.join('"%s"' % dep ', '.join('"%s"' % dep
for dep in required_names)) for dep in required_names))
print >>f, '};' print >>f, '};'
@@ -778,6 +795,11 @@ given by --build-root) at the same SUBPATH""",
help=("Enable the given space or semi-colon separated " help=("Enable the given space or semi-colon separated "
"list of targets, or all targets if not present"), "list of targets, or all targets if not present"),
action="store", default=None) action="store", default=None)
group.add_option("", "--enable-optional-components",
dest="optional_components", metavar="NAMES",
help=("Enable the given space or semi-colon separated "
"list of optional components"),
action="store", default=None)
parser.add_option_group(group) parser.add_option_group(group)
(opts, args) = parser.parse_args() (opts, args) = parser.parse_args()
@@ -819,7 +841,8 @@ given by --build-root) at the same SUBPATH""",
# Write out the required library table, if requested. # Write out the required library table, if requested.
if opts.write_library_table: if opts.write_library_table:
project_info.write_library_table(opts.write_library_table) project_info.write_library_table(opts.write_library_table,
opts.optional_components)
# Write out the make fragment, if requested. # Write out the make fragment, if requested.
if opts.write_make_fragment: if opts.write_make_fragment:
+2
View File
@@ -20,9 +20,11 @@ type = Library
name = gtest name = gtest
parent = Libraries parent = Libraries
required_libraries = Support required_libraries = Support
installed = 0
[component_1] [component_1]
type = Library type = Library
name = gtest_main name = gtest_main
parent = Libraries parent = Libraries
required_libraries = gtest required_libraries = gtest
installed = 0