| OLD | NEW | 
|    1 //===--- TargetCXXABI.h - C++ ABI Target Configuration ----------*- C++ -*-===// |    1 //===--- TargetCXXABI.h - C++ ABI Target Configuration ----------*- C++ -*-===// | 
|    2 // |    2 // | 
|    3 //                     The LLVM Compiler Infrastructure |    3 //                     The LLVM Compiler Infrastructure | 
|    4 // |    4 // | 
|    5 // This file is distributed under the University of Illinois Open Source |    5 // This file is distributed under the University of Illinois Open Source | 
|    6 // License. See LICENSE.TXT for details. |    6 // License. See LICENSE.TXT for details. | 
|    7 // |    7 // | 
|    8 //===----------------------------------------------------------------------===// |    8 //===----------------------------------------------------------------------===// | 
|    9 /// |    9 /// | 
|   10 /// \file |   10 /// \file | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   72     iOS64, |   72     iOS64, | 
|   73  |   73  | 
|   74     /// The generic AArch64 ABI is also a modified version of the Itanium ABI, |   74     /// The generic AArch64 ABI is also a modified version of the Itanium ABI, | 
|   75     /// but it has fewer divergences than the 32-bit ARM ABI. |   75     /// but it has fewer divergences than the 32-bit ARM ABI. | 
|   76     /// |   76     /// | 
|   77     /// The relevant changes from the generic ABI in this case are: |   77     /// The relevant changes from the generic ABI in this case are: | 
|   78     ///   - representation of member function pointers adjusted as in ARM. |   78     ///   - representation of member function pointers adjusted as in ARM. | 
|   79     ///   - guard variables  are smaller. |   79     ///   - guard variables  are smaller. | 
|   80     GenericAArch64, |   80     GenericAArch64, | 
|   81  |   81  | 
|   82     // @LOCALMOD-START Emscripten |  | 
|   83     /// Emscripten uses the Itanium C++, with the exception that it uses |  | 
|   84     /// ARM-style pointers to member functions. |  | 
|   85     Emscripten, |  | 
|   86     // @LOCALMOD-END Emscripten |  | 
|   87     /// The generic Mips ABI is a modified version of the Itanium ABI. |   82     /// The generic Mips ABI is a modified version of the Itanium ABI. | 
|   88     /// |   83     /// | 
|   89     /// At the moment, only change from the generic ABI in this case is: |   84     /// At the moment, only change from the generic ABI in this case is: | 
|   90     ///   - representation of member function pointers adjusted as in ARM. |   85     ///   - representation of member function pointers adjusted as in ARM. | 
|   91     GenericMIPS, |   86     GenericMIPS, | 
|   92  |   87  | 
|   93     /// The Microsoft ABI is the ABI used by Microsoft Visual Studio (and |   88     /// The Microsoft ABI is the ABI used by Microsoft Visual Studio (and | 
|   94     /// compatible compilers). |   89     /// compatible compilers). | 
|   95     /// |   90     /// | 
|   96     /// FIXME: should this be split into Win32 and Win64 variants? |   91     /// FIXME: should this be split into Win32 and Win64 variants? | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
|  116   } |  111   } | 
|  117  |  112  | 
|  118   Kind getKind() const { return TheKind; } |  113   Kind getKind() const { return TheKind; } | 
|  119  |  114  | 
|  120   /// \brief Does this ABI generally fall into the Itanium family of ABIs? |  115   /// \brief Does this ABI generally fall into the Itanium family of ABIs? | 
|  121   bool isItaniumFamily() const { |  116   bool isItaniumFamily() const { | 
|  122     switch (getKind()) { |  117     switch (getKind()) { | 
|  123     case GenericAArch64: |  118     case GenericAArch64: | 
|  124     case GenericItanium: |  119     case GenericItanium: | 
|  125     case GenericARM: |  120     case GenericARM: | 
|  126     case Emscripten: // @LOCALMOD Emscripten |  | 
|  127     case iOS: |  121     case iOS: | 
|  128     case iOS64: |  122     case iOS64: | 
|  129     case GenericMIPS: |  123     case GenericMIPS: | 
|  130       return true; |  124       return true; | 
|  131  |  125  | 
|  132     case Microsoft: |  126     case Microsoft: | 
|  133       return false; |  127       return false; | 
|  134     } |  128     } | 
|  135     llvm_unreachable("bad ABI kind"); |  129     llvm_unreachable("bad ABI kind"); | 
|  136   } |  130   } | 
|  137  |  131  | 
|  138   /// \brief Is this ABI an MSVC-compatible ABI? |  132   /// \brief Is this ABI an MSVC-compatible ABI? | 
|  139   bool isMicrosoft() const { |  133   bool isMicrosoft() const { | 
|  140     switch (getKind()) { |  134     switch (getKind()) { | 
|  141     case GenericAArch64: |  135     case GenericAArch64: | 
|  142     case GenericItanium: |  136     case GenericItanium: | 
|  143     case GenericARM: |  137     case GenericARM: | 
|  144     case Emscripten: // @LOCALMOD Emscripten |  | 
|  145     case iOS: |  138     case iOS: | 
|  146     case iOS64: |  139     case iOS64: | 
|  147     case GenericMIPS: |  140     case GenericMIPS: | 
|  148       return false; |  141       return false; | 
|  149  |  142  | 
|  150     case Microsoft: |  143     case Microsoft: | 
|  151       return true; |  144       return true; | 
|  152     } |  145     } | 
|  153     llvm_unreachable("bad ABI kind"); |  146     llvm_unreachable("bad ABI kind"); | 
|  154   } |  147   } | 
|  155  |  148  | 
|  156   // @LOCALMOD-START Emscripten |  | 
|  157   /// \brief Are pointers to member functions differently aligned? |  | 
|  158   bool arePointersToMemberFunctionsAligned() const { |  | 
|  159     switch (getKind()) { |  | 
|  160     case Emscripten: |  | 
|  161       // Emscripten uses table indices for function pointers and therefore |  | 
|  162       // doesn't require alignment. |  | 
|  163       return false; |  | 
|  164     case GenericARM: |  | 
|  165     case GenericAArch64: |  | 
|  166       // TODO: ARM-style pointers to member functions put the discriminator in |  | 
|  167       //       the this adjustment, so they don't require functions to have any |  | 
|  168       //       special alignment and could therefore also return false. |  | 
|  169     case GenericItanium: |  | 
|  170     case GenericMIPS: |  | 
|  171     case iOS: |  | 
|  172     case iOS64: |  | 
|  173     case Microsoft: |  | 
|  174       return true; |  | 
|  175     } |  | 
|  176     llvm_unreachable("bad ABI kind"); |  | 
|  177   } |  | 
|  178   // @LOCALMOD-END Emscripten |  | 
|  179  |  | 
|  180   /// \brief Is the default C++ member function calling convention |  149   /// \brief Is the default C++ member function calling convention | 
|  181   /// the same as the default calling convention? |  150   /// the same as the default calling convention? | 
|  182   bool isMemberFunctionCCDefault() const { |  151   bool isMemberFunctionCCDefault() const { | 
|  183     // Right now, this is always false for Microsoft. |  152     // Right now, this is always false for Microsoft. | 
|  184     return !isMicrosoft(); |  153     return !isMicrosoft(); | 
|  185   } |  154   } | 
|  186  |  155  | 
|  187   /// Are arguments to a call destroyed left to right in the callee? |  156   /// Are arguments to a call destroyed left to right in the callee? | 
|  188   /// This is a fundamental language change, since it implies that objects |  157   /// This is a fundamental language change, since it implies that objects | 
|  189   /// passed by value do *not* live to the end of the full expression. |  158   /// passed by value do *not* live to the end of the full expression. | 
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  242   /// exploiting this observation requires an ABI break and cannot be |  211   /// exploiting this observation requires an ABI break and cannot be | 
|  243   /// done on a generic Itanium platform. |  212   /// done on a generic Itanium platform. | 
|  244   bool canKeyFunctionBeInline() const { |  213   bool canKeyFunctionBeInline() const { | 
|  245     switch (getKind()) { |  214     switch (getKind()) { | 
|  246     case GenericARM: |  215     case GenericARM: | 
|  247     case iOS64: |  216     case iOS64: | 
|  248       return false; |  217       return false; | 
|  249  |  218  | 
|  250     case GenericAArch64: |  219     case GenericAArch64: | 
|  251     case GenericItanium: |  220     case GenericItanium: | 
|  252     case Emscripten: // @LOCALMOD Emscripten |  | 
|  253     case iOS:   // old iOS compilers did not follow this rule |  221     case iOS:   // old iOS compilers did not follow this rule | 
|  254     case Microsoft: |  222     case Microsoft: | 
|  255     case GenericMIPS: |  223     case GenericMIPS: | 
|  256       return true; |  224       return true; | 
|  257     } |  225     } | 
|  258     llvm_unreachable("bad ABI kind"); |  226     llvm_unreachable("bad ABI kind"); | 
|  259   } |  227   } | 
|  260  |  228  | 
|  261   /// When is record layout allowed to allocate objects in the tail |  229   /// When is record layout allowed to allocate objects in the tail | 
|  262   /// padding of a base class? |  230   /// padding of a base class? | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
|  290     UseTailPaddingUnlessPOD11 |  258     UseTailPaddingUnlessPOD11 | 
|  291   }; |  259   }; | 
|  292   TailPaddingUseRules getTailPaddingUseRules() const { |  260   TailPaddingUseRules getTailPaddingUseRules() const { | 
|  293     switch (getKind()) { |  261     switch (getKind()) { | 
|  294     // To preserve binary compatibility, the generic Itanium ABI has |  262     // To preserve binary compatibility, the generic Itanium ABI has | 
|  295     // permanently locked the definition of POD to the rules of C++ TR1, |  263     // permanently locked the definition of POD to the rules of C++ TR1, | 
|  296     // and that trickles down to all the derived ABIs. |  264     // and that trickles down to all the derived ABIs. | 
|  297     case GenericItanium: |  265     case GenericItanium: | 
|  298     case GenericAArch64: |  266     case GenericAArch64: | 
|  299     case GenericARM: |  267     case GenericARM: | 
|  300     case Emscripten: // @LOCALMOD Emscripten |  | 
|  301     case iOS: |  268     case iOS: | 
|  302     case GenericMIPS: |  269     case GenericMIPS: | 
|  303       return UseTailPaddingUnlessPOD03; |  270       return UseTailPaddingUnlessPOD03; | 
|  304  |  271  | 
|  305     // iOS on ARM64 uses the C++11 POD rules.  It does not honor the |  272     // iOS on ARM64 uses the C++11 POD rules.  It does not honor the | 
|  306     // Itanium exception about classes with over-large bitfields. |  273     // Itanium exception about classes with over-large bitfields. | 
|  307     case iOS64: |  274     case iOS64: | 
|  308       return UseTailPaddingUnlessPOD11; |  275       return UseTailPaddingUnlessPOD11; | 
|  309  |  276  | 
|  310     // MSVC always allocates fields in the tail-padding of a base class |  277     // MSVC always allocates fields in the tail-padding of a base class | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  323   } |  290   } | 
|  324  |  291  | 
|  325   friend bool operator!=(const TargetCXXABI &left, const TargetCXXABI &right) { |  292   friend bool operator!=(const TargetCXXABI &left, const TargetCXXABI &right) { | 
|  326     return !(left == right); |  293     return !(left == right); | 
|  327   } |  294   } | 
|  328 }; |  295 }; | 
|  329  |  296  | 
|  330 }  // end namespace clang |  297 }  // end namespace clang | 
|  331  |  298  | 
|  332 #endif |  299 #endif | 
| OLD | NEW |