xref: /aosp_15_r20/external/llvm/utils/llvm-native-gxx (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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 "", @_, "";
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