Chris Lattner wrote:> On Dec 11, 2008, at 2:35 PM, John Criswell wrote: > > >> Dear All, >> >> Are global static constructors called before main() in LLVM these days >> using some behind-the-scenes magic that is not explicit in the LLVM >> bitcode? >> > > It is explicit in the bitcode. You should see an llvm.globalctors > global array that has function pointers for each initializer to run. >Right, I saw that. I just didn't see anything from main() calling those functions, which led me to believe that something else is calling those functions before main().>> In older versions of LLVM, llvm-gcc added an explicit function >> call to __main() as the first instruction in main(); __main() would >> call >> all global static constructors. It seems __main() is now gone. >> > > Yep, __main is now gone, llvm.globalctors is king. :) >I assume putting my constructor at the head of the llvm.globalctors list will force it to be run before anything else? Is that correct? -- John T.> -Chris > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
On Dec 11, 2008, at 2:45 PM, John Criswell wrote:>> It is explicit in the bitcode. You should see an llvm.globalctors >> global array that has function pointers for each initializer to run. >> > Right, I saw that. I just didn't see anything from main() calling > those > functions, which led me to believe that something else is calling > those > functions before main().Yep, the code generators handle them magically, usually by emitting something to a .init section.>>> In older versions of LLVM, llvm-gcc added an explicit function >>> call to __main() as the first instruction in main(); __main() would >>> call >>> all global static constructors. It seems __main() is now gone. >>> >> >> Yep, __main is now gone, llvm.globalctors is king. :) >> > I assume putting my constructor at the head of the llvm.globalctors > list > will force it to be run before anything else? Is that correct?Yes, that will cause it to run before anything else in the module. If you link to native code with a static ctor, the static ctors in that code may run first. -Chris
> Yep, the code generators handle them magically, usually by emitting > something to a .init section.Correct. Currently this is purely target-specific thing, for example, mingw32 still uses __main(). Almost all other targets emit special tables which is called by libc/whatever runtime code before calling to main(). -- With best regards, Anton Korobeynikov Faculty of Mathematics and Mechanics, Saint Petersburg State University
Chris Lattner wrote:> [snip] > > Yes, that will cause it to run before anything else in the module. If > you link to native code with a static ctor, the static ctors in that > code may run first. >Thanks Chris and Anton! Another question: the llvm.global.ctor array is an array of structures with an integer and a function pointer. What information does the integer convey? -- John T.> -Chris > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >