=pod

=head1 NAME

llvm-extract - extract a function from an LLVM module

=head1 SYNOPSIS

B<llvm-extract> [I<options>] B<--func> I<function-name> [I<filename>]

=head1 DESCRIPTION

The B<llvm-extract> command takes the name of a function and extracts it from
the specified LLVM bytecode file.  It is primarily used as a debugging tool to
reduce test cases from larger programs that are triggering a bug.

In addition to extracting the bytecode of the specified function,
B<llvm-extract> will also remove unreachable global variables, prototypes, and
unused types.

The B<llvm-extract> command reads its input from standard input if filename is
omitted or if filename is -.  The output is always written to standard output,
unless the B<-o> option is specified (see below).

=head1 OPTIONS

=over

=item B<-f>

Force overwrite.  Normally, B<llvm-extract> will refuse to overwrite an
output file that already exists.  With this option, B<llvm-extract>
will overwrite the output file and replace it with new bytecode.

=item B<--func> I<function-name>

Extract the function named I<function-name> from the LLVM bytecode.

=item B<--help>

Print a summary of command line options.

=item B<-o> I<filename>

Specify the output filename.  If filename is "-" (the default), then
B<llvm-extract> sends its output to standard output.

=back

=head1 EXIT STATUS

If B<llvm-extract> succeeds, it will exit with 0.  Otherwise, if an error
occurs, it will exit with a non-zero value.

=head1 SEE ALSO

L<bugpoint|bugpoint>

=head1 AUTHORS

Maintained by the LLVM Team (L<http://llvm.org>).

=cut
