@@ -204,6 +204,59 @@ void Flang::AddAArch64TargetArgs(const ArgList &Args,
204204 }
205205}
206206
207+ static void processVSRuntimeLibrary (const ToolChain &TC, const ArgList &Args,
208+ ArgStringList &CmdArgs) {
209+ assert (TC.getTriple ().isKnownWindowsMSVCEnvironment () &&
210+ " can only add VS runtime library on Windows!" );
211+ if (TC.getTriple ().isKnownWindowsMSVCEnvironment ()) {
212+ CmdArgs.push_back (Args.MakeArgString (
213+ " --dependent-lib=" + TC.getCompilerRTBasename (Args, " builtins" )));
214+ }
215+ unsigned RTOptionID = options::OPT__SLASH_MT;
216+ if (auto *rtl = Args.getLastArg (options::OPT_fms_runtime_lib_EQ)) {
217+ RTOptionID = llvm::StringSwitch<unsigned >(rtl->getValue ())
218+ .Case (" static" , options::OPT__SLASH_MT)
219+ .Case (" static_dbg" , options::OPT__SLASH_MTd)
220+ .Case (" dll" , options::OPT__SLASH_MD)
221+ .Case (" dll_dbg" , options::OPT__SLASH_MDd)
222+ .Default (options::OPT__SLASH_MT);
223+ }
224+ switch (RTOptionID) {
225+ case options::OPT__SLASH_MT:
226+ CmdArgs.push_back (" -D_MT" );
227+ CmdArgs.push_back (" --dependent-lib=libcmt" );
228+ CmdArgs.push_back (" --dependent-lib=Fortran_main.static.lib" );
229+ CmdArgs.push_back (" --dependent-lib=FortranRuntime.static.lib" );
230+ CmdArgs.push_back (" --dependent-lib=FortranDecimal.static.lib" );
231+ break ;
232+ case options::OPT__SLASH_MTd:
233+ CmdArgs.push_back (" -D_MT" );
234+ CmdArgs.push_back (" -D_DEBUG" );
235+ CmdArgs.push_back (" --dependent-lib=libcmtd" );
236+ CmdArgs.push_back (" --dependent-lib=Fortran_main.static_dbg.lib" );
237+ CmdArgs.push_back (" --dependent-lib=FortranRuntime.static_dbg.lib" );
238+ CmdArgs.push_back (" --dependent-lib=FortranDecimal.static_dbg.lib" );
239+ break ;
240+ case options::OPT__SLASH_MD:
241+ CmdArgs.push_back (" -D_MT" );
242+ CmdArgs.push_back (" -D_DLL" );
243+ CmdArgs.push_back (" --dependent-lib=msvcrt" );
244+ CmdArgs.push_back (" --dependent-lib=Fortran_main.dynamic.lib" );
245+ CmdArgs.push_back (" --dependent-lib=FortranRuntime.dynamic.lib" );
246+ CmdArgs.push_back (" --dependent-lib=FortranDecimal.dynamic.lib" );
247+ break ;
248+ case options::OPT__SLASH_MDd:
249+ CmdArgs.push_back (" -D_MT" );
250+ CmdArgs.push_back (" -D_DEBUG" );
251+ CmdArgs.push_back (" -D_DLL" );
252+ CmdArgs.push_back (" --dependent-lib=msvcrtd" );
253+ CmdArgs.push_back (" --dependent-lib=Fortran_main.dynamic_dbg.lib" );
254+ CmdArgs.push_back (" --dependent-lib=FortranRuntime.dynamic_dbg.lib" );
255+ CmdArgs.push_back (" --dependent-lib=FortranDecimal.dynamic_dbg.lib" );
256+ break ;
257+ }
258+ }
259+
207260void Flang::addTargetOptions (const ArgList &Args,
208261 ArgStringList &CmdArgs) const {
209262 const ToolChain &TC = getToolChain ();
@@ -267,6 +320,10 @@ void Flang::addTargetOptions(const ArgList &Args,
267320 }
268321 }
269322
323+ if (Triple.isKnownWindowsMSVCEnvironment ()) {
324+ processVSRuntimeLibrary (TC, Args, CmdArgs);
325+ }
326+
270327 // TODO: Add target specific flags, ABI, mtune option etc.
271328}
272329
0 commit comments