diff --git a/js/xpconnect/src/XPCWrappedNative.cpp b/js/xpconnect/src/XPCWrappedNative.cpp --- js/xpconnect/src/XPCWrappedNative.cpp +++ js/xpconnect/src/XPCWrappedNative.cpp @@ -1152,16 +1152,20 @@ bool XPCWrappedNative::CallMethod(XPCCal if (NS_FAILED(rv)) { return Throw(rv, ccx); } JS::Rooted helper(ccx, /* init = */ ccx); return helper.get().Call(); } +#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN) +// Work around a compiler bug on ppc64le (bug 1512162). +__attribute__ ((noinline,noclone)) +#endif bool CallMethodHelper::Call() { mCallContext.SetRetVal(JS::UndefinedValue()); mCallContext.GetContext()->SetPendingException(nullptr); if (mVTableIndex == 0) { return QueryInterfaceFastPath(); } @@ -1310,16 +1314,20 @@ bool CallMethodHelper::GetOutParamSource return false; } } } return true; } +#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN) +// Work around a compiler bug on ppc64le (bug 1512162). +__attribute__ ((noinline,noclone)) +#endif bool CallMethodHelper::GatherAndConvertResults() { // now we iterate through the native params to gather and convert results uint8_t paramCount = mMethodInfo->GetParamCount(); for (uint8_t i = 0; i < paramCount; i++) { const nsXPTParamInfo& paramInfo = mMethodInfo->GetParam(i); if (!paramInfo.IsOut()) { continue; }