| Index: include/clang/Basic/TargetCXXABI.h
|
| diff --git a/include/clang/Basic/TargetCXXABI.h b/include/clang/Basic/TargetCXXABI.h
|
| index 5669d2a55937da80fd50b351d0cdb2cde89228e6..caf3b0f5aaa5b796b45af590431ef0492f288e05 100644
|
| --- a/include/clang/Basic/TargetCXXABI.h
|
| +++ b/include/clang/Basic/TargetCXXABI.h
|
| @@ -79,6 +79,12 @@ public:
|
| /// - guard variables are smaller.
|
| GenericAArch64,
|
|
|
| + // @LOCALMOD-START Emscripten
|
| + /// Emscripten uses the Itanium C++, with the exception that it uses
|
| + /// ARM-style pointers to member functions.
|
| + Emscripten,
|
| + // @LOCALMOD-END Emscripten
|
| +
|
| /// The Microsoft ABI is the ABI used by Microsoft Visual Studio (and
|
| /// compatible compilers).
|
| ///
|
| @@ -112,6 +118,7 @@ public:
|
| case GenericAArch64:
|
| case GenericItanium:
|
| case GenericARM:
|
| + case Emscripten: // @LOCALMOD Emscripten
|
| case iOS:
|
| case iOS64:
|
| return true;
|
| @@ -128,6 +135,7 @@ public:
|
| case GenericAArch64:
|
| case GenericItanium:
|
| case GenericARM:
|
| + case Emscripten: // @LOCALMOD Emscripten
|
| case iOS:
|
| case iOS64:
|
| return false;
|
| @@ -138,6 +146,29 @@ public:
|
| llvm_unreachable("bad ABI kind");
|
| }
|
|
|
| + // @LOCALMOD-START Emscripten
|
| + /// \brief Are pointers to member functions differently aligned?
|
| + bool arePointersToMemberFunctionsAligned() const {
|
| + switch (getKind()) {
|
| + case Emscripten:
|
| + // Emscripten uses table indices for function pointers and therefore
|
| + // doesn't require alignment.
|
| + return false;
|
| + case GenericARM:
|
| + case GenericAArch64:
|
| + // TODO: ARM-style pointers to member functions put the discriminator in
|
| + // the this adjustment, so they don't require functions to have any
|
| + // special alignment and could therefore also return false.
|
| + case GenericItanium:
|
| + case iOS:
|
| + case iOS64:
|
| + case Microsoft:
|
| + return true;
|
| + }
|
| + llvm_unreachable("bad ABI kind");
|
| + }
|
| + // @LOCALMOD-END Emscripten
|
| +
|
| /// \brief Is the default C++ member function calling convention
|
| /// the same as the default calling convention?
|
| bool isMemberFunctionCCDefault() const {
|
| @@ -210,6 +241,7 @@ public:
|
|
|
| case GenericAArch64:
|
| case GenericItanium:
|
| + case Emscripten: // @LOCALMOD Emscripten
|
| case iOS: // old iOS compilers did not follow this rule
|
| case Microsoft:
|
| return true;
|
| @@ -256,6 +288,7 @@ public:
|
| case GenericItanium:
|
| case GenericAArch64:
|
| case GenericARM:
|
| + case Emscripten: // @LOCALMOD Emscripten
|
| case iOS:
|
| return UseTailPaddingUnlessPOD03;
|
|
|
|
|