Ignore:
Timestamp:
Jul 24, 2013, 9:04:16 PM (12 years ago)
Author:
[email protected]
Message:

fourthTier: since the FTL disassembly hacks cannot distinguish between code and data, the LLVM disassembler symbol table callback should be able to deal gracefully with arbitrary garbage
https://bugs.webkit.org/show_bug.cgi?id=118313

Reviewed by Mark Hahnenberg.

Give it a mode where we can still crash on unrecognized reference types, so that we might
implement them in the future, but by default just print some stuff and keep going.

  • disassembler/LLVMDisassembler.cpp:

(JSC):
(JSC::symbolLookupCallback):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/disassembler/LLVMDisassembler.cpp

    r153256 r153262  
    3434namespace JSC {
    3535
    36 static const unsigned symbolStringSize = 20;
     36static const unsigned symbolStringSize = 40;
    3737
    3838static const char *symbolLookupCallback(
     
    4040    const char** referenceName)
    4141{
     42    // Set this if you want to debug an unexpected reference type. Currently we only encounter these
     43    // if we try to disassemble garbage, since our code generator never uses them. These include things
     44    // like PC-relative references.
     45    static const bool crashOnUnexpected = false;
     46   
    4247    char* symbolString = static_cast<char*>(opaque);
    4348   
     
    5358        return symbolString;
    5459    default:
    55         dataLog("referenceValue = ", referenceValue, "\n");
    56         dataLog("referenceType = ", RawPointer(referenceType), ", *referenceType = ", *referenceType, "\n");
    57         dataLog("referencePC = ", referencePC, "\n");
    58         dataLog("referenceName = ", RawPointer(referenceName), "\n");
    59    
    60         RELEASE_ASSERT_NOT_REACHED();
    61         return 0;
     60        if (crashOnUnexpected) {
     61            dataLog("referenceValue = ", referenceValue, "\n");
     62            dataLog("referenceType = ", RawPointer(referenceType), ", *referenceType = ", *referenceType, "\n");
     63            dataLog("referencePC = ", referencePC, "\n");
     64            dataLog("referenceName = ", RawPointer(referenceName), "\n");
     65           
     66            RELEASE_ASSERT_NOT_REACHED();
     67        }
     68       
     69        *referenceName = "unimplemented reference type!";
     70        *referenceType = LLVMDisassembler_ReferenceType_InOut_None;
     71        snprintf(
     72            symbolString, symbolStringSize, "unimplemented:0x%lx",
     73            static_cast<unsigned long>(referenceValue));
     74        return symbolString;
    6275    }
    6376}
Note: See TracChangeset for help on using the changeset viewer.