[llvm] [CodeGen][ARM64EC] Use function symbol type for function alias symbols. (PR #92099)
via llvm-commits
llvm-commits at lists.llvm.org
Tue May 14 04:29:53 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64
Author: Jacek Caban (cjacek)
<details>
<summary>Changes</summary>
Depends on #<!-- -->92098. I noticed that that's what MSVC does and it seems reasonable.
---
Full diff: https://github.com/llvm/llvm-project/pull/92099.diff
2 Files Affected:
- (modified) llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp (+36-39)
- (added) llvm/test/CodeGen/AArch64/arm64ec-symbols.ll (+25)
``````````diff
diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
index ee39c6355c298..038ac14cd2898 100644
--- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -1161,52 +1161,49 @@ void AArch64AsmPrinter::emitFunctionEntryLabel() {
TS->emitDirectiveVariantPCS(CurrentFnSym);
}
+ AsmPrinter::emitFunctionEntryLabel();
+
if (TM.getTargetTriple().isWindowsArm64EC() &&
!MF->getFunction().hasLocalLinkage()) {
// For ARM64EC targets, a function definition's name is mangled differently
- // from the normal symbol. We emit the alias from the unmangled symbol to
- // mangled symbol name here.
- if (MDNode *Unmangled =
- MF->getFunction().getMetadata("arm64ec_unmangled_name")) {
- AsmPrinter::emitFunctionEntryLabel();
-
- if (MDNode *ECMangled =
- MF->getFunction().getMetadata("arm64ec_ecmangled_name")) {
- StringRef UnmangledStr =
- cast<MDString>(Unmangled->getOperand(0))->getString();
- MCSymbol *UnmangledSym =
- MMI->getContext().getOrCreateSymbol(UnmangledStr);
- StringRef ECMangledStr =
- cast<MDString>(ECMangled->getOperand(0))->getString();
- MCSymbol *ECMangledSym =
- MMI->getContext().getOrCreateSymbol(ECMangledStr);
- OutStreamer->emitSymbolAttribute(UnmangledSym, MCSA_WeakAntiDep);
- OutStreamer->emitAssignment(
- UnmangledSym,
- MCSymbolRefExpr::create(ECMangledSym, MCSymbolRefExpr::VK_WEAKREF,
- MMI->getContext()));
- OutStreamer->emitSymbolAttribute(ECMangledSym, MCSA_WeakAntiDep);
- OutStreamer->emitAssignment(
- ECMangledSym,
- MCSymbolRefExpr::create(CurrentFnSym, MCSymbolRefExpr::VK_WEAKREF,
- MMI->getContext()));
- return;
+ // from the normal symbol, emit required aliases here.
+ auto emitFunctionAlias = [&](MCSymbol *Src, MCSymbol *Dst) {
+ OutStreamer->beginCOFFSymbolDef(Src);
+ OutStreamer->emitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_FUNCTION
+ << COFF::SCT_COMPLEX_TYPE_SHIFT);
+ OutStreamer->endCOFFSymbolDef();
+ OutStreamer->emitSymbolAttribute(Src, MCSA_WeakAntiDep);
+ OutStreamer->emitAssignment(
+ Src, MCSymbolRefExpr::create(Dst, MCSymbolRefExpr::VK_WEAKREF,
+ MMI->getContext()));
+ };
+
+ auto getSymbolFromMetadata = [&](StringRef Name) {
+ MCSymbol *Sym = nullptr;
+ if (MDNode *Node = MF->getFunction().getMetadata(Name)) {
+ StringRef NameStr = cast<MDString>(Node->getOperand(0))->getString();
+ Sym = MMI->getContext().getOrCreateSymbol(NameStr);
+ }
+ return Sym;
+ };
+
+ if (MCSymbol *UnmangledSym =
+ getSymbolFromMetadata("arm64ec_unmangled_name")) {
+ MCSymbol *ECMangledSym = getSymbolFromMetadata("arm64ec_ecmangled_name");
+
+ if (ECMangledSym) {
+ // An external function, emit the alias from the unmangled symbol to
+ // mangled symbol name and the alias from the mangled symbol to guest
+ // exit thunk.
+ emitFunctionAlias(UnmangledSym, ECMangledSym);
+ emitFunctionAlias(ECMangledSym, CurrentFnSym);
} else {
- StringRef UnmangledStr =
- cast<MDString>(Unmangled->getOperand(0))->getString();
- MCSymbol *UnmangledSym =
- MMI->getContext().getOrCreateSymbol(UnmangledStr);
- OutStreamer->emitSymbolAttribute(UnmangledSym, MCSA_WeakAntiDep);
- OutStreamer->emitAssignment(
- UnmangledSym,
- MCSymbolRefExpr::create(CurrentFnSym, MCSymbolRefExpr::VK_WEAKREF,
- MMI->getContext()));
- return;
+ // A function implementation, emit the alias from the unmangled symbol
+ // to mangled symbol name.
+ emitFunctionAlias(UnmangledSym, CurrentFnSym);
}
}
}
-
- return AsmPrinter::emitFunctionEntryLabel();
}
/// Small jump tables contain an unsigned byte or half, representing the offset
diff --git a/llvm/test/CodeGen/AArch64/arm64ec-symbols.ll b/llvm/test/CodeGen/AArch64/arm64ec-symbols.ll
new file mode 100644
index 0000000000000..9affdff0bacdc
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/arm64ec-symbols.ll
@@ -0,0 +1,25 @@
+; RUN: llc -mtriple=arm64ec-pc-windows-msvc < %s | FileCheck %s
+
+declare void @func() nounwind;
+
+define void @caller() nounwind {
+ call void @func()
+ ret void
+}
+
+; CHECK: .def caller;
+; CHECK-NEXT: .type 32;
+; CHECK-NEXT: .endef
+; CHECK-NEXT: .weak_anti_dep caller
+; CHECK-NEXT: .set caller, "#caller"@WEAKREF
+
+; CHECK: .def func;
+; CHECK-NEXT: .type 32;
+; CHECK-NEXT: .endef
+; CHECK-NEXT: .weak_anti_dep func
+; CHECK-NEXT: .set func, "#func"@WEAKREF
+; CHECK-NEXT: .def "#func";
+; CHECK-NEXT: .type 32;
+; CHECK-NEXT: .endef
+; CHECK-NEXT: .weak_anti_dep "#func"
+; CHECK-NEXT: .set "#func", "#func$exit_thunk"@WEAKREF
``````````
</details>
https://github.com/llvm/llvm-project/pull/92099
More information about the llvm-commits
mailing list