Merged in r312013.
On Fri, Aug 25, 2017 at 6:06 PM, Richard Smith <rich...@metafoo.co.uk> wrote: > Hi Hans, > > We should get this into Clang 5 so that people can opt out of the ABI bugfix > for passing C++ class types by value. > > On 25 August 2017 at 18:04, Richard Smith via cfe-commits > <cfe-commits@lists.llvm.org> wrote: >> >> Author: rsmith >> Date: Fri Aug 25 18:04:35 2017 >> New Revision: 311823 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=311823&view=rev >> Log: >> Add flag to request Clang is ABI-compatible with older versions of itself >> >> This patch adds a flag -fclang-abi-compat that can be used to request that >> Clang attempts to be ABI-compatible with some older version of itself. >> >> This is provided on a best-effort basis; right now, this can be used to >> undo >> the ABI change in r310401, reverting Clang to its prior C++ ABI for >> pass/return >> by value of class types affected by that change, and to undo the ABI >> change in >> r262688, reverting Clang to using integer registers rather than SSE >> registers >> for passing <1 x long long> vectors. The intent is that we will maintain >> this >> backwards compatibility path as we make ABI-breaking fixes in future. >> >> The reversion to the old behavior for r310401 is also applied to the PS4 >> target >> since that change is not part of its platform ABI (which is essentially to >> do >> whatever Clang 3.2 did). >> >> Added: >> cfe/trunk/test/CodeGenCXX/clang-abi-compat.cpp >> cfe/trunk/test/Frontend/clang-abi-compat.cpp >> Modified: >> cfe/trunk/include/clang/Driver/Options.td >> cfe/trunk/include/clang/Frontend/CodeGenOptions.def >> cfe/trunk/include/clang/Frontend/CodeGenOptions.h >> cfe/trunk/lib/CodeGen/ABIInfo.h >> cfe/trunk/lib/CodeGen/CodeGenTypes.cpp >> cfe/trunk/lib/CodeGen/CodeGenTypes.h >> cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp >> cfe/trunk/lib/CodeGen/TargetInfo.cpp >> cfe/trunk/lib/Driver/ToolChains/Clang.cpp >> cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> cfe/trunk/test/CodeGenCXX/uncopyable-args.cpp >> cfe/trunk/test/Driver/flags.c >> >> Modified: cfe/trunk/include/clang/Driver/Options.td >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Driver/Options.td (original) >> +++ cfe/trunk/include/clang/Driver/Options.td Fri Aug 25 18:04:35 2017 >> @@ -711,6 +711,9 @@ def fbuiltin : Flag<["-"], "fbuiltin">, >> def fbuiltin_module_map : Flag <["-"], "fbuiltin-module-map">, >> Group<f_Group>, >> Flags<[DriverOption]>, HelpText<"Load the clang builtins module map >> file.">; >> def fcaret_diagnostics : Flag<["-"], "fcaret-diagnostics">, >> Group<f_Group>; >> +def fclang_abi_compat_EQ : Joined<["-"], "fclang-abi-compat=">, >> Group<f_clang_Group>, >> + Flags<[CC1Option]>, MetaVarName<"<version>">, >> Values<"<major>.<minor>,latest">, >> + HelpText<"Attempt to match the ABI of Clang <version>">; >> def fclasspath_EQ : Joined<["-"], "fclasspath=">, Group<f_Group>; >> def fcolor_diagnostics : Flag<["-"], "fcolor-diagnostics">, >> Group<f_Group>, >> Flags<[CoreOption, CC1Option]>, HelpText<"Use colors in diagnostics">; >> >> Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original) >> +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Fri Aug 25 >> 18:04:35 2017 >> @@ -120,6 +120,10 @@ CODEGENOPT(NoZeroInitializedInBSS , 1, 0 >> ENUM_CODEGENOPT(ObjCDispatchMethod, ObjCDispatchMethodKind, 2, Legacy) >> CODEGENOPT(OmitLeafFramePointer , 1, 0) ///< Set when >> -momit-leaf-frame-pointer is >> ///< enabled. >> + >> +/// A version of Clang that we should attempt to be ABI-compatible with. >> +ENUM_CODEGENOPT(ClangABICompat, ClangABI, 4, ClangABI::Latest) >> + >> VALUE_CODEGENOPT(OptimizationLevel, 2, 0) ///< The -O[0-3] option >> specified. >> VALUE_CODEGENOPT(OptimizeSize, 2, 0) ///< If -Os (==1) or -Oz (==2) is >> specified. >> >> >> Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.h?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Frontend/CodeGenOptions.h (original) >> +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.h Fri Aug 25 18:04:35 >> 2017 >> @@ -69,6 +69,23 @@ public: >> LocalExecTLSModel >> }; >> >> + /// Clang versions with different platform ABI conformance. >> + enum class ClangABI { >> + /// Attempt to be ABI-compatible with code generated by Clang 3.8.x >> + /// (SVN r257626). This causes <1 x long long> to be passed in an >> + /// integer register instead of an SSE register on x64_64. >> + Ver3_8, >> + >> + /// Attempt to be ABI-compatible with code generated by Clang 4.0.x >> + /// (SVN r291814). This causes move operations to be ignored when >> + /// determining whether a class type can be passed or returned >> directly. >> + Ver4, >> + >> + /// Conform to the underlying platform's C and C++ ABIs as closely >> + /// as we can. >> + Latest >> + }; >> + >> enum StructReturnConventionKind { >> SRCK_Default, // No special option was passed. >> SRCK_OnStack, // Small structs on the stack (-fpcc-struct-return). >> >> Modified: cfe/trunk/lib/CodeGen/ABIInfo.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ABIInfo.h?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/ABIInfo.h (original) >> +++ cfe/trunk/lib/CodeGen/ABIInfo.h Fri Aug 25 18:04:35 2017 >> @@ -24,6 +24,7 @@ namespace llvm { >> >> namespace clang { >> class ASTContext; >> + class CodeGenOptions; >> class TargetInfo; >> >> namespace CodeGen { >> @@ -68,6 +69,7 @@ namespace swiftcall { >> llvm::LLVMContext &getVMContext() const; >> const llvm::DataLayout &getDataLayout() const; >> const TargetInfo &getTarget() const; >> + const CodeGenOptions &getCodeGenOpts() const; >> >> /// Return the calling convention to use for system runtime >> /// functions. >> >> Modified: cfe/trunk/lib/CodeGen/CodeGenTypes.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTypes.cpp?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CodeGenTypes.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CodeGenTypes.cpp Fri Aug 25 18:04:35 2017 >> @@ -44,6 +44,10 @@ CodeGenTypes::~CodeGenTypes() { >> delete &*I++; >> } >> >> +const CodeGenOptions &CodeGenTypes::getCodeGenOpts() const { >> + return CGM.getCodeGenOpts(); >> +} >> + >> void CodeGenTypes::addRecordTypeName(const RecordDecl *RD, >> llvm::StructType *Ty, >> StringRef suffix) { >> >> Modified: cfe/trunk/lib/CodeGen/CodeGenTypes.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenTypes.h?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CodeGenTypes.h (original) >> +++ cfe/trunk/lib/CodeGen/CodeGenTypes.h Fri Aug 25 18:04:35 2017 >> @@ -178,6 +178,7 @@ public: >> const TargetInfo &getTarget() const { return Target; } >> CGCXXABI &getCXXABI() const { return TheCXXABI; } >> llvm::LLVMContext &getLLVMContext() { return TheModule.getContext(); } >> + const CodeGenOptions &getCodeGenOpts() const; >> >> /// ConvertType - Convert type T into a llvm::Type. >> llvm::Type *ConvertType(QualType T); >> >> Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original) >> +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Fri Aug 25 18:04:35 2017 >> @@ -62,9 +62,20 @@ public: >> >> bool classifyReturnType(CGFunctionInfo &FI) const override; >> >> + bool passClassIndirect(const CXXRecordDecl *RD) const { >> + // Clang <= 4 used the pre-C++11 rule, which ignores move operations. >> + // The PS4 platform ABI follows the behavior of Clang 3.2. >> + if (CGM.getCodeGenOpts().getClangABICompat() <= >> + CodeGenOptions::ClangABI::Ver4 || >> + CGM.getTriple().getOS() == llvm::Triple::PS4) >> + return RD->hasNonTrivialDestructor() || >> + RD->hasNonTrivialCopyConstructor(); >> + return !canCopyArgument(RD); >> + } >> + >> RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override { >> // If C++ prohibits us from making a copy, pass by address. >> - if (!canCopyArgument(RD)) >> + if (passClassIndirect(RD)) >> return RAA_Indirect; >> return RAA_Default; >> } >> @@ -1012,7 +1023,7 @@ bool ItaniumCXXABI::classifyReturnType(C >> return false; >> >> // If C++ prohibits us from making a copy, return by address. >> - if (!canCopyArgument(RD)) { >> + if (passClassIndirect(RD)) { >> auto Align = >> CGM.getContext().getTypeAlignInChars(FI.getReturnType()); >> FI.getReturnInfo() = ABIArgInfo::getIndirect(Align, /*ByVal=*/false); >> return true; >> >> Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original) >> +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Fri Aug 25 18:04:35 2017 >> @@ -184,7 +184,11 @@ const TargetInfo &ABIInfo::getTarget() c >> return CGT.getTarget(); >> } >> >> -bool ABIInfo:: isAndroid() const { return >> getTarget().getTriple().isAndroid(); } >> +const CodeGenOptions &ABIInfo::getCodeGenOpts() const { >> + return CGT.getCodeGenOpts(); >> +} >> + >> +bool ABIInfo::isAndroid() const { return >> getTarget().getTriple().isAndroid(); } >> >> bool ABIInfo::isHomogeneousAggregateBaseType(QualType Ty) const { >> return false; >> @@ -2112,9 +2116,14 @@ class X86_64ABIInfo : public SwiftABIInf >> return !getTarget().getTriple().isOSDarwin(); >> } >> >> - /// GCC classifies <1 x long long> as SSE but compatibility with older >> clang >> - // compilers require us to classify it as INTEGER. >> + /// GCC classifies <1 x long long> as SSE but some platform ABIs choose >> to >> + /// classify it as INTEGER (for compatibility with older clang >> compilers). >> bool classifyIntegerMMXAsSSE() const { >> + // Clang <= 3.8 did not do this. >> + if (getCodeGenOpts().getClangABICompat() <= >> + CodeGenOptions::ClangABI::Ver3_8) >> + return false; >> + >> const llvm::Triple &Triple = getTarget().getTriple(); >> if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::PS4) >> return false; >> >> Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original) >> +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Fri Aug 25 18:04:35 2017 >> @@ -2933,6 +2933,9 @@ void Clang::ConstructJob(Compilation &C, >> >> addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs); >> >> + if (auto *ABICompatArg = >> Args.getLastArg(options::OPT_fclang_abi_compat_EQ)) >> + ABICompatArg->render(Args, CmdArgs); >> + >> // Add runtime flag for PS4 when PGO or Coverage are enabled. >> if (getToolChain().getTriple().isPS4CPU()) >> PS4cpu::addProfileRTArgs(getToolChain(), Args, CmdArgs); >> >> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) >> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Fri Aug 25 18:04:35 2017 >> @@ -573,6 +573,33 @@ static bool ParseCodeGenArgs(CodeGenOpti >> if (!Opts.ProfileInstrumentUsePath.empty()) >> setPGOUseInstrumentor(Opts, Opts.ProfileInstrumentUsePath); >> >> + if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) { >> + Opts.setClangABICompat(CodeGenOptions::ClangABI::Latest); >> + >> + StringRef Ver = A->getValue(); >> + std::pair<StringRef, StringRef> VerParts = Ver.split('.'); >> + unsigned Major, Minor = 0; >> + >> + // Check the version number is valid: either 3.x (0 <= x <= 9) or >> + // y or y.0 (4 <= y <= current version). >> + if (!VerParts.first.startswith("0") && >> + !VerParts.first.getAsInteger(10, Major) && >> + 3 <= Major && Major <= CLANG_VERSION_MAJOR && >> + (Major == 3 ? VerParts.second.size() == 1 && >> + !VerParts.second.getAsInteger(10, Minor) >> + : VerParts.first.size() == Ver.size() || >> + VerParts.second == "0")) { >> + // Got a valid version number. >> + if (Major == 3 && Minor <= 8) >> + Opts.setClangABICompat(CodeGenOptions::ClangABI::Ver3_8); >> + else if (Major <= 4) >> + Opts.setClangABICompat(CodeGenOptions::ClangABI::Ver4); >> + } else if (Ver != "latest") { >> + Diags.Report(diag::err_drv_invalid_value) >> + << A->getAsString(Args) << A->getValue(); >> + } >> + } >> + >> Opts.CoverageMapping = >> Args.hasFlag(OPT_fcoverage_mapping, OPT_fno_coverage_mapping, >> false); >> Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping); >> >> Added: cfe/trunk/test/CodeGenCXX/clang-abi-compat.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/clang-abi-compat.cpp?rev=311823&view=auto >> >> ============================================================================== >> --- cfe/trunk/test/CodeGenCXX/clang-abi-compat.cpp (added) >> +++ cfe/trunk/test/CodeGenCXX/clang-abi-compat.cpp Fri Aug 25 18:04:35 >> 2017 >> @@ -0,0 +1,19 @@ >> +// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu >> -fclang-abi-compat=3.0 %s -emit-llvm -o - | FileCheck --check-prefix=PRE39 >> --check-prefix=PRE5 %s >> +// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu >> -fclang-abi-compat=3.8 %s -emit-llvm -o - | FileCheck --check-prefix=PRE39 >> --check-prefix=PRE5 %s >> +// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu >> -fclang-abi-compat=3.9 %s -emit-llvm -o - | FileCheck --check-prefix=V39 >> --check-prefix=PRE5 %s >> +// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu >> -fclang-abi-compat=4.0 %s -emit-llvm -o - | FileCheck --check-prefix=V39 >> --check-prefix=PRE5 %s >> +// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu >> -fclang-abi-compat=5 %s -emit-llvm -o - | FileCheck --check-prefix=V39 >> --check-prefix=V5 %s >> +// RUN: %clang_cc1 -std=c++17 -triple x86_64-linux-gnu >> -fclang-abi-compat=latest %s -emit-llvm -o - | FileCheck --check-prefix=V39 >> --check-prefix=V5 %s >> + >> +typedef __attribute__((vector_size(8))) long long v1xi64; >> +void clang39(v1xi64) {} >> +// PRE39: @_Z7clang39Dv1_x(i64 >> +// V39: @_Z7clang39Dv1_x(double >> + >> +struct A { >> + A(const A&) = default; >> + A(A&&); >> +}; >> +void clang5(A) {} >> +// PRE5: @_Z6clang51A() >> +// V5: @_Z6clang51A(%{{.*}}* >> >> Modified: cfe/trunk/test/CodeGenCXX/uncopyable-args.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/uncopyable-args.cpp?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/CodeGenCXX/uncopyable-args.cpp (original) >> +++ cfe/trunk/test/CodeGenCXX/uncopyable-args.cpp Fri Aug 25 18:04:35 2017 >> @@ -1,4 +1,6 @@ >> -// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown -emit-llvm >> -o - %s | FileCheck %s >> +// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown -emit-llvm >> -o - %s | FileCheck %s --check-prefix=CHECK --check-prefix=NEWABI >> +// RUN: %clang_cc1 -std=c++11 -triple x86_64-unknown-unknown >> -fclang-abi-compat=4.0 -emit-llvm -o - %s | FileCheck %s >> --check-prefix=CHECK --check-prefix=OLDABI >> +// RUN: %clang_cc1 -std=c++11 -triple x86_64-scei-ps4 -emit-llvm -o - %s >> | FileCheck %s --check-prefix=CHECK --check-prefix=OLDABI >> // RUN: %clang_cc1 -std=c++11 -triple x86_64-windows-msvc -emit-llvm -o - >> %s -fms-compatibility -fms-compatibility-version=18 | FileCheck %s >> -check-prefix=WIN64 -check-prefix=WIN64-18 >> // RUN: %clang_cc1 -std=c++11 -triple x86_64-windows-msvc -emit-llvm -o - >> %s -fms-compatibility -fms-compatibility-version=19 | FileCheck %s >> -check-prefix=WIN64 -check-prefix=WIN64-19 >> >> @@ -56,8 +58,10 @@ void bar() { >> // CHECK-LABEL: define void @_ZN9move_ctor3barEv() >> // CHECK: call void @_Z{{.*}}C1Ev( >> // CHECK-NOT: call >> -// CHECK: call void @_ZN9move_ctor3fooENS_1AE(%"struct.move_ctor::A"* >> %{{.*}}) >> -// CHECK-LABEL: declare void >> @_ZN9move_ctor3fooENS_1AE(%"struct.move_ctor::A"*) >> +// NEWABI: call void @_ZN9move_ctor3fooENS_1AE(%"struct.move_ctor::A"* >> %{{.*}}) >> +// OLDABI: call void @_ZN9move_ctor3fooENS_1AE(i8* %{{.*}}) >> +// NEWABI-LABEL: declare void >> @_ZN9move_ctor3fooENS_1AE(%"struct.move_ctor::A"*) >> +// OLDABI-LABEL: declare void @_ZN9move_ctor3fooENS_1AE(i8*) >> >> // WIN64-LABEL: declare void >> @"\01?foo@move_ctor@@YAXUA@1@@Z"(%"struct.move_ctor::A"*) >> } >> @@ -76,8 +80,10 @@ void bar() { >> // CHECK-LABEL: define void @_ZN11all_deleted3barEv() >> // CHECK: call void @_Z{{.*}}C1Ev( >> // CHECK-NOT: call >> -// CHECK: call void >> @_ZN11all_deleted3fooENS_1AE(%"struct.all_deleted::A"* %{{.*}}) >> -// CHECK-LABEL: declare void >> @_ZN11all_deleted3fooENS_1AE(%"struct.all_deleted::A"*) >> +// NEWABI: call void >> @_ZN11all_deleted3fooENS_1AE(%"struct.all_deleted::A"* %{{.*}}) >> +// OLDABI: call void @_ZN11all_deleted3fooENS_1AE(i8* %{{.*}}) >> +// NEWABI-LABEL: declare void >> @_ZN11all_deleted3fooENS_1AE(%"struct.all_deleted::A"*) >> +// OLDABI-LABEL: declare void @_ZN11all_deleted3fooENS_1AE(i8*) >> >> // WIN64-LABEL: declare void >> @"\01?foo@all_deleted@@YAXUA@1@@Z"(%"struct.all_deleted::A"*) >> } >> @@ -95,8 +101,10 @@ void bar() { >> // CHECK-LABEL: define void @_ZN18implicitly_deleted3barEv() >> // CHECK: call void @_Z{{.*}}C1Ev( >> // CHECK-NOT: call >> -// CHECK: call void >> @_ZN18implicitly_deleted3fooENS_1AE(%"struct.implicitly_deleted::A"* >> %{{.*}}) >> -// CHECK-LABEL: declare void >> @_ZN18implicitly_deleted3fooENS_1AE(%"struct.implicitly_deleted::A"*) >> +// NEWABI: call void >> @_ZN18implicitly_deleted3fooENS_1AE(%"struct.implicitly_deleted::A"* >> %{{.*}}) >> +// OLDABI: call void @_ZN18implicitly_deleted3fooENS_1AE(i8* %{{.*}}) >> +// NEWABI-LABEL: declare void >> @_ZN18implicitly_deleted3fooENS_1AE(%"struct.implicitly_deleted::A"*) >> +// OLDABI-LABEL: declare void @_ZN18implicitly_deleted3fooENS_1AE(i8*) >> >> // In MSVC 2013, the copy ctor is not deleted by a move assignment. In >> MSVC 2015, it is. >> // WIN64-18-LABEL: declare void >> @"\01?foo@implicitly_deleted@@YAXUA@1@@Z"(i64 >> @@ -116,8 +124,10 @@ void bar() { >> // CHECK-LABEL: define void @_ZN11one_deleted3barEv() >> // CHECK: call void @_Z{{.*}}C1Ev( >> // CHECK-NOT: call >> -// CHECK: call void >> @_ZN11one_deleted3fooENS_1AE(%"struct.one_deleted::A"* %{{.*}}) >> -// CHECK-LABEL: declare void >> @_ZN11one_deleted3fooENS_1AE(%"struct.one_deleted::A"*) >> +// NEWABI: call void >> @_ZN11one_deleted3fooENS_1AE(%"struct.one_deleted::A"* %{{.*}}) >> +// OLDABI: call void @_ZN11one_deleted3fooENS_1AE(i8* %{{.*}}) >> +// NEWABI-LABEL: declare void >> @_ZN11one_deleted3fooENS_1AE(%"struct.one_deleted::A"*) >> +// OLDABI-LABEL: declare void @_ZN11one_deleted3fooENS_1AE(i8*) >> >> // WIN64-LABEL: declare void >> @"\01?foo@one_deleted@@YAXUA@1@@Z"(%"struct.one_deleted::A"*) >> } >> @@ -196,8 +206,10 @@ void bar() { >> } >> // CHECK-LABEL: define void @_ZN14two_copy_ctors3barEv() >> // CHECK: call void @_Z{{.*}}C1Ev( >> -// CHECK: call void >> @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"* %{{.*}}) >> -// CHECK-LABEL: declare void >> @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"*) >> +// NEWABI: call void >> @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"* %{{.*}}) >> +// OLDABI: call void >> @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"* byval >> +// NEWABI-LABEL: declare void >> @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"*) >> +// OLDABI-LABEL: declare void >> @_ZN14two_copy_ctors3fooENS_1BE(%"struct.two_copy_ctors::B"* byval >> >> // WIN64-LABEL: declare void >> @"\01?foo@two_copy_ctors@@YAXUB@1@@Z"(%"struct.two_copy_ctors::B"*) >> } >> @@ -209,7 +221,8 @@ struct A { >> void *p; >> }; >> void *foo(A a) { return a.p; } >> -// CHECK-LABEL: define i8* >> @_ZN15definition_only3fooENS_1AE(%"struct.definition_only::A"* >> +// NEWABI-LABEL: define i8* >> @_ZN15definition_only3fooENS_1AE(%"struct.definition_only::A"* >> +// OLDABI-LABEL: define i8* @_ZN15definition_only3fooENS_1AE(i8* >> // WIN64-LABEL: define i8* >> @"\01?foo@definition_only@@YAPEAXUA@1@@Z"(%"struct.definition_only::A"* >> } >> >> @@ -224,7 +237,8 @@ struct A { >> B b; >> }; >> void *foo(A a) { return a.b.p; } >> -// CHECK-LABEL: define i8* >> @_ZN17deleted_by_member3fooENS_1AE(%"struct.deleted_by_member::A"* >> +// NEWABI-LABEL: define i8* >> @_ZN17deleted_by_member3fooENS_1AE(%"struct.deleted_by_member::A"* >> +// OLDABI-LABEL: define i8* @_ZN17deleted_by_member3fooENS_1AE(i8* >> // WIN64-LABEL: define i8* >> @"\01?foo@deleted_by_member@@YAPEAXUA@1@@Z"(%"struct.deleted_by_member::A"* >> } >> >> @@ -238,7 +252,8 @@ struct A : B { >> A(); >> }; >> void *foo(A a) { return a.p; } >> -// CHECK-LABEL: define i8* >> @_ZN15deleted_by_base3fooENS_1AE(%"struct.deleted_by_base::A"* >> +// NEWABI-LABEL: define i8* >> @_ZN15deleted_by_base3fooENS_1AE(%"struct.deleted_by_base::A"* >> +// OLDABI-LABEL: define i8* @_ZN15deleted_by_base3fooENS_1AE(i8* >> // WIN64-LABEL: define i8* >> @"\01?foo@deleted_by_base@@YAPEAXUA@1@@Z"(%"struct.deleted_by_base::A"* >> } >> >> @@ -253,7 +268,8 @@ struct A { >> B b; >> }; >> void *foo(A a) { return a.b.p; } >> -// CHECK-LABEL: define i8* >> @_ZN22deleted_by_member_copy3fooENS_1AE(%"struct.deleted_by_member_copy::A"* >> +// NEWABI-LABEL: define i8* >> @_ZN22deleted_by_member_copy3fooENS_1AE(%"struct.deleted_by_member_copy::A"* >> +// OLDABI-LABEL: define i8* @_ZN22deleted_by_member_copy3fooENS_1AE(i8* >> // WIN64-LABEL: define i8* >> @"\01?foo@deleted_by_member_copy@@YAPEAXUA@1@@Z"(%"struct.deleted_by_member_copy::A"* >> } >> >> @@ -267,7 +283,8 @@ struct A : B { >> A(); >> }; >> void *foo(A a) { return a.p; } >> -// CHECK-LABEL: define i8* >> @_ZN20deleted_by_base_copy3fooENS_1AE(%"struct.deleted_by_base_copy::A"* >> +// NEWABI-LABEL: define i8* >> @_ZN20deleted_by_base_copy3fooENS_1AE(%"struct.deleted_by_base_copy::A"* >> +// OLDABI-LABEL: define i8* @_ZN20deleted_by_base_copy3fooENS_1AE(i8* >> // WIN64-LABEL: define i8* >> @"\01?foo@deleted_by_base_copy@@YAPEAXUA@1@@Z"(%"struct.deleted_by_base_copy::A"* >> } >> >> @@ -277,7 +294,8 @@ struct A { >> A(const A &o) = delete; >> void *p; >> }; >> -// CHECK-LABEL: define i8* >> @_ZN15explicit_delete3fooENS_1AE(%"struct.explicit_delete::A"* >> +// NEWABI-LABEL: define i8* >> @_ZN15explicit_delete3fooENS_1AE(%"struct.explicit_delete::A"* >> +// OLDABI-LABEL: define i8* @_ZN15explicit_delete3fooENS_1AE(i8* >> // WIN64-LABEL: define i8* >> @"\01?foo@explicit_delete@@YAPEAXUA@1@@Z"(%"struct.explicit_delete::A"* >> void *foo(A a) { return a.p; } >> } >> @@ -289,7 +307,8 @@ struct A { >> // Deleted copy ctor due to rvalue ref member. >> int &&ref; >> }; >> -// CHECK-LABEL: define {{.*}} >> @_ZN28implicitly_deleted_copy_ctor3fooENS_1AE(%"struct.implicitly_deleted_copy_ctor::A"* >> +// NEWABI-LABEL: define {{.*}} >> @_ZN28implicitly_deleted_copy_ctor3fooENS_1AE(%"struct.implicitly_deleted_copy_ctor::A"* >> +// OLDABI-LABEL: define {{.*}} >> @_ZN28implicitly_deleted_copy_ctor3fooENS_1AE(i32* >> // WIN64-LABEL: define {{.*}} >> @"\01?foo@implicitly_deleted_copy_ctor@@YAAEAHUA@1@@Z"(%"struct.implicitly_deleted_copy_ctor::A"* >> int &foo(A a) { return a.ref; } >> >> >> Modified: cfe/trunk/test/Driver/flags.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/flags.c?rev=311823&r1=311822&r2=311823&view=diff >> >> ============================================================================== >> --- cfe/trunk/test/Driver/flags.c (original) >> +++ cfe/trunk/test/Driver/flags.c Fri Aug 25 18:04:35 2017 >> @@ -24,3 +24,6 @@ >> >> // RUN: %clang -target armv7-apple-darwin10 -### -S -mno-implicit-float >> -mimplicit-float %s 2>&1 | FileCheck -check-prefix=TEST8 %s >> // TEST8-NOT: "-no-implicit-float" >> + >> +// RUN: %clang -target x86_64-linux-gnu -### -c -fclang-abi-compat=3.2 %s >> 2>&1 | FileCheck -check-prefix=TEST9 %s >> +// TEST9: "-fclang-abi-compat=3.2" >> >> Added: cfe/trunk/test/Frontend/clang-abi-compat.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/clang-abi-compat.cpp?rev=311823&view=auto >> >> ============================================================================== >> --- cfe/trunk/test/Frontend/clang-abi-compat.cpp (added) >> +++ cfe/trunk/test/Frontend/clang-abi-compat.cpp Fri Aug 25 18:04:35 2017 >> @@ -0,0 +1,15 @@ >> +// RUN: not %clang_cc1 -fclang-abi-compat=banana %s -fsyntax-only 2>&1 | >> FileCheck --check-prefix=INVALID %s >> +// RUN: not %clang_cc1 -fclang-abi-compat=2.9 %s -fsyntax-only 2>&1 | >> FileCheck --check-prefix=INVALID %s >> +// RUN: not %clang_cc1 -fclang-abi-compat=8 %s -fsyntax-only 2>&1 | >> FileCheck --check-prefix=INVALID %s >> +// RUN: not %clang_cc1 -fclang-abi-compat=3.10 %s -fsyntax-only 2>&1 | >> FileCheck --check-prefix=INVALID %s >> +// RUN: not %clang_cc1 -fclang-abi-compat=4.1 %s -fsyntax-only 2>&1 | >> FileCheck --check-prefix=INVALID %s >> +// RUN: not %clang_cc1 -fclang-abi-compat=04 %s -fsyntax-only 2>&1 | >> FileCheck --check-prefix=INVALID %s >> +// RUN: not %clang_cc1 -fclang-abi-compat=4. %s -fsyntax-only 2>&1 | >> FileCheck --check-prefix=INVALID %s >> +// RUN: not %clang_cc1 -fclang-abi-compat=4.00 %s -fsyntax-only 2>&1 | >> FileCheck --check-prefix=INVALID %s >> +// INVALID: error: invalid value '{{.*}}' in '-fclang-abi-compat={{.*}}' >> +// >> +// RUN: %clang_cc1 -fclang-abi-compat=3.0 %s -fsyntax-only >> +// RUN: %clang_cc1 -fclang-abi-compat=3.9 %s -fsyntax-only >> +// RUN: %clang_cc1 -fclang-abi-compat=4 %s -fsyntax-only >> +// RUN: %clang_cc1 -fclang-abi-compat=4.0 %s -fsyntax-only >> +// RUN: %clang_cc1 -fclang-abi-compat=latest %s -fsyntax-only >> >> >> _______________________________________________ >> cfe-commits mailing list >> cfe-commits@lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits