Bug 174005

Summary: DFG_ASSERT should allow stuffing registers before trapping.
Product: WebKit Reporter: Keith Miller <keith_miller>
Component: New BugsAssignee: Keith Miller <keith_miller>
Status: REOPENED    
Severity: Normal CC: benjamin, buildbot, cdumez, cmarcelo, commit-queue, dbates, fpizlo, jfbastien, jlewis3, mark.lam, msaboff, oliver, saam, webkit-bug-importer
Priority: P2 Keywords: InRadar
Version: WebKit Nightly Build   
Hardware: Unspecified   
OS: Unspecified   
Attachments:
Description Flags
Patch
none
Patch
none
Patch
none
Patch for landing
none
Patch for landing
none
Patch for landing
none
Patch for landing
none
Patch for landing none

Keith Miller
Reported 2017-06-29 19:17:04 PDT
DFG_ASSERT should allow stuffing registers before trapping.
Attachments
Patch (11.82 KB, patch)
2017-06-29 19:21 PDT, Keith Miller
no flags
Patch (11.80 KB, patch)
2017-06-29 19:43 PDT, Keith Miller
no flags
Patch (11.90 KB, patch)
2017-06-29 19:56 PDT, Keith Miller
no flags
Patch for landing (11.94 KB, patch)
2017-06-29 21:49 PDT, Keith Miller
no flags
Patch for landing (12.00 KB, patch)
2017-06-29 21:56 PDT, Keith Miller
no flags
Patch for landing (12.04 KB, patch)
2017-06-29 21:57 PDT, Keith Miller
no flags
Patch for landing (13.85 KB, patch)
2017-06-29 22:33 PDT, Keith Miller
no flags
Patch for landing (12.57 KB, patch)
2017-06-29 22:43 PDT, Keith Miller
no flags
Keith Miller
Comment 1 2017-06-29 19:21:48 PDT
Keith Miller
Comment 2 2017-06-29 19:43:25 PDT
Keith Miller
Comment 3 2017-06-29 19:56:24 PDT
Mark Lam
Comment 4 2017-06-29 20:56:30 PDT
Comment on attachment 314214 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=314214&action=review > Source/JavaScriptCore/ChangeLog:12 > + up to five registers right befor e crashing. The values stuffed typo: /befor e/before/. > Source/JavaScriptCore/dfg/DFGGraph.cpp:1455 > - CRASH_WITH_SECURITY_IMPLICATION(); > + WTFReportBacktrace(); I have a concern about removing CRASH_WITH_SECURITY_IMPLICATION() here. I'm not certain, but I think CRASH_WITH_SECURITY_IMPLICATION() is used by the security folks for their special testing. I see why you didn't move it into WAI_U_CRASH i.e. because CRASH_WITH_SECURITY_IMPLICATION() results in a function call which can wipe your registers. We need to find a way to preserve this functionality so that the security folks can still use CRASH_WITH_SECURITY_IMPLICATION(). > Source/WTF/wtf/Assertions.h:472 > +ALWAYS_INLINE NO_RETURN_DUE_TO_CRASH void WAI_U_CRASH(Reason reason, A misc1, B misc2, C misc3, D misc4) I think "WAI_U_CRASH" is a bit too cutesy (and very specific to contemporary American colloquialism). Can we just call it CRASH_WITH_DETAILS instead? That seems more clear for people who aren't so hip to the latest cultural jargon (like me). > Source/WTF/wtf/Assertions.h:479 > + CRASH(); Do something about the need for CRASH_WITH_SECURITY_IMPLICATION() here. > Source/WTF/wtf/Assertions.h:534 > +template<typename Reason, typename A, typename B, typename C, typename D> > +ALWAYS_INLINE NO_RETURN_DUE_TO_CRASH void WAI_U_CRASH(Reason reason, A misc1, B misc2, C misc3, D misc4) > +{ > + STUFF_REGISTER_FOR_CRASH("x16", reason); > + STUFF_REGISTER_FOR_CRASH("x17", misc1); > + STUFF_REGISTER_FOR_CRASH("x18", misc2); > + STUFF_REGISTER_FOR_CRASH("x19", misc3); > + STUFF_REGISTER_FOR_CRASH("x20", misc4); > + CRASH(); > +} nit: Instead of duplicating the functions, how about just defining a set of registers like so: #if CPU(X86_64) && OS(DARWIN) #define CRASH_DETAIL_REGISTER1 "r11" #define CRASH_DETAIL_REGISTER2 "r10" ... #elif CPU(ARM64) && OS(DARWIN) #define CRASH_DETAIL_REGISTER1 "x16" #define CRASH_DETAIL_REGISTER2 "x17" ... #endif #if OS(DARWIN) && (CPU(X86_64) || CPU(ARM64)) template<typename Reason, typename A, typename B, typename C, typename D> ALWAYS_INLINE NO_RETURN_DUE_TO_CRASH void CRASH_WITH_DETAILS(Reason reason, A misc1, B misc2, C misc3, D misc4) { STUFF_REGISTER_FOR_CRASH(CRASH_DETAIL_REGISTER1, reason); STUFF_REGISTER_FOR_CRASH(CRASH_DETAIL_REGISTER1, misc1); ... } ...
Mark Lam
Comment 5 2017-06-29 21:06:31 PDT
Comment on attachment 314214 [details] Patch Regarding the use of CRASH_WITH_SECURITY_IMPLICATION, I talked with Keith offline and we agree that we'll: 1. define a DFG_CRASH_WITH_SECURITY_IMPLICATION() if not already defined. By default, it will be define to CRASH(). 2. This DFG_ASSERT code will use DFG_CRASH_WITH_SECURITY_IMPLICATION() instead of CRASH() directly. r=me with fixes.
Keith Miller
Comment 6 2017-06-29 21:48:26 PDT
Comment on attachment 314214 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=314214&action=review >> Source/JavaScriptCore/ChangeLog:12 >> + up to five registers right befor e crashing. The values stuffed > > typo: /befor e/before/. fixed. >> Source/WTF/wtf/Assertions.h:472 >> +ALWAYS_INLINE NO_RETURN_DUE_TO_CRASH void WAI_U_CRASH(Reason reason, A misc1, B misc2, C misc3, D misc4) > > I think "WAI_U_CRASH" is a bit too cutesy (and very specific to contemporary American colloquialism). Can we just call it CRASH_WITH_DETAILS instead? That seems more clear for people who aren't so hip to the latest cultural jargon (like me). :( fair enough... I changed it to CRASH_WITH_INFO. >> Source/WTF/wtf/Assertions.h:479 >> + CRASH(); > > Do something about the need for CRASH_WITH_SECURITY_IMPLICATION() here. I ended up going with an INLINE_CRASH_WITH_SECURITY_IMPLICATION that defaults to CRASH() >> Source/WTF/wtf/Assertions.h:534 >> +} > > nit: Instead of duplicating the functions, how about just defining a set of registers like so: > > #if CPU(X86_64) && OS(DARWIN) > #define CRASH_DETAIL_REGISTER1 "r11" > #define CRASH_DETAIL_REGISTER2 "r10" > ... > #elif CPU(ARM64) && OS(DARWIN) > #define CRASH_DETAIL_REGISTER1 "x16" > #define CRASH_DETAIL_REGISTER2 "x17" > ... > #endif > > #if OS(DARWIN) && (CPU(X86_64) || CPU(ARM64)) > template<typename Reason, typename A, typename B, typename C, typename D> > ALWAYS_INLINE NO_RETURN_DUE_TO_CRASH void CRASH_WITH_DETAILS(Reason reason, A misc1, B misc2, C misc3, D misc4) > { > STUFF_REGISTER_FOR_CRASH(CRASH_DETAIL_REGISTER1, reason); > STUFF_REGISTER_FOR_CRASH(CRASH_DETAIL_REGISTER1, misc1); > ... > } > ... Nice! changed.
Keith Miller
Comment 7 2017-06-29 21:49:19 PDT
Created attachment 314229 [details] Patch for landing
Keith Miller
Comment 8 2017-06-29 21:56:44 PDT
Created attachment 314230 [details] Patch for landing
Keith Miller
Comment 9 2017-06-29 21:57:09 PDT
Created attachment 314231 [details] Patch for landing
Saam Barati
Comment 10 2017-06-29 22:03:10 PDT
Comment on attachment 314229 [details] Patch for landing View in context: https://bugs.webkit.org/attachment.cgi?id=314229&action=review LGTM too > Source/JavaScriptCore/dfg/DFGGraph.h:96 > +#define DFG_ASSERT(graph, node, assertion, ...) do { \ Why not just have this call logForCrash directly now. handleAssertionFailure seems slightly like a misnomer now since it doesn’t crash > Source/WTF/wtf/Assertions.h:477 > +#define STUFF_REGISTER_FOR_CRASH(reg, value) __asm__ volatile ("movq %0, %%" reg : : "r" (static_cast<uint64_t>(value)) : reg) Nit: we might want this to be bitwise_cast in the future so we can log doubles
Keith Miller
Comment 11 2017-06-29 22:09:19 PDT
> View in context: > https://bugs.webkit.org/attachment.cgi?id=314229&action=review > > LGTM too > > > Source/JavaScriptCore/dfg/DFGGraph.h:96 > > +#define DFG_ASSERT(graph, node, assertion, ...) do { \ > > Why not just have this call logForCrash directly now. handleAssertionFailure > seems slightly like a misnomer now since it doesn’t crash I changed it to logAssertionFailure. > > > Source/WTF/wtf/Assertions.h:477 > > +#define STUFF_REGISTER_FOR_CRASH(reg, value) __asm__ volatile ("movq %0, %%" reg : : "r" (static_cast<uint64_t>(value)) : reg) > > Nit: we might want this to be bitwise_cast in the future so we can log > doubles bitwise_cast asserts you have the right size. I think it's easier to bitwise_cast your doubles/floats since those will be less common. I suppose I could add a static assert that the type of the value is integral so people don't forget to cast.
Saam Barati
Comment 12 2017-06-29 22:32:30 PDT
(In reply to Keith Miller from comment #11) > > View in context: > > https://bugs.webkit.org/attachment.cgi?id=314229&action=review > > > > LGTM too > > > > > Source/JavaScriptCore/dfg/DFGGraph.h:96 > > > +#define DFG_ASSERT(graph, node, assertion, ...) do { \ > > > > Why not just have this call logForCrash directly now. handleAssertionFailure > > seems slightly like a misnomer now since it doesn’t crash > > I changed it to logAssertionFailure. > > > > > > Source/WTF/wtf/Assertions.h:477 > > > +#define STUFF_REGISTER_FOR_CRASH(reg, value) __asm__ volatile ("movq %0, %%" reg : : "r" (static_cast<uint64_t>(value)) : reg) > > > > Nit: we might want this to be bitwise_cast in the future so we can log > > doubles > > bitwise_cast asserts you have the right size. I think it's easier to > bitwise_cast your doubles/floats since those will be less common. I suppose > I could add a static assert that the type of the value is integral so people > don't forget to cast. I think we can probably do this in a later patch as needed.
Keith Miller
Comment 13 2017-06-29 22:33:46 PDT
Created attachment 314236 [details] Patch for landing
Keith Miller
Comment 14 2017-06-29 22:43:12 PDT
Created attachment 314237 [details] Patch for landing
WebKit Commit Bot
Comment 15 2017-06-30 01:23:21 PDT
Comment on attachment 314237 [details] Patch for landing Clearing flags on attachment: 314237 Committed r218992: <http://trac.webkit.org/changeset/218992>
WebKit Commit Bot
Comment 16 2017-06-30 01:23:23 PDT
All reviewed patches have been landed. Closing bug.
Oliver Hunt
Comment 17 2017-06-30 08:42:35 PDT
Comment on attachment 314237 [details] Patch for landing View in context: https://bugs.webkit.org/attachment.cgi?id=314237&action=review > Source/WTF/wtf/Assertions.h:557 > +ALWAYS_INLINE NO_RETURN_DUE_TO_CRASH void CRASH_WITH_INFO(Types...) webkit style says this should not be a pile of uppercase, even if it is replacing what used to be a macro (which i don't believe it is?)
JF Bastien
Comment 18 2017-06-30 08:43:25 PDT
Comment on attachment 314237 [details] Patch for landing View in context: https://bugs.webkit.org/attachment.cgi?id=314237&action=review This is super cool! :D > Source/WTF/wtf/Assertions.h:481 > +// This ordering was chosen to be consistant with JSC's JIT asserts. We probably shouldn't change this ordering "consistent"
Filip Pizlo
Comment 19 2017-06-30 09:22:47 PDT
Comment on attachment 314237 [details] Patch for landing View in context: https://bugs.webkit.org/attachment.cgi?id=314237&action=review > Source/WTF/wtf/Assertions.h:471 > +#ifndef INLINE_CRASH_WITH_SECURITY_IMPLICATION > +// This is useful if you are going to stuff data into registers before crashing. Like the CRASH_WITH_INFO functions below... > +#define INLINE_CRASH_WITH_SECURITY_IMPLICATION() CRASH() > +#endif Really don't like this change. This likely means that clang will rage-coalesce all crashes to the same origin. This means that we will get crash logs that claim for example that we crashed at vector overflow, even though it's a DFG_CRASH. Can we revert this change to use a crash function call instead, and pass line/file info to that function to prevent rage-coalescing?
Matt Lewis
Comment 21 2017-06-30 11:38:04 PDT
Reverted r218992 for reason: The patch broke the iOS device builds. Committed r219006: <http://trac.webkit.org/changeset/219006>
Radar WebKit Bug Importer
Comment 22 2017-07-03 13:41:08 PDT
Note You need to log in before you can comment on or make changes to this bug.