X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FFAQ.html;h=b67fae3abe547d3d281e693f30b42f533a5d7667;hb=e50fb9ac174b791047ffa8648443ab94b2097cd9;hp=bd393cdf131157b76aec50c86e12996ac2ef282d;hpb=0493f34bb8f8f3a90324a4867abad246a5e56a0f;p=oota-llvm.git diff --git a/docs/FAQ.html b/docs/FAQ.html index bd393cdf131..b67fae3abe5 100644 --- a/docs/FAQ.html +++ b/docs/FAQ.html @@ -1,215 +1,675 @@ - + + + + LLVM: Frequently Asked Questions + + + -

-
-LLVM: Frequently Asked Questions -
-

+
+ LLVM: Frequently Asked Questions +
-
+
    +
  1. License +
      +
    1. Why are the LLVM source code and the front-end distributed under different + licenses?
    2. +
    3. Does the University of Illinois Open Source License really qualify as an + "open source" license?
    4. +
    5. Can I modify LLVM source code and redistribute the modified source?
    6. +
    7. Can I modify LLVM source code and redistribute binaries or other tools + based on it, without redistributing the source?
    8. +
  2. - -

    -Licenses -

    - - -
    -
    Why are the LLVM source code and the front-end distributed - under different licenses? -
    - The C/C++ front-ends are based on GCC and must be distributed under - the GPL. Our aim is to distribute LLVM source code under a much - less restrictive license, in particular one that does not - compel users who distribute tools based on modifying the source to - redistribute the modified source code as well. -

    -

    Does the Illinois Open Source License really qualify - as an "open source" license? -
    The - - UI Open Source License is certified by the - Open Source Initiative (OSI). -

    -

    Can I modify LLVM source code and redistribute the modified - source? -
    - Yes. The modified source distribution must retain the - copyright notice and follow the three bulletted conditions listed in - the LLVM license. -

    -

    Can I modify LLVM source code and redistribute binaries or - other tools based on it, without redistributing the source? -
    - Yes, this is why we distribute LLVM under a less restrictive license - than GPL, as explained in the first question above. -

    -

    -
    +
  3. Source code +
      +
    1. In what language is LLVM written?
    2. +
    3. How portable is the LLVM source code?
    4. +
  4. - -

    -Source Code -

    - - -
    -
    In what language is LLVM written? -
    - All of the LLVM tools and libraries are written in C++ with extensive use - of the STL. -

    - -

    How portable is the LLVM source code? -
    - The LLVM source code should be portable to most modern UNIX-like operating - systems. Most of the code is written in standard C++ with operating - system services abstracted to a support library. The tools required to - build and test 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. - -

      - -

    • The Python test classes are more UNIX-centric than they should be, - so porting to non-UNIX like platforms (i.e. Windows, MacOS 9) will - require some effort. -

      - -

    • 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. -
    -
    +
  5. Build Problems +
      +
    1. When I run configure, it finds the wrong C compiler.
    2. +
    3. The configure script finds the right C compiler, but it uses the + LLVM linker from a previous build. What do I do?
    4. +
    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 modified a Makefile in my source tree, but my build tree keeps using + the old version. What do I do?
    10. +
    11. I've upgraded to a new version of LLVM, and I get strange build + errors.
    12. +
    13. I've built LLVM and am testing it, but the tests freeze.
    14. +
    15. Why do test results differ when I perform different types of builds?
    16. +
    17. Compiling LLVM with GCC 3.3.2 fails, what should I do?
    18. +
    19. When I use the test suite, all of the C Backend tests fail. What is + wrong?
    20. +
    21. After CVS update, rebuilding gives the error "No rule to make + target".
    22. +
  6. -
    +
  7. Source Languages +
      +
    1. What source languages are supported?
    2. +
    3. What support is there for higher level source + language constructs for building a compiler?
    4. +
    5. I don't understand the GetElementPtr + instruction. Help!
    6. +
    + +
  8. Using the GCC Front End +
      +
    1. + When I compile software that uses a configure script, the configure script + thinks my system has all of the header files and libraries it is testing + for. How do I get configure to work correctly? +
    2. + +
    3. + When I compile code using the LLVM GCC front end, it complains that it + cannot find libcrtend.a. +
    4. + +
    5. + How can I disable all optimizations when compiling code using the LLVM GCC front end? +
    6. + +
    7. Can I use LLVM to convert C++ code to C code?
    8. + +
    +
  9. + +
  10. Questions about code generated by the GCC front-end +
      +
    1. What is this __main() call that gets inserted into + main()?
    2. +
    3. What is this llvm.global_ctors and + _GLOBAL__I__tmp_webcompile... stuff that happens when I + #include <iostream>?
    4. +
    5. Where did all of my code go??
    6. +
    7. What is this "undef" thing that shows up in my code?
    8. +
    +
  11. +
+ +
+

Written by The LLVM Team

