[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