1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/perl 2*9880d681SAndroid Build Coastguard Worker# Wrapper around LLVM tools to generate a native .o from llvm-gxx using an 3*9880d681SAndroid Build Coastguard Worker# LLVM back-end (CBE by default). 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker# set up defaults. 6*9880d681SAndroid Build Coastguard Worker$Verbose = 0; 7*9880d681SAndroid Build Coastguard Worker$SaveTemps = 1; 8*9880d681SAndroid Build Coastguard Worker$PreprocessOnly = 0; 9*9880d681SAndroid Build Coastguard Worker$CompileDontLink = 0; 10*9880d681SAndroid Build Coastguard Worker$Backend = 'cbe'; 11*9880d681SAndroid Build Coastguard Workerchomp ($ProgramName = `basename $0`); 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workersub boldprint { 14*9880d681SAndroid Build Coastguard Worker print "[1m", @_, "[0m"; 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker# process command-line options. 18*9880d681SAndroid Build Coastguard Worker# most of these are passed on to llvm-gxx. 19*9880d681SAndroid Build Coastguard Worker$GCCOptions = ""; 20*9880d681SAndroid Build Coastguard Workerfor ($i = 0; $i <= $#ARGV; ++$i) { 21*9880d681SAndroid Build Coastguard Worker if ($ARGV[$i] =~ /-mllvm-backend=([a-z0-9]*)/) { 22*9880d681SAndroid Build Coastguard Worker $Backend = $1; 23*9880d681SAndroid Build Coastguard Worker if ($ProgramName =~ /llvm-native-gxx/) { 24*9880d681SAndroid Build Coastguard Worker splice (@ARGV, $i, 1); 25*9880d681SAndroid Build Coastguard Worker --$i; 26*9880d681SAndroid Build Coastguard Worker } 27*9880d681SAndroid Build Coastguard Worker } elsif ($ARGV[$i] eq "-E") { 28*9880d681SAndroid Build Coastguard Worker $PreprocessOnly = 1; 29*9880d681SAndroid Build Coastguard Worker } elsif ($ARGV[$i] eq "-c") { 30*9880d681SAndroid Build Coastguard Worker $GCCOptions .= " " . $ARGV[$i]; 31*9880d681SAndroid Build Coastguard Worker $CompileDontLink = 1; 32*9880d681SAndroid Build Coastguard Worker } elsif ($ARGV[$i] eq "-v") { 33*9880d681SAndroid Build Coastguard Worker $GCCOptions .= " " . $ARGV[$i]; 34*9880d681SAndroid Build Coastguard Worker $Verbose = 1; 35*9880d681SAndroid Build Coastguard Worker } elsif ($ARGV[$i] eq "-o") { 36*9880d681SAndroid Build Coastguard Worker $OutputFile = $ARGV[$i + 1]; 37*9880d681SAndroid Build Coastguard Worker } elsif ($ARGV[$i] eq "-save-temps") { 38*9880d681SAndroid Build Coastguard Worker $GCCOptions .= " " . $ARGV[$i]; 39*9880d681SAndroid Build Coastguard Worker $SaveTemps = 1; 40*9880d681SAndroid Build Coastguard Worker } elsif ($ARGV[$i] =~ /\.bc$/) { 41*9880d681SAndroid Build Coastguard Worker push (@BytecodeFiles, $ARGV[$i]); 42*9880d681SAndroid Build Coastguard Worker } elsif ($ARGV[$i] =~ /^-L/) { 43*9880d681SAndroid Build Coastguard Worker $GCCOptions .= " " . $ARGV[$i]; 44*9880d681SAndroid Build Coastguard Worker push (@LibDirs, $ARGV[$i]); 45*9880d681SAndroid Build Coastguard Worker } elsif ($ARGV[$i] =~ /^-l/) { 46*9880d681SAndroid Build Coastguard Worker $GCCOptions .= " " . $ARGV[$i]; 47*9880d681SAndroid Build Coastguard Worker push (@Libs, $ARGV[$i]); 48*9880d681SAndroid Build Coastguard Worker } elsif ($ARGV[$i] =~ /\.(c|cpp|cc|i|ii|C)$/) { 49*9880d681SAndroid Build Coastguard Worker $LastCFile = $ARGV[$i]; 50*9880d681SAndroid Build Coastguard Worker } 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workersub GetDefaultOutputFileName { 54*9880d681SAndroid Build Coastguard Worker my $DefaultOutputFileBase; 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker if ($ProgramName =~ /llvm-native-gxx/) { 57*9880d681SAndroid Build Coastguard Worker $DefaultOutputFileBase = $LastCFile; 58*9880d681SAndroid Build Coastguard Worker } elsif ($ProgramName =~ /native-build/) { 59*9880d681SAndroid Build Coastguard Worker $DefaultOutputFileBase = $BytecodeFiles[0]; 60*9880d681SAndroid Build Coastguard Worker } 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker my $def = $DefaultOutputFileBase; 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker die "Can't figure out name of output file.\n" 65*9880d681SAndroid Build Coastguard Worker unless $DefaultOutputFileBase 66*9880d681SAndroid Build Coastguard Worker && (($ProgramName !~ /native-build/) 67*9880d681SAndroid Build Coastguard Worker || $#BytecodeFiles == 0); 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker print "Warning: defaulting output file name ", 70*9880d681SAndroid Build Coastguard Worker "based on '$DefaultOutputFileBase'\n" if $Verbose; 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker if ($ProgramName =~ /llvm-native-gxx/) { 73*9880d681SAndroid Build Coastguard Worker $def =~ s/\.(c|cpp|cc|i|ii|C)$/.o/; 74*9880d681SAndroid Build Coastguard Worker } elsif ($ProgramName =~ /native-build/) { 75*9880d681SAndroid Build Coastguard Worker $def =~ s/\.bc$/.$Backend/; 76*9880d681SAndroid Build Coastguard Worker if ($CompileDontLink) { 77*9880d681SAndroid Build Coastguard Worker $def .= ".o"; 78*9880d681SAndroid Build Coastguard Worker } 79*9880d681SAndroid Build Coastguard Worker } 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker return $def; 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker# run a command, optionally echoing, and quitting if it fails: 85*9880d681SAndroid Build Coastguard Workersub run { 86*9880d681SAndroid Build Coastguard Worker my $command = join(" ", @_); 87*9880d681SAndroid Build Coastguard Worker print "$command\n" if $Verbose; 88*9880d681SAndroid Build Coastguard Worker $command =~ s/\"/\\\"/g; 89*9880d681SAndroid Build Coastguard Worker system $command and die "$0: $command failed"; 90*9880d681SAndroid Build Coastguard Worker} 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workersub LinkBytecodeFilesIntoTemporary { 93*9880d681SAndroid Build Coastguard Worker my $FinalOutputFileName = shift @_; 94*9880d681SAndroid Build Coastguard Worker my @BytecodeFiles = @_; 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker my $BCFiles = join (" ", @BytecodeFiles); 97*9880d681SAndroid Build Coastguard Worker my $LinkedBCFile; 98*9880d681SAndroid Build Coastguard Worker if ($SaveTemps) { 99*9880d681SAndroid Build Coastguard Worker $LinkedBCFile = "${FinalOutputFileName}.llvm.bc"; 100*9880d681SAndroid Build Coastguard Worker } else { 101*9880d681SAndroid Build Coastguard Worker $LinkedBCFile = "/tmp/nativebuild-$$.llvm.bc"; 102*9880d681SAndroid Build Coastguard Worker } 103*9880d681SAndroid Build Coastguard Worker run "llvm-link -o $LinkedBCFile $BCFiles"; 104*9880d681SAndroid Build Coastguard Worker return $LinkedBCFile; 105*9880d681SAndroid Build Coastguard Worker} 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workersub CompileBytecodeToNative { 108*9880d681SAndroid Build Coastguard Worker my ($BCFile, $Backend, $OutputFile) = @_; 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker my $GeneratedCode; 111*9880d681SAndroid Build Coastguard Worker if ($Backend eq 'cbe') { 112*9880d681SAndroid Build Coastguard Worker if ($SaveTemps) { 113*9880d681SAndroid Build Coastguard Worker $GeneratedCode = "${OutputFile}.c"; 114*9880d681SAndroid Build Coastguard Worker } else { 115*9880d681SAndroid Build Coastguard Worker $GeneratedCode = "/tmp/nativebuild-$$.c"; 116*9880d681SAndroid Build Coastguard Worker } 117*9880d681SAndroid Build Coastguard Worker run "llc -march=c -f -o $GeneratedCode $BCFile"; 118*9880d681SAndroid Build Coastguard Worker } elsif ($Backend eq 'llc') { 119*9880d681SAndroid Build Coastguard Worker if ($SaveTemps) { 120*9880d681SAndroid Build Coastguard Worker $GeneratedCode = "${OutputFile}.s"; 121*9880d681SAndroid Build Coastguard Worker } else { 122*9880d681SAndroid Build Coastguard Worker $GeneratedCode = "/tmp/nativebuild-$$.s"; 123*9880d681SAndroid Build Coastguard Worker } 124*9880d681SAndroid Build Coastguard Worker run "llc -f -o $GeneratedCode $BCFile"; 125*9880d681SAndroid Build Coastguard Worker } 126*9880d681SAndroid Build Coastguard Worker my $LibDirs = join (" ", @LibDirs); 127*9880d681SAndroid Build Coastguard Worker my $Libs = join (" ", @Libs); 128*9880d681SAndroid Build Coastguard Worker run "gcc $GCCOptions $GeneratedCode -o $OutputFile $LibDirs $Libs"; 129*9880d681SAndroid Build Coastguard Worker run "rm $BCFile $GeneratedCode" 130*9880d681SAndroid Build Coastguard Worker unless $SaveTemps; 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workersub CompileCToNative { 134*9880d681SAndroid Build Coastguard Worker my ($LLVMGCCCommand, $Backend, $OutputFile) = @_; 135*9880d681SAndroid Build Coastguard Worker run $LLVMGCCCommand; 136*9880d681SAndroid Build Coastguard Worker if ($PreprocessOnly) { 137*9880d681SAndroid Build Coastguard Worker return; 138*9880d681SAndroid Build Coastguard Worker } 139*9880d681SAndroid Build Coastguard Worker my $BCFile = "${OutputFile}.llvm.bc"; 140*9880d681SAndroid Build Coastguard Worker if ($CompileDontLink) { 141*9880d681SAndroid Build Coastguard Worker run "mv ${OutputFile} $BCFile"; 142*9880d681SAndroid Build Coastguard Worker } else { # gccld messes with the output file name 143*9880d681SAndroid Build Coastguard Worker run "mv ${OutputFile}.bc $BCFile"; 144*9880d681SAndroid Build Coastguard Worker } 145*9880d681SAndroid Build Coastguard Worker my $GeneratedCode; 146*9880d681SAndroid Build Coastguard Worker if ($Backend eq 'cbe') { 147*9880d681SAndroid Build Coastguard Worker $GeneratedCode = "${OutputFile}.cbe.c"; 148*9880d681SAndroid Build Coastguard Worker run "llc -march=c -f -o $GeneratedCode $BCFile"; 149*9880d681SAndroid Build Coastguard Worker } elsif ($Backend eq 'llc') { 150*9880d681SAndroid Build Coastguard Worker $GeneratedCode = "${OutputFile}.llc.s"; 151*9880d681SAndroid Build Coastguard Worker run "llc -f -o $GeneratedCode $BCFile"; 152*9880d681SAndroid Build Coastguard Worker } 153*9880d681SAndroid Build Coastguard Worker my $NativeGCCOptions = ""; 154*9880d681SAndroid Build Coastguard Worker if ($CompileDontLink) { 155*9880d681SAndroid Build Coastguard Worker $NativeGCCOptions = "-c"; 156*9880d681SAndroid Build Coastguard Worker } 157*9880d681SAndroid Build Coastguard Worker run "gcc $NativeGCCOptions $GeneratedCode -o $OutputFile"; 158*9880d681SAndroid Build Coastguard Worker run "rm ${OutputFile}.llvm.bc $GeneratedCode" 159*9880d681SAndroid Build Coastguard Worker unless $SaveTemps; 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker# guess the name of the output file, if -o was not specified. 163*9880d681SAndroid Build Coastguard Worker$OutputFile = GetDefaultOutputFileName () unless $OutputFile; 164*9880d681SAndroid Build Coastguard Workerprint "Output file is $OutputFile\n" if $Verbose; 165*9880d681SAndroid Build Coastguard Worker# do all the dirty work: 166*9880d681SAndroid Build Coastguard Workerif ($ProgramName eq /native-build/) { 167*9880d681SAndroid Build Coastguard Worker my $LinkedBCFile = LinkBytecodeFilesIntoTemporary (@BytecodeFiles); 168*9880d681SAndroid Build Coastguard Worker CompileBytecodeToNative ($LinkedBCFile, $Backend, $OutputFile); 169*9880d681SAndroid Build Coastguard Worker} elsif ($ProgramName =~ /llvm-native-gxx/) { 170*9880d681SAndroid Build Coastguard Worker # build the llvm-gxx command line. 171*9880d681SAndroid Build Coastguard Worker $LLVMGCCCommand = join (" ", ("llvm-g++", @ARGV)); 172*9880d681SAndroid Build Coastguard Worker CompileCToNative ($LLVMGCCCommand, $Backend, $OutputFile); 173*9880d681SAndroid Build Coastguard Worker} 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker# we're done. 176*9880d681SAndroid Build Coastguard Workerexit 0; 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker__END__ 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker=pod 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker=head1 NAME 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerllvm-native-gxx 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker=head1 SYNOPSIS 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerllvm-native-g++ [OPTIONS...] FILE 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Workernative-build [OPTIONS...] FILE 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker=head1 DESCRIPTION 193*9880d681SAndroid Build Coastguard Worker 194*9880d681SAndroid Build Coastguard Workerllvm-native-g++ is a wrapper around the LLVM command-line tools which generates 195*9880d681SAndroid Build Coastguard Workera native object (.o) file by compiling FILE with llvm-g++, and then running 196*9880d681SAndroid Build Coastguard Workeran LLVM back-end (CBE by default) over the resulting bitcode, and then 197*9880d681SAndroid Build Coastguard Workercompiling the resulting code to a native object file. 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard WorkerIf called as "native-build", it compiles bitcode to native code, and takes 200*9880d681SAndroid Build Coastguard Workerdifferent options. 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker=head1 OPTIONS 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Workerllvm-native-g++ takes the same options as llvm-gcc. All options 205*9880d681SAndroid Build Coastguard Workerexcept -mllvm-backend=... are passed on to llvm-g++. 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker=over 4 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Worker=item -mllvm-backend=BACKEND 210*9880d681SAndroid Build Coastguard Worker 211*9880d681SAndroid Build Coastguard WorkerUse BACKEND for native code generation. 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Worker=item -v 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard WorkerPrint command lines that llvm-native-g++ runs. 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker=item -o FILE 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerllvm-native-g++ tries to guess the name of the llvm-g++ output file by looking 220*9880d681SAndroid Build Coastguard Workerfor this option in the command line. If it can't find it, it finds the last C 221*9880d681SAndroid Build Coastguard Workeror C++ source file named on the command line, and turns its suffix into .o. See 222*9880d681SAndroid Build Coastguard WorkerBUGS. 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker=item -save-temps 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard WorkerSave temporary files used by llvm-native-g++ (and llvm-g++, and g++). 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Worker=back 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker=head1 BUGS 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerllvm-native-g++ only handles the case where llvm-g++ compiles a single 233*9880d681SAndroid Build Coastguard Workerfile per invocation. llvm-native-g++ has weak command-line argument 234*9880d681SAndroid Build Coastguard Workerparsing and is a poor substitute for making g++/g++.c do this stuff. 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard WorkerThis manual page does not adequately document native-build mode. 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Workerllvm-native-g++ is pretty gross because it represents the blind merging of two 239*9880d681SAndroid Build Coastguard Workerother scripts that predated it. It could use some code clean-up. 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Worker=head1 SEE ALSO 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerg++(1) 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker=head1 AUTHOR 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard WorkerBrian R. Gaeke 248*9880d681SAndroid Build Coastguard Worker 249*9880d681SAndroid Build Coastguard Worker=cut 250