summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/offlineasm/ast.rb
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/offlineasm/ast.rb')
-rw-r--r--Source/JavaScriptCore/offlineasm/ast.rb179
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