]>
Commit | Line | Data |
---|---|---|
6fe7ccc8 A |
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 | ||
93a37866 | 24 | require "config" |
93a37866 A |
25 | require "arm" |
26 | require "arm64" | |
6fe7ccc8 A |
27 | require "ast" |
28 | require "x86" | |
93a37866 A |
29 | require "mips" |
30 | require "sh4" | |
31 | require "cloop" | |
6fe7ccc8 A |
32 | |
33 | BACKENDS = | |
34 | [ | |
35 | "X86", | |
81345200 | 36 | "X86_WIN", |
6fe7ccc8 | 37 | "X86_64", |
81345200 | 38 | "X86_64_WIN", |
93a37866 A |
39 | "ARM", |
40 | "ARMv7", | |
41 | "ARMv7_TRADITIONAL", | |
42 | "ARM64", | |
43 | "MIPS", | |
44 | "SH4", | |
45 | "C_LOOP" | |
6fe7ccc8 A |
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", | |
81345200 | 56 | "X86_WIN", |
6fe7ccc8 | 57 | "X86_64", |
81345200 | 58 | "X86_64_WIN", |
93a37866 A |
59 | "ARM", |
60 | "ARMv7", | |
61 | "ARMv7_TRADITIONAL", | |
62 | "ARM64", | |
63 | "MIPS", | |
64 | "SH4", | |
65 | "C_LOOP" | |
6fe7ccc8 A |
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 | |
93a37866 A |
76 | e.message << "At #{codeOriginString}" |
77 | raise e | |
6fe7ccc8 A |
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) | |
81345200 | 86 | $asm.putsLabel(self.name[1..-1], @global) |
6fe7ccc8 A |
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 | |
81345200 A |
98 | if extern? |
99 | Assembler.externLabelReference(name[1..-1]) | |
100 | else | |
101 | Assembler.labelReference(name[1..-1]) | |
102 | end | |
6fe7ccc8 | 103 | end |
81345200 | 104 | |
93a37866 A |
105 | def cLabel |
106 | Assembler.cLabelReference(name[1..-1]) | |
107 | end | |
6fe7ccc8 A |
108 | end |
109 | ||
110 | class LocalLabelReference | |
111 | def asmLabel | |
112 | Assembler.localLabelReference("_offlineasm_"+name[1..-1]) | |
113 | end | |
81345200 | 114 | |
93a37866 A |
115 | def cLabel |
116 | Assembler.cLocalLabelReference("_offlineasm_"+name[1..-1]) | |
117 | end | |
6fe7ccc8 A |
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 |