[clang] [FMV] Emit the resolver along with the default version definition. (PR #84405)

Jon Roelofs via cfe-commits cfe-commits at lists.llvm.org
Fri Mar 15 09:03:39 PDT 2024


================
@@ -4347,6 +4362,19 @@ void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) {
   }
 }
 
+/// Adds a declaration to the list of multi version functions if not present.
+void CodeGenModule::AddDeferredMultiVersionResolverToEmit(GlobalDecl GD) {
+  const auto *FD = cast<FunctionDecl>(GD.getDecl());
+  assert(FD && "Not a FunctionDecl?");
+
+  if (FD->isTargetVersionMultiVersion()) {
+    StringRef NamePrefix = getMangledName(GD).split('.').first;
----------------
jroelofs wrote:

`asm`+multiversioning isn't really the point of that argument... sorry, bad example. My point is that the `.` inserted for multi versioning mangling might not be the only one. If you insist on string splitting, it should at least be `rsplit`.

We shouldn't have to rely on string splitting though: `getMangledNameImpl(..., false)` returns the prefix that you need. It is used elsewhere in this multiversioning code to retrieve what the mangled name would be on the function if it did not have the attribute:

https://github.com/llvm/llvm-project/blob/7337db72ed334f8389601f160b762e50c4e61c25/clang/lib/CodeGen/CodeGenModule.cpp#L1857-L1861



https://github.com/llvm/llvm-project/pull/84405


More information about the cfe-commits mailing list