lowerStackArgs: check Arg::addr.isValidForm when falling back to SP offsets
authorjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Apr 2017 17:36:01 +0000 (17:36 +0000)
committerjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Apr 2017 17:36:01 +0000 (17:36 +0000)
https://bugs.webkit.org/show_bug.cgi?id=171278

Reviewed by Filip Pizlo.

lowerStackArgs checked that the FP offsets it tries to generate
are valid form, but didn't check that the fallback was valid
form. This lead to stackAddr's assertion being dead, and the
MaroAssembler asserting way later on move / add when handed a huge
immediate.

* b3/air/AirArg.cpp:
(JSC::B3::Air::Arg::stackAddrImpl):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@215743 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/b3/air/AirArg.cpp

index 423798b..44cfe74 100644 (file)
@@ -1,3 +1,19 @@
+2017-04-25  JF Bastien  <jfbastien@apple.com>
+
+        lowerStackArgs: check Arg::addr.isValidForm when falling back to SP offsets
+        https://bugs.webkit.org/show_bug.cgi?id=171278
+
+        Reviewed by Filip Pizlo.
+
+        lowerStackArgs checked that the FP offsets it tries to generate
+        are valid form, but didn't check that the fallback was valid
+        form. This lead to stackAddr's assertion being dead, and the
+        MaroAssembler asserting way later on move / add when handed a huge
+        immediate.
+
+        * b3/air/AirArg.cpp:
+        (JSC::B3::Air::Arg::stackAddrImpl):
+
 2017-04-25  Zan Dobersek  <zdobersek@igalia.com>
 
         [aarch64] moveConditionally32(), moveConditionallyTest32() should move from/to 64-bit registers
index d0e6912..6e8a5dc 100644 (file)
@@ -48,6 +48,8 @@ Arg Arg::stackAddrImpl(int32_t offsetFromFP, unsigned frameSize, Width width)
         result = Arg::addr(
             Air::Tmp(MacroAssembler::stackPointerRegister),
             offsetFromFP + frameSize);
+        if (!result.isValidForm(width))
+            result = Arg();
     }
     return result;
 }