Ignore:
Timestamp:
Apr 10, 2014, 3:33:59 PM (11 years ago)
Author:
[email protected]
Message:

LLInt interpreter code should be generated as part of one function
https://bugs.webkit.org/show_bug.cgi?id=131205

Reviewed by Mark Lam.

Source/JavaScriptCore:

Changed the generation of llint opcodes so that they are all part of the same
global function, llint_entry. That function is used to fill in an entry point
table that includes each of the opcodes and helpers.

Added appropriate use of new -I option to offline assembler and offset
generator scripts.

  • llint/LowLevelInterpreter.asm:
  • llint/LowLevelInterpreter.cpp:
  • llint/LowLevelInterpreter.h:
  • offlineasm/arm.rb:
  • offlineasm/arm64.rb:
  • offlineasm/asm.rb:
  • offlineasm/ast.rb:
  • offlineasm/backends.rb:
  • offlineasm/cloop.rb:
  • offlineasm/generate_offset_extractor.rb:
  • offlineasm/instructions.rb:
  • offlineasm/parser.rb:
  • offlineasm/registers.rb:
  • offlineasm/self_hash.rb:
  • offlineasm/settings.rb:
  • offlineasm/transform.rb:
  • offlineasm/x86.rb:

Added a new "global" keyword to the offline assembler that denotes a label that
should be exported. Added opcode and operand support to get the absolute
address of a local label using position independent calculations. Updated the
offline assembler to handle included files, both when generating the checksum
as well as including files from other than the local directory via a newly
added -I option. The offline assembler now automatically determines external
functions by keeping track of referenced functions that are defined within the
assembly source. This is used both for choosing the correct macro for external
references as well as generating the needed EXTERN directives for masm.
Updated the generation of the masm only .sym file to be written once at the end
of the offline assembler.

  • assembler/MacroAssemblerCodeRef.h:

(JSC::MacroAssemblerCodePtr::createLLIntCodePtr):
(JSC::MacroAssemblerCodeRef::createLLIntCodeRef):

  • bytecode/CodeBlock.cpp:

(JSC::CodeBlock::dumpBytecode):
(JSC::CodeBlock::CodeBlock):

  • bytecode/GetByIdStatus.cpp:

(JSC::GetByIdStatus::computeFromLLInt):

  • bytecode/Opcode.h:

(JSC::padOpcodeName):

  • bytecode/PutByIdStatus.cpp:

(JSC::PutByIdStatus::computeFromLLInt):

  • jit/JIT.cpp:

(JSC::JIT::privateCompileMainPass):

  • jit/JITStubs.h:
  • llint/LLIntCLoop.cpp:

(JSC::LLInt::initialize):

  • llint/LLIntData.h:

(JSC::LLInt::getCodeFunctionPtr):
(JSC::LLInt::getOpcode): Deleted.
(JSC::LLInt::getCodePtr): Deleted.

  • llint/LLIntOpcode.h:
  • llint/LLIntSlowPaths.cpp:

(JSC::LLInt::LLINT_SLOW_PATH_DECL):

  • llint/LLIntThunks.cpp:

(JSC::LLInt::functionForCallEntryThunkGenerator):
(JSC::LLInt::functionForConstructEntryThunkGenerator):
(JSC::LLInt::functionForCallArityCheckThunkGenerator):
(JSC::LLInt::functionForConstructArityCheckThunkGenerator):
(JSC::LLInt::evalEntryThunkGenerator):
(JSC::LLInt::programEntryThunkGenerator):

  • llint/LLIntThunks.h:

Changed references to llint helpers to go through the entry point table populated
by llint_entry. Added helpers to OpcodeID enum for all builds.

  • bytecode/BytecodeList.json:
  • generate-bytecode-files:
  • llint/LLIntCLoop.cpp:

(JSC::LLInt::CLoop::initialize):
Reordered sections to match the order that the functions are added to the entry point
table. Added new "asmPrefix" property for symbols that have one name but are generated
with a prefix, e.g. op_enter -> llint_op_enter. Eliminated the "emitDefineID" property
as we are using enums for all bytecode references. Changed the C Loop only
llint_c_loop_init to llint_entry.

Source/WebKit:

