diff --git a/llvm/docs/FAQ.html b/llvm/docs/FAQ.html index 23c61cc6ea12..87e6c13f3565 100644 --- a/llvm/docs/FAQ.html +++ b/llvm/docs/FAQ.html @@ -71,6 +71,9 @@
  • What is this __main() call that gets inserted into main()?
  • Where did all of my code go??
  • +
  • What is this llvm.global_ctors and + _GLOBAL__I__tmp_webcompile... stuff that happens when I + #include <iostream>?
  • @@ -449,6 +452,42 @@ you can read from and assign to volatile global variables.

    + + +

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

    +
    + + +
  • + +