diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 98b337e60e4ff..c4cd26adb5a09 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -205,6 +205,30 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args, } } +static void addVSDefines(const ToolChain &TC, const ArgList &Args, + ArgStringList &CmdArgs) { + + unsigned ver = 0; + const VersionTuple vt = TC.computeMSVCVersion(nullptr, Args); + ver = vt.getMajor() * 10000000 + vt.getMinor().value_or(0) * 100000 + + vt.getSubminor().value_or(0); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_VER=" + Twine(ver / 100000))); + CmdArgs.push_back(Args.MakeArgString("-D_MSC_FULL_VER=" + Twine(ver))); + CmdArgs.push_back(Args.MakeArgString("-D_WIN32")); + + llvm::Triple triple = TC.getTriple(); + if (triple.isAArch64()) { + CmdArgs.push_back("-D_M_ARM64=1"); + } else if (triple.isX86() && triple.isArch32Bit()) { + CmdArgs.push_back("-D_M_IX86=600"); + } else if (triple.isX86() && triple.isArch64Bit()) { + CmdArgs.push_back("-D_M_X64=100"); + } else { + llvm_unreachable( + "Flang on Windows only supports X86_32, X86_64 and AArch64"); + } +} + static void processVSRuntimeLibrary(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { assert(TC.getTriple().isKnownWindowsMSVCEnvironment() && @@ -334,6 +358,7 @@ void Flang::addTargetOptions(const ArgList &Args, if (Triple.isKnownWindowsMSVCEnvironment()) { processVSRuntimeLibrary(TC, Args, CmdArgs); + addVSDefines(TC, Args, CmdArgs); } // TODO: Add target specific flags, ABI, mtune option etc. diff --git a/flang/test/Driver/msvc-defines.f90 b/flang/test/Driver/msvc-defines.f90 new file mode 100644 index 0000000000000..a05df666ac09a --- /dev/null +++ b/flang/test/Driver/msvc-defines.f90 @@ -0,0 +1,10 @@ +! RUN: %flang -### --target=aarch64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-AARCH64 +! RUN: %flang -### --target=i386-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_32 +! RUN: %flang -### --target=x86_64-windows-msvc %S/Inputs/hello.f90 -v 2>&1 | FileCheck %s --check-prefixes=MSVC,MSVC-X86_64 + +! MSVC: -fc1 +! MSVC-SAME: -D_MSC_VER={{[0-9]*}} +! MSVC-SAME: -D_MSC_FULL_VER={{[0-9]*}} +! MSVC-AARCH64-SAME: -D_M_ARM64=1 +! MSVC-X86_32-SAME: -D_M_IX86=600 +! MSVC-X86_64-SAME: -D_M_X64=100