Skip to content

Commit dff5bb9

Browse files
authored
[flang] Add MSC_VER and target arch defines when targeting the MSVC ABI (#73250)
Fixes #67675
1 parent 4596dd1 commit dff5bb9

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

clang/lib/Driver/ToolChains/Flang.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,30 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args,
205205
}
206206
}
207207

208+
static void addVSDefines(const ToolChain &TC, const ArgList &Args,
209+
ArgStringList &CmdArgs) {
210+
211+
unsigned ver = 0;
212+
const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args);
213+
ver = vt.getMajor() * 10000000 + vt.getMinor().value_or(0) * 100000 +
214+
vt.getSubminor().value_or(0);
215+
CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 100000)));
216+
CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver)));
217+
CmdArgs.push_back(Args.MakeArgString("-D_WIN32"));
218+
219+
llvm::Triple triple = TC.getTriple();
220+
if (triple.isAArch64()) {
221+
CmdArgs.push_back("-D_M_ARM64=1");
222+
} else if (triple.isX86() && triple.isArch32Bit()) {
223+
CmdArgs.push_back("-D_M_IX86=600");
224+
} else if (triple.isX86() && triple.isArch64Bit()) {
225+
CmdArgs.push_back("-D_M_X64=100");
226+
} else {
227+
llvm_unreachable(
228+
"Flang on Windows only supports X86_32, X86_64 and AArch64");
229+
}
230+
}
231+
208232
static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args,
209233
ArgStringList &CmdArgs) {
210234
assert(TC.getTriple().isKnownWindowsMSVCEnvironment() &&
@@ -334,6 +358,7 @@ void Flang::addTargetOptions(const ArgList &Args,
334358

335359
if (Triple.isKnownWindowsMSVCEnvironment()) {
336360
processVSRuntimeLibrary(TC, Args, CmdArgs);
361+
addVSDefines(TC, Args, CmdArgs);
337362
}
338363

339364
// TODO: Add target specific flags, ABI, mtune option etc.

flang/test/Driver/msvc-defines.f90

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64
2+
! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_32
3+
! RUN: %flang -### --target=x86_64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_64
4+
5+
! MSVC: -fc1
6+
! MSVC-SAME: -D_MSC_VER={{[0-9]*}}
7+
! MSVC-SAME: -D_MSC_FULL_VER={{[0-9]*}}
8+
! MSVC-AARCH64-SAME: -D_M_ARM64=1
9+
! MSVC-X86_32-SAME: -D_M_IX86=600
10+
! MSVC-X86_64-SAME: -D_M_X64=100

0 commit comments

Comments
 (0)