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