summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Reinhardt <stever@eecs.umich.edu>2006-02-22 22:22:06 -0500
committerSteve Reinhardt <stever@eecs.umich.edu>2006-02-22 22:22:06 -0500
commitf67a99d1c96fab60e16a8739803de27a3fba6420 (patch)
tree7b35ca89e8fae82897c609d1b88eefe6e8d140c9
parent9a4c0f12ef63a701f9ce0918e604bcdcc679fe32 (diff)
downloadgem5-f67a99d1c96fab60e16a8739803de27a3fba6420.tar.xz
Auto-generate arch/foo.hh "switch headers" in scons.
SConscript: Include new arch/SConscript file. arch/isa_specific.hh: Get rid of unnecessary ISA_INCLUDE() macro and other things that were used only for that purpose. build/SConstruct: Move list of ISAs to env var ALL_ISA_LIST. --HG-- extra : convert_revision : 612c7ee4279d57209662be88dc577d80fdbd692c
-rw-r--r--SConscript2
-rw-r--r--arch/SConscript74
-rw-r--r--arch/isa_specific.hh14
-rw-r--r--build/SConstruct5
4 files changed, 80 insertions, 15 deletions
diff --git a/SConscript b/SConscript
index d2f6b0497..49f06af7d 100644
--- a/SConscript
+++ b/SConscript
@@ -346,6 +346,8 @@ arch_source = SConscript('arch/%s/SConscript' % env['TARGET_ISA'],
# 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)
+
# Set up complete list of sources based on configuration.
sources = base_sources + arch_source
diff --git a/arch/SConscript b/arch/SConscript
new file mode 100644
index 000000000..2d8e34b7b
--- /dev/null
+++ b/arch/SConscript
@@ -0,0 +1,74 @@
+# -*- mode:python -*-
+
+# Copyright (c) 2006 The Regents of The University of Michigan
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import os.path
+
+# Import build environment variable from SConstruct.
+Import('env')
+
+#
+# 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('''
+ isa_traits.hh
+ ''')
+
+# Generate the header. target[0] is the full path of the output
+# header to generate. 'source' is a dummy variable, since we get the
+# list of ISAs from env['ALL_ISA_LIST'].
+def gen_switch_hdr(target, source, env):
+ fname = str(target[0])
+ basename = os.path.basename(fname)
+ f = open(fname, 'w')
+ f.write('#include "arch/isa_specific.hh"\n')
+ cond = '#if'
+ for isa in env['ALL_ISA_LIST']:
+ f.write('%s THE_ISA == %s_ISA\n#include "arch/%s/%s"\n'
+ % (cond, isa.upper(), isa, basename))
+ cond = '#elif'
+ f.write('#else\n#error "THE_ISA not set"\n#endif\n')
+ f.close()
+ return 0
+
+# String to print when generating header
+def gen_switch_hdr_string(target, source, env):
+ return "Generating ISA switch header " + str(target[0])
+
+# Build SCons Action object. 'varlist' specifies env vars that this
+# action depdnds on; when env['ALL_ISA_LIST'] changes these actions
+# should get re-executed.
+switch_hdr_action = Action(gen_switch_hdr, gen_switch_hdr_string,
+ varlist=['ALL_ISA_LIST'])
+
+# Instantiate actions for each header
+for hdr in isa_switch_hdrs:
+ env.Command(hdr, [], switch_hdr_action)
diff --git a/arch/isa_specific.hh b/arch/isa_specific.hh
index e11e6c292..44f8e9d64 100644
--- a/arch/isa_specific.hh
+++ b/arch/isa_specific.hh
@@ -50,27 +50,13 @@
//These tell the preprocessor where to find the files of a particular
//ISA, and set the "TheISA" macro for use elsewhere.
#if THE_ISA == ALPHA_ISA
- #define ISA_PATH arch/alpha/
#define TheISA AlphaISA
#elif THE_ISA == SPARC_ISA
- #define ISA_PATH arch/sparc/
#define TheISA SparcISA
#elif THE_ISA == MIPS_ISA
- #define ISA_PATH arch/mips/
#define TheISA MipsISA
#else
#error "THE_ISA not set"
#endif
-//The following is some preprocessor voodoo to allow redirectable includes
-//The end result is the ISA_INCLUDE() macro which is used inside stub
-//include files in arch and which redirect to the isa in use.
-#define STRINGIFY(token) #token
-#define EXPAND(token) token
-#define STICK_TOGETHER(firstpart, secondpart) \
- EXPAND(firstpart)EXPAND(secondpart)
-#define EXPAND_AND_STRINGIFY(pathAndFile) \
- STRINGIFY(pathAndFile)
-#define ISA_INCLUDE(filename) \
- EXPAND_AND_STRINGIFY(STICK_TOGETHER(ISA_PATH, filename))
#endif
diff --git a/build/SConstruct b/build/SConstruct
index c552e5639..38d404846 100644
--- a/build/SConstruct
+++ b/build/SConstruct
@@ -218,12 +218,15 @@ if have_mysql:
env = conf.Finish()
+# Define the universe of supported ISAs
+env['ALL_ISA_LIST'] = ['alpha', 'sparc', 'mips']
+
# Sticky options get saved in the options file so they persist from
# one invocation to the next (unless overridden, in which case the new
# value becomes sticky).
sticky_opts = Options(args=ARGUMENTS)
sticky_opts.AddOptions(
- EnumOption('TARGET_ISA', 'Target ISA', 'alpha', ('alpha', 'sparc', 'mips')),
+ EnumOption('TARGET_ISA', 'Target ISA', 'alpha', env['ALL_ISA_LIST']),
BoolOption('FULL_SYSTEM', 'Full-system support', False),
BoolOption('ALPHA_TLASER',
'Model Alpha TurboLaser platform (vs. Tsunami)', False),