Update doc to reflect changes I am about to install to fix PR 888.
[oota-llvm.git] / docs / FAQ.html
index de90be4185d0027631e30f840c267f3de8293962..b67fae3abe547d3d281e693f30b42f533a5d7667 100644 (file)
@@ -36,7 +36,6 @@
   <li><a href="#build">Build Problems</a>
   <ol>
   <li>When I run configure, it finds the wrong C compiler.</li>
-  <li>I compile the code, and I get some error about <tt>/localhome</tt>.</li>
   <li>The <tt>configure</tt> script finds the right C compiler, but it uses the
   LLVM linker from a previous build.  What do I do?</li>
   <li>When creating a dynamic library, I get a strange GLIBC error.</li>
@@ -60,6 +59,8 @@
     <li><a href="#langs">What source languages are supported?</a></li>
     <li><a href="#langhlsupp">What support is there for higher level source
       language constructs for building a compiler?</a></li>
+    <li><a href="GetElementPtr.html">I don't understand the GetElementPtr
+      instruction. Help!</a></li>
   </ol>
 
   <li><a href="#cfe">Using the GCC Front End</a>
@@ -79,6 +80,8 @@
     How can I disable all optimizations when compiling code using the LLVM GCC front end?
     </li>
 
+    <li><a href="#translatec++">Can I use LLVM to convert C++ code to C code?</a></li>
+
   </ol>
   </li>
 
@@ -211,22 +214,6 @@ explicitly.</p>
 
 </div>
 
-<div class="question">
-<p>I compile the code, and I get some error about <tt>/localhome</tt>.</p>
-</div>
-
-<div class="answer">
-
-<p>There are several possible causes for this.  The first is that you didn't set
-a pathname properly when using <tt>configure</tt>, and it defaulted to a
-pathname that we use on our research machines.</p>
-
-<p>Another possibility is that we hardcoded a path in our Makefiles.  If you see
-this, please email the LLVM bug mailing list with the name of the offending
-Makefile and a description of what is wrong with it.</p>
-
-</div>
-
 <div class="question">
 <p>The <tt>configure</tt> script finds the right C compiler, but it uses the
 LLVM linker from a previous build.  What do I do?</p>
@@ -418,14 +405,21 @@ rebuilding.</p>
   <p>Currently, there isn't much. LLVM supports an intermediate representation
   which is useful for code representation but will not support the high level
   (abstract syntax tree) representation needed by most compilers. There are no
-  facilities for lexical nor semantical analysis. There is, however, a <i>mostly
+  facilities for lexical nor semantic analysis. There is, however, a <i>mostly
     implemented</i> configuration-driven 
   <a href="CompilerDriver.html">compiler driver</a> which simplifies the task
   of running optimizations, linking, and executable generation.</p>
-  <p>You might be interested in following the progress of the <a
-    href="http://hlvm.org">HLVM Project</a> which is attempting to address these
-  issues.</p>
 </div>
+
+<div class="question"><a name="langhlsupp">
+  <p>I don't understand the GetElementPtr
+      instruction. Help!</a></p>
+</div>
+<div class="answer">
+  <p>See <a href="GetElementPtr.html">The Often Misunderstood GEP
+   Instruction</a>.</li>
+</div>
+
 <!-- *********************************************************************** -->
 <div class="doc_section">
   <a name="cfe">Using the GCC Front End</a>
@@ -449,28 +443,21 @@ or translation to the C back end).  That is why configure thinks your system
 <p>
 To work around this, perform the following steps:
 </p>
-
 <ol>
-  <li>
-  Make sure the CC and CXX environment variables contains the full path to the
-  LLVM GCC front end.
-  </li>
+  <li>Make sure the CC and CXX environment variables contains the full path to 
+  the LLVM GCC front end.</li>
 
-  <li>
-  Make sure that the regular C compiler is first in your PATH.
-  </li>
+  <li>Make sure that the regular C compiler is first in your PATH. </li>
 
-  <li>
-  Add the string "-Wl,-native" to your CFLAGS environment variable.
-  </li>
+  <li>Add the string "-Wl,-native" to your CFLAGS environment variable.</li>
 </ol>
 
 <p>
-This will allow the gccld linker to create a native code executable instead of
-a shell script that runs the JIT.  Creating native code requires standard
-linkage, which in turn will allow the configure script to find out if code is
-not linking on your system because the feature isn't available on your system.
-</p>
+This will allow the <tt>llvm-ld</tt> linker to create a native code executable 
+instead of shell script that runs the JIT.  Creating native code requires 
+standard linkage, which in turn will allow the configure script to find out if 
+code is not linking on your system because the feature isn't available on your 
+system.</p>
 </div>
 
 <div class="question">
@@ -504,6 +491,70 @@ code that you desire.
 </p>
 </div>
 
+
+<div class="question">
+<p>
+<a name="translatec++">Can I use LLVM to convert C++ code to C code?</a>
+</p>
+</div>
+
+<div class="answer">
+<p>Yes, you can use LLVM to convert code from any language LLVM supports to C.
+Note that the generated C code will be very low level (all loops are lowered
+to gotos, etc) and not very pretty (comments are stripped, original source
+formatting is totally lost, variables are renamed, expressions are regrouped), 
+so this may not be what you're looking for.  However, this is a good way to add
+C++ support for a processor that does not otherwise have a C++ compiler.
+</p>
+
+<p>Use commands like this:</p>
+
+<ol>
+<li><p>Compile your program as normal with llvm-g++:</p></li>
+
+<div class="doc_code">$ llvm-g++ x.cpp -o program</div>
+
+<p>or:</p>
+
+<div class="doc_code">
+ llvm-g++ a.cpp -c<br>
+ llvm-g++ b.cpp -c<br>
+ llvm-g++ a.o b.o -o program
+</div>
+
+<p>With llvm-gcc3, this will generate program and program.bc.  The .bc file is 
+the LLVM version of the program all linked together.</p>
+
+<li><p>Convert the LLVM code to C code, using the LLC tool with the C
+backend:</p></li>
+
+<div class="doc_code">$ llc -march=c program.bc -o program.c</div>
+
+<li><p>Finally, compile the c file:</p></li>
+
+<div class="doc_code">$ cc x.c</div>
+
+</ol>
+
+<p>Note that, by default, the C backend does not support exception handling.
+If you want/need it for a certain program, you can enable it by passing
+"-enable-correct-eh-support" to the llc program.  The resultant code will
+use setjmp/longjmp to implement exception support that is correct but
+relatively slow.
+</p>
+
+<p>Also note: this specific sequence of commands won't work if you use a 
+function defined in the C++ runtime library (or any other C++ library).  To 
+access an external C++ library, you must manually 
+compile libstdc++ to LLVM bytecode, statically link it into your program, then
+use the commands above to convert the whole result into C code.  Alternatively,
+you can compile the libraries and your application into two different chunks
+of C code and link them.</p>
+
+</div>
+
+
+
 <!-- *********************************************************************** -->
 <div class="doc_section">
   <a name="cfe_code">Questions about code generated by the GCC front-end</a>