r311823 - Add flag to request Clang is ABI-compatible with older versions of itself
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 29 10:15:19 PDT 2017
Merged in r312013.
On Fri, Aug 25, 2017 at 6:06 PM, Richard Smith <richard at 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 at 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 at move_ctor@@YAXUA at 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 at all_deleted@@YAXUA at 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 at implicitly_deleted@@YAXUA at 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 at one_deleted@@YAXUA at 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 at two_copy_ctors@@YAXUB at 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 at definition_only@@YAPEAXUA at 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 at deleted_by_member@@YAPEAXUA at 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 at deleted_by_base@@YAPEAXUA at 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 at deleted_by_member_copy@@YAPEAXUA at 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 at deleted_by_base_copy@@YAPEAXUA at 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 at explicit_delete@@YAPEAXUA at 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 at implicitly_deleted_copy_ctor@@YAAEAHUA at 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 at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
More information about the cfe-commits
mailing list