rsmith added inline comments.

================
Comment at: lib/CodeGen/CodeGenModule.cpp:961-970
   if (const auto *FD = dyn_cast<FunctionDecl>(ND))
     if (FD->isMultiVersion() && !OmitMultiVersionMangling) {
       if (FD->isCPUDispatchMultiVersion() || FD->isCPUSpecificMultiVersion())
         AppendCPUSpecificCPUDispatchMangling(
             CGM, FD->getAttr<CPUSpecificAttr>(), Out);
+      else if (FD->isTargetClonesMultiVersion())
+        AppendTargetClonesMangling(CGM, FD->getAttr<TargetClonesAttr>(), Out);
----------------
erichkeane wrote:
> rsmith wrote:
> > This chain of `if`s and similar things elsewhere make me think we're 
> > missing an abstraction. Perhaps `FunctionDecl` should have a 
> > `getMultiVersionAttr()` and/or `getMultiVersionKind()` functions?
> I'm not super sure what either buys us... The multiversion attributes are all 
> somewhat different unfortunately, so they would need to be dispatched 
> separately later.  The 'getMultiVersionKind' is perhaps useful, though its 
> essentially what isXXXMultiVersion does.  I'll think on it, I agree that 
> there is likely an abstraction somewhere between that can improve this...
The idea would be that we have an enum that we can perform a covered `switch` 
over, so we don't need to remember to update all the relevant places when we 
add another kind of multiversioning. You already have the code to work out the 
kind of multiversioning; moving it from SemaDecl.cpp to FunctionDecl then using 
it where it makes sense in this patch would help, I think.


================
Comment at: lib/Sema/SemaDecl.cpp:9811-9812
 
   // Main isn't allowed to become a multiversion function, however it IS
   // permitted to have 'main' be marked with the 'target' optimization hint.
   if (NewFD->isMain()) {
----------------
erichkeane wrote:
> rsmith wrote:
> > Why can't `main` be multiversioned? That seems like an arbitrary 
> > restriction.
> At the time of implementing 'target', I was unsure of (and still am) how to 
> accomplish this.  It would seem that I'd need to make the entry point a 
> wrapper that calls the ifunc.  GCC seems to improperly call this (it doesn't 
> emit the 'main' fucntion as far as I can tell).
OK, if there's actually a problem with having the `main` symbol be an ifunc, 
that seems like a perfectly legitimate reason for the restriction.


https://reviews.llvm.org/D51650



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

Reply via email to