+
+ + + +
+ License +
+ + +
+

Why are the LLVM source code and the front-end distributed under different +licenses?

+
+ +
+

The C/C++ front-ends are based on GCC and must be distributed under the GPL. +Our aim is to distribute LLVM source code under a much less restrictive +license, in particular one that does not compel users who distribute tools based +on modifying the source to redistribute the modified source code as well.

+
+ +
+

Does the University of Illinois Open Source License really qualify as an +"open source" license?

+
+ +
+

Yes, the license is certified by the Open +Source Initiative (OSI).

+
+ +
+

Can I modify LLVM source code and redistribute the modified source?

+
+ +
+

Yes. The modified source distribution must retain the copyright notice and +follow the three bulletted conditions listed in the LLVM license.

+
+ +
+

Can I modify LLVM source code and redistribute binaries or other tools based +on it, without redistributing the source?

+
+ +
+

Yes, this is why we distribute LLVM under a less restrictive license than +GPL, as explained in the first question above.

+
+ + +
+ Source Code +
+ + +
+

In what language is LLVM written?

+
+ +
+

All of the LLVM tools and libraries are written in C++ with extensive use of +the STL.

+
+ +
+

How portable is the LLVM source code?

+
+ +
+

The LLVM source code should be portable to most modern UNIX-like operating +systems. Most of the code is written in standard C++ with operating system +services abstracted to a support library. The tools required to build and test +LLVM have been ported to a plethora of platforms.

+ +

Some porting problems may exist in the following areas:

+ + + +
+ + +
+ Build Problems +
+ + +
+

When I run configure, it finds the wrong C compiler.

+
+ +
+ +

The configure script attempts to locate first gcc and then +cc, unless it finds compiler paths set in CC and CXX +for the C and C++ compiler, respectively.

+ +

If configure finds the wrong compiler, either adjust your +PATH environment variable or set CC and CXX +explicitly.

+ +
+ +
+

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

+
+ +
+

The configure script uses the PATH to find executables, so +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. + +
  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 ...

    + +

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

  4. + +
+ +
+ +
+

When creating a dynamic library, I get a strange GLIBC error.

+
+ +
+

Under some operating systems (i.e. Linux), libtool does not work correctly if +GCC was compiled with the --disable-shared option. To work around this, install +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.

+
+ +
+

You need to re-run configure in your object directory. When new Makefiles +are added to the source tree, they have to be copied over to the object tree in +order to be used by the build.

+
+ +
+

I've modified a Makefile in my source tree, but my build tree keeps using the +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>

+ +

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

+ +
+ +
+

I've upgraded to a new version of LLVM, and I get strange build errors.

+
+ +
+ +

Sometimes, changes to the LLVM source code alters how the build system works. +Changes in libtool, autoconf, or header file dependencies are especially prone +to this sort of problem.

+ +

The best thing to try is to remove the old files and re-build. In most +cases, this takes care of the problem. To do this, just type make +clean and then make in the directory that fails to build.

+ +
+ +
+

I've built LLVM and am testing it, but the tests freeze.

+
+ +
+ +

This is most likely occurring because you built a profile or release +(optimized) build of LLVM and have not specified the same information on the +gmake command line.

+ +

For example, if you built LLVM with the command:

+ +

gmake ENABLE_PROFILING=1 + +

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

+ +

cd llvm/test
gmake ENABLE_PROFILING=1

+ +
+ +
+

Why do test results differ when I perform different types of builds?

+
+ +
+ +

The LLVM test suite is dependent upon several features of the LLVM tools and +libraries.

+ +

First, the debugging assertions in code are not enabled in optimized or +profiling builds. Hence, tests that used to fail may pass.

+ +

Second, some tests may rely upon debugging options or behavior that is only +available in the debug build. These tests will fail in an optimized or profile +build.

+ +
+ +
+

Compiling LLVM with GCC 3.3.2 fails, what should I do?

+
+ +
+

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

+
+ +
+

After CVS 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:

+ +
+
+% cd $LLVM_OBJ_DIR
+% rm -f `find . -name \*\.d` 
+% gmake 
+
+
+ +

In other cases, it may be necessary to run make clean before +rebuilding.

+
+ + +
Source Languages
+ +

+ What source languages are supported?

+
+
+

LLVM currently has full support for C and C++ source languages. These are + 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 + 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 + 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 + building a compiler?

+
+
+

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 semantic analysis. There is, however, a mostly + implemented configuration-driven + compiler driver which simplifies the task + of running optimizations, linking, and executable generation.

+
+ +
+

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

+
+
+

See The Often Misunderstood GEP + Instruction. +

+ + +
+ Using the GCC Front End +
+ +
+

+When I compile software that uses a configure script, the configure script +thinks my system has all of the header files and libraries it is testing for. +How do I get configure to work correctly? +

+
+ +
+

