Ignore:
Timestamp:
Feb 25, 2012, 4:19:07 PM (13 years ago)
Author:
[email protected]
Message:

LLInt assembly file should be split into 32-bit and 64-bit parts
https://bugs.webkit.org/show_bug.cgi?id=79584

Reviewed by Sam Weinig.

Moved LowLevelInterpreter.asm to LowLevelInterpreter32_64.asm. Gave offlineasm
the ability to include files, and correctly track dependencies: it restricts
the include mechanism to using the same directory as the source file, and uses
the SHA1 hash of all .asm files in that directory as an input hash.

  • llint/LLIntOfflineAsmConfig.h:
  • llint/LowLevelInterpreter.asm:
  • llint/LowLevelInterpreter32_64.asm: Added.
    • This is just the entire contents of what was previously LowLevelInterpreter.asm
  • llint/LowLevelInterpreter64.asm: Added.
  • offlineasm/asm.rb:
  • offlineasm/ast.rb:
  • offlineasm/generate_offset_extractor.rb:
  • offlineasm/parser.rb:
  • offlineasm/self_hash.rb:
File:
1 edited

Legend:

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

    r108444 r108913  
    2424require "ast"
    2525require "instructions"
     26require "pathname"
    2627require "registers"
     28require "self_hash"
     29
     30class CodeOrigin
     31    attr_reader :fileName, :lineNumber
     32   
     33    def initialize(fileName, lineNumber)
     34        @fileName = fileName
     35        @lineNumber = lineNumber
     36    end
     37   
     38    def to_s
     39        "#{fileName}:#{lineNumber}"
     40    end
     41end
    2742
    2843class Token
     
    4762   
    4863    def to_s
    49         "#{@string.inspect} at line #{codeOrigin}"
     64        "#{@string.inspect} at #{codeOrigin}"
    5065    end
    5166   
     
    6378#
    6479
    65 def lex(str)
     80def lex(str, fileName)
     81    fileName = Pathname.new(fileName)
    6682    result = []
    6783    lineNumber = 1
     
    7187            # comment, ignore
    7288        when /\A\n/
    73             result << Token.new(lineNumber, $&)
     89            result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
    7490            lineNumber += 1
    7591        when /\A[a-zA-Z]([a-zA-Z0-9_]*)/
    76             result << Token.new(lineNumber, $&)
     92            result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
    7793        when /\A\.([a-zA-Z0-9_]*)/
    78             result << Token.new(lineNumber, $&)
     94            result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
    7995        when /\A_([a-zA-Z0-9_]*)/
    80             result << Token.new(lineNumber, $&)
     96            result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
    8197        when /\A([ \t]+)/
    8298            # whitespace, ignore
    8399        when /\A0x([0-9a-fA-F]+)/
    84             result << Token.new(lineNumber, $&.hex.to_s)
     100            result << Token.new(CodeOrigin.new(fileName, lineNumber), $&.hex.to_s)
    85101        when /\A0([0-7]+)/
    86             result << Token.new(lineNumber, $&.oct.to_s)
     102            result << Token.new(CodeOrigin.new(fileName, lineNumber), $&.oct.to_s)
    87103        when /\A([0-9]+)/
    88             result << Token.new(lineNumber, $&)
     104            result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
    89105        when /\A::/
    90             result << Token.new(lineNumber, $&)
     106            result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
    91107        when /\A[:,\(\)\[\]=\+\-*]/
    92             result << Token.new(lineNumber, $&)
    93         else
    94             raise "Lexer error at line number #{lineNumber}, unexpected sequence #{str[0..20].inspect}"
     108            result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
     109        else
     110            raise "Lexer error at #{CodeOrigin.new(fileName, lineNumber).to_s}, unexpected sequence #{str[0..20].inspect}"
    95111        end
    96112        str = $~.post_match
     
    112128
    113129def isKeyword(token)
    114     token =~ /\A((true)|(false)|(if)|(then)|(else)|(elsif)|(end)|(and)|(or)|(not)|(macro)|(const)|(sizeof)|(error))\Z/ or
     130    token =~ /\A((true)|(false)|(if)|(then)|(else)|(elsif)|(end)|(and)|(or)|(not)|(macro)|(const)|(sizeof)|(error)|(include))\Z/ or
    115131        token =~ REGISTER_PATTERN or
    116132        token =~ INSTRUCTION_PATTERN
     
    143159
    144160class Parser
    145     def initialize(tokens)
    146         @tokens = tokens
     161    def initialize(data, fileName)
     162        @tokens = lex(data, fileName)
    147163        @idx = 0
    148164    end
     
    572588                end
    573589                @idx += 1
     590            elsif @tokens[@idx] == "include"
     591                @idx += 1
     592                parseError unless isIdentifier(@tokens[@idx])
     593                moduleName = @tokens[@idx].string
     594                fileName = @tokens[@idx].codeOrigin.fileName.dirname + (moduleName + ".asm")
     595                @idx += 1
     596                $stderr.puts "offlineasm: Including file #{fileName}"
     597                list << parse(fileName)
    574598            else
    575599                parseError "Expecting terminal #{final} #{comment}"
     
    580604end
    581605
    582 def parse(tokens)
    583     parser = Parser.new(tokens)
     606def parseData(data, fileName)
     607    parser = Parser.new(data, fileName)
    584608    parser.parseSequence(nil, "")
    585609end
    586610
     611def parse(fileName)
     612    parseData(IO::read(fileName), fileName)
     613end
     614
     615def parseHash(fileName)
     616    dirHash(Pathname.new(fileName).dirname, /\.asm$/)
     617end
     618
Note: See TracChangeset for help on using the changeset viewer.