[cfe-dev] Running code on module load

David Chisnall csdavec at swansea.ac.uk
Mon Mar 3 09:17:05 PST 2008

On further inspection, there appears to be a bug in llvm-gcc when  
performing this operation.

The @llvm.global_ctors variable is defined as an array of i32,  
function pairs (the i32 seems to always be 65536 - does anyone know  
what this is?).  However, the functions can have arbitrary types.  The  
following code will break llvm-gcc:

int __attribute__((constructor)) foo(void) {
   return 0;
void __attribute__((constructor)) bar(void) {}

Worse, it doesn't give a nice warning, but an internal LLVM error  
because the first method defines the type of the array and the second  
being added (with a different type) breaks everything.

Before I implement this in clang, I'd like to know if anyone knows the  
correct behaviour.  Presumably the ctor functions should only be of  
type void()*, since C doesn't provide any mechanism for handling  
returns or passing in arguments to functions called in this way.   
Should we be silently casting ctor functions to this, or throwing an  
error if they are of another form (could cause runtime errors if they  
actually try to use their parameters)?

Is there an accompanying linker bug?  What happens if you define the  
@llvm.global_ctors as two different types in two different modules and  
then try linking them?


On 2 Mar 2008, at 15:29, David Chisnall wrote:

> Hi,
> Most of the remaining parts of Objective-C code generation require
> code to be run when the module loads (calling runtime library
> functions to register the existence of classes, categories, protocols,
> and so on).
> Looking at llvm-gcc, it seems that I need to put these in
> @llvm.global_ctors to have them automatically put in the .ctors
> section in the compiled module.  Does clang already have some
> infrastructure for collecting these and emitting the list?
> David
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev

More information about the cfe-dev mailing list