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