diff options
Diffstat (limited to 'Source/JavaScriptCore/offlineasm/ast.rb')
-rw-r--r-- | Source/JavaScriptCore/offlineasm/ast.rb | 179 |
1 files changed, 177 insertions, 2 deletions
diff --git a/Source/JavaScriptCore/offlineasm/ast.rb b/Source/JavaScriptCore/offlineasm/ast.rb index 74bccff56..1241b7fe5 100644 --- a/Source/JavaScriptCore/offlineasm/ast.rb +++ b/Source/JavaScriptCore/offlineasm/ast.rb @@ -229,6 +229,10 @@ class Immediate < NoChildren true end + def immediateOperand? + true + end + def register? false end @@ -255,6 +259,10 @@ class AddImmediates < Node "(#{left.dump} + #{right.dump})" end + def value + "#{left.value} + #{right.value}" + end + def address? false end @@ -267,6 +275,10 @@ class AddImmediates < Node true end + def immediateOperand? + true + end + def register? false end @@ -293,6 +305,10 @@ class SubImmediates < Node "(#{left.dump} - #{right.dump})" end + def value + "#{left.value} - #{right.value}" + end + def address? false end @@ -305,6 +321,10 @@ class SubImmediates < Node true end + def immediateOperand? + true + end + def register? false end @@ -343,6 +363,10 @@ class MulImmediates < Node true end + def immediateOperand? + false + end + def register? false end @@ -380,6 +404,10 @@ class NegImmediate < Node true end + def immediateOperand? + false + end + def register? false end @@ -418,6 +446,10 @@ class OrImmediates < Node true end + def immediateOperand? + false + end + def register? false end @@ -456,6 +488,10 @@ class AndImmediates < Node true end + def immediateOperand? + false + end + def register? false end @@ -494,6 +530,10 @@ class XorImmediates < Node true end + def immediateOperand? + false + end + def register? false end @@ -531,6 +571,48 @@ class BitnotImmediate < Node true end + def immediateOperand? + false + end + + def register? + false + end +end + +class StringLiteral < NoChildren + attr_reader :value + + def initialize(codeOrigin, value) + super(codeOrigin) + @value = value[1..-2] + raise "Bad string literal #{value.inspect} at #{codeOriginString}" unless value.is_a? String + end + + def dump + "#{value}" + end + + def ==(other) + other.is_a? StringLiteral and other.value == @value + end + + def address? + false + end + + def label? + false + end + + def immediate? + false + end + + def immediateOperand? + false + end + def register? false end @@ -607,6 +689,10 @@ class FPRegisterID < NoChildren false end + def immediateOperand? + false + end + def register? true end @@ -629,6 +715,10 @@ class SpecialRegister < NoChildren false end + def immediateOperand? + false + end + def register? true end @@ -699,6 +789,10 @@ class Address < Node false end + def immediateOperand? + true + end + def register? false end @@ -759,6 +853,10 @@ class BaseIndex < Node false end + def immediateOperand? + false + end + def register? false end @@ -792,6 +890,10 @@ class AbsoluteAddress < NoChildren false end + def immediateOperand? + true + end + def register? false end @@ -825,6 +927,8 @@ class Instruction < Node $asm.putLocalAnnotation when "globalAnnotation" $asm.putGlobalAnnotation + when "emit" + $asm.puts "#{operands[0].dump}" else raise "Unhandled opcode #{opcode} at #{codeOriginString}" end @@ -864,6 +968,7 @@ class ConstDecl < Node end $labelMapping = {} +$referencedExternLabels = Array.new class Label < NoChildren attr_reader :name @@ -871,17 +976,61 @@ class Label < NoChildren def initialize(codeOrigin, name) super(codeOrigin) @name = name + @extern = true + @global = false end - def self.forName(codeOrigin, name) + def self.forName(codeOrigin, name, definedInFile = false) if $labelMapping[name] raise "Label name collision: #{name}" unless $labelMapping[name].is_a? Label else $labelMapping[name] = Label.new(codeOrigin, name) end + if definedInFile + $labelMapping[name].clearExtern() + end $labelMapping[name] end - + + def self.setAsGlobal(codeOrigin, name) + if $labelMapping[name] + label = $labelMapping[name] + raise "Label: #{name} declared global multiple times" unless not label.global? + label.setGlobal() + else + newLabel = Label.new(codeOrigin, name) + newLabel.setGlobal() + $labelMapping[name] = newLabel + end + end + + def self.resetReferenced + $referencedExternLabels = Array.new + end + + def self.forReferencedExtern() + $referencedExternLabels.each { + | label | + yield "#{label.name}" + } + end + + def clearExtern + @extern = false + end + + def extern? + @extern + end + + def setGlobal + @global = true + end + + def global? + @global + end + def dump "#{name}:" end @@ -949,10 +1098,24 @@ class LabelReference < Node label.name end + def extern? + $labelMapping[name].is_a? Label and $labelMapping[name].extern? + end + + def used + if !$referencedExternLabels.include?(@label) and extern? + $referencedExternLabels.push(@label) + end + end + def dump label.name end + def value + asmLabel() + end + def address? false end @@ -964,6 +1127,10 @@ class LabelReference < Node def immediate? false end + + def immediateOperand? + true + end end class LocalLabelReference < NoChildren @@ -989,6 +1156,10 @@ class LocalLabelReference < NoChildren def dump label.name end + + def value + asmLabel() + end def address? false @@ -1001,6 +1172,10 @@ class LocalLabelReference < NoChildren def immediate? false end + + def immediateOperand? + true + end end class Sequence < Node |