Changeset 200543 in webkit


Ignore:
Timestamp:
May 7, 2016, 9:20:16 AM (8 years ago)
Author:
mark.lam@apple.com
Message:

Add JSC options bytecodeRangeToJITCompile and jitWhitelist.
https://bugs.webkit.org/show_bug.cgi?id=157428

Reviewed by Michael Saboff.

  1. Added Options::bytecodeRangeToJITCompile and Options::jitWhitelist options.
  1. Moved DFGFunctionWhitelist* to FunctionWhitelist* and made it generic so that it can be used for more than one whitelist instance. In this case, we now have two: the dfgWhitelist and the jitWhitelist.
  1. Added "can compile" checks in LLInt::shouldJIT() to check Options::bytecodeRangeToJITCompile and Options::jitWhitelist.
  • CMakeLists.txt:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • dfg/DFGDriver.cpp:

(JSC::DFG::getNumCompilations):
(JSC::DFG::ensureGlobalDFGWhitelist):
(JSC::DFG::compileImpl):

  • dfg/DFGFunctionWhitelist.cpp: Removed.
  • dfg/DFGFunctionWhitelist.h: Removed.
  • llint/LLIntSlowPaths.cpp:

(JSC::LLInt::ensureGlobalJITWhitelist):
(JSC::LLInt::shouldJIT):

  • runtime/Options.h:
  • tools/FunctionWhitelist.cpp: Copied from Source/JavaScriptCore/dfg/DFGFunctionWhitelist.cpp.

(JSC::FunctionWhitelist::FunctionWhitelist):
(JSC::FunctionWhitelist::contains):
(JSC::DFG::FunctionWhitelist::ensureGlobalWhitelist): Deleted.
(JSC::DFG::FunctionWhitelist::FunctionWhitelist): Deleted.
(JSC::DFG::FunctionWhitelist::parseFunctionNamesInFile): Deleted.
(JSC::DFG::FunctionWhitelist::contains): Deleted.

  • tools/FunctionWhitelist.h: Copied from Source/JavaScriptCore/dfg/DFGFunctionWhitelist.h.
