Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
This revision was automatically updated to reflect the committed changes. Closed by commit rL269891: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, (authored by ABataev). Changed prior to commit: http://reviews.llvm.org/D20171?vs=57344=57579#toc Repository: rL LLVM http://reviews.llvm.org/D20171 Files: cfe/trunk/include/clang/Basic/LangOptions.def cfe/trunk/include/clang/Basic/LangOptions.h cfe/trunk/include/clang/Driver/CC1Options.td cfe/trunk/include/clang/Driver/CLCompatOptions.td cfe/trunk/lib/AST/ASTContext.cpp cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/lib/Sema/SemaDeclAttr.cpp cfe/trunk/test/CodeGenCXX/default_calling_conv.cpp Index: cfe/trunk/include/clang/Driver/CC1Options.td === --- cfe/trunk/include/clang/Driver/CC1Options.td +++ cfe/trunk/include/clang/Driver/CC1Options.td @@ -610,6 +610,8 @@ HelpText<"Use the native __fp16 type for arguments and returns (and skip ABI-specific lowering)">; def fallow_half_arguments_and_returns : Flag<["-"], "fallow-half-arguments-and-returns">, HelpText<"Allow function arguments and returns of type half">; +def fdefault_calling_conv_EQ : Joined<["-"], "fdefault-calling-conv=">, + HelpText<"Set default MS calling convention">; // C++ TSes. def fcoroutines : Flag<["-"], "fcoroutines">, Index: cfe/trunk/include/clang/Driver/CLCompatOptions.td === --- cfe/trunk/include/clang/Driver/CLCompatOptions.td +++ cfe/trunk/include/clang/Driver/CLCompatOptions.td @@ -268,6 +268,15 @@ def _SLASH_Fp : CLJoined<"Fp">, HelpText<"Set pch filename (with /Yc and /Yu)">, MetaVarName<"">; +def _SLASH_Gd : CLFlag<"Gd">, + HelpText<"Set __cdecl as a default calling convention">; +def _SLASH_Gr : CLFlag<"Gr">, + HelpText<"Set __fastcall as a default calling convention">; +def _SLASH_Gz : CLFlag<"Gz">, + HelpText<"Set __stdcall as a default calling convention">; +def _SLASH_Gv : CLFlag<"Gv">, + HelpText<"Set __vectorcall as a default calling convention">; + // Ignored: def _SLASH_analyze_ : CLIgnoredFlag<"analyze-">; @@ -279,7 +288,6 @@ def _SLASH_Fd : CLIgnoredJoined<"Fd">; def _SLASH_FC : CLIgnoredFlag<"FC">; def _SLASH_FS : CLIgnoredFlag<"FS">, HelpText<"Force synchronous PDB writes">; -def _SLASH_Gd : CLIgnoredFlag<"Gd">; def _SLASH_GF : CLIgnoredFlag<"GF">; def _SLASH_GS_ : CLIgnoredFlag<"GS-">; def _SLASH_kernel_ : CLIgnoredFlag<"kernel-">; @@ -324,12 +332,9 @@ def _SLASH_GL_ : CLFlag<"GL-">; def _SLASH_Gm : CLFlag<"Gm">; def _SLASH_Gm_ : CLFlag<"Gm-">; -def _SLASH_Gr : CLFlag<"Gr">; def _SLASH_GS : CLFlag<"GS">; def _SLASH_GT : CLFlag<"GT">; def _SLASH_Guard : CLJoined<"guard:">; -def _SLASH_Gv : CLFlag<"Gv">; -def _SLASH_Gz : CLFlag<"Gz">; def _SLASH_GZ : CLFlag<"GZ">; def _SLASH_H : CLFlag<"H">; def _SLASH_homeparams : CLFlag<"homeparams">; Index: cfe/trunk/include/clang/Basic/LangOptions.h === --- cfe/trunk/include/clang/Basic/LangOptions.h +++ cfe/trunk/include/clang/Basic/LangOptions.h @@ -65,6 +65,14 @@ PPTMK_FullGeneralityVirtualInheritance }; + enum DefaultCallingConvention { +DCC_None, +DCC_CDecl, +DCC_FastCall, +DCC_StdCall, +DCC_VectorCall + }; + enum AddrSpaceMapMangling { ASMM_Target, ASMM_On, ASMM_Off }; enum MSVCMajorVersion { Index: cfe/trunk/include/clang/Basic/LangOptions.def === --- cfe/trunk/include/clang/Basic/LangOptions.def +++ cfe/trunk/include/clang/Basic/LangOptions.def @@ -172,6 +172,7 @@ LANGOPT(CharIsSigned , 1, 1, "signed char") LANGOPT(ShortWChar, 1, 0, "unsigned short wchar_t") ENUM_LANGOPT(MSPointerToMemberRepresentationMethod, PragmaMSPointersToMembersKind, 2, PPTMK_BestCase, "member-pointer representation method") +ENUM_LANGOPT(DefaultCallingConv, DefaultCallingConvention, 3, DCC_None, "default calling convention") LANGOPT(ShortEnums, 1, 0, "short enum types") @@ -216,7 +217,6 @@ LANGOPT(FakeAddressSpaceMap , 1, 0, "OpenCL fake address space map") ENUM_LANGOPT(AddressSpaceMapMangling , AddrSpaceMapMangling, 2, ASMM_Target, "OpenCL address space map mangling mode") -LANGOPT(MRTD , 1, 0, "-mrtd calling convention") BENIGN_LANGOPT(DelayedTemplateParsing , 1, 0, "delayed template parsing") LANGOPT(BlocksRuntimeOptional , 1, 0, "optional blocks runtime") Index: cfe/trunk/test/CodeGenCXX/default_calling_conv.cpp === --- cfe/trunk/test/CodeGenCXX/default_calling_conv.cpp +++ cfe/trunk/test/CodeGenCXX/default_calling_conv.cpp @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -fdefault-calling-conv=cdecl -emit-llvm -o - %s | FileCheck %s --check-prefix=CDECL --check-prefix=ALL +// RUN: %clang_cc1 -triple
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
rnk accepted this revision. rnk added a comment. This revision is now accepted and ready to land. Thanks, lgtm! http://reviews.llvm.org/D20171 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
a.makarov updated this revision to Diff 57344. a.makarov added a comment. I've updated the patch. Please take a look. http://reviews.llvm.org/D20171 Files: include/clang/Basic/LangOptions.def include/clang/Basic/LangOptions.h include/clang/Driver/CC1Options.td include/clang/Driver/CLCompatOptions.td lib/AST/ASTContext.cpp lib/Driver/Tools.cpp lib/Frontend/CompilerInvocation.cpp lib/Sema/SemaDeclAttr.cpp test/CodeGenCXX/default_calling_conv.cpp Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -3954,7 +3954,7 @@ } if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false)) -CmdArgs.push_back("-mrtd"); +CmdArgs.push_back("-fdefault-calling-conv=stdcall"); if (shouldUseFramePointer(Args, getToolChain().getTriple())) CmdArgs.push_back("-mdisable-fp-elim"); @@ -6140,6 +6140,15 @@ CmdArgs.push_back("-fms-memptr-rep=virtual"); } + if (Args.getLastArg(options::OPT__SLASH_Gd)) + CmdArgs.push_back("-fdefault-calling-conv=cdecl"); + else if (Args.getLastArg(options::OPT__SLASH_Gr)) + CmdArgs.push_back("-fdefault-calling-conv=fastcall"); + else if (Args.getLastArg(options::OPT__SLASH_Gz)) + CmdArgs.push_back("-fdefault-calling-conv=stdcall"); + else if (Args.getLastArg(options::OPT__SLASH_Gv)) + CmdArgs.push_back("-fdefault-calling-conv=vectorcall"); + if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ)) A->render(Args, CmdArgs); Index: lib/AST/ASTContext.cpp === --- lib/AST/ASTContext.cpp +++ lib/AST/ASTContext.cpp @@ -8605,8 +8605,25 @@ if (IsCXXMethod) return ABI->getDefaultMethodCallConv(IsVariadic); - if (LangOpts.MRTD && !IsVariadic) return CC_X86StdCall; - + switch (LangOpts.getDefaultCallingConv()) { + case LangOptions::DCC_None: +break; + case LangOptions::DCC_CDecl: +return CC_C; + case LangOptions::DCC_FastCall: +if (getTargetInfo().hasFeature("sse2")) + return CC_X86FastCall; +break; + case LangOptions::DCC_StdCall: +if (!IsVariadic) + return CC_X86StdCall; +break; + case LangOptions::DCC_VectorCall: +// __vectorcall cannot be applied to variadic functions. +if (!IsVariadic) + return CC_X86VectorCall; +break; + } return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown); } Index: lib/Sema/SemaDeclAttr.cpp === --- lib/Sema/SemaDeclAttr.cpp +++ lib/Sema/SemaDeclAttr.cpp @@ -3895,11 +3895,12 @@ // This convention is not valid for the target. Use the default function or // method calling convention. -TargetInfo::CallingConvMethodType MT = TargetInfo::CCMT_Unknown; -if (FD) - MT = FD->isCXXInstanceMember() ? TargetInfo::CCMT_Member : -TargetInfo::CCMT_NonMember; -CC = TI.getDefaultCallingConv(MT); +bool IsCXXMethod = false, IsVariadic = false; +if (FD) { + IsCXXMethod = FD->isCXXInstanceMember(); + IsVariadic = FD->isVariadic(); +} +CC = Context.getDefaultCallingConvention(IsVariadic, IsCXXMethod); } attr.setProcessingCache((unsigned) CC); Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -1772,7 +1772,6 @@ Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align); Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant); Opts.FastRelaxedMath = Args.hasArg(OPT_cl_fast_relaxed_math); - Opts.MRTD = Args.hasArg(OPT_mrtd); Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat); Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map); Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype); @@ -1849,6 +1848,49 @@ Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel); } + // Check for MS default calling conventions being specified. + if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) { +LangOptions::DefaultCallingConvention DefaultCC = +llvm::StringSwitch( +A->getValue()) +.Case("cdecl", LangOptions::DCC_CDecl) +.Case("fastcall", LangOptions::DCC_FastCall) +.Case("stdcall", LangOptions::DCC_StdCall) +.Case("vectorcall", LangOptions::DCC_VectorCall) +.Default(LangOptions::DCC_None); +if (DefaultCC == LangOptions::DCC_None) + Diags.Report(diag::err_drv_invalid_value) + << "-fdefault-calling-conv=" << A->getValue(); + +llvm::Triple T(TargetOpts.Triple); +llvm::Triple::ArchType Arch = T.getArch(); +bool emitError = (DefaultCC == LangOptions::DCC_FastCall || + DefaultCC == LangOptions::DCC_StdCall) && + Arch != llvm::Triple::x86; +
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
rnk added inline comments. Comment at: include/clang/Driver/CC1Options.td:615 @@ +614,3 @@ + HelpText<"Set default MS calling convention">; +def mrtd : Flag<["-"], "mrtd">, Group, + Alias, AliasArgs<["stdcall"]>, Doesn't this have to live in Options.td if you want it to be available in the driver interface? Otherwise it's a -cc1-only flag. Comment at: lib/Sema/SemaDeclAttr.cpp:3898 @@ -3897,6 +3897,3 @@ // method calling convention. -TargetInfo::CallingConvMethodType MT = TargetInfo::CCMT_Unknown; -if (FD) - MT = FD->isCXXInstanceMember() ? TargetInfo::CCMT_Member : -TargetInfo::CCMT_NonMember; -CC = TI.getDefaultCallingConv(MT); +bool isCXXMethod = false, isVariadic = false; +if (FD) { Use leading upper case variables to achieve consistency with our insanity, please. :) http://reviews.llvm.org/D20171 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
a.makarov updated this revision to Diff 57071. a.makarov added a comment. Renamed option 'DefaultMSCallingConv' into 'DefaultCallingConv' and enum 'DefaultMSCallingConvention' into 'DefaultCallingConvention'. http://reviews.llvm.org/D20171 Files: include/clang/Basic/LangOptions.def include/clang/Basic/LangOptions.h include/clang/Driver/CC1Options.td include/clang/Driver/CLCompatOptions.td include/clang/Driver/Options.td lib/AST/ASTContext.cpp lib/Driver/Tools.cpp lib/Frontend/CompilerInvocation.cpp lib/Sema/SemaDeclAttr.cpp test/CodeGenCXX/default_calling_conv.cpp Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -6140,6 +6140,15 @@ CmdArgs.push_back("-fms-memptr-rep=virtual"); } + if (Args.getLastArg(options::OPT__SLASH_Gd)) + CmdArgs.push_back("-fdefault-calling-conv=cdecl"); + else if (Args.getLastArg(options::OPT__SLASH_Gr)) + CmdArgs.push_back("-fdefault-calling-conv=fastcall"); + else if (Args.getLastArg(options::OPT__SLASH_Gz)) + CmdArgs.push_back("-fdefault-calling-conv=stdcall"); + else if (Args.getLastArg(options::OPT__SLASH_Gv)) + CmdArgs.push_back("-fdefault-calling-conv=vectorcall"); + if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ)) A->render(Args, CmdArgs); Index: lib/AST/ASTContext.cpp === --- lib/AST/ASTContext.cpp +++ lib/AST/ASTContext.cpp @@ -8605,8 +8605,25 @@ if (IsCXXMethod) return ABI->getDefaultMethodCallConv(IsVariadic); - if (LangOpts.MRTD && !IsVariadic) return CC_X86StdCall; - + switch (LangOpts.getDefaultCallingConv()) { + case LangOptions::DCC_None: +break; + case LangOptions::DCC_CDecl: +return CC_C; + case LangOptions::DCC_FastCall: +if (getTargetInfo().hasFeature("sse2")) + return CC_X86FastCall; +break; + case LangOptions::DCC_StdCall: +if (!IsVariadic) + return CC_X86StdCall; +break; + case LangOptions::DCC_VectorCall: +// __vectorcall cannot be applied to variadic functions. +if (!IsVariadic) + return CC_X86VectorCall; +break; + } return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown); } Index: lib/Sema/SemaDeclAttr.cpp === --- lib/Sema/SemaDeclAttr.cpp +++ lib/Sema/SemaDeclAttr.cpp @@ -3895,11 +3895,12 @@ // This convention is not valid for the target. Use the default function or // method calling convention. -TargetInfo::CallingConvMethodType MT = TargetInfo::CCMT_Unknown; -if (FD) - MT = FD->isCXXInstanceMember() ? TargetInfo::CCMT_Member : -TargetInfo::CCMT_NonMember; -CC = TI.getDefaultCallingConv(MT); +bool isCXXMethod = false, isVariadic = false; +if (FD) { + isCXXMethod = FD->isCXXInstanceMember(); + isVariadic = FD->isVariadic(); +} +CC = Context.getDefaultCallingConvention(isVariadic, isCXXMethod); } attr.setProcessingCache((unsigned) CC); Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -1772,7 +1772,6 @@ Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align); Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant); Opts.FastRelaxedMath = Args.hasArg(OPT_cl_fast_relaxed_math); - Opts.MRTD = Args.hasArg(OPT_mrtd); Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat); Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map); Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype); @@ -1849,6 +1848,34 @@ Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel); } + // Check for MS default calling conventions being specified. + if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) { +LangOptions::DefaultCallingConvention DefaultCC = +llvm::StringSwitch( +A->getValue()) +.Case("cdecl", LangOptions::DCC_CDecl) +.Case("fastcall", LangOptions::DCC_FastCall) +.Case("stdcall", LangOptions::DCC_StdCall) +.Case("vectorcall", LangOptions::DCC_VectorCall) +.Default(LangOptions::DCC_None); +if (DefaultCC == LangOptions::DCC_None) + Diags.Report(diag::err_drv_invalid_value) + << "-fdefault-calling-conv=" << A->getValue(); + +llvm::Triple T(TargetOpts.Triple); +llvm::Triple::ArchType Arch = T.getArch(); +bool emitError = (DefaultCC == LangOptions::DCC_FastCall || + DefaultCC == LangOptions::DCC_StdCall) && + Arch != llvm::Triple::x86; +emitError |= DefaultCC == LangOptions::DCC_VectorCall && + !(Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64); +if (emitError) +
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
majnemer added inline comments. Comment at: include/clang/Basic/LangOptions.def:175 @@ -174,2 +174,3 @@ ENUM_LANGOPT(MSPointerToMemberRepresentationMethod, PragmaMSPointersToMembersKind, 2, PPTMK_BestCase, "member-pointer representation method") +ENUM_LANGOPT(DefaultMSCallingConv, DefaultMSCallingConvention, 3, DCC_None, "default calling convention") I'd remove the "MS" from this langopt now that it helps implement `-mrtd`. http://reviews.llvm.org/D20171 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
a.makarov updated this revision to Diff 57062. a.makarov added a comment. Thanks for the review! I've updated the patch, please take a look. Modifications: - the dependency from MS compatibility mode is removed; - the option is renamed into '-fdefault-calling-conv' (since it's not in MS compatibility mode); - the '-mrtd' option is now an alias for '-fdefault-calling-conv=stdcall'; - 'stdcall' is now ignored for variadic functions; - since 'vectorcall' requires SSE2 or higher (https://msdn.microsoft.com/en-us/library/dn375768.aspx) the necessary check is added http://reviews.llvm.org/D20171 Files: include/clang/Basic/LangOptions.def include/clang/Basic/LangOptions.h include/clang/Driver/CC1Options.td include/clang/Driver/CLCompatOptions.td include/clang/Driver/Options.td lib/AST/ASTContext.cpp lib/Driver/Tools.cpp lib/Frontend/CompilerInvocation.cpp lib/Sema/SemaDeclAttr.cpp test/CodeGenCXX/default_calling_conv.cpp Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -6140,6 +6140,15 @@ CmdArgs.push_back("-fms-memptr-rep=virtual"); } + if (Args.getLastArg(options::OPT__SLASH_Gd)) + CmdArgs.push_back("-fdefault-calling-conv=cdecl"); + else if (Args.getLastArg(options::OPT__SLASH_Gr)) + CmdArgs.push_back("-fdefault-calling-conv=fastcall"); + else if (Args.getLastArg(options::OPT__SLASH_Gz)) + CmdArgs.push_back("-fdefault-calling-conv=stdcall"); + else if (Args.getLastArg(options::OPT__SLASH_Gv)) + CmdArgs.push_back("-fdefault-calling-conv=vectorcall"); + if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ)) A->render(Args, CmdArgs); Index: lib/AST/ASTContext.cpp === --- lib/AST/ASTContext.cpp +++ lib/AST/ASTContext.cpp @@ -8605,8 +8605,25 @@ if (IsCXXMethod) return ABI->getDefaultMethodCallConv(IsVariadic); - if (LangOpts.MRTD && !IsVariadic) return CC_X86StdCall; - + switch (LangOpts.getDefaultMSCallingConv()) { + case LangOptions::DCC_None: +break; + case LangOptions::DCC_CDecl: +return CC_C; + case LangOptions::DCC_FastCall: +if (getTargetInfo().hasFeature("sse2")) + return CC_X86FastCall; +break; + case LangOptions::DCC_StdCall: +if (!IsVariadic) + return CC_X86StdCall; +break; + case LangOptions::DCC_VectorCall: +// __vectorcall cannot be applied to variadic functions. +if (!IsVariadic) + return CC_X86VectorCall; +break; + } return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown); } Index: lib/Sema/SemaDeclAttr.cpp === --- lib/Sema/SemaDeclAttr.cpp +++ lib/Sema/SemaDeclAttr.cpp @@ -3895,11 +3895,12 @@ // This convention is not valid for the target. Use the default function or // method calling convention. -TargetInfo::CallingConvMethodType MT = TargetInfo::CCMT_Unknown; -if (FD) - MT = FD->isCXXInstanceMember() ? TargetInfo::CCMT_Member : -TargetInfo::CCMT_NonMember; -CC = TI.getDefaultCallingConv(MT); +bool isCXXMethod = false, isVariadic = false; +if (FD) { + isCXXMethod = FD->isCXXInstanceMember(); + isVariadic = FD->isVariadic(); +} +CC = Context.getDefaultCallingConvention(isVariadic, isCXXMethod); } attr.setProcessingCache((unsigned) CC); Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -1772,7 +1772,6 @@ Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align); Opts.SinglePrecisionConstants = Args.hasArg(OPT_cl_single_precision_constant); Opts.FastRelaxedMath = Args.hasArg(OPT_cl_fast_relaxed_math); - Opts.MRTD = Args.hasArg(OPT_mrtd); Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat); Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map); Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype); @@ -1849,6 +1848,34 @@ Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel); } + // Check for MS default calling conventions being specified. + if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) { +LangOptions::DefaultMSCallingConvention DefaultCC = +llvm::StringSwitch( +A->getValue()) +.Case("cdecl", LangOptions::DCC_CDecl) +.Case("fastcall", LangOptions::DCC_FastCall) +.Case("stdcall", LangOptions::DCC_StdCall) +.Case("vectorcall", LangOptions::DCC_VectorCall) +.Default(LangOptions::DCC_None); +if (DefaultCC == LangOptions::DCC_None) + Diags.Report(diag::err_drv_invalid_value) + << "-fdefault-calling-conv=" << A->getValue(); + +llvm::Triple T(TargetOpts.Triple); +llvm::Triple::ArchType Arch =
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
a.makarov added inline comments. Comment at: lib/AST/ASTContext.cpp:8616-8619 @@ +8615,6 @@ + return CC_C; +case LangOptions::DCC_FastCall: + return CC_X86FastCall; +case LangOptions::DCC_StdCall: + return CC_X86StdCall; +case LangOptions::DCC_VectorCall: rnk wrote: > Neither fastcall nor stdcall can be applied to variadic functions. As I've got from MSDN, **vectorcall** and stdcall cannot be applied to vararg functions. Are you sure about fastcall?) http://reviews.llvm.org/D20171 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
a.makarov added inline comments. Comment at: lib/AST/ASTContext.cpp:8604-8606 @@ -8603,5 +8603,5 @@ bool IsCXXMethod) const { // Pass through to the C++ ABI object if (IsCXXMethod) return ABI->getDefaultMethodCallConv(IsVariadic); majnemer wrote: > rnk wrote: > > majnemer wrote: > > > Do these flags not have an effect on methods? > > Nope: > > https://msdn.microsoft.com/en-us/library/46t77ak2.aspx > > "for all functions except C++ member functions..." > Yeah, that's what the documentation says. But do they really have no effect? > :) Yes, I've checked. Member functions are not affected =) http://reviews.llvm.org/D20171 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
majnemer added inline comments. Comment at: lib/AST/ASTContext.cpp:8604-8606 @@ -8603,5 +8603,5 @@ bool IsCXXMethod) const { // Pass through to the C++ ABI object if (IsCXXMethod) return ABI->getDefaultMethodCallConv(IsVariadic); rnk wrote: > majnemer wrote: > > Do these flags not have an effect on methods? > Nope: > https://msdn.microsoft.com/en-us/library/46t77ak2.aspx > "for all functions except C++ member functions..." Yeah, that's what the documentation says. But do they really have no effect? :) http://reviews.llvm.org/D20171 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
rnk added inline comments. Comment at: lib/AST/ASTContext.cpp:8604-8606 @@ -8603,5 +8603,5 @@ bool IsCXXMethod) const { // Pass through to the C++ ABI object if (IsCXXMethod) return ABI->getDefaultMethodCallConv(IsVariadic); majnemer wrote: > Do these flags not have an effect on methods? Nope: https://msdn.microsoft.com/en-us/library/46t77ak2.aspx "for all functions except C++ member functions..." http://reviews.llvm.org/D20171 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
majnemer added a subscriber: majnemer. Comment at: lib/AST/ASTContext.cpp:8604-8606 @@ -8603,5 +8603,5 @@ bool IsCXXMethod) const { // Pass through to the C++ ABI object if (IsCXXMethod) return ABI->getDefaultMethodCallConv(IsVariadic); Do these flags not have an effect on methods? http://reviews.llvm.org/D20171 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
rnk added inline comments. Comment at: include/clang/Basic/LangOptions.def:220 @@ -218,3 +219,3 @@ LANGOPT(MRTD , 1, 0, "-mrtd calling convention") BENIGN_LANGOPT(DelayedTemplateParsing , 1, 0, "delayed template parsing") Let's get rid of this and have it use a single DefaultCallingConv LangOpt. Comment at: include/clang/Driver/CC1Options.td:613 @@ -612,1 +612,3 @@ HelpText<"Allow function arguments and returns of type half">; +def fms_ms_default_calling_conv_EQ : Joined<["-"], "fms-default-calling-conv=">, + HelpText<"Set default MS calling convention">; Let's unify the -cc1 layer with -mrtd, and just have a single -fdefault-calling-convention=stdcall/etc flag. Comment at: lib/AST/ASTContext.cpp:8610 @@ -8609,2 +8609,3 @@ - return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown); + if (LangOpts.MSVCCompat) { +switch (LangOpts.getDefaultMSCallingConv()) { I don't think we need to guard this on MSVCCompat, it'll be unset usually. It will also help us avoid a special path for MRTD. Comment at: lib/AST/ASTContext.cpp:8616-8619 @@ +8615,6 @@ + return CC_C; +case LangOptions::DCC_FastCall: + return CC_X86FastCall; +case LangOptions::DCC_StdCall: + return CC_X86StdCall; +case LangOptions::DCC_VectorCall: Neither fastcall nor stdcall can be applied to variadic functions. http://reviews.llvm.org/D20171 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D20171: Support for MSVS default calling convention options (/Gd, /Gz, /Gv, /Gr)
a.makarov created this revision. a.makarov added a reviewer: rnk. a.makarov added a subscriber: cfe-commits. Patch for bug #27711 http://reviews.llvm.org/D20171 Files: include/clang/Basic/LangOptions.def include/clang/Basic/LangOptions.h include/clang/Driver/CC1Options.td include/clang/Driver/CLCompatOptions.td lib/AST/ASTContext.cpp lib/Driver/Tools.cpp lib/Frontend/CompilerInvocation.cpp lib/Sema/SemaDeclAttr.cpp test/CodeGenCXX/default_calling_conv.cpp Index: lib/Driver/Tools.cpp === --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -6140,6 +6140,15 @@ CmdArgs.push_back("-fms-memptr-rep=virtual"); } + if (Args.getLastArg(options::OPT__SLASH_Gd)) + CmdArgs.push_back("-fms-default-calling-conv=cdecl"); + else if (Args.getLastArg(options::OPT__SLASH_Gr)) + CmdArgs.push_back("-fms-default-calling-conv=fastcall"); + else if (Args.getLastArg(options::OPT__SLASH_Gz)) + CmdArgs.push_back("-fms-default-calling-conv=stdcall"); + else if (Args.getLastArg(options::OPT__SLASH_Gv)) + CmdArgs.push_back("-fms-default-calling-conv=vectorcall"); + if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ)) A->render(Args, CmdArgs); Index: lib/AST/ASTContext.cpp === --- lib/AST/ASTContext.cpp +++ lib/AST/ASTContext.cpp @@ -8607,7 +8607,25 @@ if (LangOpts.MRTD && !IsVariadic) return CC_X86StdCall; - return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown); + if (LangOpts.MSVCCompat) { +switch (LangOpts.getDefaultMSCallingConv()) { +case LangOptions::DCC_None: + return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown); +case LangOptions::DCC_CDecl: + return CC_C; +case LangOptions::DCC_FastCall: + return CC_X86FastCall; +case LangOptions::DCC_StdCall: + return CC_X86StdCall; +case LangOptions::DCC_VectorCall: + // __vectorcall cannot be applied to variadic functions. + if (!IsVariadic) +return CC_X86VectorCall; + else +return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown); +} + } else +return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown); } bool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const { Index: lib/Sema/SemaDeclAttr.cpp === --- lib/Sema/SemaDeclAttr.cpp +++ lib/Sema/SemaDeclAttr.cpp @@ -3895,11 +3895,12 @@ // This convention is not valid for the target. Use the default function or // method calling convention. -TargetInfo::CallingConvMethodType MT = TargetInfo::CCMT_Unknown; -if (FD) - MT = FD->isCXXInstanceMember() ? TargetInfo::CCMT_Member : -TargetInfo::CCMT_NonMember; -CC = TI.getDefaultCallingConv(MT); +bool isCXXMethod = false, isVariadic = false; +if (FD) { + isCXXMethod = FD->isCXXInstanceMember(); + isVariadic = FD->isVariadic(); +} +CC = Context.getDefaultCallingConvention(isVariadic, isCXXMethod); } attr.setProcessingCache((unsigned) CC); Index: lib/Frontend/CompilerInvocation.cpp === --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -1849,6 +1849,34 @@ Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel); } + // Check for MS default calling conventions being specified. + if (Arg *A = Args.getLastArg(OPT_fms_ms_default_calling_conv_EQ)) { +LangOptions::DefaultMSCallingConvention DefaultCC = +llvm::StringSwitch( +A->getValue()) +.Case("cdecl", LangOptions::DCC_CDecl) +.Case("fastcall", LangOptions::DCC_FastCall) +.Case("stdcall", LangOptions::DCC_StdCall) +.Case("vectorcall", LangOptions::DCC_VectorCall) +.Default(LangOptions::DCC_None); +if (DefaultCC == LangOptions::DCC_None) + Diags.Report(diag::err_drv_invalid_value) + << "-fms-default-calling-conv" << A->getValue(); + +llvm::Triple T(TargetOpts.Triple); +llvm::Triple::ArchType Arch = T.getArch(); +bool emitError = (DefaultCC == LangOptions::DCC_FastCall || + DefaultCC == LangOptions::DCC_StdCall) && + Arch != llvm::Triple::x86; +emitError |= DefaultCC == LangOptions::DCC_VectorCall && + !(Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64); +if (emitError) + Diags.Report(diag::err_drv_argument_not_allowed_with) + << A->getSpelling() << T.getTriple(); +else + Opts.setDefaultMSCallingConv(DefaultCC); + } + // Check if -fopenmp is specified. Opts.OpenMP = Args.hasArg(options::OPT_fopenmp); Opts.OpenMPUseTLS = Index: include/clang/Driver/CC1Options.td === ---