.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.14
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sh \" Subsection heading
.br
.if t .Sp
.ne 5
.PP
\fB\\$1\fR
.PP
..
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings.  \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote.  | will give a
.\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
.\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
.\" expand to `' in nroff, nothing in troff, for use with C<>.
.tr \(*W-|\(bv\*(Tr
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
.    ds -- \(*W-
.    ds PI pi
.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
.    ds L" ""
.    ds R" ""
.    ds C` ""
.    ds C' ""
'br\}
.el\{\
.    ds -- \|\(em\|
.    ds PI \(*p
.    ds L" ``
.    ds R" ''
'br\}
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
.\" entries marked with X<> in POD.  Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.if \nF \{\
.    de IX
.    tm Index:\\$1\t\\n%\t"\\$2"
..
.    nr % 0
.    rr F
.\}
.\"
.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.hy 0
.if n .na
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
.    \" fudge factors for nroff and troff
.if n \{\
.    ds #H 0
.    ds #V .8m
.    ds #F .3m
.    ds #[ \f1
.    ds #] \fP
.\}
.if t \{\
.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
.    ds #V .6m
.    ds #F 0
.    ds #[ \&
.    ds #] \&
.\}
.    \" simple accents for nroff and troff
.if n \{\
.    ds ' \&
.    ds ` \&
.    ds ^ \&
.    ds , \&
.    ds ~ ~
.    ds /
.\}
.if t \{\
.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
.    \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
.    \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
.    \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
.    ds : e
.    ds 8 ss
.    ds o a
.    ds d- d\h'-1'\(ga
.    ds D- D\h'-1'\(hy
.    ds th \o'bp'
.    ds Th \o'LP'
.    ds ae ae
.    ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "LLVM2CPP 1"
.TH LLVM2CPP 1 "2006-08-10" "CVS" "LLVM Command Guide"
.SH "NAME"
llvm2xpp \- LLVM bytecode to LLVM C++ IR translator
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
\&\fBllvm2cpp\fR [\fIoptions\fR] [\fIfilename\fR]
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
\&\fBllvm2cpp\fR translates from \s-1LLVM\s0 bytecode (.bc files) to a 
corresponding \*(C+ source file that will make calls against the \s-1LLVM\s0 \*(C+ \s-1API\s0 to
build the same module as the input. By default, the \*(C+ output is a complete
program that builds the module, verifies it and then emits the module as
\&\s-1LLVM\s0 assembly. This technique assists with testing because the input to
\&\fBllvm2cpp\fR and the output of the generated \*(C+ program should be identical.
.PP
If \fIfilename\fR is omitted or is \f(CW\*(C`\-\*(C'\fR, then \fBllvm2cpp\fR reads its input from
standard input.
.PP
If an output file is not specified with the \fB\-o\fR option, then
\&\fBllvm2cpp\fR sends its output to a file or standard output by following
these rules:
.IP "\(bu" 4
If the input is standard input, then the output is standard output.
.IP "\(bu" 4
If the input is a file that ends with \f(CW\*(C`.bc\*(C'\fR, then the output file is of
the same name, except that the suffix is changed to \f(CW\*(C`.cpp\*(C'\fR.
.IP "\(bu" 4
If the input is a file that does not end with the \f(CW\*(C`.bc\*(C'\fR suffix, then the
output file has the same name as the input file, except that the \f(CW\*(C`.cpp\*(C'\fR
suffix is appended.
.SH "OPTIONS"
.IX Header "OPTIONS"
.IP "\fB\-f\fR" 4
.IX Item "-f"
Force overwrite.  Normally, \fBllvm2cpp\fR will refuse to overwrite an
output file that already exists.  With this option, \fBllvm2cpp\fR
will overwrite the output file and replace it with new \*(C+ source code.
.IP "\fB\-\-help\fR" 4
.IX Item "--help"
Print a summary of command line options.
.IP "\fB\-f\fR" 4
.IX Item "-f"
Normally, \fBllvm2cpp\fR will not overwrite an existing output file. With this
option, that default behavior is changed and the program will overwrite existing
output files.
.IP "\fB\-o\fR \fIfilename\fR" 4
.IX Item "-o filename"
Specify the output file name.  If \fIfilename\fR is \f(CW\*(C`\-\*(C'\fR, then \fBllvm2cpp\fR
sends its output to standard output.
.IP "\fB\-funcname\fR \fIfunctionName\fR" 4
.IX Item "-funcname functionName"
Specify the name of the function to be generated. The generated code contains a
single function that produces the input module. By default its name is
\&\fImakeLLVMModule\fR. The \fB\-funcname\fR option overrides this default and allows
you to control the name of the generated function. This is handy in conjunction
with the \fB\-fragment\fR option when you only want \fBllvm2cpp\fR to generate a
single function that produces the module. With both options, such generated code
could be \fI#included\fR into another program.
.IP "\fB\-for\fR" 4
.IX Item "-for"
Specify the name of the thing for which \*(C+ code should be generated. By default
the entire input module is re\-generated. However, use of the various \fB\-gen\-*\fR
options can restrict what is produced. This option indicates what that
restriction is.
.IP "\fB\-gen\-program\fR" 4
.IX Item "-gen-program"
Specify that the output should be a complete program. Such program will recreate
\&\fBllvm2cpp\fR's input as an \s-1LLVM\s0 module, verify that module, and then write out
the module in \s-1LLVM\s0 assembly format. This is useful for doing identity tests
where the output of the generated program is identical to the input to
\&\fBllvm2cpp\fR. The \s-1LLVM\s0 DejaGnu test suite can make use of this fact. This is the
default form of generated output.
.Sp
If the \fB\-for\fR option is given with this option, it specifies the module
identifier to use for the module created.
.IP "\fB\-gen\-module\fR" 4
.IX Item "-gen-module"
Specify that the output should be a function that regenerates the module. It is
assumed that this output will be #included into another program that has already
arranged for the correct header files to be #included. The function generated
takes no arguments and returns a \fIModule*\fR. 
.Sp
If the \fB\-for\fR option is given with this option, it specifies the module
identifier to use in creating the module returned by the generated function.
.IP "\fB\-gen\-contents\fR" 4
.IX Item "-gen-contents"
Specify that the output should be a function that adds the contents of the input
module to another module. It is assumed that the output will be #included into
another program that has already arranged for the correct header files to be
#included. The function generated takes a single argument of type \fIModule*\fR and
returns that argument. Note that Module level attributes such as endianess,
pointer size, target triple and inline asm are not passed on from the input
module to the destination module. Only the sub-elements of the module (types,
constants, functions, global variables) will be added to the input module.
.Sp
If the \fB\-for\fR option is given with this option, it specifies the module
identifier to set in the input module by the generated function.
.IP "\fB\-gen\-function\fR" 4
.IX Item "-gen-function"
Specify that the output should be a function that produces the definitions
necessary for a specific function to be added to a module.  It is assumed that 
the output will be #included into another program that has already arranged 
for the correct header files to be #included. The function generated takes a 
single argument of type \fIModule*\fR and returns the \fIFunction*\fR that it added to
the module.  Note that only those things (types, constants, etc.) directly 
needed in the definition of the function will be placed in the generated
function. 
.Sp
The \fB\-for\fR option must be given with this option or an error will be produced.
The value of the option must be the name of a function in the input module for
which code should be generated. If the named function does not exist an error
will be produced.
.IP "\fB\-gen\-inline\fR" 4
.IX Item "-gen-inline"
This option is very analagous to \fB\-gen\-function\fR except that the generated
function will not re-produce the target function's definition. Instead, the body
of the target function is inserted into some other function passed as an
argument to the generated function. Similarly any arguments to the function must
be passed to the generated function. The result of the generated function is the
first basic block of the target function.
.Sp
The \fB\-for\fR option works the same way as it does for \fB\-gen\-function\fR.
.IP "\fB\-gen\-variable\fR" 4
.IX Item "-gen-variable"
Specify that the output should be a function that produces the definitions
necessary for a specific global variable to be added to a module. It is assumed
that the output will be #included into another program that has already arranged
for the correct header files to be #included. The function generated takes a
single argument of type \fIModule*\fR and returns the \fIGlobalVariable*\fR that it 
added to the module. Note that only those things (types, constants, etc.)
directly needed in the definition of the global variable will be placed in the
generated function.
.Sp
The \fB\-for\fR option must be given with this option or an error will be produced.
THe value of the option must be the name of a global variable in the input
module for which code should be generated. If the named global variable does not
exist an error will be produced.
.IP "\fB\-gen\-type\fR" 4
.IX Item "-gen-type"
Specify that the output should be a function that produces the definitions
necessary for specific type to be added to a module. It is assumed that the
otuput will be #included into another program that has already arranged for the
correct header files to be #included. The function generated take a single
argument of type \fIModule*\fR and returns the \fIType*\fR that it added to the
module. Note that the generated function will only add the necessary type
definitions to (possibly recursively) define the requested type.
.Sp
The \fB\-for\fR option must be given with this option or an error will be produced.
The value of the option must be the name of a global type in the input module
for which code should be generated. If the named type does not exist an error
will be produced.
.IP "\fB\-stats\fR" 4
.IX Item "-stats"
Show pass statistics (not interesting in this program).
.IP "\fB\-time\-passes\fR" 4
.IX Item "-time-passes"
Show pass timing statistics (not interesting in this program).
.IP "\fB\-version\fR" 4
.IX Item "-version"
Show the version number of this program.
.SH "EXIT STATUS"
.IX Header "EXIT STATUS"
If \fBllvm2cpp\fR succeeds, it will exit with 0.  Otherwise, if an error
occurs, it will exit with a non-zero value.
.SH "SEE ALSO"
.IX Header "SEE ALSO"
llvm-as tblgen
.SH "AUTHORS"
.IX Header "AUTHORS"
Written by Reid Spencer (<http://hlvm.org>).
