Chromium Code Reviews| 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 | |
| 82 /// 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 |
| 83 /// compatible compilers). | 89 /// compatible compilers). |
| 84 /// | 90 /// |
| 85 /// FIXME: should this be split into Win32 and Win64 variants? | 91 /// FIXME: should this be split into Win32 and Win64 variants? |
| 86 /// | 92 /// |
| 87 /// Only scattered and incomplete official documentation exists. | 93 /// Only scattered and incomplete official documentation exists. |
| 88 Microsoft | 94 Microsoft |
| 89 }; | 95 }; |
| 90 | 96 |
| 91 private: | 97 private: |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 105 } | 111 } |
| 106 | 112 |
| 107 Kind getKind() const { return TheKind; } | 113 Kind getKind() const { return TheKind; } |
| 108 | 114 |
| 109 /// \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? |
| 110 bool isItaniumFamily() const { | 116 bool isItaniumFamily() const { |
| 111 switch (getKind()) { | 117 switch (getKind()) { |
| 112 case GenericAArch64: | 118 case GenericAArch64: |
| 113 case GenericItanium: | 119 case GenericItanium: |
| 114 case GenericARM: | 120 case GenericARM: |
| 121 case Emscripten: // @LOCALMOD Emscripten | |
| 115 case iOS: | 122 case iOS: |
| 116 case iOS64: | 123 case iOS64: |
| 117 return true; | 124 return true; |
| 118 | 125 |
| 119 case Microsoft: | 126 case Microsoft: |
| 120 return false; | 127 return false; |
| 121 } | 128 } |
| 122 llvm_unreachable("bad ABI kind"); | 129 llvm_unreachable("bad ABI kind"); |
| 123 } | 130 } |
| 124 | 131 |
| 125 /// \brief Is this ABI an MSVC-compatible ABI? | 132 /// \brief Is this ABI an MSVC-compatible ABI? |
| 126 bool isMicrosoft() const { | 133 bool isMicrosoft() const { |
| 127 switch (getKind()) { | 134 switch (getKind()) { |
| 128 case GenericAArch64: | 135 case GenericAArch64: |
| 129 case GenericItanium: | 136 case GenericItanium: |
| 130 case GenericARM: | 137 case GenericARM: |
| 138 case Emscripten: // @LOCALMOD Emscripten | |
| 131 case iOS: | 139 case iOS: |
| 132 case iOS64: | 140 case iOS64: |
| 133 return false; | 141 return false; |
| 134 | 142 |
| 135 case Microsoft: | 143 case Microsoft: |
| 136 return true; | 144 return true; |
| 137 } | 145 } |
| 138 llvm_unreachable("bad ABI kind"); | 146 llvm_unreachable("bad ABI kind"); |
| 139 } | 147 } |
| 140 | 148 |
| 149 // @LOCALMOD-START Emscripten | |
| 150 /// \brief Are pointers to member functions differently aligned? | |
| 151 bool arePointersToMemberFunctionsAligned() const { | |
| 152 switch (getKind()) { | |
| 153 case Emscripten: | |
| 154 // Emscripten uses table indices for function pointers and therefore | |
| 155 // doesn't require alignment. | |
| 156 return false; | |
| 157 case GenericARM: | |
| 158 case GenericAArch64: | |
| 159 // ARM-style pointers to member functions put the discriminator in the | |
| 160 // this adjustment, so they don't require functions to have any special | |
| 161 // alignment. | |
| 162 return false; | |
| 163 case GenericItanium: | |
|
jvoung (off chromium)
2015/03/20 17:07:07
Hmm, so LE32 uses GenericItanium directly and does
JF
2015/03/20 18:49:38
As discussed on IRC I left ARM as it was, with a T
| |
| 164 case iOS: | |
| 165 case iOS64: | |
| 166 case Microsoft: | |
| 167 return true; | |
| 168 } | |
| 169 llvm_unreachable("bad ABI kind"); | |
| 170 } | |
| 171 // @LOCALMOD-END Emscripten | |
| 172 | |
| 141 /// \brief Is the default C++ member function calling convention | 173 /// \brief Is the default C++ member function calling convention |
| 142 /// the same as the default calling convention? | 174 /// the same as the default calling convention? |
| 143 bool isMemberFunctionCCDefault() const { | 175 bool isMemberFunctionCCDefault() const { |
| 144 // Right now, this is always false for Microsoft. | 176 // Right now, this is always false for Microsoft. |
| 145 return !isMicrosoft(); | 177 return !isMicrosoft(); |
| 146 } | 178 } |
| 147 | 179 |
| 148 /// Are arguments to a call destroyed left to right in the callee? | 180 /// Are arguments to a call destroyed left to right in the callee? |
| 149 /// This is a fundamental language change, since it implies that objects | 181 /// This is a fundamental language change, since it implies that objects |
| 150 /// passed by value do *not* live to the end of the full expression. | 182 /// 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... | |
| 203 /// exploiting this observation requires an ABI break and cannot be | 235 /// exploiting this observation requires an ABI break and cannot be |
| 204 /// done on a generic Itanium platform. | 236 /// done on a generic Itanium platform. |
| 205 bool canKeyFunctionBeInline() const { | 237 bool canKeyFunctionBeInline() const { |
| 206 switch (getKind()) { | 238 switch (getKind()) { |
| 207 case GenericARM: | 239 case GenericARM: |
| 208 case iOS64: | 240 case iOS64: |
| 209 return false; | 241 return false; |
| 210 | 242 |
| 211 case GenericAArch64: | 243 case GenericAArch64: |
| 212 case GenericItanium: | 244 case GenericItanium: |
| 245 case Emscripten: // @LOCALMOD Emscripten | |
| 213 case iOS: // old iOS compilers did not follow this rule | 246 case iOS: // old iOS compilers did not follow this rule |
| 214 case Microsoft: | 247 case Microsoft: |
| 215 return true; | 248 return true; |
| 216 } | 249 } |
| 217 llvm_unreachable("bad ABI kind"); | 250 llvm_unreachable("bad ABI kind"); |
| 218 } | 251 } |
| 219 | 252 |
| 220 /// When is record layout allowed to allocate objects in the tail | 253 /// When is record layout allowed to allocate objects in the tail |
| 221 /// padding of a base class? | 254 /// padding of a base class? |
| 222 /// | 255 /// |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 249 UseTailPaddingUnlessPOD11 | 282 UseTailPaddingUnlessPOD11 |
| 250 }; | 283 }; |
| 251 TailPaddingUseRules getTailPaddingUseRules() const { | 284 TailPaddingUseRules getTailPaddingUseRules() const { |
| 252 switch (getKind()) { | 285 switch (getKind()) { |
| 253 // To preserve binary compatibility, the generic Itanium ABI has | 286 // To preserve binary compatibility, the generic Itanium ABI has |
| 254 // permanently locked the definition of POD to the rules of C++ TR1, | 287 // permanently locked the definition of POD to the rules of C++ TR1, |
| 255 // and that trickles down to all the derived ABIs. | 288 // and that trickles down to all the derived ABIs. |
| 256 case GenericItanium: | 289 case GenericItanium: |
| 257 case GenericAArch64: | 290 case GenericAArch64: |
| 258 case GenericARM: | 291 case GenericARM: |
| 292 case Emscripten: // @LOCALMOD Emscripten | |
| 259 case iOS: | 293 case iOS: |
| 260 return UseTailPaddingUnlessPOD03; | 294 return UseTailPaddingUnlessPOD03; |
| 261 | 295 |
| 262 // iOS on ARM64 uses the C++11 POD rules. It does not honor the | 296 // iOS on ARM64 uses the C++11 POD rules. It does not honor the |
| 263 // Itanium exception about classes with over-large bitfields. | 297 // Itanium exception about classes with over-large bitfields. |
| 264 case iOS64: | 298 case iOS64: |
| 265 return UseTailPaddingUnlessPOD11; | 299 return UseTailPaddingUnlessPOD11; |
| 266 | 300 |
| 267 // MSVC always allocates fields in the tail-padding of a base class | 301 // MSVC always allocates fields in the tail-padding of a base class |
| 268 // subobject, even if they're POD. | 302 // subobject, even if they're POD. |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 280 } | 314 } |
| 281 | 315 |
| 282 friend bool operator!=(const TargetCXXABI &left, const TargetCXXABI &right) { | 316 friend bool operator!=(const TargetCXXABI &left, const TargetCXXABI &right) { |
| 283 return !(left == right); | 317 return !(left == right); |
| 284 } | 318 } |
| 285 }; | 319 }; |
| 286 | 320 |
| 287 } // end namespace clang | 321 } // end namespace clang |
| 288 | 322 |
| 289 #endif | 323 #endif |
| OLD | NEW |