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