summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SConscript57
-rw-r--r--arch/SConscript72
-rw-r--r--arch/alpha/SConscript49
-rwxr-xr-xarch/isa_parser.py8
-rw-r--r--arch/mips/SConscript50
-rw-r--r--arch/sparc/SConscript52
6 files changed, 163 insertions, 125 deletions
diff --git a/SConscript b/SConscript
index 49f06af7d..3e607caa4 100644
--- a/SConscript
+++ b/SConscript
@@ -320,6 +320,11 @@ syscall_emulation_sources = Split('''
sim/syscall_emul.cc
''')
+# The following stuff (targetarch code and global define of THE_ISA)
+# are legacy things that assume we're only compiling one ISA at a
+# time. These will have to go away if we want to build a binary that
+# supports multiple ISAs.
+
targetarch_files = Split('''
alpha_linux_process.hh
alpha_memory.hh
@@ -338,18 +343,14 @@ for f in targetarch_files:
env.Command('targetarch/' + f, 'arch/%s/%s' % (env['TARGET_ISA'], f),
'''echo '#include "arch/%s/%s"' > $TARGET''' % (env['TARGET_ISA'], f))
-# Let the target architecture define what sources it needs
-arch_source = SConscript('arch/%s/SConscript' % env['TARGET_ISA'],
- build_dir = 'build/%s/' % env['BUILD_DIR'],
- exports = 'env', duplicate = False)
-
# Add a flag defining what THE_ISA should be for all compilation
env.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())])
-SConscript('arch/SConscript', exports = 'env', duplicate = False)
+arch_sources = SConscript('arch/SConscript',
+ exports = 'env', duplicate = False)
# Set up complete list of sources based on configuration.
-sources = base_sources + arch_source
+sources = base_sources + arch_sources
if env['FULL_SYSTEM']:
sources += full_system_sources
@@ -366,27 +367,6 @@ for opt in env.ExportOptions:
###################################################
#
-# Add an SCons scanner for ISA files
-#
-###################################################
-import SCons.Scanner
-
-def ISAScan():
- return SCons.Scanner.Classic("ISAScan",
- "$ISASUFFIXES",
- "SRCDIR",
- '^[ \t]*##[ \t]*include[ \t]*"([^>"]+)"')
-
-def ISAPath(env, dir, target=None, source=None, a=None):
- return (Dir(env['SRCDIR']), Dir('.'))
-
-iscan = Scanner(function = ISAScan().scan, skeys = [".isa", ".ISA"],
- path_function = ISAPath)
-env.Append(SCANNERS = iscan)
-
-
-###################################################
-#
# Special build rules.
#
###################################################
@@ -397,27 +377,6 @@ env.Command(Split('base/traceflags.hh base/traceflags.cc'),
'base/traceflags.py',
'python $SOURCE $TARGET.base')
-# several files are generated from arch/$TARGET_ISA/isa_desc.
-env.Command(Split('''
- arch/%s/decoder.cc
- arch/%s/decoder.hh
- arch/%s/alpha_o3_exec.cc
- arch/%s/fast_cpu_exec.cc
- arch/%s/simple_cpu_exec.cc
- arch/%s/full_cpu_exec.cc''' %
- (env['TARGET_ISA'],
- env['TARGET_ISA'],
- env['TARGET_ISA'],
- env['TARGET_ISA'],
- env['TARGET_ISA'],
- env['TARGET_ISA'])),
- Split('''
- arch/%s/isa/main.isa
- arch/isa_parser.py''' %
- env['TARGET_ISA']),
- '$SRCDIR/arch/isa_parser.py $SOURCE $TARGET.dir arch/%s' % env['TARGET_ISA'])
-
-
# libelf build is described in its own SConscript file.
# SConscript-local is the per-config build, which just copies some
# header files into a place where they can be found.
diff --git a/arch/SConscript b/arch/SConscript
index 2d8e34b7b..51f6cc023 100644
--- a/arch/SConscript
+++ b/arch/SConscript
@@ -31,11 +31,17 @@ import os.path
# Import build environment variable from SConstruct.
Import('env')
+# Right now there are no source files immediately in this directory
+sources = []
+
+#################################################################
#
# ISA "switch header" generation.
#
# Auto-generate arch headers that include the right ISA-specific
# header based on the setting of THE_ISA preprocessor variable.
+#
+#################################################################
# List of headers to generate
isa_switch_hdrs = Split('''
@@ -72,3 +78,69 @@ switch_hdr_action = Action(gen_switch_hdr, gen_switch_hdr_string,
# Instantiate actions for each header
for hdr in isa_switch_hdrs:
env.Command(hdr, [], switch_hdr_action)
+
+#################################################################
+#
+# Include architecture-specific files.
+#
+#################################################################
+
+#
+# Build a SCons scanner for ISA files
+#
+import SCons.Scanner
+
+def ISAScan():
+ return SCons.Scanner.Classic("ISAScan",
+ "$ISASUFFIXES",
+ "SRCDIR",
+ '^[ \t]*##[ \t]*include[ \t]*"([^>"]+)"')
+
+def ISAPath(env, dir, target=None, source=None, a=None):
+ return (Dir(env['SRCDIR']), Dir('.'))
+
+iscan = Scanner(function = ISAScan().scan, skeys = [".isa", ".ISA"],
+ path_function = ISAPath)
+env.Append(SCANNERS = iscan)
+
+#
+# Now create a Builder object that uses isa_parser.py to generate C++
+# output from the ISA description (*.isa) files.
+#
+
+# several files are generated from the ISA description
+isa_desc_gen_files = Split('''
+ decoder.cc
+ alpha_o3_exec.cc
+ fast_cpu_exec.cc
+ simple_cpu_exec.cc
+ full_cpu_exec.cc
+ decoder.hh
+ ''')
+
+# Convert to File node to fix path
+isa_parser = File('isa_parser.py')
+
+# The emitter patches up the sources & targets to include the
+# autogenerated files as targets and isa parser itself as a source.
+def isa_desc_emitter(target, source, env):
+ return (isa_desc_gen_files, [isa_parser] + source)
+
+# Pieces are in place, so create the builder.
+isa_desc_builder = Builder(action='${SOURCES[0]} ${SOURCES[1]} $TARGET.dir',
+ source_scanner = iscan,
+ emitter = isa_desc_emitter)
+
+env.Append(BUILDERS = { 'ISADesc' : isa_desc_builder })
+
+#
+# Now include other ISA-specific sources from the ISA subdirectories.
+#
+
+isa = env['TARGET_ISA'] # someday this may be a list of ISAs
+
+# Let the target architecture define what additional sources it needs
+sources += SConscript(os.path.join(isa, 'SConscript'),
+ exports = 'env', duplicate = False)
+
+Return('sources')
diff --git a/arch/alpha/SConscript b/arch/alpha/SConscript
index a5ae77dac..050dfb9cf 100644
--- a/arch/alpha/SConscript
+++ b/arch/alpha/SConscript
@@ -43,40 +43,45 @@ Import('env')
###################################################
# Base sources used by all configurations.
-arch_base_sources = Split('''
- arch/alpha/decoder.cc
- arch/alpha/alpha_o3_exec.cc
- arch/alpha/fast_cpu_exec.cc
- arch/alpha/simple_cpu_exec.cc
- arch/alpha/full_cpu_exec.cc
- arch/alpha/faults.cc
- arch/alpha/isa_traits.cc
+base_sources = Split('''
+ faults.cc
+ isa_traits.cc
''')
# Full-system sources
-arch_full_system_sources = Split('''
- arch/alpha/alpha_memory.cc
- arch/alpha/arguments.cc
- arch/alpha/ev5.cc
- arch/alpha/osfpal.cc
- arch/alpha/stacktrace.cc
- arch/alpha/vtophys.cc
+full_system_sources = Split('''
+ alpha_memory.cc
+ arguments.cc
+ ev5.cc
+ osfpal.cc
+ stacktrace.cc
+ vtophys.cc
''')
# Syscall emulation (non-full-system) sources
-arch_syscall_emulation_sources = Split('''
- arch/alpha/alpha_common_syscall_emul.cc
- arch/alpha/alpha_linux_process.cc
- arch/alpha/alpha_tru64_process.cc
+syscall_emulation_sources = Split('''
+ alpha_common_syscall_emul.cc
+ alpha_linux_process.cc
+ alpha_tru64_process.cc
''')
# Set up complete list of sources based on configuration.
-sources = arch_base_sources
+sources = base_sources
if env['FULL_SYSTEM']:
- sources += arch_full_system_sources
+ sources += full_system_sources
else:
- sources += arch_syscall_emulation_sources
+ sources += syscall_emulation_sources
+
+# Convert file names to SCons File objects. This takes care of the
+# path relative to the top of the directory tree.
+sources = [File(s) for s in sources]
+
+# Add in files generated by the ISA description.
+isa_desc_files = env.ISADesc('isa/main.isa')
+# Only non-header files need to be compiled.
+isa_desc_sources = [f for f in isa_desc_files if not f.path.endswith('.hh')]
+sources += isa_desc_sources
Return('sources')
diff --git a/arch/isa_parser.py b/arch/isa_parser.py
index b92d267c9..a2bf31a0c 100755
--- a/arch/isa_parser.py
+++ b/arch/isa_parser.py
@@ -1751,7 +1751,7 @@ def preprocess_isa_desc(isa_desc):
#
# Read in and parse the ISA description.
#
-def parse_isa_desc(isa_desc_file, output_dir, include_path):
+def parse_isa_desc(isa_desc_file, output_dir):
# set a global var for the input filename... used in error messages
global input_filename
input_filename = isa_desc_file
@@ -1781,7 +1781,7 @@ def parse_isa_desc(isa_desc_file, output_dir, include_path):
update_if_needed(output_dir + '/decoder.hh', file_template % vars())
# generate decoder.cc
- includes = '#include "%s/decoder.hh"' % include_path
+ includes = '#include "decoder.hh"'
global_output = global_code.decoder_output
namespace_output = namespace_code.decoder_output
# namespace_output += namespace_code.decode_block
@@ -1790,7 +1790,7 @@ def parse_isa_desc(isa_desc_file, output_dir, include_path):
# generate per-cpu exec files
for cpu in CpuModel.list:
- includes = '#include "%s/decoder.hh"\n' % include_path
+ includes = '#include "decoder.hh"\n'
includes += cpu.includes
global_output = global_code.exec_output[cpu.name]
namespace_output = namespace_code.exec_output[cpu.name]
@@ -1800,4 +1800,4 @@ def parse_isa_desc(isa_desc_file, output_dir, include_path):
# Called as script: get args from command line.
if __name__ == '__main__':
- parse_isa_desc(sys.argv[1], sys.argv[2], sys.argv[3])
+ parse_isa_desc(sys.argv[1], sys.argv[2])
diff --git a/arch/mips/SConscript b/arch/mips/SConscript
index a6af91669..b8efa7ef9 100644
--- a/arch/mips/SConscript
+++ b/arch/mips/SConscript
@@ -40,42 +40,44 @@ Import('env')
###################################################
# Base sources used by all configurations.
-arch_base_sources = Split('''
- arch/mips/decoder.cc
- arch/mips/mips_o3_exec.cc
- arch/mips/fast_cpu_exec.cc
- arch/mips/simple_cpu_exec.cc
- arch/mips/full_cpu_exec.cc
- arch/mips/faults.cc
- arch/mips/isa_traits.cc
+base_sources = Split('''
+ faults.cc
+ isa_traits.cc
''')
# Full-system sources
-arch_full_system_sources = Split('''
- arch/mips/memory.cc
- arch/mips/arguments.cc
- arch/mips/mips34k.cc
- arch/mips/osfpal.cc
- arch/mips/stacktrace.cc
- arch/mips/vtophys.cc
+full_system_sources = Split('''
+ memory.cc
+ arguments.cc
+ mips34k.cc
+ osfpal.cc
+ stacktrace.cc
+ vtophys.cc
''')
# Syscall emulation (non-full-system) sources
-arch_syscall_emulation_sources = Split('''
- arch/mips/common_syscall_emul.cc
- arch/mips/linux_process.cc
- arch/mips/tru64_process.cc
+syscall_emulation_sources = Split('''
+ common_syscall_emul.cc
+ linux_process.cc
+ tru64_process.cc
''')
# Set up complete list of sources based on configuration.
-sources = arch_base_sources
+sources = base_sources
if env['FULL_SYSTEM']:
- sources += arch_full_system_sources
+ sources += full_system_sources
else:
- sources += arch_syscall_emulation_sources
+ sources += syscall_emulation_sources
-for opt in env.ExportOptions:
- env.ConfigFile(opt)
+# Convert file names to SCons File objects. This takes care of the
+# path relative to the top of the directory tree.
+sources = [File(s) for s in sources]
+
+# Add in files generated by the ISA description.
+isa_desc_files = env.ISADesc('isa/main.isa')
+# Only non-header files need to be compiled.
+isa_desc_sources = [f for f in isa_desc_files if not f.path.endswith('.hh')]
+sources += isa_desc_sources
Return('sources')
diff --git a/arch/sparc/SConscript b/arch/sparc/SConscript
index d8a3749a1..fea31fd5d 100644
--- a/arch/sparc/SConscript
+++ b/arch/sparc/SConscript
@@ -40,43 +40,43 @@ Import('env')
###################################################
# Base sources used by all configurations.
-arch_base_sources = Split('''
- arch/sparc/decoder.cc
- arch/sparc/alpha_o3_exec.cc
- arch/sparc/fast_cpu_exec.cc
- arch/sparc/simple_cpu_exec.cc
- arch/sparc/full_cpu_exec.cc
- arch/sparc/faults.cc
- arch/sparc/isa_traits.cc
+base_sources = Split('''
+ faults.cc
+ isa_traits.cc
''')
# Full-system sources
-arch_full_system_sources = Split('''
- arch/sparc/alpha_memory.cc
- arch/sparc/arguments.cc
- arch/sparc/ev5.cc
- arch/sparc/osfpal.cc
- arch/sparc/stacktrace.cc
- arch/sparc/vtophys.cc
+full_system_sources = Split('''
+ alpha_memory.cc
+ arguments.cc
+ ev5.cc
+ osfpal.cc
+ stacktrace.cc
+ vtophys.cc
''')
# Syscall emulation (non-full-system) sources
-arch_syscall_emulation_sources = Split('''
- arch/sparc/alpha_common_syscall_emul.cc
- arch/sparc/alpha_linux_process.cc
- arch/sparc/alpha_tru64_process.cc
+syscall_emulation_sources = Split('''
+ alpha_common_syscall_emul.cc
+ alpha_linux_process.cc
+ alpha_tru64_process.cc
''')
-sources = arch_base_sources
+sources = base_sources
if env['FULL_SYSTEM']:
- sources += arch_full_system_sources
- if env['ALPHA_TLASER']:
- sources += arch_turbolaser_sources
+ sources += full_system_sources
else:
- sources += arch_syscall_emulation_sources
+ sources += syscall_emulation_sources
-for opt in env.ExportOptions:
- env.ConfigFile(opt)
+# Convert file names to SCons File objects. This takes care of the
+# path relative to the top of the directory tree.
+sources = [File(s) for s in sources]
+
+# Add in files generated by the ISA description.
+isa_desc_files = env.ISADesc('isa/main.isa')
+# Only non-header files need to be compiled.
+isa_desc_sources = [f for f in isa_desc_files if not f.path.endswith('.hh')]
+sources += isa_desc_sources
Return('sources')