@@ -627,10 +627,10 @@ Function *AArch64Arm64ECCallLowering::buildGuestExitThunk(Function *F) {
627627 Function::Create (Arm64Ty, GlobalValue::WeakODRLinkage, 0 , ThunkName, M);
628628 GuestExit->setComdat (M->getOrInsertComdat (ThunkName));
629629 GuestExit->setSection (" .wowthk$aa" );
630- GuestExit->setMetadata (
630+ GuestExit->addMetadata (
631631 " arm64ec_unmangled_name" ,
632- MDNode::get (M->getContext (),
633- MDString::get (M->getContext (), F->getName ())));
632+ * MDNode::get (M->getContext (),
633+ MDString::get (M->getContext (), F->getName ())));
634634 GuestExit->setMetadata (
635635 " arm64ec_ecmangled_name" ,
636636 MDNode::get (M->getContext (),
@@ -803,6 +803,23 @@ bool AArch64Arm64ECCallLowering::runOnModule(Module &Mod) {
803803 DispatchFnGlobal =
804804 M->getOrInsertGlobal (" __os_arm64x_dispatch_call" , DispatchFnPtrType);
805805
806+ // Mangle names of function aliases and add the alias name to
807+ // arm64ec_unmangled_name metadata to ensure a weak anti-dependency symbol is
808+ // emitted for the alias as well. Do this early, before handling
809+ // hybrid_patchable functions, to avoid mangling their aliases.
810+ for (GlobalAlias &A : Mod.aliases ()) {
811+ auto F = dyn_cast_or_null<Function>(A.getAliaseeObject ());
812+ if (!F)
813+ continue ;
814+ if (std::optional<std::string> MangledName =
815+ getArm64ECMangledFunctionName (A.getName ().str ())) {
816+ F->addMetadata (" arm64ec_unmangled_name" ,
817+ *MDNode::get (M->getContext (),
818+ MDString::get (M->getContext (), A.getName ())));
819+ A.setName (MangledName.value ());
820+ }
821+ }
822+
806823 DenseMap<GlobalAlias *, GlobalAlias *> FnsMap;
807824 SetVector<GlobalAlias *> PatchableFns;
808825
@@ -837,20 +854,24 @@ bool AArch64Arm64ECCallLowering::runOnModule(Module &Mod) {
837854 // emitGlobalAlias to emit the right alias.
838855 auto *A =
839856 GlobalAlias::create (GlobalValue::LinkOnceODRLinkage, OrigName, &F);
857+ auto *AM = GlobalAlias::create (GlobalValue::LinkOnceODRLinkage,
858+ MangledName.value (), &F);
859+ F.replaceUsesWithIf (AM,
860+ [](Use &U) { return isa<GlobalAlias>(U.getUser ()); });
840861 F.replaceAllUsesWith (A);
841862 F.setMetadata (" arm64ec_exp_name" ,
842863 MDNode::get (M->getContext (),
843864 MDString::get (M->getContext (),
844865 " EXP+" + MangledName.value ())));
845866 A->setAliasee (&F);
867+ AM->setAliasee (&F);
846868
847869 if (F.hasDLLExportStorageClass ()) {
848870 A->setDLLStorageClass (GlobalValue::DLLExportStorageClass);
849871 F.setDLLStorageClass (GlobalValue::DefaultStorageClass);
850872 }
851873
852- FnsMap[A] = GlobalAlias::create (GlobalValue::LinkOnceODRLinkage,
853- MangledName.value (), &F);
874+ FnsMap[A] = AM;
854875 PatchableFns.insert (A);
855876 }
856877 }
@@ -928,9 +949,9 @@ bool AArch64Arm64ECCallLowering::processFunction(
928949 if (!F.hasLocalLinkage () || F.hasAddressTaken ()) {
929950 if (std::optional<std::string> MangledName =
930951 getArm64ECMangledFunctionName (F.getName ().str ())) {
931- F.setMetadata (" arm64ec_unmangled_name" ,
932- MDNode::get (M->getContext (),
933- MDString::get (M->getContext (), F.getName ())));
952+ F.addMetadata (" arm64ec_unmangled_name" ,
953+ * MDNode::get (M->getContext (),
954+ MDString::get (M->getContext (), F.getName ())));
934955 if (F.hasComdat () && F.getComdat ()->getName () == F.getName ()) {
935956 Comdat *MangledComdat = M->getOrInsertComdat (MangledName.value ());
936957 SmallVector<GlobalObject *> ComdatUsers =
0 commit comments