dexonsmith added a comment.

In D105959#2883954 <https://reviews.llvm.org/D105959#2883954>, @mehdi_amini 
wrote:

> That's interesting!
>
> I'm not sure how to get there though: a complete solution should be able to 
> "degrade" to global constructor when the platform-specific logic isn't 
> available (unless we're confident that no such environment can exist?).

Right, it needs to downgrade (and I think there should be a CMake flag to turn 
it off in case there are reasons some LLVM user doesn't want it).

I think this would work:

  #ifdef USE_DARWIN_CLOPT
  // Add F to the list of initializers for LLVMSupport to iterate through.
  #define LLVM_ADD_CLOPT_CONSTRUCTOR(F, V) \
    __attribute__((section("__DATA,__llvmopts"),visibility("hidden"))) \
    void (*V)() = F;
  #elif defined(...) // Handle magic for other platforms.
  #else
  // Create a local symbol with a static initializer that calls F.
  #define LLVM_ADD_CLOPT_CONSTRUCTOR(F, V) \
    namespace { struct V##Type { V##Type() { F(); } } V; }
  #endif
  
  void initOptions();
  // Add an options constructor the array of cl::opt initializers.
  LLVM_ADD_CLOPT_CONSTRUCTOR(initOptions, OptionsConstructorVariable);

but maybe there's a cleaner downgrade that doesn't add an extra type.

In D105959#2883956 <https://reviews.llvm.org/D105959#2883956>, @mehdi_amini 
wrote:

> Something else I'm not sure about is how it works across DSOs: when each LLVM 
> library is linked into its own shared library, is the dynamic linker creating 
> this array when loading the libraries? (I'm starting to doubt about how this 
> would even work on windows)

Yeah, this technique only works within a single final linked image. It'd need 
to be off when the library isn't statically linked to LLVMSupport.

I imagine we'd want CMake to just "get this right" for us, but we can also 
enforce this at link time to catch configuration errors -- add a 
(dead-strippable) symbol to LLVMSupport that's `visibility("hidden")`, and 
manufacture a (dead-strippable) reference to it in any TU that uses the macro. 
If the TU ends up in a different linked image than LLVMSupport you'll get a 
link error.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D105959/new/

https://reviews.llvm.org/D105959

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to