From e0869908b254420c674ae3ce43642bd41ef2a6b4 Mon Sep 17 00:00:00 2001 From: Jacek Caban 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 ec8ac814d3156..d6d6cc8f394f0 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 demangledName = - getArm64ECDemangledFunctionName(name); + } else if (std::optional demangledName = + getArm64ECDemangledFunctionName(name)) { Symbol *us = ctx.symtab.addUndefined(saver().save(*demangledName)); auto u = dyn_cast(us); if (u && !u->weakAlias) diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index 35d54d4945f7f..df3c5a176b52e 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 mangledName = getArm64ECMangledFunctionName(name)) pairName = std::move(*mangledName); + else if (std::optional 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 0000000000000..043d39e0c8089 --- /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