Ignore:
Timestamp:
Feb 12, 2016, 6:37:19 PM (9 years ago)
Author:
[email protected]
Message:

offlineasm: Emit Dwarf2 file and location directives to allow for debugging .asm files
https://bugs.webkit.org/show_bug.cgi?id=152703

Reviewed by Mark Lam.

Added support to output Dwarf2 .file and .loc assembler directives to provide the debugging
information needed to correlate the offline assembler generated code with the source lines
in the .asm files.

Changed the tracking of file data to include a file index that was provided to the .file
directive. That index is used when emitting the .loc directives.

  • offlineasm/arm.rb:
  • offlineasm/arm64.rb:
  • offlineasm/asm.rb:
  • offlineasm/backends.rb:
  • offlineasm/config.rb:
  • offlineasm/parser.rb:
  • offlineasm/x86.rb:
File:
1 edited

Legend:

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

    r194531 r196541  
    1 # Copyright (C) 2011 Apple Inc. All rights reserved.
     1# Copyright (C) 2011, 2016 Apple Inc. All rights reserved.
    22#
    33# Redistribution and use in source and binary forms, with or without
     
    2929require "self_hash"
    3030
     31class SourceFile
     32    @@fileNames = []
     33   
     34    attr_reader :name, :fileNumber
     35
     36    def SourceFile.outputDotFileList(outp)
     37        @@fileNames.each_index {
     38            | index |
     39            outp.puts "\".file #{index+1} \\\"#{@@fileNames[index]}\\\"\\n\""
     40        }
     41    end
     42
     43    def initialize(fileName)
     44        @name = Pathname.new(fileName)
     45        pathName = "#{@name.realpath}"
     46        fileNumber = @@fileNames.index(pathName)
     47        if not fileNumber
     48            @@fileNames << pathName
     49            fileNumber = @@fileNames.length
     50        else
     51            fileNumber += 1 # File numbers are 1 based
     52        end
     53        @fileNumber = fileNumber
     54    end
     55end
     56
    3157class CodeOrigin
    32     attr_reader :fileName, :lineNumber
    33    
    34     def initialize(fileName, lineNumber)
    35         @fileName = fileName
     58    attr_reader :lineNumber
     59   
     60    def initialize(sourceFile, lineNumber)
     61        @sourceFile = sourceFile
    3662        @lineNumber = lineNumber
    3763    end
    38    
     64
     65    def fileName
     66        @sourceFile.name
     67    end
     68
     69    def debugDirective
     70        $emitWinAsm ? nil : "\".loc #{@sourceFile.fileNumber} #{lineNumber}\\n\""
     71    end
     72
    3973    def to_s
    4074        "#{fileName}:#{lineNumber}"
     
    118152#
    119153
    120 def lex(str, fileName)
    121     fileName = Pathname.new(fileName)
     154def lex(str, file)
    122155    result = []
    123156    lineNumber = 1
     
    139172            # enableInstrAnnotations is not enabled.
    140173            if annotation
    141                 result << Annotation.new(CodeOrigin.new(fileName, lineNumber),
     174                result << Annotation.new(CodeOrigin.new(file, lineNumber),
    142175                                         annotationType, annotation)
    143176                annotation = nil
    144177            end
    145             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
     178            result << Token.new(CodeOrigin.new(file, lineNumber), $&)
    146179            lineNumber += 1
    147180        when /\A[a-zA-Z]([a-zA-Z0-9_.]*)/
    148             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
     181            result << Token.new(CodeOrigin.new(file, lineNumber), $&)
    149182        when /\A\.([a-zA-Z0-9_]*)/
    150             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
     183            result << Token.new(CodeOrigin.new(file, lineNumber), $&)
    151184        when /\A_([a-zA-Z0-9_]*)/
    152             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
     185            result << Token.new(CodeOrigin.new(file, lineNumber), $&)
    153186        when /\A([ \t]+)/
    154187            # whitespace, ignore
     
    157190            next
    158191        when /\A0x([0-9a-fA-F]+)/
    159             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&.hex.to_s)
     192            result << Token.new(CodeOrigin.new(file, lineNumber), $&.hex.to_s)
    160193        when /\A0([0-7]+)/
    161             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&.oct.to_s)
     194            result << Token.new(CodeOrigin.new(file, lineNumber), $&.oct.to_s)
    162195        when /\A([0-9]+)/
    163             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
     196            result << Token.new(CodeOrigin.new(file, lineNumber), $&)
    164197        when /\A::/
    165             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
     198            result << Token.new(CodeOrigin.new(file, lineNumber), $&)
    166199        when /\A[:,\(\)\[\]=\+\-~\|&^*]/
    167             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
     200            result << Token.new(CodeOrigin.new(file, lineNumber), $&)
    168201        when /\A".*"/
    169             result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
    170         else
    171             raise "Lexer error at #{CodeOrigin.new(fileName, lineNumber).to_s}, unexpected sequence #{str[0..20].inspect}"
     202            result << Token.new(CodeOrigin.new(file, lineNumber), $&)
     203        else
     204            raise "Lexer error at #{CodeOrigin.new(file, lineNumber).to_s}, unexpected sequence #{str[0..20].inspect}"
    172205        end
    173206        whitespaceFound = false
     
    778811
    779812def parseData(data, fileName)
    780     parser = Parser.new(data, fileName)
     813    parser = Parser.new(data, SourceFile.new(fileName))
    781814    parser.parseSequence(nil, "")
    782815end
     
    787820
    788821def parseHash(fileName)
    789     parser = Parser.new(IO::read(fileName), fileName)
     822    parser = Parser.new(IO::read(fileName), SourceFile.new(fileName))
    790823    fileList = parser.parseIncludes(nil, "")
    791824    fileListHash(fileList)
Note: See TracChangeset for help on using the changeset viewer.