[clang] 683b308 - [clang] Add -fc++-abi= flag for specifying which C++ ABI to use

Leonard Chan via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 14 15:50:09 PDT 2020


Updated with 8487bfd4e9ae186f9f588ef989d27a96cc2438c9

On Wed, Oct 14, 2020 at 1:53 PM Richard Smith <richard at metafoo.co.uk> wrote:

> On Wed, 14 Oct 2020 at 12:31, Leonard Chan via cfe-commits <
> cfe-commits at 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 at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201014/56570429/attachment-0001.html>


More information about the cfe-commits mailing list