InlinableNatives.cpp (16125B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * vim: set ts=8 sts=2 et sw=2 tw=80: 3 * This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "jit/InlinableNatives.h" 8 9 #ifdef JS_HAS_INTL_API 10 # include "builtin/intl/Collator.h" 11 # include "builtin/intl/DateTimeFormat.h" 12 # include "builtin/intl/DisplayNames.h" 13 # include "builtin/intl/DurationFormat.h" 14 # include "builtin/intl/ListFormat.h" 15 # include "builtin/intl/NumberFormat.h" 16 # include "builtin/intl/PluralRules.h" 17 # include "builtin/intl/RelativeTimeFormat.h" 18 # include "builtin/intl/Segmenter.h" 19 #endif 20 #ifdef ENABLE_EXPLICIT_RESOURCE_MANAGEMENT 21 # include "builtin/AsyncDisposableStackObject.h" 22 # include "builtin/DisposableStackObject.h" 23 #endif 24 #include "builtin/MapObject.h" 25 #include "js/experimental/JitInfo.h" 26 #include "vm/ArrayBufferObject.h" 27 #include "vm/AsyncIteration.h" 28 #include "vm/Iteration.h" 29 #include "vm/SharedArrayObject.h" 30 31 using namespace js; 32 using namespace js::jit; 33 34 #define ADD_NATIVE(native) \ 35 const JSJitInfo js::jit::JitInfo_##native{ \ 36 {nullptr}, \ 37 {uint16_t(InlinableNative::native)}, \ 38 {0}, \ 39 JSJitInfo::InlinableNative}; 40 INLINABLE_NATIVE_LIST(ADD_NATIVE) 41 #undef ADD_NATIVE 42 43 const JSClass* js::jit::InlinableNativeGuardToClass(InlinableNative native) { 44 switch (native) { 45 #ifdef JS_HAS_INTL_API 46 // Intl natives. 47 case InlinableNative::IntlGuardToCollator: 48 return &CollatorObject::class_; 49 case InlinableNative::IntlGuardToDateTimeFormat: 50 return &DateTimeFormatObject::class_; 51 case InlinableNative::IntlGuardToDisplayNames: 52 return &DisplayNamesObject::class_; 53 case InlinableNative::IntlGuardToDurationFormat: 54 return &DurationFormatObject::class_; 55 case InlinableNative::IntlGuardToListFormat: 56 return &ListFormatObject::class_; 57 case InlinableNative::IntlGuardToNumberFormat: 58 return &NumberFormatObject::class_; 59 case InlinableNative::IntlGuardToPluralRules: 60 return &PluralRulesObject::class_; 61 case InlinableNative::IntlGuardToRelativeTimeFormat: 62 return &RelativeTimeFormatObject::class_; 63 case InlinableNative::IntlGuardToSegmenter: 64 return &SegmenterObject::class_; 65 case InlinableNative::IntlGuardToSegments: 66 return &SegmentsObject::class_; 67 case InlinableNative::IntlGuardToSegmentIterator: 68 return &SegmentIteratorObject::class_; 69 #else 70 case InlinableNative::IntlGuardToCollator: 71 case InlinableNative::IntlGuardToDateTimeFormat: 72 case InlinableNative::IntlGuardToDisplayNames: 73 case InlinableNative::IntlGuardToListFormat: 74 case InlinableNative::IntlGuardToNumberFormat: 75 case InlinableNative::IntlGuardToPluralRules: 76 case InlinableNative::IntlGuardToRelativeTimeFormat: 77 case InlinableNative::IntlGuardToSegmenter: 78 case InlinableNative::IntlGuardToSegments: 79 case InlinableNative::IntlGuardToSegmentIterator: 80 MOZ_CRASH("Intl API disabled"); 81 #endif 82 83 // Utility intrinsics. 84 case InlinableNative::IntrinsicGuardToArrayIterator: 85 return &ArrayIteratorObject::class_; 86 case InlinableNative::IntrinsicGuardToMapIterator: 87 return &MapIteratorObject::class_; 88 case InlinableNative::IntrinsicGuardToSetIterator: 89 return &SetIteratorObject::class_; 90 case InlinableNative::IntrinsicGuardToStringIterator: 91 return &StringIteratorObject::class_; 92 case InlinableNative::IntrinsicGuardToRegExpStringIterator: 93 return &RegExpStringIteratorObject::class_; 94 case InlinableNative::IntrinsicGuardToWrapForValidIterator: 95 return &WrapForValidIteratorObject::class_; 96 case InlinableNative::IntrinsicGuardToIteratorHelper: 97 return &IteratorHelperObject::class_; 98 #ifdef NIGHTLY_BUILD 99 case InlinableNative::IntrinsicGuardToIteratorRange: 100 return &IteratorRangeObject::class_; 101 #endif 102 case InlinableNative::IntrinsicGuardToAsyncIteratorHelper: 103 return &AsyncIteratorHelperObject::class_; 104 #ifdef ENABLE_EXPLICIT_RESOURCE_MANAGEMENT 105 case InlinableNative::IntrinsicGuardToAsyncDisposableStack: 106 return &AsyncDisposableStackObject::class_; 107 case InlinableNative::IntrinsicGuardToDisposableStack: 108 return &DisposableStackObject::class_; 109 #endif 110 111 case InlinableNative::IntrinsicGuardToMapObject: 112 return &MapObject::class_; 113 case InlinableNative::IntrinsicGuardToSetObject: 114 return &SetObject::class_; 115 case InlinableNative::IntrinsicGuardToArrayBuffer: 116 return &FixedLengthArrayBufferObject::class_; 117 case InlinableNative::IntrinsicGuardToSharedArrayBuffer: 118 return &FixedLengthSharedArrayBufferObject::class_; 119 120 default: 121 MOZ_CRASH("Not a GuardTo instruction"); 122 } 123 } 124 125 // Returns true if |native| can be inlined cross-realm. Especially inlined 126 // natives that can allocate objects or throw exceptions shouldn't be inlined 127 // cross-realm without a careful analysis because we might use the wrong realm! 128 // 129 // Note that self-hosting intrinsics are never called cross-realm. See the 130 // MOZ_CRASH below. 131 // 132 // If you are adding a new inlinable native, the safe thing is to |return false| 133 // here. 134 bool js::jit::CanInlineNativeCrossRealm(InlinableNative native) { 135 switch (native) { 136 case InlinableNative::MathAbs: 137 case InlinableNative::MathFloor: 138 case InlinableNative::MathCeil: 139 case InlinableNative::MathRound: 140 case InlinableNative::MathClz32: 141 case InlinableNative::MathSqrt: 142 case InlinableNative::MathATan2: 143 case InlinableNative::MathHypot: 144 case InlinableNative::MathMax: 145 case InlinableNative::MathMin: 146 case InlinableNative::MathPow: 147 case InlinableNative::MathImul: 148 case InlinableNative::MathFRound: 149 case InlinableNative::MathF16Round: 150 case InlinableNative::MathTrunc: 151 case InlinableNative::MathSign: 152 case InlinableNative::MathSin: 153 case InlinableNative::MathTan: 154 case InlinableNative::MathCos: 155 case InlinableNative::MathExp: 156 case InlinableNative::MathLog: 157 case InlinableNative::MathASin: 158 case InlinableNative::MathATan: 159 case InlinableNative::MathACos: 160 case InlinableNative::MathLog10: 161 case InlinableNative::MathLog2: 162 case InlinableNative::MathLog1P: 163 case InlinableNative::MathExpM1: 164 case InlinableNative::MathCosH: 165 case InlinableNative::MathSinH: 166 case InlinableNative::MathTanH: 167 case InlinableNative::MathACosH: 168 case InlinableNative::MathASinH: 169 case InlinableNative::MathATanH: 170 case InlinableNative::MathCbrt: 171 case InlinableNative::Boolean: 172 return true; 173 174 case InlinableNative::Array: 175 // Cross-realm case handled by inlineArray. 176 return true; 177 178 case InlinableNative::MathRandom: 179 // RNG state is per-realm. 180 return false; 181 182 case InlinableNative::IntlGuardToCollator: 183 case InlinableNative::IntlGuardToDateTimeFormat: 184 case InlinableNative::IntlGuardToDisplayNames: 185 case InlinableNative::IntlGuardToDurationFormat: 186 case InlinableNative::IntlGuardToListFormat: 187 case InlinableNative::IntlGuardToNumberFormat: 188 case InlinableNative::IntlGuardToPluralRules: 189 case InlinableNative::IntlGuardToRelativeTimeFormat: 190 case InlinableNative::IntlGuardToSegmenter: 191 case InlinableNative::IntlGuardToSegments: 192 case InlinableNative::IntlGuardToSegmentIterator: 193 case InlinableNative::IsRegExpObject: 194 case InlinableNative::IsOptimizableRegExpObject: 195 case InlinableNative::IsPossiblyWrappedRegExpObject: 196 case InlinableNative::IsRegExpPrototypeOptimizable: 197 case InlinableNative::RegExpMatcher: 198 case InlinableNative::RegExpSearcher: 199 case InlinableNative::RegExpSearcherLastLimit: 200 case InlinableNative::RegExpHasCaptureGroups: 201 case InlinableNative::GetFirstDollarIndex: 202 case InlinableNative::IntrinsicNewArrayIterator: 203 case InlinableNative::IntrinsicNewStringIterator: 204 case InlinableNative::IntrinsicNewRegExpStringIterator: 205 case InlinableNative::IntrinsicStringReplaceString: 206 case InlinableNative::IntrinsicStringSplitString: 207 case InlinableNative::IntrinsicUnsafeSetReservedSlot: 208 case InlinableNative::IntrinsicUnsafeGetReservedSlot: 209 case InlinableNative::IntrinsicUnsafeGetObjectFromReservedSlot: 210 case InlinableNative::IntrinsicUnsafeGetInt32FromReservedSlot: 211 case InlinableNative::IntrinsicUnsafeGetStringFromReservedSlot: 212 case InlinableNative::IntrinsicIsCallable: 213 case InlinableNative::IntrinsicIsConstructor: 214 case InlinableNative::IntrinsicToObject: 215 case InlinableNative::IntrinsicIsObject: 216 case InlinableNative::IntrinsicIsCrossRealmArrayConstructor: 217 case InlinableNative::IntrinsicCanOptimizeArraySpecies: 218 case InlinableNative::IntrinsicToInteger: 219 case InlinableNative::IntrinsicToLength: 220 case InlinableNative::IntrinsicIsConstructing: 221 case InlinableNative::IntrinsicIsSuspendedGenerator: 222 case InlinableNative::IntrinsicSubstringKernel: 223 case InlinableNative::IntrinsicGuardToArrayIterator: 224 case InlinableNative::IntrinsicGuardToMapIterator: 225 case InlinableNative::IntrinsicGuardToSetIterator: 226 case InlinableNative::IntrinsicGuardToStringIterator: 227 case InlinableNative::IntrinsicGuardToRegExpStringIterator: 228 case InlinableNative::IntrinsicGuardToWrapForValidIterator: 229 case InlinableNative::IntrinsicGuardToIteratorHelper: 230 case InlinableNative::IntrinsicGuardToAsyncIteratorHelper: 231 #ifdef NIGHTLY_BUILD 232 case InlinableNative::IntrinsicGuardToIteratorRange: 233 #endif 234 case InlinableNative::IntrinsicIsPackedArray: 235 case InlinableNative::IntrinsicGuardToMapObject: 236 case InlinableNative::IntrinsicGetNextMapEntryForIterator: 237 case InlinableNative::IntrinsicGuardToSetObject: 238 case InlinableNative::IntrinsicGetNextSetEntryForIterator: 239 case InlinableNative::IntrinsicGuardToArrayBuffer: 240 case InlinableNative::IntrinsicGuardToSharedArrayBuffer: 241 case InlinableNative::IntrinsicIsTypedArrayConstructor: 242 case InlinableNative::IntrinsicIsTypedArray: 243 case InlinableNative::IntrinsicIsPossiblyWrappedTypedArray: 244 case InlinableNative::IntrinsicPossiblyWrappedTypedArrayLength: 245 case InlinableNative::IntrinsicRegExpBuiltinExec: 246 case InlinableNative::IntrinsicRegExpBuiltinExecForTest: 247 case InlinableNative::IntrinsicRegExpExec: 248 case InlinableNative::IntrinsicRegExpExecForTest: 249 case InlinableNative::IntrinsicTypedArrayLength: 250 case InlinableNative::IntrinsicArrayIteratorPrototypeOptimizable: 251 #ifdef ENABLE_EXPLICIT_RESOURCE_MANAGEMENT 252 case InlinableNative::IntrinsicGuardToAsyncDisposableStack: 253 case InlinableNative::IntrinsicGuardToDisposableStack: 254 #endif 255 MOZ_CRASH("Unexpected cross-realm intrinsic call"); 256 257 case InlinableNative::TestBailout: 258 case InlinableNative::TestAssertFloat32: 259 case InlinableNative::TestAssertRecoveredOnBailout: 260 // Testing functions, not worth inlining cross-realm. 261 return false; 262 263 case InlinableNative::ArrayIsArray: 264 case InlinableNative::ArrayJoin: 265 case InlinableNative::ArrayPop: 266 case InlinableNative::ArrayShift: 267 case InlinableNative::ArrayPush: 268 case InlinableNative::ArraySlice: 269 case InlinableNative::ArrayBufferByteLength: 270 case InlinableNative::AtomicsCompareExchange: 271 case InlinableNative::AtomicsExchange: 272 case InlinableNative::AtomicsLoad: 273 case InlinableNative::AtomicsStore: 274 case InlinableNative::AtomicsAdd: 275 case InlinableNative::AtomicsSub: 276 case InlinableNative::AtomicsAnd: 277 case InlinableNative::AtomicsOr: 278 case InlinableNative::AtomicsXor: 279 case InlinableNative::AtomicsIsLockFree: 280 case InlinableNative::AtomicsPause: 281 case InlinableNative::BigInt: 282 case InlinableNative::BigIntAsIntN: 283 case InlinableNative::BigIntAsUintN: 284 case InlinableNative::DataViewGetInt8: 285 case InlinableNative::DataViewGetUint8: 286 case InlinableNative::DataViewGetInt16: 287 case InlinableNative::DataViewGetUint16: 288 case InlinableNative::DataViewGetInt32: 289 case InlinableNative::DataViewGetUint32: 290 case InlinableNative::DataViewGetFloat16: 291 case InlinableNative::DataViewGetFloat32: 292 case InlinableNative::DataViewGetFloat64: 293 case InlinableNative::DataViewGetBigInt64: 294 case InlinableNative::DataViewGetBigUint64: 295 case InlinableNative::DataViewSetInt8: 296 case InlinableNative::DataViewSetUint8: 297 case InlinableNative::DataViewSetInt16: 298 case InlinableNative::DataViewSetUint16: 299 case InlinableNative::DataViewSetInt32: 300 case InlinableNative::DataViewSetUint32: 301 case InlinableNative::DataViewSetFloat16: 302 case InlinableNative::DataViewSetFloat32: 303 case InlinableNative::DataViewSetFloat64: 304 case InlinableNative::DataViewSetBigInt64: 305 case InlinableNative::DataViewSetBigUint64: 306 case InlinableNative::DataViewByteLength: 307 case InlinableNative::DataViewByteOffset: 308 case InlinableNative::DateGetTime: 309 case InlinableNative::DateGetFullYear: 310 case InlinableNative::DateGetMonth: 311 case InlinableNative::DateGetDate: 312 case InlinableNative::DateGetDay: 313 case InlinableNative::DateGetHours: 314 case InlinableNative::DateGetMinutes: 315 case InlinableNative::DateGetSeconds: 316 case InlinableNative::FunctionBind: 317 case InlinableNative::MapConstructor: 318 case InlinableNative::MapGet: 319 case InlinableNative::MapHas: 320 case InlinableNative::MapDelete: 321 case InlinableNative::MapSet: 322 case InlinableNative::MapSize: 323 case InlinableNative::Number: 324 case InlinableNative::NumberParseInt: 325 case InlinableNative::NumberToString: 326 case InlinableNative::ReflectGetPrototypeOf: 327 case InlinableNative::RegExpDotAll: 328 case InlinableNative::RegExpGlobal: 329 case InlinableNative::RegExpHasIndices: 330 case InlinableNative::RegExpIgnoreCase: 331 case InlinableNative::RegExpMultiline: 332 case InlinableNative::RegExpSticky: 333 case InlinableNative::RegExpUnicode: 334 case InlinableNative::RegExpUnicodeSets: 335 case InlinableNative::SetConstructor: 336 case InlinableNative::SetHas: 337 case InlinableNative::SetDelete: 338 case InlinableNative::SetAdd: 339 case InlinableNative::SetSize: 340 case InlinableNative::SharedArrayBufferByteLength: 341 case InlinableNative::String: 342 case InlinableNative::StringToString: 343 case InlinableNative::StringValueOf: 344 case InlinableNative::StringCharCodeAt: 345 case InlinableNative::StringCodePointAt: 346 case InlinableNative::StringFromCharCode: 347 case InlinableNative::StringFromCodePoint: 348 case InlinableNative::StringCharAt: 349 case InlinableNative::StringAt: 350 case InlinableNative::StringIncludes: 351 case InlinableNative::StringIndexOf: 352 case InlinableNative::StringLastIndexOf: 353 case InlinableNative::StringStartsWith: 354 case InlinableNative::StringEndsWith: 355 case InlinableNative::StringToLowerCase: 356 case InlinableNative::StringToUpperCase: 357 case InlinableNative::StringToLocaleLowerCase: 358 case InlinableNative::StringToLocaleUpperCase: 359 case InlinableNative::StringTrim: 360 case InlinableNative::StringTrimStart: 361 case InlinableNative::StringTrimEnd: 362 case InlinableNative::Object: 363 case InlinableNative::ObjectCreate: 364 case InlinableNative::ObjectIs: 365 case InlinableNative::ObjectIsPrototypeOf: 366 case InlinableNative::ObjectKeys: 367 case InlinableNative::ObjectToString: 368 case InlinableNative::TypedArrayConstructor: 369 case InlinableNative::TypedArrayFill: 370 case InlinableNative::TypedArraySet: 371 case InlinableNative::TypedArraySubarray: 372 case InlinableNative::TypedArrayLength: 373 case InlinableNative::TypedArrayByteLength: 374 case InlinableNative::TypedArrayByteOffset: 375 case InlinableNative::WeakMapGet: 376 case InlinableNative::WeakMapHas: 377 case InlinableNative::WeakSetHas: 378 #ifdef FUZZING_JS_FUZZILLI 379 case InlinableNative::FuzzilliHash: 380 #endif 381 // Default to false for most natives. 382 return false; 383 384 case InlinableNative::Limit: 385 break; 386 } 387 MOZ_CRASH("Unknown native"); 388 }