[LLVMdev] Question about appending linkage
viridia at gmail.com
Tue Apr 1 22:36:27 PDT 2008
John Criswell wrote:
> Talin wrote:
>> I'm trying to figure out how to do static initialization (like static
>> constructors in C++ or Java). I figured I would use appending linkage -
>> that is, for each module I'd generate a function that did all of the
>> static initialization for that module, and then I'd put a pointer to
>> that function in an array with appending linkage. Then my
>> compiler-generated startup code would simply iterate through the array
>> and call each function in turn, before calling my "main" method.
>> Only problem is - how do I know when I've reached the end of the array?
> There are several ways to do this:
> 1) Link in a bytecode file at the end that has an array that ends with a
> NULL function pointer. The last time I checked, appending arrays
> appended arrays in link order, so the NULL will be at the end. LLVM
> does not define this behavior, so it may disappear in future releases.
> 2) Write a transform that either puts a NULL function pointer at the end
> or creates a global variable with the array size.
This assumes that I'm writing my own linker instead of using the
llvm-link tool, right?
At the moment I'm writing out separate bitcode files for each source
module, and then linking them together with llvm-link. In my current
build process none of my code is involved in the link phase. Since the
compiler doesn't know how many modules will get linked, it doesn't know
the array size.
> 3) Put the array into its own section. Write a GNU ld linker script
> that defines symbols at the beginning and end of the section. You then
> write your code so that it loops until it hits the variable at the end
> of the section (the Linux 2.4 linker does this).
> My personal preference would be option 2. The transform is trivial to
> write and does not rely on undefined behavior.
> -- John T.
>> -- Talin
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
More information about the llvm-dev