Skip to content

Commit 9fe9f33

Browse files
committed
[CodeGen][ARM64EC] Factor out emitFunctionAlias and getSymbolFromMetadata in emitFunctionEntryLabel.
1 parent 5865482 commit 9fe9f33

File tree

1 file changed

+31
-39
lines changed

1 file changed

+31
-39
lines changed

llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp

Lines changed: 31 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1161,52 +1161,44 @@ void AArch64AsmPrinter::emitFunctionEntryLabel() {
11611161
TS->emitDirectiveVariantPCS(CurrentFnSym);
11621162
}
11631163

1164+
AsmPrinter::emitFunctionEntryLabel();
1165+
11641166
if (TM.getTargetTriple().isWindowsArm64EC() &&
11651167
!MF->getFunction().hasLocalLinkage()) {
11661168
// 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 = getSymbolFromMetadata("arm64ec_unmangled_name")) {
1187+
MCSymbol *ECMangledSym = getSymbolFromMetadata("arm64ec_ecmangled_name");
1188+
1189+
if (ECMangledSym) {
1190+
// An external function, emit the alias from the unmangled symbol to
1191+
// mangled symbol name and the alias from the mangled symbol to guest
1192+
// exit thunk.
1193+
emitFunctionAlias(UnmangledSym, ECMangledSym);
1194+
emitFunctionAlias(ECMangledSym, CurrentFnSym);
11941195
} 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;
1196+
// A function implementation, emit the alias from the unmangled symbol
1197+
// to mangled symbol name.
1198+
emitFunctionAlias(UnmangledSym, CurrentFnSym);
12051199
}
12061200
}
12071201
}
1208-
1209-
return AsmPrinter::emitFunctionEntryLabel();
12101202
}
12111203

12121204
/// Small jump tables contain an unsigned byte or half, representing the offset

0 commit comments

Comments
 (0)