On Wed, 14 Oct 2020 at 12:31, Leonard Chan via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> > Author: Leonard Chan > Date: 2020-10-14T12:31:21-07:00 > New Revision: 683b308c07bf827255fe1403056413f790e03729 > > URL: > https://github.com/llvm/llvm-project/commit/683b308c07bf827255fe1403056413f790e03729 > DIFF: > https://github.com/llvm/llvm-project/commit/683b308c07bf827255fe1403056413f790e03729.diff > > LOG: [clang] Add -fc++-abi= flag for specifying which C++ ABI to use > > This implements the flag proposed in RFC > http://lists.llvm.org/pipermail/cfe-dev/2020-August/066437.html. > > The goal is to add a way to override the default target C++ ABI through > a compiler flag. This makes it easier to test and transition between > different > C++ ABIs through compile flags rather than build flags. > > In this patch: > - Store `-fc++-abi=` in a LangOpt. This isn't stored in a > CodeGenOpt because there are instances outside of codegen where Clang > needs to know what the ABI is (particularly through > ASTContext::createCXXABI), and we should be able to override the > target default if the flag is provided at that point. > - Expose the existing ABIs in TargetCXXABI as values that can be passed > through this flag. > - Create a .def file for these ABIs to make it easier to check flag > values. > - Add an error for diagnosing bad ABI flag values. > > Differential Revision: https://reviews.llvm.org/D85802 > > Added: > clang/include/clang/Basic/TargetCXXABI.def > clang/test/Frontend/invalid-cxx-abi.cpp > > Modified: > clang/include/clang/AST/ASTContext.h > clang/include/clang/Basic/DiagnosticDriverKinds.td > clang/include/clang/Basic/LangOptions.h > clang/include/clang/Basic/TargetCXXABI.h > clang/include/clang/Driver/Options.td > clang/lib/AST/ASTContext.cpp > clang/lib/CodeGen/CodeGenModule.cpp > clang/lib/CodeGen/ItaniumCXXABI.cpp > clang/lib/Driver/ToolChains/Clang.cpp > clang/lib/Frontend/CompilerInvocation.cpp > > Removed: > > > > > ################################################################################ > diff --git a/clang/include/clang/AST/ASTContext.h > b/clang/include/clang/AST/ASTContext.h > index 3f4079e2569b..e5c80866a0a9 100644 > --- a/clang/include/clang/AST/ASTContext.h > +++ b/clang/include/clang/AST/ASTContext.h > @@ -39,6 +39,7 @@ > #include "clang/Basic/SanitizerBlacklist.h" > #include "clang/Basic/SourceLocation.h" > #include "clang/Basic/Specifiers.h" > +#include "clang/Basic/TargetCXXABI.h" > #include "clang/Basic/XRayLists.h" > #include "llvm/ADT/APSInt.h" > #include "llvm/ADT/ArrayRef.h" > @@ -697,6 +698,11 @@ class ASTContext : public RefCountedBase<ASTContext> { > return FullSourceLoc(Loc,SourceMgr); > } > > + /// Return the C++ ABI kind that should be used. The C++ ABI can be > overriden > + /// at compile time with `-fc++-abi=`. If this is not provided, we > instead use > + /// the default ABI set by the target. > + TargetCXXABI::Kind getCXXABIKind() const; > + > /// All comments in this translation unit. > RawCommentList Comments; > > > diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td > b/clang/include/clang/Basic/DiagnosticDriverKinds.td > index 29bc19e5a84e..f1b3d4d9087e 100644 > --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td > +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td > @@ -524,4 +524,6 @@ def err_drv_invalid_object_mode : Error<"OBJECT_MODE > setting %0 is not recognize > > def err_drv_invalid_sve_vector_bits : Error< > "'-msve-vector-bits' is not supported without SVE enabled">; > + > +def err_invalid_cxx_abi : Error<"Invalid C++ ABI name '%0'">; > Diagnostics should start with a lowercase letter. > } > > diff --git a/clang/include/clang/Basic/LangOptions.h > b/clang/include/clang/Basic/LangOptions.h > index 84d25c359c55..147fab614308 100644 > --- a/clang/include/clang/Basic/LangOptions.h > +++ b/clang/include/clang/Basic/LangOptions.h > @@ -18,6 +18,7 @@ > #include "clang/Basic/LLVM.h" > #include "clang/Basic/ObjCRuntime.h" > #include "clang/Basic/Sanitizers.h" > +#include "clang/Basic/TargetCXXABI.h" > #include "clang/Basic/Visibility.h" > #include "llvm/ADT/FloatingPointMode.h" > #include "llvm/ADT/StringRef.h" > @@ -294,6 +295,10 @@ class LangOptions : public LangOptionsBase { > /// host code generation. > std::string OMPHostIRFile; > > + /// C++ ABI to compile with, if specified by the frontend through > -fc++-abi=. > + /// This overrides the default ABI used by the target. > + llvm::Optional<TargetCXXABI::Kind> CXXABI; > + > /// Indicates whether the front-end is explicitly told that the > /// input is a header file (i.e. -x c-header). > bool IsHeaderFile = false; > > diff --git a/clang/include/clang/Basic/TargetCXXABI.def > b/clang/include/clang/Basic/TargetCXXABI.def > new file mode 100644 > index 000000000000..0ae0bb555f60 > --- /dev/null > +++ b/clang/include/clang/Basic/TargetCXXABI.def > @@ -0,0 +1,129 @@ > +//===--- TargetCXXABI.def - Target C++ ABI database --------------- C++ > -*-===// > +// > +// Part of the LLVM Project, under the Apache License v2.0 with LLVM > Exceptions. > +// See https://llvm.org/LICENSE.txt for license information. > +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception > +// > > +//===----------------------------------------------------------------------===// > +// > +// This file defines the various C++ ABI kinds used on > diff erent platforms. > +// Users of this file must define the CXXABI macro to make use of this > +// information. > +// > > +//===----------------------------------------------------------------------===// > + > +#ifndef CXXABI > +#error Define the CXXABI macro to handle C++ ABI kinds. > +#endif > + > +#ifndef ITANIUM_CXXABI > +#define ITANIUM_CXXABI(Name, Str) CXXABI(Name, Str) > +#endif > + > +#ifndef MICROSOFT_CXXABI > +#define MICROSOFT_CXXABI(Name, Str) CXXABI(Name, Str) > +#endif > + > +/// The generic Itanium ABI is the standard ABI of most open-source > +/// and Unix-like platforms. It is the primary ABI targeted by > +/// many compilers, including Clang and GCC. > +/// > +/// It is documented here: > +/// http://www.codesourcery.com/public/cxx-abi/ > +ITANIUM_CXXABI(GenericItanium, "itanium") > + > +/// The generic ARM ABI is a modified version of the Itanium ABI > +/// proposed by ARM for use on ARM-based platforms. > +/// > +/// These changes include: > +/// - the representation of member function pointers is adjusted > +/// to not conflict with the 'thumb' bit of ARM function pointers; > +/// - constructors and destructors return 'this'; > +/// - guard variables are smaller; > +/// - inline functions are never key functions; > +/// - array cookies have a slightly > diff erent layout; +/// - additional convenience functions are specified; > +/// - and more! > +/// > +/// It is documented here: > +/// http://infocenter.arm.com > +/// > /help/topic/com.arm.doc.ihi0041c/IHI0041C_cppabi.pdf > +ITANIUM_CXXABI(GenericARM, "arm") > + > +/// The iOS ABI is a partial implementation of the ARM ABI. > +/// Several of the features of the ARM ABI were not fully implemented > +/// in the compilers that iOS was launched with. > +/// > +/// Essentially, the iOS ABI includes the ARM changes to: > +/// - member function pointers, > +/// - guard variables, > +/// - array cookies, and > +/// - constructor/destructor signatures. > +ITANIUM_CXXABI(iOS, "ios") > + > +/// The iOS 64-bit ABI is follows ARM's published 64-bit ABI more > +/// closely, but we don't guarantee to follow it perfectly. > +/// > +/// It is documented here: > +/// http://infocenter.arm.com > +/// > /help/topic/com.arm.doc.ihi0059a/IHI0059A_cppabi64.pdf > +ITANIUM_CXXABI(iOS64, "ios64") > + > +/// WatchOS is a modernisation of the iOS ABI, which roughly means it's > +/// the iOS64 ABI ported to 32-bits. The primary > diff erence from iOS64 is +/// that RTTI objects must still be unique at the moment. > +ITANIUM_CXXABI(WatchOS, "watchos") > + > +/// The generic AArch64 ABI is also a modified version of the Itanium ABI, > +/// but it has fewer divergences than the 32-bit ARM ABI. > +/// > +/// The relevant changes from the generic ABI in this case are: > +/// - representation of member function pointers adjusted as in ARM. > +/// - guard variables are smaller. > +ITANIUM_CXXABI(GenericAArch64, "aarch64") > + > +/// The generic Mips ABI is a modified version of the Itanium ABI. > +/// > +/// At the moment, only change from the generic ABI in this case is: > +/// - representation of member function pointers adjusted as in ARM. > +ITANIUM_CXXABI(GenericMIPS, "mips") > + > +/// The WebAssembly ABI is a modified version of the Itanium ABI. > +/// > +/// The changes from the Itanium ABI are: > +/// - representation of member function pointers is adjusted, as in ARM; > +/// - member functions are not specially aligned; > +/// - constructors and destructors return 'this', as in ARM; > +/// - guard variables are 32-bit on wasm32, as in ARM; > +/// - unused bits of guard variables are reserved, as in ARM; > +/// - inline functions are never key functions, as in ARM; > +/// - C++11 POD rules are used for tail padding, as in iOS64. > +/// > +/// TODO: At present the WebAssembly ABI is not considered stable, so none > +/// of these details is necessarily final yet. > +ITANIUM_CXXABI(WebAssembly, "webassembly") > + > +/// The Fuchsia ABI is a modified version of the Itanium ABI. > +/// > +/// The relevant changes from the Itanium ABI are: > +/// - constructors and destructors return 'this', as in ARM. > +ITANIUM_CXXABI(Fuchsia, "fuchsia") > + > +/// The XL ABI is the ABI used by IBM xlclang compiler and is a modified > +/// version of the Itanium ABI. > +/// > +/// The relevant changes from the Itanium ABI are: > +/// - static initialization is adjusted to use sinit and sterm > functions; > +ITANIUM_CXXABI(XL, "xl") > + > +/// The Microsoft ABI is the ABI used by Microsoft Visual Studio (and > +/// compatible compilers). > +/// > +/// FIXME: should this be split into Win32 and Win64 variants? > +/// > +/// Only scattered and incomplete official documentation exists. > +MICROSOFT_CXXABI(Microsoft, "microsoft") > + > +#undef CXXABI > +#undef ITANIUM_CXXABI > +#undef MICROSOFT_CXXABI > > diff --git a/clang/include/clang/Basic/TargetCXXABI.h > b/clang/include/clang/Basic/TargetCXXABI.h > index 93f70fc70dd8..ed6438a9b236 100644 > --- a/clang/include/clang/Basic/TargetCXXABI.h > +++ b/clang/include/clang/Basic/TargetCXXABI.h > @@ -15,6 +15,7 @@ > #ifndef LLVM_CLANG_BASIC_TARGETCXXABI_H > #define LLVM_CLANG_BASIC_TARGETCXXABI_H > > +#include "llvm/ADT/StringMap.h" > #include "llvm/Support/ErrorHandling.h" > > namespace clang { > @@ -24,105 +25,8 @@ class TargetCXXABI { > public: > /// The basic C++ ABI kind. > enum Kind { > - /// The generic Itanium ABI is the standard ABI of most open-source > - /// and Unix-like platforms. It is the primary ABI targeted by > - /// many compilers, including Clang and GCC. > - /// > - /// It is documented here: > - /// http://www.codesourcery.com/public/cxx-abi/ > - GenericItanium, > - > - /// The generic ARM ABI is a modified version of the Itanium ABI > - /// proposed by ARM for use on ARM-based platforms. > - /// > - /// These changes include: > - /// - the representation of member function pointers is adjusted > - /// to not conflict with the 'thumb' bit of ARM function pointers; > - /// - constructors and destructors return 'this'; > - /// - guard variables are smaller; > - /// - inline functions are never key functions; > - /// - array cookies have a slightly > diff erent layout; > - /// - additional convenience functions are specified; > - /// - and more! > - /// > - /// It is documented here: > - /// http://infocenter.arm.com > - /// > /help/topic/com.arm.doc.ihi0041c/IHI0041C_cppabi.pdf > - GenericARM, > - > - /// The iOS ABI is a partial implementation of the ARM ABI. > - /// Several of the features of the ARM ABI were not fully implemented > - /// in the compilers that iOS was launched with. > - /// > - /// Essentially, the iOS ABI includes the ARM changes to: > - /// - member function pointers, > - /// - guard variables, > - /// - array cookies, and > - /// - constructor/destructor signatures. > - iOS, > - > - /// The iOS 64-bit ABI is follows ARM's published 64-bit ABI more > - /// closely, but we don't guarantee to follow it perfectly. > - /// > - /// It is documented here: > - /// http://infocenter.arm.com > - /// > /help/topic/com.arm.doc.ihi0059a/IHI0059A_cppabi64.pdf > - iOS64, > - > - /// WatchOS is a modernisation of the iOS ABI, which roughly means > it's > - /// the iOS64 ABI ported to 32-bits. The primary > diff erence from iOS64 is > - /// that RTTI objects must still be unique at the moment. > - WatchOS, > - > - /// The generic AArch64 ABI is also a modified version of the Itanium > ABI, > - /// but it has fewer divergences than the 32-bit ARM ABI. > - /// > - /// The relevant changes from the generic ABI in this case are: > - /// - representation of member function pointers adjusted as in ARM. > - /// - guard variables are smaller. > - GenericAArch64, > - > - /// The generic Mips ABI is a modified version of the Itanium ABI. > - /// > - /// At the moment, only change from the generic ABI in this case is: > - /// - representation of member function pointers adjusted as in ARM. > - GenericMIPS, > - > - /// The WebAssembly ABI is a modified version of the Itanium ABI. > - /// > - /// The changes from the Itanium ABI are: > - /// - representation of member function pointers is adjusted, as in > ARM; > - /// - member functions are not specially aligned; > - /// - constructors and destructors return 'this', as in ARM; > - /// - guard variables are 32-bit on wasm32, as in ARM; > - /// - unused bits of guard variables are reserved, as in ARM; > - /// - inline functions are never key functions, as in ARM; > - /// - C++11 POD rules are used for tail padding, as in iOS64. > - /// > - /// TODO: At present the WebAssembly ABI is not considered stable, so > none > - /// of these details is necessarily final yet. > - WebAssembly, > - > - /// The Fuchsia ABI is a modified version of the Itanium ABI. > - /// > - /// The relevant changes from the Itanium ABI are: > - /// - constructors and destructors return 'this', as in ARM. > - Fuchsia, > - > - /// The XL ABI is the ABI used by IBM xlclang compiler and is a > modified > - /// version of the Itanium ABI. > - /// > - /// The relevant changes from the Itanium ABI are: > - /// - static initialization is adjusted to use sinit and sterm > functions; > - XL, > - > - /// The Microsoft ABI is the ABI used by Microsoft Visual Studio (and > - /// compatible compilers). > - /// > - /// FIXME: should this be split into Win32 and Win64 variants? > - /// > - /// Only scattered and incomplete official documentation exists. > - Microsoft > +#define CXXABI(Name, Str) Name, > +#include "TargetCXXABI.def" > }; > > private: > @@ -131,7 +35,20 @@ class TargetCXXABI { > // audit the users to pass it by reference instead. > Kind TheKind; > > + static const auto &getABIMap() { > + static llvm::StringMap<Kind> ABIMap = { > +#define CXXABI(Name, Str) {Str, Name}, > +#include "TargetCXXABI.def" > + }; > + return ABIMap; > + } > + > public: > + static Kind getKind(StringRef Name) { return getABIMap().lookup(Name); } > + static bool isABI(StringRef Name) { > + return getABIMap().find(Name) != getABIMap().end(); > + } > + > /// A bogus initialization of the platform ABI. > TargetCXXABI() : TheKind(GenericItanium) {} > > @@ -146,19 +63,11 @@ class TargetCXXABI { > /// Does this ABI generally fall into the Itanium family of ABIs? > bool isItaniumFamily() const { > switch (getKind()) { > - case Fuchsia: > - case GenericAArch64: > - case GenericItanium: > - case GenericARM: > - case iOS: > - case iOS64: > - case WatchOS: > - case GenericMIPS: > - case WebAssembly: > - case XL: > +#define CXXABI(Name, Str) > +#define ITANIUM_CXXABI(Name, Str) case Name: > +#include "TargetCXXABI.def" > return true; > - > - case Microsoft: > + default: > return false; > } > llvm_unreachable("bad ABI kind"); > @@ -167,20 +76,12 @@ class TargetCXXABI { > /// Is this ABI an MSVC-compatible ABI? > bool isMicrosoft() const { > switch (getKind()) { > - case Fuchsia: > - case GenericAArch64: > - case GenericItanium: > - case GenericARM: > - case iOS: > - case iOS64: > - case WatchOS: > - case GenericMIPS: > - case WebAssembly: > - case XL: > - return false; > - > - case Microsoft: > +#define CXXABI(Name, Str) > +#define MICROSOFT_CXXABI(Name, Str) case Name: > +#include "TargetCXXABI.def" > return true; > + default: > + return false; > } > llvm_unreachable("bad ABI kind"); > } > > diff --git a/clang/include/clang/Driver/Options.td > b/clang/include/clang/Driver/Options.td > index 34868bd31115..0365657bf728 100644 > --- a/clang/include/clang/Driver/Options.td > +++ b/clang/include/clang/Driver/Options.td > @@ -1371,6 +1371,10 @@ def fno_experimental_relative_cxx_abi_vtables : > Flag<["-"], "fno-experimental-re > Group<f_Group>, Flags<[CC1Option]>, > HelpText<"Do not use the experimental C++ class ABI for classes with > virtual tables">; > > +def fcxx_abi_EQ : Joined<["-"], "fc++-abi=">, > + Group<f_clang_Group>, Flags<[CC1Option]>, > + HelpText<"C++ ABI to use. This will override the target > C++ ABI.">; > + > def flat__namespace : Flag<["-"], "flat_namespace">; > def flax_vector_conversions_EQ : Joined<["-"], > "flax-vector-conversions=">, Group<f_Group>, > HelpText<"Enable implicit vector bit-casts">, > Values<"none,integer,all">, Flags<[CC1Option]>; > > diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp > index 8caff6b33379..f3680d7adfee 100644 > --- a/clang/lib/AST/ASTContext.cpp > +++ b/clang/lib/AST/ASTContext.cpp > @@ -879,10 +879,15 @@ ASTContext::getCanonicalTemplateTemplateParmDecl( > return CanonTTP; > } > > +TargetCXXABI::Kind ASTContext::getCXXABIKind() const { > + auto Kind = getTargetInfo().getCXXABI().getKind(); > + return getLangOpts().CXXABI.getValueOr(Kind); > +} > + > CXXABI *ASTContext::createCXXABI(const TargetInfo &T) { > if (!LangOpts.CPlusPlus) return nullptr; > > - switch (T.getCXXABI().getKind()) { > + switch (getCXXABIKind()) { > case TargetCXXABI::Fuchsia: > case TargetCXXABI::GenericARM: // Same as Itanium at this level > case TargetCXXABI::iOS: > > diff --git a/clang/lib/CodeGen/CodeGenModule.cpp > b/clang/lib/CodeGen/CodeGenModule.cpp > index 93b49ec981e8..aaf20ea5e41c 100644 > --- a/clang/lib/CodeGen/CodeGenModule.cpp > +++ b/clang/lib/CodeGen/CodeGenModule.cpp > @@ -75,19 +75,14 @@ static llvm::cl::opt<bool> LimitedCoverage( > static const char AnnotationSection[] = "llvm.metadata"; > > static CGCXXABI *createCXXABI(CodeGenModule &CGM) { > - switch (CGM.getTarget().getCXXABI().getKind()) { > - case TargetCXXABI::Fuchsia: > - case TargetCXXABI::GenericAArch64: > - case TargetCXXABI::GenericARM: > - case TargetCXXABI::iOS: > - case TargetCXXABI::iOS64: > - case TargetCXXABI::WatchOS: > - case TargetCXXABI::GenericMIPS: > - case TargetCXXABI::GenericItanium: > - case TargetCXXABI::WebAssembly: > - case TargetCXXABI::XL: > + switch (CGM.getContext().getCXXABIKind()) { > +#define ITANIUM_CXXABI(Name, Str) case TargetCXXABI::Name: > +#define CXXABI(Name, Str) > +#include "clang/Basic/TargetCXXABI.def" > return CreateItaniumCXXABI(CGM); > - case TargetCXXABI::Microsoft: > +#define MICROSOFT_CXXABI(Name, Str) case TargetCXXABI::Name: > +#define CXXABI(Name, Str) > +#include "clang/Basic/TargetCXXABI.def" > return CreateMicrosoftCXXABI(CGM); > } > > > diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp > b/clang/lib/CodeGen/ItaniumCXXABI.cpp > index cfb736ce0ff1..d4fe0ce5cbcb 100644 > --- a/clang/lib/CodeGen/ItaniumCXXABI.cpp > +++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp > @@ -542,7 +542,7 @@ class XLCXXABI final : public ItaniumCXXABI { > } > > CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) { > - switch (CGM.getTarget().getCXXABI().getKind()) { > + switch (CGM.getContext().getCXXABIKind()) { > // For IR-generation purposes, there's no significant > diff erence > // between the ARM and iOS ABIs. > case TargetCXXABI::GenericARM: > > diff --git a/clang/lib/Driver/ToolChains/Clang.cpp > b/clang/lib/Driver/ToolChains/Clang.cpp > index d16de8928ec1..39fcf240449c 100644 > --- a/clang/lib/Driver/ToolChains/Clang.cpp > +++ b/clang/lib/Driver/ToolChains/Clang.cpp > @@ -5029,6 +5029,9 @@ void Clang::ConstructJob(Compilation &C, const > JobAction &JA, > /*Default=*/false)) > Args.AddLastArg(CmdArgs, options::OPT_ffixed_point); > > + if (Arg *A = Args.getLastArg(options::OPT_fcxx_abi_EQ)) > + A->render(Args, CmdArgs); > + > // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi} > // (-ansi is equivalent to -std=c89 or -std=c++98). > // > > diff --git a/clang/lib/Frontend/CompilerInvocation.cpp > b/clang/lib/Frontend/CompilerInvocation.cpp > index a4c56cc4e51e..13320ebb03c5 100644 > --- a/clang/lib/Frontend/CompilerInvocation.cpp > +++ b/clang/lib/Frontend/CompilerInvocation.cpp > @@ -3513,6 +3513,15 @@ static void ParseLangArgs(LangOptions &Opts, > ArgList &Args, InputKind IK, > Args.hasFlag(OPT_fexperimental_relative_cxx_abi_vtables, > OPT_fno_experimental_relative_cxx_abi_vtables, > /*default=*/false); > + > + // The value can be empty, which indicates the system default should be > used. > + StringRef CXXABI = Args.getLastArgValue(OPT_fcxx_abi_EQ); > + if (!CXXABI.empty()) { > + if (!TargetCXXABI::isABI(CXXABI)) > + Diags.Report(diag::err_invalid_cxx_abi) << CXXABI; > + else > + Opts.CXXABI = TargetCXXABI::getKind(CXXABI); > + } > } > > static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) { > > diff --git a/clang/test/Frontend/invalid-cxx-abi.cpp > b/clang/test/Frontend/invalid-cxx-abi.cpp > new file mode 100644 > index 000000000000..20c6d7bde22c > --- /dev/null > +++ b/clang/test/Frontend/invalid-cxx-abi.cpp > @@ -0,0 +1,16 @@ > +// These should succeed. > +// RUN: %clang_cc1 -fc++-abi=itanium %s > +// RUN: %clang_cc1 -fc++-abi=arm %s > +// RUN: %clang_cc1 -fc++-abi=ios %s > +// RUN: %clang_cc1 -fc++-abi=ios64 %s > +// RUN: %clang_cc1 -fc++-abi=aarch64 %s > +// RUN: %clang_cc1 -fc++-abi=mips %s > +// RUN: %clang_cc1 -fc++-abi=webassembly %s > +// RUN: %clang_cc1 -fc++-abi=fuchsia %s > +// RUN: %clang_cc1 -fc++-abi=xl %s > +// RUN: %clang_cc1 -fc++-abi=microsoft %s > + > +// RUN: not %clang_cc1 -fc++-abi=InvalidABI %s 2>&1 | FileCheck %s > -check-prefix=INVALID > +// RUN: not %clang_cc1 -fc++-abi=Fuchsia %s 2>&1 | FileCheck %s > -check-prefix=CASE-SENSITIVE > +// INVALID: error: Invalid C++ ABI name 'InvalidABI' > +// CASE-SENSITIVE: error: Invalid C++ ABI name 'Fuchsia' > > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits