X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FFAQ.html;h=95e425aac66990b875816ccc83b62839966481d3;hb=a1ace76c70ae5332d6f33fce5c0c1e2fdb8cca11;hp=b67fae3abe547d3d281e693f30b42f533a5d7667;hpb=31d041935ec93742d827b617a65dbb5154752434;p=oota-llvm.git diff --git a/docs/FAQ.html b/docs/FAQ.html index b67fae3abe5..95e425aac66 100644 --- a/docs/FAQ.html +++ b/docs/FAQ.html @@ -39,8 +39,8 @@
  • The configure script finds the right C compiler, but it uses the LLVM linker from a previous build. What do I do?
  • When creating a dynamic library, I get a strange GLIBC error.
  • -
  • 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.
  • I've modified a Makefile in my source tree, but my build tree keeps using the old version. What do I do?
  • I've upgraded to a new version of LLVM, and I get strange build @@ -50,13 +50,18 @@
  • Compiling LLVM with GCC 3.3.2 fails, what should I do?
  • When I use the test suite, all of the C Backend tests fail. What is wrong?
  • -
  • After CVS update, rebuilding gives the error "No rule to make - target".
  • +
  • After Subversion update, rebuilding gives the error "No rule to make + target".
  • +
  • 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. I don't understand the GetElementPtr @@ -87,8 +92,6 @@
    6. 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. @@ -180,14 +183,12 @@ LLVM have been ported to a plethora of platforms.

        Some porting problems may exist in the following areas:

          -
        • The GCC front end code is not as portable as the LLVM suite, so it may not - compile as well on unsupported platforms.
        • + compile as well on unsupported platforms.
        • The LLVM build system relies heavily on UNIX shell tools, like the Bourne - Shell and sed. Porting to systems without these tools (MacOS 9, Plan 9) will - require more effort.
        • - + Shell and sed. Porting to systems without these tools (MacOS 9, Plan 9) + will require more effort.
        @@ -225,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.

        @@ -255,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.

        @@ -271,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.

        @@ -311,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
        +
        +
        @@ -343,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:

        @@ -377,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.

        +
        + @@ -388,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.

        +
        + +
        @@ -411,13 +482,12 @@ rebuilding.

        of running optimizations, linking, and executable generation.

        -
        -

        I don't understand the GetElementPtr - instruction. Help!

        + @@ -471,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
         
        +

        @@ -510,79 +583,67 @@ 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++:

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

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

          or:

          +

          or:

          - llvm-g++ a.cpp -c
          - llvm-g++ b.cpp -c
          - llvm-g++ a.o b.o -o program +
          +% 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.

          +

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

        4. -
        5. Convert the LLVM code to C code, using the LLC tool with the C -backend:

        6. +
        7. Convert the LLVM code to C code, using the LLC tool with the C + backend:

          -
          $ llc -march=c program.bc -o program.c
          +
          +
          +% llc -march=c program.bc -o program.c
          +
          +
        8. -
        9. Finally, compile the c file:

        10. +
        11. Finally, compile the C file:

          -
          $ cc x.c
          +
          +
          +% cc x.c
          +
          +
        -

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

        +

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

        +

        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.

        - - -

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

        - -

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

        -
        - - -

        What is this llvm.global_ctors and @@ -650,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.