From 39b7189ef6e4f2ab637086457f32069afbe32107 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 9 Dec 2024 16:53:58 +0100 Subject: [PATCH] [LLD][COFF] Emit warnings for missing load config on EC targets ARM64EC and ARM64X images require a load configuration to be valid. --- lld/COFF/SymbolTable.cpp | 9 +++++++++ lld/test/COFF/arm64x-loadconfig.s | 14 +++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lld/COFF/SymbolTable.cpp b/lld/COFF/SymbolTable.cpp index fc78afb4c9e40..e47540c68b908 100644 --- a/lld/COFF/SymbolTable.cpp +++ b/lld/COFF/SymbolTable.cpp @@ -601,6 +601,15 @@ void SymbolTable::initializeLoadConfig() { auto sym = dyn_cast_or_null(findUnderscore("_load_config_used")); if (!sym) { + if (isEC()) { + Warn(ctx) << "EC version of '_load_config_used' is missing"; + return; + } + if (ctx.hybridSymtab) { + Warn(ctx) << "native version of '_load_config_used' is missing for " + "ARM64X target"; + return; + } if (ctx.config.guardCF != GuardCFLevel::Off) Warn(ctx) << "Control Flow Guard is enabled but '_load_config_used' is missing"; diff --git a/lld/test/COFF/arm64x-loadconfig.s b/lld/test/COFF/arm64x-loadconfig.s index 8d2ab55554634..d21f4bfe95b84 100644 --- a/lld/test/COFF/arm64x-loadconfig.s +++ b/lld/test/COFF/arm64x-loadconfig.s @@ -8,7 +8,19 @@ // RUN: llvm-mc -filetype=obj -triple=aarch64-windows loadconfig-short.s -o loadconfig-short.obj // RUN: llvm-mc -filetype=obj -triple=arm64ec-windows loadconfig-short.s -o loadconfig-short-arm64ec.obj -// RUN: lld-link -machine:arm64x -out:out.dll -dll -noentry loadconfig.obj test.obj +// RUN: lld-link -machine:arm64x -out:out-warn.dll -dll -noentry test.obj \ +// RUN: 2>&1 | FileCheck --check-prefixes=WARN-LOADCFG,WARN-EC-LOADCFG %s +// WARN-LOADCFG: lld-link: warning: native version of '_load_config_used' is missing for ARM64X target +// WARN-EC-LOADCFG: lld-link: warning: EC version of '_load_config_used' is missing + +// RUN: lld-link -machine:arm64x -out:out-nonative.dll -dll -noentry loadconfig-ec.obj chpe.obj \ +// RUN: 2>&1 | FileCheck --check-prefixes=WARN-LOADCFG --implicit-check-not EC %s + +// RUN: lld-link -machine:arm64ec -out:out-ec.dll -dll -noentry chpe.obj \ +// RUN: 2>&1 | FileCheck --check-prefixes=WARN-EC-LOADCFG --implicit-check-not native %s + +// RUN: lld-link -machine:arm64x -out:out.dll -dll -noentry loadconfig.obj test.obj \ +// RUN: 2>&1 | FileCheck --check-prefixes=WARN-EC-LOADCFG --implicit-check-not native %s // RUN: llvm-readobj --coff-load-config out.dll | FileCheck --check-prefix=DYNRELOCS %s // DYNRELOCS: DynamicValueRelocTableOffset: 0xC