mstorsjo marked 2 inline comments as done.
mstorsjo added inline comments.

================
Comment at: clang/lib/CodeGen/ItaniumCXXABI.cpp:2519-2520
       return VarLinkage;
+  // On Windows, WeakODR is a no-op, boiling down to the same as normal 
external
+  // linkage.
+  if (CGM.getTriple().isOSWindows())
----------------
rnk wrote:
> mstorsjo wrote:
> > rnk wrote:
> > > I would say that this is inaccurate. It greatly affects what the 
> > > optimizer is allowed to do.
> > > 
> > > It looks like we forgot to put a comdat on these things, is that not the 
> > > correct fix?
> > Oh, ok.
> > 
> > The full case I was trying to fix (but forgot to recheck after changing 
> > this bit) is that when used with `-ffunction-sections`, the tls wrapper 
> > function ends up as comdat `one_only`, which then gives multiple definition 
> > errors. So perhaps the issue is in the handling of `-ffunction-sections` 
> > wrt weak_odr?
> Ah, that is an interesting wrinkle. I'm surprised that things worked without 
> -ffunction-sections, though. I would've expected the two plain external 
> definitions to produce multiple definition errors.
Without `-ffunction-sections`, there's no separate thread wrapper produced at 
all, so everything else is generated with working linkage. I just haven't 
happened to build code that forces generation of a tls wrapper without 
`-ffunction-sections` yet.


================
Comment at: clang/lib/CodeGen/ItaniumCXXABI.cpp:2522
+  if (CGM.getTriple().isOSWindows())
+    return llvm::GlobalValue::LinkOnceODRLinkage;
   return llvm::GlobalValue::WeakODRLinkage;
----------------
rsmith wrote:
> I think the thread wrapper should probably be `linkonce_odr` across all 
> platforms, at least in all TUs that don't contain a definition of the 
> variable. Every such TU is supposed to provide its own copy regardless, so 
> making it non-discardable seems to serve no purpose.
> 
> That said, I suspect this is only hiding the real problem (by discarding the 
> symbol before it creates a link error), and you'd still get link errors if 
> you have two TUs that both use the same thread-local variable and happen to 
> not inline / discard their thread wrappers.
There's actually a case already where these are made linkonce for other TUs at 
https://github.com/llvm/llvm-project/blob/master/clang/lib/CodeGen/ItaniumCXXABI.cpp#L2639-L2642:

```
      // If this isn't a TU in which this variable is defined, the thread
      // wrapper is discardable.
      if (Wrapper->getLinkage() == llvm::Function::WeakODRLinkage)
        Wrapper->setLinkage(llvm::Function::LinkOnceODRLinkage);
```

In what cases would two TUs create two non-inline/discardable wrappers - and 
wouldn't that cause similar linking errors on other platforms as well?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D71572



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

Reply via email to