99484cfae8
Start using SCons File objects to avoid fixed paths in subordinate SConscripts. SConscript: Push isa_parser stuff (including .isa scanner) down into arch/SConscript. arch/SConscript: Create a Builder object for .isa files, including existing scanner. Return file objects generated by isa-specific SConscript back up to parent. arch/alpha/SConscript: arch/mips/SConscript: arch/sparc/SConscript: Convert sources to scons File objects, so file names can be specified relative to the current directory. Invoke new builder for isa description, and get generated sources from there (instead of listing them explicitly). arch/isa_parser.py: Get rid of third argument ("include_path"). It was a pain to generate this from scons, and it turned out it's not needed anyway, since the only included file (decoder.hh) will be in the same directory as the sources. --HG-- extra : convert_revision : 36861bcef36763f229704d8cb7a642b4486a3581
146 lines
5.2 KiB
Python
146 lines
5.2 KiB
Python
# -*- 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')
|
|
|
|
# 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('''
|
|
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)
|
|
|
|
#################################################################
|
|
#
|
|
# 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')
|