[clang] [ARM64EC] Add softintrin.lib as an implicit dependency to object files. (PR #89171)
Eli Friedman via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 17 23:09:02 PDT 2024
https://github.com/efriedma-quic created https://github.com/llvm/llvm-project/pull/89171
This copies MSVC behavior, and avoids weird link errors in certain cases.
>From 617b140cbd0c878bb6f4994d89aae3bbd8ea2754 Mon Sep 17 00:00:00 2001
From: Eli Friedman <efriedma at quicinc.com>
Date: Wed, 17 Apr 2024 23:04:50 -0700
Subject: [PATCH] [ARM64EC] Add softintrin.lib as an implicit dependency to
object files.
This copies MSVC behavior, and avoids weird link errors in certain
cases.
---
clang/lib/Driver/ToolChains/Clang.cpp | 13 ++++++++++---
clang/test/Driver/cl-options.c | 1 +
2 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 766a9b91e3c0ad..5b0fa7c8db0c62 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -4697,7 +4697,8 @@ renderDebugOptions(const ToolChain &TC, const Driver &D, const llvm::Triple &T,
Output.getFilename());
}
-static void ProcessVSRuntimeLibrary(const ArgList &Args,
+static void ProcessVSRuntimeLibrary(const ToolChain &TC,
+ const ArgList &Args,
ArgStringList &CmdArgs) {
unsigned RTOptionID = options::OPT__SLASH_MT;
@@ -4760,6 +4761,12 @@ static void ProcessVSRuntimeLibrary(const ArgList &Args,
// implemented in clang.
CmdArgs.push_back("--dependent-lib=oldnames");
}
+
+ // All Arm64EC object files implicitly add softintrin.lib. This is necessary
+ // even if the file doesn't actually refer to any of the routines because
+ // the CRT itself has incomplete dependency markings.
+ if (TC.getTriple().isWindowsArm64EC())
+ CmdArgs.push_back("--dependent-lib=softintrin");
}
void Clang::ConstructJob(Compilation &C, const JobAction &JA,
@@ -7015,7 +7022,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
if (Triple.isWindowsMSVCEnvironment() && !D.IsCLMode() &&
Args.hasArg(options::OPT_fms_runtime_lib_EQ))
- ProcessVSRuntimeLibrary(Args, CmdArgs);
+ ProcessVSRuntimeLibrary(getToolChain(), Args, CmdArgs);
// Handle -fgcc-version, if present.
VersionTuple GNUCVer;
@@ -8134,7 +8141,7 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
ArgStringList &CmdArgs) const {
bool isNVPTX = getToolChain().getTriple().isNVPTX();
- ProcessVSRuntimeLibrary(Args, CmdArgs);
+ ProcessVSRuntimeLibrary(getToolChain(), Args, CmdArgs);
if (Arg *ShowIncludes =
Args.getLastArg(options::OPT__SLASH_showIncludes,
diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c
index 5b6dfe308a76ea..7731300ae9f525 100644
--- a/clang/test/Driver/cl-options.c
+++ b/clang/test/Driver/cl-options.c
@@ -790,6 +790,7 @@
// RUN: %clang_cl -vctoolsdir "" /arm64EC /c -### -- %s 2>&1 | FileCheck --check-prefix=ARM64EC %s
// ARM64EC-NOT: /arm64EC has been overridden by specified target
// ARM64EC: "-triple" "arm64ec-pc-windows-msvc19.33.0"
+// ARM64EC-SAME: "--dependent-lib=softintrin"
// RUN: %clang_cl -vctoolsdir "" /arm64EC /c -target x86_64-pc-windows-msvc -### -- %s 2>&1 | FileCheck --check-prefix=ARM64EC_OVERRIDE %s
// ARM64EC_OVERRIDE: warning: /arm64EC has been overridden by specified target: x86_64-pc-windows-msvc; option ignored
More information about the cfe-commits
mailing list