# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
# THE POSSIBILITY OF SUCH DAMAGE.
-require "armv7"
+require "config"
+require "arm"
+require "arm64"
require "ast"
require "x86"
+require "mips"
+require "sh4"
+require "cloop"
BACKENDS =
[
"X86",
+ "X86_WIN",
"X86_64",
- "ARMv7"
+ "X86_64_WIN",
+ "ARM",
+ "ARMv7",
+ "ARMv7_TRADITIONAL",
+ "ARM64",
+ "MIPS",
+ "SH4",
+ "C_LOOP"
]
# Keep the set of working backends separate from the set of backends that might be
WORKING_BACKENDS =
[
"X86",
+ "X86_WIN",
"X86_64",
- "ARMv7"
+ "X86_64_WIN",
+ "ARM",
+ "ARMv7",
+ "ARMv7_TRADITIONAL",
+ "ARM64",
+ "MIPS",
+ "SH4",
+ "C_LOOP"
]
BACKEND_PATTERN = Regexp.new('\\A(' + BACKENDS.join(')|(') + ')\\Z')
+$allBackends = {}
+$validBackends = {}
+BACKENDS.each {
+ | backend |
+ $validBackends[backend] = true
+ $allBackends[backend] = true
+}
+
+def includeOnlyBackends(list)
+ newValidBackends = {}
+ list.each {
+ | backend |
+ if $validBackends[backend]
+ newValidBackends[backend] = true
+ end
+ }
+ $validBackends = newValidBackends
+end
+
+def isBackend?(backend)
+ $allBackends[backend]
+end
+
+def isValidBackend?(backend)
+ $validBackends[backend]
+end
+
+def validBackends
+ $validBackends.keys
+end
+
class Node
def lower(name)
begin
$activeBackend = name
send("lower" + name)
rescue => e
- raise "Got error #{e} at #{codeOriginString}"
+ e.message << "At #{codeOriginString}"
+ raise e
end
end
end
class Label
def lower(name)
- $asm.putsLabel(self.name[1..-1])
+ $asm.putsLabel(self.name[1..-1], @global)
end
end
class LabelReference
def asmLabel
- Assembler.labelReference(name[1..-1])
+ if extern?
+ Assembler.externLabelReference(name[1..-1])
+ else
+ Assembler.labelReference(name[1..-1])
+ end
+ end
+
+ def cLabel
+ Assembler.cLabelReference(name[1..-1])
end
end
def asmLabel
Assembler.localLabelReference("_offlineasm_"+name[1..-1])
end
+
+ def cLabel
+ Assembler.cLocalLabelReference("_offlineasm_"+name[1..-1])
+ end
end
class Skip