]> git.saurik.com Git - apple/javascriptcore.git/blob - offlineasm/backends.rb
4fa3e19ecd00ea0c9be784f32bfe3ab833a0e049
[apple/javascriptcore.git] / offlineasm / backends.rb
1 # Copyright (C) 2011 Apple Inc. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions
5 # are met:
6 # 1. Redistributions of source code must retain the above copyright
7 # notice, this list of conditions and the following disclaimer.
8 # 2. Redistributions in binary form must reproduce the above copyright
9 # notice, this list of conditions and the following disclaimer in the
10 # documentation and/or other materials provided with the distribution.
11 #
12 # THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
13 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
14 # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
15 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
16 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
18 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
19 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
20 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
22 # THE POSSIBILITY OF SUCH DAMAGE.
23
24 require "config"
25 require "arm"
26 require "arm64"
27 require "ast"
28 require "x86"
29 require "mips"
30 require "sh4"
31 require "cloop"
32
33 BACKENDS =
34 [
35 "X86",
36 "X86_WIN",
37 "X86_64",
38 "X86_64_WIN",
39 "ARM",
40 "ARMv7",
41 "ARMv7_TRADITIONAL",
42 "ARM64",
43 "MIPS",
44 "SH4",
45 "C_LOOP"
46 ]
47
48 # Keep the set of working backends separate from the set of backends that might be
49 # supported. This is great because the BACKENDS list is almost like a reserved
50 # words list, in that it causes settings resolution to treat those words specially.
51 # Hence this lets us set aside the name of a backend we might want to support in
52 # the future while not actually supporting the backend yet.
53 WORKING_BACKENDS =
54 [
55 "X86",
56 "X86_WIN",
57 "X86_64",
58 "X86_64_WIN",
59 "ARM",
60 "ARMv7",
61 "ARMv7_TRADITIONAL",
62 "ARM64",
63 "MIPS",
64 "SH4",
65 "C_LOOP"
66 ]
67
68 BACKEND_PATTERN = Regexp.new('\\A(' + BACKENDS.join(')|(') + ')\\Z')
69
70 class Node
71 def lower(name)
72 begin
73 $activeBackend = name
74 send("lower" + name)
75 rescue => e
76 e.message << "At #{codeOriginString}"
77 raise e
78 end
79 end
80 end
81
82 # Overrides for lower() for those nodes that are backend-agnostic
83
84 class Label
85 def lower(name)
86 $asm.putsLabel(self.name[1..-1], @global)
87 end
88 end
89
90 class LocalLabel
91 def lower(name)
92 $asm.putsLocalLabel "_offlineasm_#{self.name[1..-1]}"
93 end
94 end
95
96 class LabelReference
97 def asmLabel
98 if extern?
99 Assembler.externLabelReference(name[1..-1])
100 else
101 Assembler.labelReference(name[1..-1])
102 end
103 end
104
105 def cLabel
106 Assembler.cLabelReference(name[1..-1])
107 end
108 end
109
110 class LocalLabelReference
111 def asmLabel
112 Assembler.localLabelReference("_offlineasm_"+name[1..-1])
113 end
114
115 def cLabel
116 Assembler.cLocalLabelReference("_offlineasm_"+name[1..-1])
117 end
118 end
119
120 class Skip
121 def lower(name)
122 end
123 end
124
125 class Sequence
126 def lower(name)
127 $activeBackend = name
128 if respond_to? "getModifiedList#{name}"
129 newList = send("getModifiedList#{name}")
130 newList.each {
131 | node |
132 node.lower(name)
133 }
134 elsif respond_to? "lower#{name}"
135 send("lower#{name}")
136 else
137 @list.each {
138 | node |
139 node.lower(name)
140 }
141 end
142 end
143 end
144