Updated VS dependencies for JavaScriptCore changes.

  • WebKit.vcxproj/WebKit.sln:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/offlineasm/ast.rb

    r148474 r167094  
    230230    end
    231231   
     232    def immediateOperand?
     233        true
     234    end
     235       
    232236    def register?
    233237        false
     
    256260    end
    257261   
    258     def address?
    259         false
    260     end
    261    
    262     def label?
    263         false
    264     end
    265    
    266     def immediate?
     262    def value
     263        "#{left.value} + #{right.value}"
     264    end
     265   
     266    def address?
     267        false
     268    end
     269   
     270    def label?
     271        false
     272    end
     273   
     274    def immediate?
     275        true
     276    end
     277   
     278    def immediateOperand?
    267279        true
    268280    end
     
    294306    end
    295307   
    296     def address?
    297         false
    298     end
    299    
    300     def label?
    301         false
    302     end
    303    
    304     def immediate?
     308    def value
     309        "#{left.value} - #{right.value}"
     310    end
     311   
     312    def address?
     313        false
     314    end
     315   
     316    def label?
     317        false
     318    end
     319   
     320    def immediate?
     321        true
     322    end
     323   
     324    def immediateOperand?
    305325        true
    306326    end
     
    344364    end
    345365   
     366    def immediateOperand?
     367        false
     368    end
     369   
    346370    def register?
    347371        false
     
    381405    end
    382406   
     407    def immediateOperand?
     408        false
     409    end
     410   
    383411    def register?
    384412        false
     
    419447    end
    420448   
     449    def immediateOperand?
     450        false
     451    end
     452   
    421453    def register?
    422454        false
     
    457489    end
    458490   
     491    def immediateOperand?
     492        false
     493    end
     494   
    459495    def register?
    460496        false
     
    495531    end
    496532   
     533    def immediateOperand?
     534        false
     535    end
     536   
    497537    def register?
    498538        false
     
    530570    def immediate?
    531571        true
     572    end
     573   
     574    def immediateOperand?
     575        false
    532576    end
    533577   
     
    608652    end
    609653   
     654    def immediateOperand?
     655        false
     656    end
     657   
    610658    def register?
    611659        true
     
    627675   
    628676    def immediate?
     677        false
     678    end
     679   
     680    def immediateOperand?
    629681        false
    630682    end
     
    698750    def immediate?
    699751        false
     752    end
     753   
     754    def immediateOperand?
     755        true
    700756    end
    701757   
     
    760816    end
    761817   
     818    def immediateOperand?
     819        false
     820    end
     821   
    762822    def register?
    763823        false
     
    791851    def immediate?
    792852        false
     853    end
     854   
     855    def immediateOperand?
     856        true
    793857    end
    794858   
     
    865929
    866930$labelMapping = {}
     931$referencedExternLabels = Array.new
    867932
    868933class Label < NoChildren
     
    872937        super(codeOrigin)
    873938        @name = name
    874     end
    875    
    876     def self.forName(codeOrigin, name)
     939        @extern = true
     940        @global = false
     941    end
     942   
     943    def self.forName(codeOrigin, name, definedInFile = false)
    877944        if $labelMapping[name]
    878945            raise "Label name collision: #{name}" unless $labelMapping[name].is_a? Label
     
    880947            $labelMapping[name] = Label.new(codeOrigin, name)
    881948        end
     949        if definedInFile
     950            $labelMapping[name].clearExtern()
     951        end
    882952        $labelMapping[name]
    883953    end
    884    
     954
     955    def self.setAsGlobal(codeOrigin, name)
     956        if $labelMapping[name]
     957            label = $labelMapping[name]
     958            raise "Label: #{name} declared global multiple times" unless not label.global?
     959            label.setGlobal()
     960        else
     961            newLabel = Label.new(codeOrigin, name)
     962            newLabel.setGlobal()
     963            $labelMapping[name] = newLabel
     964        end
     965    end
     966
     967    def self.resetReferenced
     968        $referencedExternLabels = Array.new
     969    end
     970
     971    def self.forReferencedExtern()
     972        $referencedExternLabels.each {
     973            | label |
     974            yield "#{label.name}"
     975        }
     976    end
     977
     978    def clearExtern
     979        @extern = false
     980    end
     981
     982    def extern?
     983        @extern
     984    end
     985
     986    def setGlobal
     987        @global = true
     988    end
     989
     990    def global?
     991        @global
     992    end
     993
    885994    def dump
    886995        "#{name}:"
     
    9501059    end
    9511060   
     1061    def extern?
     1062        $labelMapping[name].is_a? Label and $labelMapping[name].extern?
     1063    end
     1064
     1065    def used
     1066        if !$referencedExternLabels.include?(@label) and extern?
     1067            $referencedExternLabels.push(@label)
     1068        end
     1069    end
     1070
    9521071    def dump
    9531072        label.name
    9541073    end
    9551074   
    956     def address?
    957         false
    958     end
    959    
    960     def label?
    961         true
    962     end
    963    
    964     def immediate?
    965         false
     1075    def value
     1076        asmLabel()
     1077    end
     1078
     1079    def address?
     1080        false
     1081    end
     1082   
     1083    def label?
     1084        true
     1085    end
     1086   
     1087    def immediate?
     1088        false
     1089    end
     1090   
     1091    def immediateOperand?
     1092        true
    9661093    end
    9671094end
     
    9901117        label.name
    9911118    end
    992    
    993     def address?
    994         false
    995     end
    996    
    997     def label?
    998         true
    999     end
    1000    
    1001     def immediate?
    1002         false
     1119
     1120    def value
     1121        asmLabel()
     1122    end
     1123   
     1124    def address?
     1125        false
     1126    end
     1127   
     1128    def label?
     1129        true
     1130    end
     1131   
     1132    def immediate?
     1133        false
     1134    end
     1135   
     1136    def immediateOperand?
     1137        true
    10031138    end
    10041139end
Note: See TracChangeset for help on using the changeset viewer.