+The configure script is getting things wrong because the LLVM linker allows +symbols to be undefined at link time (so that they can be resolved during JIT +or translation to the C back end). That is why configure thinks your system +"has everything." +

+

+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 that the regular C compiler is first in your PATH.
  4. + +
  5. Add the string "-Wl,-native" to your CFLAGS environment variable.
  6. +
+ +

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

+
+ +
+

+When I compile code using the LLVM GCC front end, it complains that it cannot +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
+
+
+ +
+

+How can I disable all optimizations when compiling code using the LLVM GCC front end? +

+
+ +
+

+Passing "-Wa,-disable-opt -Wl,-disable-opt" will disable *all* cleanup and +optimizations done at the llvm level, leaving you with the truly horrible +code that you desire. +

+
+ + +
+

+Can I use LLVM to convert C++ code to C code? +

+
+ +
+

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++:

  2. + +
    $ 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.

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

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

  6. + +
    $ 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. +

+ +

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.

+ +
+ + + + +
+ Questions about code generated by the GCC front-end +
+ +

+ +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 +_GLOBAL__I__tmp_webcompile... stuff that happens when I #include +<iostream>?

+
+ +
+ +

If you #include the <iostream> header into a C++ translation unit, the +file will probably use the std::cin/std::cout/... global +objects. However, C++ does not guarantee an order of initialization between +static objects in different translation units, so if a static ctor/dtor in your +.cpp file used std::cout, for example, the object would not necessarily +be automatically initialized before your use.

+ +

To make std::cout and friends work correctly in these scenarios, the +STL that we use declares a static object that gets created in every translation +unit that includes <iostream>. This object has a static +constructor and destructor that initializes and destroys the global iostream +objects before they could possibly be used in the file. The code that you see +in the .ll file corresponds to the constructor and destructor registration code. +

+ +

If you would like to make it easier to understand the LLVM code +generated by the compiler in the demo page, consider using printf() +instead of iostreams to print values.

+ +
+ + + +

+ +Where did all of my code go?? +

+ +
+

+If you are using the LLVM demo page, you may often wonder what happened to all +of the code that you typed in. Remember that the demo script is running the +code through the LLVM optimizers, so if your code doesn't actually do anything +useful, it might all be deleted. +

+ +

+To prevent this, make sure that the code is actually needed. For example, if +you are computing some expression, return the value from the function instead of +leaving it in a local variable. If you really want to constrain the optimizer, +you can read from and assign to volatile global variables. +

+
+ + + +

+ +

What is this "undef" thing that shows up in my code? +

+ +
+

+undef is the LLVM way of representing +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; } +
+ +

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

+
+ + - -

-Build Problems -

- - -
-
When I run configure, it finds the wrong C compiler. -
- The configure script attempts to locate first gcc and - then cc, unless it finds compiler paths set in CC and - CXX for the C and C++ compiler, respectively. - - If configure finds the wrong compiler, either adjust your - PATH environment variable or set CC and CXX - 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? -
- The configure script uses the PATH to find - executables, so 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. Run configure with an alternative PATH that - is correct. In a Borne compatible shell, the syntax would be: -

    - PATH= ./configure ... -

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

- -
When creating a dynamic library, I get a strange GLIBC error. -
- Under some operating systems (i.e. Linux), libtool does not work correctly - if GCC was compiled with the --disable-shared option. To work around this, - install 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. -
- You need to re-run configure in your object directory. When new Makefiles - are added to the source tree, they have to be copied over to the object - tree in order to be used by the build. -

- -

I've modified a Makefile in my source tree, but my build tree keeps - using the 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> -

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

- -

I've upgraded to a new version of LLVM, and I get strange build - errors. -
- Sometimes changes to the LLVM source code alters how the build system - works. Changes in libtool, autoconf, or header file dependencies are - especially prone to this sort of problem. -

- The best thing to try is to remove the old files and re-build. In most - cases, this takes care of the problem. To do this, just type make - clean and then make in the directory that fails to build. -

- -

I've built LLVM and am testing it, but the tests freeze. -
- This is most likely occurring because you built a profile or release - (optimized) build of LLVM and have not specified the same information on - the gmake command line. -

- For example, if you built LLVM with the command: -

- gmake ENABLE_PROFILING=1 -

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

- cd llvm/test
gmake ENABLE_PROFILING=1
-

- -

Why do test results differ when I perform different types of - builds? -
- The LLVM test suite is dependent upon several features of the LLVM tools - and libraries. -

- First, the debugging assertions in code are not enabled in optimized or - profiling builds. Hence, tests that used to fail may pass. -

- Second, some tests may rely upon debugging options or behavior that is - only available in the debug build. These tests will fail in an optimized - or profile build. -


+
+ Valid CSS! + Valid HTML 4.01! -The LLVM Compiler Infrastructure -
+ LLVM Compiler Infrastructure
+ Last modified: $Date$ +