[cfe-dev] Static constructors: _cxx_global_var_initN vs _GLOBAL__sub_I_XXX

Andrew Parker via cfe-dev cfe-dev at lists.llvm.org
Thu Jan 7 01:36:06 PST 2016


I'm trying to understand more about global constructors generated by clang.
As far as I understand it, any compilation unit which requires static
constructors will cause clang to generate LLVM IR to append to the array:

@llvm.global_ctors

This is an array of structs with 3 elements: a priority, a function pointer
and an unknown (seemingly undocumented) member.

In most cases I only ever see one element in this array (per compilation
unit) with name _GLOBAL__sub_I_Filename.cpp.

However in some more complex cases - which I've yet to pin down but I think
relates to templates - I see multiple members. Those members always seem to
look something like:

__cxx_global_var_init89
__cxx_global_var_init90
_GLOBAL__sub_I_Filename.cpp

Furthermore, the last function usually just wraps other functions with
names prefixed by __cxx_global_var_init, e.g.

declare i8* @memset(i8*, i32, i64) #0
define internal void @__s3e__GLOBAL__sub_I_Filename.cpp() #0 {
  call void @__cxx_global_var_init(), !dbg !32933
  call void @__cxx_global_var_init1(), !dbg !32933
  call void @__cxx_global_var_init2(), !dbg !32933
  ret void
}

I'd just like to understand what the logic is behind the generation of
these functions. It looks to me like there's implicit constructor priority
however the priority member of the @llvm.global_ctors array is never used
(well, it's always 65535).

Does anyone know the secrets behind this?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160107/5690fdf0/attachment.html>


More information about the cfe-dev mailing list