#!/usr/bin/perl use strict; use warnings; my $path = $ARGV[0]; `(cd $path/tools/llvm-config; make ENABLE_OPTIMIZED=0 llvm-config-perobjincl)`; my %compdeps; my @codegencomponents = ('x86codegen','powerpccodegen'); my @allnonsys = ('support','jit','fullcodegen',@codegencomponents); my @allcomponents= ('system',@allnonsys); my $allJIT="jit core lib/Support/SourceMgr.o lib/Analysis/PointerTracking.o lib/Transforms/Scalar/DCE.o lib/Analysis/IPA/CallGraph.o"; for my $component (@allcomponents) { $/ = " "; $component =~ s/^fullcodegen/codegen interpreter jit target/; if ($component =~ "^jit") { open DEPS, "$path/tools/llvm-config/llvm-config-perobjincl --libnames $allJIT|"; } else { open DEPS, "$path/tools/llvm-config/llvm-config-perobjincl --libnames $component|"; } $component =~ s/^codegen.+/fullcodegen/; while () { chomp; s/[\n\r]//; next if (!/\.o$/); s/Support\/reg(.*).o/Support\/reg$1.c/; s/\.o$/.cpp/; $compdeps{$component}{$_}=1; } close DEPS or die "llvm-config failed"; } # System is always linked in, so remove it from all else foreach my $systemcomp (keys %{$compdeps{'system'}}) { foreach my $component (@allnonsys) { delete $compdeps{$component}{$systemcomp} if defined $compdeps{$component}{$systemcomp}; } } # Eliminate components from codegen that are in JIT already. # and compute common codegen components. my %intersection = (); my %count = (); foreach my $codegen (@codegencomponents) { my %newdeps; for my $depobj (keys %{$compdeps{$codegen}}) { next if $compdeps{'jit'}{$depobj}; $newdeps{$depobj}=1; $count{$depobj}++; } $compdeps{$codegen} = \%newdeps; } foreach my $element (keys %count) { $intersection{$element}=1 if $count{$element} > 1; } foreach my $codegen (@codegencomponents) { foreach my $element (keys %intersection) { delete $compdeps{$codegen}{$element}; } # Move the system and support objs required (even if not common) to codegen, # since these were already built for tblgen. foreach my $element (keys %{$compdeps{'system'}}) { next unless defined $compdeps{$codegen}{$element}; delete $compdeps{$codegen}{$element}; $intersection{$element}=1; } foreach my $element (keys %{$compdeps{'support'}}) { next unless defined $compdeps{$codegen}{$element}; delete $compdeps{$codegen}{$element}; $intersection{$element}=1; } } @allcomponents=(@allcomponents,'codegen'); $compdeps{'codegen'}=\%intersection; foreach my $comp (keys %{$compdeps{'codegen'}}) { delete $compdeps{'fullcodegen'}{$comp}; } foreach my $comp (keys %{$compdeps{'jit'}}) { delete $compdeps{'fullcodegen'}{$comp}; } foreach my $comp (keys %{$compdeps{'support'}}) { $compdeps{'support_nodups'}{$comp}=1; } foreach my $comp (keys %{$compdeps{'jit'}}) { next unless defined $compdeps{'support_nodups'}{$comp}; delete $compdeps{'support_nodups'}{$comp}; } @allcomponents=(@allcomponents,'codegen','support_nodups'); foreach my $comp (@allcomponents) { print "libllvm$comp"."_la_SOURCES="; foreach my $dep (sort keys %{$compdeps{$comp}}) { print "\\\n\tllvm/$dep"; } print "\n\n"; }