[LLVMdev] Inconsistent third field in global_ctors (was Re: [llvm] r214321 - UseListOrder: Visit global values)

Rafael EspĂ­ndola rafael.espindola at gmail.com
Wed Jul 30 15:46:55 PDT 2014


> Looking a little deeper, it's not "old-style" exactly; rejecting this
> isn't trivial.
>
>   - According to LangRef, the third field is optional [1].
>
> [1]: http://llvm.org/docs/LangRef.html#the-llvm-global-ctors-global-variable
>
>   - It was added in r209015 to support comdat keys.
>
>   - The helper functions `llvm::appendToGlobalCtors()` and
>     `llvm::appendToGlobalDtors()` (in ModuleUtils.cpp) will by default
>     set up the two-field version.
>
>   - Despite the field being optional (and the API defaulting to the
>     short version), the BitcodeReader auto-upgrades to the 3-element
>     version.
>
> It looks to me like `@llvm.global_ctors` and `@llvm.global_dtors` are in
> an inconsistent state here.  In particular, with the same version of the
> tool, if you generate the arrays you get one type, then if you write to
> bitcode and read it back you get another type.
>
> There are a few ways to move forward:
>
>  1. Remove the auto-upgrade from the BitcodeReader, making the third
>     field truly optional.  Why create them one way, and round-trip to
>     bitcode another way?
>
>  2. Make the third field *required*.  This primarily means:
>
>     - changing `appendToGlobal?tors()` (etc.?) to add the third field
>       immediately instead of waiting for a bitcode rount-trip and
>     - rejecting the two-field version in .ll.
>
>     This is another way of removing the inconsistency.
>

I have a small preference for 2, but just because it makes the current
IR definition simpler. Reid implemented the auto upgrade, so he
probably has a better insight on which option is best.

Cheers,
Rafael



More information about the llvm-dev mailing list