@@ -1161,52 +1161,45 @@ void AArch64AsmPrinter::emitFunctionEntryLabel() {
1161
1161
TS->emitDirectiveVariantPCS (CurrentFnSym);
1162
1162
}
1163
1163
1164
+ AsmPrinter::emitFunctionEntryLabel ();
1165
+
1164
1166
if (TM.getTargetTriple ().isWindowsArm64EC () &&
1165
1167
!MF->getFunction ().hasLocalLinkage ()) {
1166
1168
// For ARM64EC targets, a function definition's name is mangled differently
1167
- // from the normal symbol. We emit the alias from the unmangled symbol to
1168
- // mangled symbol name here.
1169
- if (MDNode *Unmangled =
1170
- MF-> getFunction (). getMetadata ( " arm64ec_unmangled_name " )) {
1171
- AsmPrinter::emitFunctionEntryLabel ();
1172
-
1173
- if (MDNode *ECMangled =
1174
- MF-> getFunction (). getMetadata ( " arm64ec_ecmangled_name " )) {
1175
- StringRef UnmangledStr =
1176
- cast<MDString>(Unmangled-> getOperand ( 0 ))-> getString () ;
1177
- MCSymbol *UnmangledSym =
1178
- MMI-> getContext (). getOrCreateSymbol (UnmangledStr );
1179
- StringRef ECMangledStr =
1180
- cast<MDString>(ECMangled-> getOperand ( 0 ))-> getString ();
1181
- MCSymbol *ECMangledSym =
1182
- MMI-> getContext (). getOrCreateSymbol (ECMangledStr) ;
1183
- OutStreamer-> emitSymbolAttribute (UnmangledSym, MCSA_WeakAntiDep);
1184
- OutStreamer-> emitAssignment (
1185
- UnmangledSym,
1186
- MCSymbolRefExpr::create (ECMangledSym, MCSymbolRefExpr::VK_WEAKREF,
1187
- MMI-> getContext ()));
1188
- OutStreamer-> emitSymbolAttribute (ECMangledSym, MCSA_WeakAntiDep);
1189
- OutStreamer-> emitAssignment (
1190
- ECMangledSym,
1191
- MCSymbolRefExpr::create (CurrentFnSym, MCSymbolRefExpr::VK_WEAKREF,
1192
- MMI-> getContext ()) );
1193
- return ;
1169
+ // from the normal symbol, emit required aliases here.
1170
+ auto emitFunctionAlias = [&](MCSymbol *Src, MCSymbol *Dst) {
1171
+ OutStreamer-> emitSymbolAttribute (Src, MCSA_WeakAntiDep);
1172
+ OutStreamer-> emitAssignment (
1173
+ Src, MCSymbolRefExpr::create (Dst, MCSymbolRefExpr::VK_WEAKREF,
1174
+ MMI-> getContext ()));
1175
+ };
1176
+
1177
+ auto getSymbolFromMetadata = [&]( StringRef Name) {
1178
+ MCSymbol *Sym = nullptr ;
1179
+ if (MDNode *Node = MF-> getFunction (). getMetadata (Name)) {
1180
+ StringRef NameStr = cast<MDString>(Node-> getOperand ( 0 ))-> getString ( );
1181
+ Sym = MMI-> getContext (). getOrCreateSymbol (NameStr);
1182
+ }
1183
+ return Sym;
1184
+ } ;
1185
+
1186
+ if (MCSymbol *UnmangledSym =
1187
+ getSymbolFromMetadata ( " arm64ec_unmangled_name " )) {
1188
+ MCSymbol *ECMangledSym = getSymbolFromMetadata ( " arm64ec_ecmangled_name " );
1189
+
1190
+ if (ECMangledSym) {
1191
+ // An external function, emit the alias from the unmangled symbol to
1192
+ // mangled symbol name and the alias from the mangled symbol to guest
1193
+ // exit thunk.
1194
+ emitFunctionAlias (UnmangledSym, ECMangledSym );
1195
+ emitFunctionAlias (ECMangledSym, CurrentFnSym) ;
1194
1196
} else {
1195
- StringRef UnmangledStr =
1196
- cast<MDString>(Unmangled->getOperand (0 ))->getString ();
1197
- MCSymbol *UnmangledSym =
1198
- MMI->getContext ().getOrCreateSymbol (UnmangledStr);
1199
- OutStreamer->emitSymbolAttribute (UnmangledSym, MCSA_WeakAntiDep);
1200
- OutStreamer->emitAssignment (
1201
- UnmangledSym,
1202
- MCSymbolRefExpr::create (CurrentFnSym, MCSymbolRefExpr::VK_WEAKREF,
1203
- MMI->getContext ()));
1204
- return ;
1197
+ // A function implementation, emit the alias from the unmangled symbol
1198
+ // to mangled symbol name.
1199
+ emitFunctionAlias (UnmangledSym, CurrentFnSym);
1205
1200
}
1206
1201
}
1207
1202
}
1208
-
1209
- return AsmPrinter::emitFunctionEntryLabel ();
1210
1203
}
1211
1204
1212
1205
// / Small jump tables contain an unsigned byte or half, representing the offset
0 commit comments