X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FFAQ.html;h=95e425aac66990b875816ccc83b62839966481d3;hb=e562b1725ee068ff525082d1e9ba885c8928c72e;hp=6e0600be3397f383c7157704812b00aaa9a0701e;hpb=e00906fbc222c19b7ab84a817b2be46b87484e99;p=oota-llvm.git diff --git a/docs/FAQ.html b/docs/FAQ.html index 6e0600be339..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,13 +50,18 @@
    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. I don't understand the GetElementPtr @@ -88,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. @@ -181,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.
        @@ -215,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?

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

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

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

        @@ -328,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
        +
        +
        @@ -360,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:

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

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

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

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

        + + + +
        Using the GCC Front End @@ -450,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.

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

        @@ -524,70 +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 +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 @@ -655,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.