[lld] [LLD][COFF] Fix handling of invalid ARM64EC function names (PR #116252)
Jacek Caban via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 15 07:16:55 PST 2024
https://github.com/cjacek updated https://github.com/llvm/llvm-project/pull/116252
>From e0869908b254420c674ae3ce43642bd41ef2a6b4 Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Thu, 14 Nov 2024 16:31:19 +0100
Subject: [PATCH] [LLD][COFF] Fix handling of invalid ARM64EC function names
Since these symbols cannot be mangled or demangled, there is no symbol to check for conflicts
in checkLazyECPair, nor is there an alias to create in addUndefined. Attempting to create an
import library with such symbols results in an error; the patch includes a test to ensure the
error is handled correctly.
This is a follow-up to #115567.
---
lld/COFF/Driver.cpp | 5 ++---
lld/COFF/SymbolTable.cpp | 5 ++++-
lld/test/COFF/arm64ec-invalid-name.s | 15 +++++++++++++++
3 files changed, 21 insertions(+), 4 deletions(-)
create mode 100644 lld/test/COFF/arm64ec-invalid-name.s
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index ec8ac814d31562..d6d6cc8f394f0c 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -714,9 +714,8 @@ Symbol *LinkerDriver::addUndefined(StringRef name, bool aliasEC) {
Symbol *t = ctx.symtab.addUndefined(saver().save(*mangledName));
u->setWeakAlias(t, true);
}
- } else {
- std::optional<std::string> demangledName =
- getArm64ECDemangledFunctionName(name);
+ } else if (std::optional<std::string> demangledName =
+ getArm64ECDemangledFunctionName(name)) {
Symbol *us = ctx.symtab.addUndefined(saver().save(*demangledName));
auto u = dyn_cast<Undefined>(us);
if (u && !u->weakAlias)
diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp
index 35d54d4945f7f4..df3c5a176b52e0 100644
--- a/lld/COFF/SymbolTable.cpp
+++ b/lld/COFF/SymbolTable.cpp
@@ -669,8 +669,11 @@ bool checkLazyECPair(SymbolTable *symtab, StringRef name, InputFile *f) {
if (std::optional<std::string> mangledName =
getArm64ECMangledFunctionName(name))
pairName = std::move(*mangledName);
+ else if (std::optional<std::string> demangledName =
+ getArm64ECDemangledFunctionName(name))
+ pairName = std::move(*demangledName);
else
- pairName = *getArm64ECDemangledFunctionName(name);
+ return true;
Symbol *sym = symtab->find(pairName);
if (!sym)
diff --git a/lld/test/COFF/arm64ec-invalid-name.s b/lld/test/COFF/arm64ec-invalid-name.s
new file mode 100644
index 00000000000000..043d39e0c8089c
--- /dev/null
+++ b/lld/test/COFF/arm64ec-invalid-name.s
@@ -0,0 +1,15 @@
+// REQUIRES: aarch64
+
+// Verify that an error is emitted when attempting to export an invalid function name.
+// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %s -o %t.obj
+// RUN: llvm-mc -filetype=obj -triple=arm64ec-windows %S/Inputs/loadconfig-arm64ec.s -o %t-loadconfig.obj
+// RUN: not lld-link -machine:arm64ec -dll -noentry "-export:?func" %t-loadconfig.obj %t.obj 2>&1 | FileCheck %s
+// CHECK: error: Invalid ARM64EC function name '?func'
+
+// Verify that we can handle an invalid function name in the archive map.
+// RUN: llvm-lib -machine:arm64ec -out:%t.lib %t.obj
+// RUN: lld-link -machine:arm64ec -dll -noentry %t-loadconfig.obj %t.lib
+
+ .globl "?func"
+"?func":
+ ret
More information about the llvm-commits
mailing list