X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FFAQ.html;h=95e425aac66990b875816ccc83b62839966481d3;hb=a1ace76c70ae5332d6f33fce5c0c1e2fdb8cca11;hp=e015f91df5493f81367f5561b760183c6bd44543;hpb=7b8229a1464797b58fe7e968a4d9716a0c98b3d9;p=oota-llvm.git diff --git a/docs/FAQ.html b/docs/FAQ.html index e015f91df54..95e425aac66 100644 --- a/docs/FAQ.html +++ b/docs/FAQ.html @@ -36,12 +36,11 @@
  • Build Problems
    1. When I run configure, it finds the wrong C compiler.
    2. -
    3. I compile the code, and I get some error about /localhome.
    4. The configure script finds the right C compiler, but it uses the LLVM linker from a previous build. What do I do?
    5. When creating a dynamic library, I get a strange GLIBC error.
    6. -
    7. I've updated my source tree from CVS, and now my build is trying to use a - file/directory that doesn't exist.
    8. +
    9. I've updated my source tree from Subversion, and now my build is trying + to use a file/directory that doesn't exist.
    10. I've modified a Makefile in my source tree, but my build tree keeps using the old version. What do I do?
    11. I've upgraded to a new version of LLVM, and I get strange build @@ -51,15 +50,22 @@
    12. Compiling LLVM with GCC 3.3.2 fails, what should I do?
    13. When I use the test suite, all of the C Backend tests fail. What is wrong?
    14. -
    15. After CVS update, rebuilding gives the error "No rule to make - target".
    16. +
    17. After Subversion update, rebuilding gives the error "No rule to make + target".
    18. +
    19. The llvmc program gives me errors/doesn't + work.
  • Source Languages
    1. What source languages are supported?
    2. +
    3. I'd like to write a self-hosting LLVM compiler. How + should I interface with the LLVM middle-end optimizers and back-end code + generators?
    4. What support is there for higher level source language constructs for building a compiler?
    5. +
    6. I don't understand the GetElementPtr + instruction. Help!
  • Using the GCC Front End @@ -79,13 +85,13 @@ How can I disable all optimizations when compiling code using the LLVM GCC front end?
  • +
  • Can I use LLVM to convert C++ code to C code?
  • +
  • Questions about code generated by the GCC front-end
      -
    1. What is this __main() call that gets inserted into - main()?
    2. What is this llvm.global_ctors and _GLOBAL__I__tmp_webcompile... stuff that happens when I #include <iostream>?
    3. @@ -177,14 +183,12 @@ LLVM have been ported to a plethora of platforms.

      Some porting problems may exist in the following areas:

      @@ -211,22 +215,6 @@ explicitly.

      -
      -

      I compile the code, and I get some error about /localhome.

      -
      - -
      - -

      There are several possible causes for this. The first is that you didn't set -a pathname properly when using configure, and it defaulted to a -pathname that we use on our research machines.

      - -

      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.

      - -
      -

      The configure script finds the right C compiler, but it uses the LLVM linker from a previous build. What do I do?

      @@ -238,21 +226,23 @@ if it's grabbing the wrong linker/assembler/etc, there are two ways to fix it:

        -
      1. Adjust your PATH environment variable so that the correct - program appears first in the PATH. This may work, but may not be - convenient when you want them first in your path for other - work.

      2. + program appears first in the PATH. This may work, but may not be + convenient when you want them first in your path for other + work.

      3. Run configure with an alternative PATH that is - correct. In a Borne compatible shell, the syntax would be:

        - -

        PATH=[the path without the bad program] ./configure ...

        + correct. In a Borne compatible shell, the syntax would be:

        + +
        +
        +% PATH=[the path without the bad program] ./configure ...
        +
        +

        This is still somewhat inconvenient, but it allows configure - to do its work without having to adjust your PATH - permanently.

      4. - + to do its work without having to adjust your PATH + permanently.

      @@ -268,8 +258,8 @@ your own version of GCC that has shared libraries enabled by default.

      -

      I've updated my source tree from CVS, and now my build is trying to use a -file/directory that doesn't exist.

      +

      I've updated my source tree from Subversion, and now my build is trying to +use a file/directory that doesn't exist.

      @@ -284,12 +274,13 @@ old version. What do I do?

      -

      If the Makefile already exists in your object tree, you can just run the following command in the top level directory of your object tree:

      -

      ./config.status <relative path to Makefile>

      +

      +
      % ./config.status <relative path to Makefile>
      +

      If the Makefile is new, you will have to modify the configure script to copy it over.

      @@ -324,11 +315,18 @@ clean and then make in the directory that fails to build.

      For example, if you built LLVM with the command:

      -

      gmake ENABLE_PROFILING=1 +

      +
      % gmake ENABLE_PROFILING=1
      +

      ...then you must run the tests with the following commands:

      -

      cd llvm/test
      gmake ENABLE_PROFILING=1

      +
      +
      +% cd llvm/test
      +% gmake ENABLE_PROFILING=1
      +
      +
      @@ -356,27 +354,28 @@ build.

      This is a bug in GCC, and - affects projects other than LLVM. Try upgrading or downgrading your GCC.

      +affects projects other than LLVM. Try upgrading or downgrading your GCC.

      -

      After CVS update, rebuilding gives the error "No rule to make target".

      +

      After Subversion update, rebuilding gives the error "No rule to make +target".

      If the error is of the form:

      - +
       gmake[2]: *** No rule to make target `/path/to/somefile', needed by
       `/path/to/another/file.d'.
      Stop. -
      +
      -

      This may occur anytime files are moved within the CVS repository or removed -entirely. In this case, the best solution is to erase all .d files, -which list dependencies for source files, and rebuild:

      +

      This may occur anytime files are moved within the Subversion repository or +removed entirely. In this case, the best solution is to erase all +.d files, which list dependencies for source files, and rebuild:

      @@ -390,6 +389,15 @@ which list dependencies for source files, and rebuild:

      rebuilding.

      + + +
      +

      llvmc is experimental and isn't really supported. We suggest +using llvm-gcc instead.

      +
      + @@ -401,17 +409,67 @@ rebuilding.

      available through a special version of GCC that LLVM calls the C Front End

      There is an incomplete version of a Java front end available in the - llvm-java CVS repository. There is no documentation on this yet so + java module. There is no documentation on this yet so you'll need to download the code, compile it, and try it.

      -

      In the examples/BFtoLLVM directory is a translator for the - BrainF*** language (2002 Language Specification).

      -

      In the projects/Stacker directory is a compiler and runtime +

      In the stacker module is a compiler and runtime library for the Stacker language, a "toy" language loosely based on Forth.

      The PyPy developers are working on integrating LLVM into the PyPy backend so that PyPy language can translate to LLVM.

      -
      -

      What support is there for a higher level source language constructs for + +

      +
      +

      Your compiler front-end will communicate with LLVM by creating a module in + the LLVM intermediate representation (IR) format. Assuming you want to + write your language's compiler in the language itself (rather than C++), + there are 3 major ways to tackle generating LLVM IR from a front-end:

      +
        +
      • + Call into the LLVM libraries code using your language's FFI + (foreign function interface). +
          +
        • for: best tracks changes to the LLVM IR, .ll syntax, + and .bc format
        • +
        • for: enables running LLVM optimization passes without a + emit/parse overhead
        • +
        • for: adapts well to a JIT context
        • +
        • against: lots of ugly glue code to write
        • +
        +
      • +
      • + Emit LLVM assembly from your compiler's native language. +
          +
        • for: very straightforward to get started
        • +
        • against: the .ll parser is slower than the bitcode reader + when interfacing to the middle end
        • +
        • against: you'll have to re-engineer the LLVM IR object + model and asm writer in your language
        • +
        • against: it may be harder to track changes to the IR
        • +
        +
      • +
      • + Emit LLVM bitcode from your compiler's native language. +
          +
        • for: can use the more-efficient bitcode reader when + interfacing to the middle end
        • +
        • against: you'll have to re-engineer the LLVM IR object + model and bitcode writer in your language
        • +
        • against: it may be harder to track changes to the IR
        • +
        +
      • +
      +

      If you go with the first option, the C bindings in include/llvm-c should + help a lot, since most languages have strong support for interfacing with + C. The most common hurdle with calling C from managed code is interfacing + with the garbage collector. The C interface was designed to require very + little memory management, and so is straightforward in this regard.

      +
      + +
      @@ -423,6 +481,15 @@ rebuilding.

      compiler driver which simplifies the task of running optimizations, linking, and executable generation.

      + + + +
      Using the GCC Front End @@ -446,28 +513,21 @@ or translation to the C back end). That is why configure thinks your system

      To work around this, perform the following steps:

      -
        -
      1. - Make sure the CC and CXX environment variables contains the full path to the - LLVM GCC front end. -
      2. +
      3. Make sure the CC and CXX environment variables contains the full path to + the LLVM GCC front end.
      4. -
      5. - Make sure that the regular C compiler is first in your PATH. -
      6. +
      7. Make sure that the regular C compiler is first in your PATH.
      8. -
      9. - Add the string "-Wl,-native" to your CFLAGS environment variable. -
      10. +
      11. Add the string "-Wl,-native" to your CFLAGS environment variable.

      -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. -

      +This will allow the llvm-ld 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.

      @@ -481,11 +541,14 @@ find libcrtend.a.

      The only way this can happen is if you haven't installed the runtime library. To correct this, do:

      + +
      -  % cd llvm/runtime
      -  % make clean ; make install-bytecode
      +% cd llvm/runtime
      +% make clean ; make install-bytecode
       
      +

      @@ -501,33 +564,85 @@ code that you desire.

      - - - -

      - -What is this __main() call that gets inserted into main()? -

      -
      +

      -The __main call is inserted by the C/C++ compiler in order to guarantee -that static constructors and destructors are called when the program starts up -and shuts down. In C, you can create static constructors and destructors by -using GCC extensions, and in C++ you can do so by creating a global variable -whose class has a ctor or dtor. +Can I use LLVM to convert C++ code to C code?

      +
      -

      -The actual implementation of __main lives in the -llvm/runtime/GCCLibraries/crtend/ directory in the source-base, and is -linked in automatically when you link the program. +

      +

      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.

      + +

      Use commands like this:

      + +
        +
      1. Compile your program as normal with llvm-g++:

        + +
        +
        +% llvm-g++ x.cpp -o program
        +
        - +

        or:

        + +
        +
        +% llvm-g++ a.cpp -c
        +% llvm-g++ b.cpp -c
        +% llvm-g++ a.o b.o -o program
        +
        +
        + +

        With llvm-gcc3, this will generate program and program.bc. The .bc + file is the LLVM version of the program all linked together.

      2. + +
      3. Convert the LLVM code to C code, using the LLC tool with the C + backend:

        + +
        +
        +% llc -march=c program.bc -o program.c
        +
        +
      4. + +
      5. Finally, compile the C file:

        + +
        +
        +% cc x.c
        +
        +
      6. + +
      + +

      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.

      + +

      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 +bitcode, 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.

      + +
      + + +
      @@ -596,12 +711,13 @@ a value that is not defined. You can get these if you do not initialize a variable before you use it. For example, the C function:

      - int X() { int i; return i; } +
      +int X() { int i; return i; }
      +
      -

      Is compiled to "ret int undef" because "i" never has a value -specified for it. -

      +

      Is compiled to "ret i32 undef" because "i" never has +a value specified for it.