Question about ObjectSizeOffsetVisitor::visitGlobalVariable

In this function (used to check the size of a global) there is an initial check for whether the initializer to this function is “definitive.” My question is: why do we need this? How does the object’s size change if a global’s initializer is defined at link time?


Looks like the commit that added that was . A reduced example might look something like this:

At the C source level, static object size detection has to be similarly conservative in the face of ‘variable-length’ structs like struct my_string { size_t size; char data[0]; };, though I don’t know how relevant that is here.

Interesting, so I guess we can check for whether it’s an array type and adjust accordingly instead? Blocking all global variables without definitive initializers feels a bit much to me, especially if they have primitive types (i.e. integers) that don’t have the potential to be screwed around with like this.

Sounds reasonable to me if there’re no other subtitles to worry about.

I tried to track down more of the reasons behind the strict definitive
initializer requirement because of other IPO/global opts we do.
Unfortunately, I failed.

It seems clear we cannot allow any global, as we cannot do IPO depending
on the linkage. I suspect exact definitions are the least we need to
make sure we don't get something entirely different at link time. Then
there is the variable-length/empty size issue that seems to me as if it
is a "on-off" special case.

Based on the above assumptions I tried out what happens if we relax the
condition, here is what I came up with:

Is the size == 0 check going to work for all cases? I don’t know how flexible array types are represented but if we have an int[1] in a global would this fail? Maybe have a check instead for: if constructor is not definitive and we are an array type then return false

  • Karl