Location:
trunk/Source/JavaScriptCore
Files:
6 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r200430 r200543  
    290290    dfg/DFGLiveCatchVariablePreservationPhase.cpp
    291291    dfg/DFGFrozenValue.cpp
    292     dfg/DFGFunctionWhitelist.cpp
    293292    dfg/DFGGraph.cpp
    294293    dfg/DFGGraphSafepoint.cpp
     
    827826    tools/CodeProfiling.cpp
    828827    tools/FunctionOverrides.cpp
     828    tools/FunctionWhitelist.cpp
    829829    tools/JSDollarVM.cpp
    830830    tools/JSDollarVMPrototype.cpp
  • trunk/Source/JavaScriptCore/ChangeLog

    r200541 r200543  
     12016-05-07  Mark Lam  <mark.lam@apple.com>
     2
     3        Add JSC options bytecodeRangeToJITCompile and jitWhitelist.
     4        https://bugs.webkit.org/show_bug.cgi?id=157428
     5
     6        Reviewed by Michael Saboff.
     7
     8        1. Added Options::bytecodeRangeToJITCompile and Options::jitWhitelist options.
     9
     10        2. Moved DFGFunctionWhitelist* to FunctionWhitelist* and made it generic so that
     11           it can be used for more than one whitelist instance.  In this case, we now have
     12           two: the dfgWhitelist and the jitWhitelist.
     13
     14        3. Added "can compile" checks in LLInt::shouldJIT() to check
     15           Options::bytecodeRangeToJITCompile and Options::jitWhitelist.
     16
     17        * CMakeLists.txt:
     18        * JavaScriptCore.xcodeproj/project.pbxproj:
     19        * dfg/DFGDriver.cpp:
     20        (JSC::DFG::getNumCompilations):
     21        (JSC::DFG::ensureGlobalDFGWhitelist):
     22        (JSC::DFG::compileImpl):
     23        * dfg/DFGFunctionWhitelist.cpp: Removed.
     24        * dfg/DFGFunctionWhitelist.h: Removed.
     25
     26        * llint/LLIntSlowPaths.cpp:
     27        (JSC::LLInt::ensureGlobalJITWhitelist):
     28        (JSC::LLInt::shouldJIT):
     29
     30        * runtime/Options.h:
     31
     32        * tools/FunctionWhitelist.cpp: Copied from Source/JavaScriptCore/dfg/DFGFunctionWhitelist.cpp.
     33        (JSC::FunctionWhitelist::FunctionWhitelist):
     34        (JSC::FunctionWhitelist::contains):
     35        (JSC::DFG::FunctionWhitelist::ensureGlobalWhitelist): Deleted.
     36        (JSC::DFG::FunctionWhitelist::FunctionWhitelist): Deleted.
     37        (JSC::DFG::FunctionWhitelist::parseFunctionNamesInFile): Deleted.
     38        (JSC::DFG::FunctionWhitelist::contains): Deleted.
     39        * tools/FunctionWhitelist.h: Copied from Source/JavaScriptCore/dfg/DFGFunctionWhitelist.h.
     40
    1412016-05-07  Benjamin Poulain  <bpoulain@apple.com>
    242
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r200430 r200543  
    11321132                2A83638918D7D0FE0000EBCC /* FullGCActivityCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A83638718D7D0FE0000EBCC /* FullGCActivityCallback.cpp */; };
    11331133                2A83638A18D7D0FE0000EBCC /* FullGCActivityCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A83638818D7D0FE0000EBCC /* FullGCActivityCallback.h */; settings = {ATTRIBUTES = (Private, ); }; };
    1134                 2A88067819107D5500CB0BBB /* DFGFunctionWhitelist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2A88067619107D5500CB0BBB /* DFGFunctionWhitelist.cpp */; };
    1135                 2A88067919107D5500CB0BBB /* DFGFunctionWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A88067719107D5500CB0BBB /* DFGFunctionWhitelist.h */; };
    11361134                2AAAA31218BD49D100394CC8 /* StructureIDBlob.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AAAA31018BD49D100394CC8 /* StructureIDBlob.h */; settings = {ATTRIBUTES = (Private, ); }; };
    11371135                2AABCDE718EF294200002096 /* GCLogging.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AABCDE618EF294200002096 /* GCLogging.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    20952093                FEA08620182B7A0400F6D851 /* Breakpoint.h in Headers */ = {isa = PBXBuildFile; fileRef = FEA0861E182B7A0400F6D851 /* Breakpoint.h */; settings = {ATTRIBUTES = (Private, ); }; };
    20962094                FEA08621182B7A0400F6D851 /* DebuggerPrimitives.h in Headers */ = {isa = PBXBuildFile; fileRef = FEA0861F182B7A0400F6D851 /* DebuggerPrimitives.h */; settings = {ATTRIBUTES = (Private, ); }; };
     2095                FEA0C4021CDD7D1D00481991 /* FunctionWhitelist.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEA0C4001CDD7D0E00481991 /* FunctionWhitelist.cpp */; };
     2096                FEA0C4031CDD7D1D00481991 /* FunctionWhitelist.h in Headers */ = {isa = PBXBuildFile; fileRef = FEA0C4011CDD7D0E00481991 /* FunctionWhitelist.h */; };
    20972097                FEA1E4391C213A2B00277A16 /* ValueProfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEA1E4381C213A2600277A16 /* ValueProfile.cpp */; };
    20982098                FEB137571BB11EF900CD5100 /* MacroAssemblerARM64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = FEB137561BB11EEE00CD5100 /* MacroAssemblerARM64.cpp */; };
     
    32663266                2A83638718D7D0FE0000EBCC /* FullGCActivityCallback.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FullGCActivityCallback.cpp; sourceTree = "<group>"; };
    32673267                2A83638818D7D0FE0000EBCC /* FullGCActivityCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FullGCActivityCallback.h; sourceTree = "<group>"; };
    3268                 2A88067619107D5500CB0BBB /* DFGFunctionWhitelist.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGFunctionWhitelist.cpp; path = dfg/DFGFunctionWhitelist.cpp; sourceTree = "<group>"; };
    3269                 2A88067719107D5500CB0BBB /* DFGFunctionWhitelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGFunctionWhitelist.h; path = dfg/DFGFunctionWhitelist.h; sourceTree = "<group>"; };
    32703268                2AAAA31018BD49D100394CC8 /* StructureIDBlob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StructureIDBlob.h; sourceTree = "<group>"; };
    32713269                2AABCDE618EF294200002096 /* GCLogging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GCLogging.h; sourceTree = "<group>"; };
     
    43484346                FEA0861E182B7A0400F6D851 /* Breakpoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Breakpoint.h; sourceTree = "<group>"; };
    43494347                FEA0861F182B7A0400F6D851 /* DebuggerPrimitives.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebuggerPrimitives.h; sourceTree = "<group>"; };
     4348                FEA0C4001CDD7D0E00481991 /* FunctionWhitelist.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FunctionWhitelist.cpp; sourceTree = "<group>"; };
     4349                FEA0C4011CDD7D0E00481991 /* FunctionWhitelist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FunctionWhitelist.h; sourceTree = "<group>"; };
    43504350                FEA1E4381C213A2600277A16 /* ValueProfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ValueProfile.cpp; sourceTree = "<group>"; };
    43514351                FEB137561BB11EEE00CD5100 /* MacroAssemblerARM64.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MacroAssemblerARM64.cpp; sourceTree = "<group>"; };
     
    60616061                                FE4BFF291AD476E700088F87 /* FunctionOverrides.cpp */,
    60626062                                FE4BFF2A1AD476E700088F87 /* FunctionOverrides.h */,
     6063                                FEA0C4001CDD7D0E00481991 /* FunctionWhitelist.cpp */,
     6064                                FEA0C4011CDD7D0E00481991 /* FunctionWhitelist.h */,
    60636065                                FE384EE11ADDB7AD0055DE2C /* JSDollarVM.cpp */,
    60646066                                FE384EE21ADDB7AD0055DE2C /* JSDollarVM.h */,
     
    62156217                                0F69CC86193AC60A0045759E /* DFGFrozenValue.cpp */,
    62166218                                0F69CC87193AC60A0045759E /* DFGFrozenValue.h */,
    6217                                 2A88067619107D5500CB0BBB /* DFGFunctionWhitelist.cpp */,
    6218                                 2A88067719107D5500CB0BBB /* DFGFunctionWhitelist.h */,
    62196219                                86EC9DB61328DF82002B2AD7 /* DFGGenerationInfo.h */,
    62206220                                86EC9DB71328DF82002B2AD7 /* DFGGraph.cpp */,
     
    70797079                                99DA00A91BD5993100F4575C /* builtins_generate_separate_header.py in Headers */,
    70807080                                0F338E111BF0276C0013C88F /* B3OpaqueByproduct.h in Headers */,
     7081                                FEA0C4031CDD7D1D00481991 /* FunctionWhitelist.h in Headers */,
    70817082                                99DA00AA1BD5993100F4575C /* builtins_generate_separate_implementation.py in Headers */,
    70827083                                99DA00A31BD5993100F4575C /* builtins_generator.py in Headers */,
     
    72687269                                0F2DD8151AB3D8BE00BBB8E8 /* DFGForAllKills.h in Headers */,
    72697270                                0F69CC89193AC60A0045759E /* DFGFrozenValue.h in Headers */,
    7270                                 2A88067919107D5500CB0BBB /* DFGFunctionWhitelist.h in Headers */,
    72717271                                86EC9DC61328DF82002B2AD7 /* DFGGenerationInfo.h in Headers */,
    72727272                                86EC9DC81328DF82002B2AD7 /* DFGGraph.h in Headers */,
     
    88358835                                A7D89CF717A0B8CC00773AD8 /* DFGFlushFormat.cpp in Sources */,
    88368836                                0F69CC88193AC60A0045759E /* DFGFrozenValue.cpp in Sources */,
    8837                                 2A88067819107D5500CB0BBB /* DFGFunctionWhitelist.cpp in Sources */,
    88388837                                86EC9DC71328DF82002B2AD7 /* DFGGraph.cpp in Sources */,
    88398838                                0F2FCCF918A60070001A27F8 /* DFGGraphSafepoint.cpp in Sources */,
     
    88508849                                A78A9778179738B8009DF744 /* DFGJITFinalizer.cpp in Sources */,
    88518850                                0FC97F3F18202119002C9B26 /* DFGJumpReplacement.cpp in Sources */,
     8851                                FEA0C4021CDD7D1D00481991 /* FunctionWhitelist.cpp in Sources */,
    88528852                                A73A535A1799CD5D00170C19 /* DFGLazyJSValue.cpp in Sources */,
    88538853                                62F2AA371B0BEDE300610C7A /* DFGLazyNode.cpp in Sources */,
  • trunk/Source/JavaScriptCore/dfg/DFGDriver.cpp

    r198364 r200543  
    3131
    3232#include "CodeBlock.h"
    33 #include "DFGFunctionWhitelist.h"
    3433#include "DFGJITCode.h"
    3534#include "DFGPlan.h"
    3635#include "DFGThunks.h"
    3736#include "DFGWorklist.h"
     37#include "FunctionWhitelist.h"
    3838#include "JITCode.h"
    3939#include "JSCInlines.h"
     
    4141#include "TypeProfilerLog.h"
    4242#include <wtf/Atomics.h>
     43#include <wtf/NeverDestroyed.h>
    4344
    4445#if ENABLE(FTL_JIT)
     
    5657
    5758#if ENABLE(DFG_JIT)
     59static FunctionWhitelist& ensureGlobalDFGWhitelist()
     60{
     61    static LazyNeverDestroyed<FunctionWhitelist> dfgWhitelist;
     62    static std::once_flag initializeWhitelistFlag;
     63    std::call_once(initializeWhitelistFlag, [] {
     64        const char* functionWhitelistFile = Options::dfgWhitelist();
     65        dfgWhitelist.construct(functionWhitelistFile);
     66    });
     67    return dfgWhitelist;
     68}
     69
    5870static CompilationResult compileImpl(
    5971    VM& vm, CodeBlock* codeBlock, CodeBlock* profiledDFGCodeBlock, CompilationMode mode,
     
    6274{
    6375    if (!Options::bytecodeRangeToDFGCompile().isInRange(codeBlock->instructionCount())
    64         || !FunctionWhitelist::ensureGlobalWhitelist().contains(codeBlock))
     76        || !ensureGlobalDFGWhitelist().contains(codeBlock))
    6577        return CompilationFailed;
    6678   
  • trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp

    r199864 r200543  
    3535#include "Exception.h"
    3636#include "ExceptionFuzz.h"
     37#include "FunctionWhitelist.h"
    3738#include "GetterSetter.h"
    3839#include "HostCallReturnValue.h"
     
    5758#include "StructureRareDataInlines.h"
    5859#include "VMInlines.h"
     60#include <wtf/NeverDestroyed.h>
    5961#include <wtf/StringPrintStream.h>
    6062
     
    288290
    289291#if ENABLE(JIT)
    290 inline bool shouldJIT(ExecState* exec, CodeBlock*)
    291 {
     292static FunctionWhitelist& ensureGlobalJITWhitelist()
     293{
     294    static LazyNeverDestroyed<FunctionWhitelist> baselineWhitelist;
     295    static std::once_flag initializeWhitelistFlag;
     296    std::call_once(initializeWhitelistFlag, [] {
     297        const char* functionWhitelistFile = Options::jitWhitelist();
     298        baselineWhitelist.construct(functionWhitelistFile);
     299    });
     300    return baselineWhitelist;
     301}
     302
     303inline bool shouldJIT(ExecState* exec, CodeBlock* codeBlock)
     304{
     305    if (!Options::bytecodeRangeToJITCompile().isInRange(codeBlock->instructionCount())
     306        || !ensureGlobalJITWhitelist().contains(codeBlock))
     307        return false;
     308
    292309    // You can modify this to turn off JITting without rebuilding the world.
    293310    return exec->vm().canUseJIT();
  • trunk/Source/JavaScriptCore/runtime/Options.h

    r200531 r200543  
    146146    v(bool, dumpFTLDisassembly, false, Normal, "dumps disassembly of FTL function upon compilation") \
    147147    v(bool, dumpAllDFGNodes, false, Normal, nullptr) \
     148    v(optionRange, bytecodeRangeToJITCompile, 0, Normal, "bytecode size range to allow compilation on, e.g. 1:100") \
    148149    v(optionRange, bytecodeRangeToDFGCompile, 0, Normal, "bytecode size range to allow DFG compilation on, e.g. 1:100") \
    149150    v(optionRange, bytecodeRangeToFTLCompile, 0, Normal, "bytecode size range to allow FTL compilation on, e.g. 1:100") \
     151    v(optionString, jitWhitelist, nullptr, Normal, "file with list of function signatures to allow compilation on") \
    150152    v(optionString, dfgWhitelist, nullptr, Normal, "file with list of function signatures to allow DFG compilation on") \
    151153    v(bool, dumpSourceAtDFGTime, false, Normal, "dumps source code of JS function being DFG compiled") \
  • trunk/Source/JavaScriptCore/tools/FunctionWhitelist.cpp

    r200530 r200543  
    11/*
    2  * Copyright (C) 2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2525
    2626#include "config.h"
    27 #include "DFGFunctionWhitelist.h"
     27#include "FunctionWhitelist.h"
    2828
    29 #if ENABLE(DFG_JIT)
     29#if ENABLE(JIT)
    3030
    3131#include "CodeBlock.h"
     
    3333#include <stdio.h>
    3434#include <string.h>
    35 #include <wtf/NeverDestroyed.h>
    3635#include <wtf/text/StringBuilder.h>
    3736
    38 namespace JSC { namespace DFG {
    39 
    40 FunctionWhitelist& FunctionWhitelist::ensureGlobalWhitelist()
    41 {
    42     static LazyNeverDestroyed<FunctionWhitelist> functionWhitelist;
    43     static std::once_flag initializeWhitelistFlag;
    44     std::call_once(initializeWhitelistFlag, [] {
    45         const char* functionWhitelistFile = Options::dfgWhitelist();
    46         functionWhitelist.construct(functionWhitelistFile);
    47     });
    48     return functionWhitelist;
    49 }
     37namespace JSC {
    5038
    5139FunctionWhitelist::FunctionWhitelist(const char* filename)
    52 {
    53     parseFunctionNamesInFile(filename);
    54 }
    55 
    56 void FunctionWhitelist::parseFunctionNamesInFile(const char* filename)
    5740{
    5841    if (!filename)
     
    6447        return;
    6548    }
     49
     50    m_hasActiveWhitelist = true;
    6651
    6752    char* line;
     
    9075}
    9176
    92 bool FunctionWhitelist::contains(CodeBlock* codeBlock) const 
     77bool FunctionWhitelist::contains(CodeBlock* codeBlock) const
    9378{
    9479    ASSERT(!isCompilationThread());
    95     if (!Options::dfgWhitelist())
     80    if (!m_hasActiveWhitelist)
    9681        return true;
    9782
     
    11095}
    11196
    112 } } // namespace JSC::DFG
     97} // namespace JSC
    11398
    114 #endif // ENABLE(DFG_JIT)
     99#endif // ENABLE(JIT)
    115100
  • trunk/Source/JavaScriptCore/tools/FunctionWhitelist.h

    r200530 r200543  
    11/*
    2  * Copyright (C) 2014 Apple Inc. All rights reserved.
     2 * Copyright (C) 2014, 2016 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 #ifndef DFGFunctionWhitelist_h
    27 #define DFGFunctionWhitelist_h
    28 
    29 #if ENABLE(DFG_JIT)
     26#ifndef FunctionWhitelist_h
     27#define FunctionWhitelist_h
    3028
    3129#include <wtf/HashSet.h>
     
    3634class CodeBlock;
    3735
    38 namespace DFG {
    39 
    4036class FunctionWhitelist {
    4137public:
    42     static FunctionWhitelist& ensureGlobalWhitelist();
    4338    explicit FunctionWhitelist(const char*);
    4439
     
    4641
    4742private:
    48     void parseFunctionNamesInFile(const char*);
    49 
    5043    HashSet<String> m_entries;
     44    bool m_hasActiveWhitelist { false };
    5145};
    5246
    53 } } // namespace JSC::DFG
     47} // namespace JSC
    5448
    55 #endif // ENABLE(DFG_JIT)
    56 
    57 #endif // DFGFunctionWhitelist_h
     49#endif // FunctionWhitelist_h
Note: See TracChangeset for help on using the changeset viewer.