+2003-09-08 Dave Brolley <brolley@redhat.com>
+
+ On behalf of Doug Evans <dje@sebabeach.org>
+ Pass in paths to input files, instead of assuming they live in
+ $srcdir/cpu. Plus misc. option processing cleanup.
+ * cgen-doc.scm (doc-arguments): Make options strings not symbols.
+ Add pre-process pass to all options.
+ * cgen-gas.scm (gas-arguments): Ditto.
+ * cgen-sid.scm (sim-arguments): Ditto.
+ * cgen-sim.scm (sim-arguments): Ditto.
+ * cgen-stest.scm (stest-arguments): Ditto.
+ * cgen-opc.scm (opc-arguments): Ditto. New argument -OPC.
+ (-opc-file-path): New global.
+ (opc-file-path): New fn.
+ * opcodes.scm (read-cpu.opc): Replace srcdir,cpu args with opc-file.
+ All callers updated.
+ (gen-extra-cpu.h,gen-extra-cpu.c,gen-extra-opc.h,gen-extra-opc.c,
+ gen-extra-asm.c,gen-extra-dis.c,gen-extra-ibld.h,gen-extra-ibld.c):
+ Replace srcdir arg with opc-file. All callers updated.
+ * read.scm (-opt-spec-update): Delete.
+ (opt-get-first-pass,opt-get-second-pass): New fns.
+ (-cgen): Process application-specific arguments in two passes.
+
2003-08-29 Dave Brolley <brolley@redhat.com>
* cpu/frv.cpu: Removed.
(define doc-arguments
(list
- (list '-H "file" "generate $arch.html in <file>"
+ (list "-H" "file" "generate $arch.html in <file>"
+ #f
(lambda (arg) (file-write arg cgen.html)))
- ; can't use '-I because that gets interpreted as a complex number
- (list (string->symbol "-I") "file" "generate $arch-insn.html in <file>"
+ (list "-I" "file" "generate $arch-insn.html in <file>"
+ #f
(lambda (arg) (file-write arg cgen-insn.html)))
- (list '-N "file" "specify name of insn.html file"
+ (list "-N" "file" "specify name of insn.html file"
+ #f
(lambda (arg) (set! *insn-html-file-name* arg)))
)
)
(define gas-arguments
(list
- (list '-B "file" "generate build script in <file>"
+ (list "-B" "file" "generate build script in <file>"
+ #f
(lambda (arg) (file-write arg cgen-build.sh)))
- (list '-E "file" "generate allinsn.exp in <file>"
+ (list "-E" "file" "generate allinsn.exp in <file>"
+ #f
(lambda (arg) (file-write arg cgen-allinsn.exp)))
)
)
(load (string-append srcdir "/opc-opinst.scm"))
)
+; Records the -OPC arg which specifies the path to the .opc file.
+(define -opc-file-path #f)
+(define (opc-file-path)
+ (if -opc-file-path
+ -opc-file-path
+ (error ".opc file unspecified, missing -OPC argument"))
+)
+
(define opc-arguments
(list
- (list '-H "file" "generate $arch-desc.h in <file>"
+ (list "-OPC" "file" "specify path to .opc file"
+ (lambda (arg) (set! -opc-file-path arg))
+ #f)
+ (list "-H" "file" "generate $arch-desc.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-desc.h)))
- (list '-C "file" "generate $arch-desc.c in <file>"
+ (list "-C" "file" "generate $arch-desc.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-desc.c)))
- (list '-O "file" "generate $arch-opc.h in <file>"
+ (list "-O" "file" "generate $arch-opc.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-opc.h)))
- (list '-P "file" "generate $arch-opc.c in <file>"
+ (list "-P" "file" "generate $arch-opc.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-opc.c)))
- (list '-Q "file" "generate $arch-opinst.c in <file>"
+ (list "-Q" "file" "generate $arch-opinst.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-opinst.c)))
- (list '-B "file" "generate $arch-ibld.h in <file>"
+ (list "-B" "file" "generate $arch-ibld.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-ibld.h)))
- (list '-L "file" "generate $arch-ibld.in in <file>"
+ (list "-L" "file" "generate $arch-ibld.in in <file>"
+ #f
(lambda (arg) (file-write arg cgen-ibld.in)))
- (list '-A "file" "generate $arch-asm.in in <file>"
+ (list "-A" "file" "generate $arch-asm.in in <file>"
+ #f
(lambda (arg) (file-write arg cgen-asm.in)))
- (list '-D "file" "generate $arch-dis.in in <file>"
+ (list "-D" "file" "generate $arch-dis.in in <file>"
+ #f
(lambda (arg) (file-write arg cgen-dis.in)))
)
)
(define sim-arguments
(list
- (list '-H "file" "generate desc.h in <file>"
+ (list "-H" "file" "generate desc.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-desc.h)))
- (list '-C "file" "generate cpu.h in <file>"
+ (list "-C" "file" "generate cpu.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-cpu.h)))
- (list '-E "file" "generate defs.h in <file>"
+ (list "-E" "file" "generate defs.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-defs.h)))
- (list '-T "file" "generate decode.h in <file>"
+ (list "-T" "file" "generate decode.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-decode.h)))
- (list '-D "file" "generate decode.cxx in <file>"
+ (list "-D" "file" "generate decode.cxx in <file>"
+ #f
(lambda (arg) (file-write arg cgen-decode.cxx)))
- (list '-W "file" "generate write.cxx in <file>"
+ (list "-W" "file" "generate write.cxx in <file>"
+ #f
(lambda (arg) (file-write arg cgen-write.cxx)))
- (list '-S "file" "generate semantics.cxx in <file>"
+ (list "-S" "file" "generate semantics.cxx in <file>"
+ #f
(lambda (arg) (file-write arg cgen-semantics.cxx)))
- (list '-X "file" "generate sem-switch.cxx in <file>"
+ (list "-X" "file" "generate sem-switch.cxx in <file>"
+ #f
(lambda (arg) (file-write arg cgen-sem-switch.cxx)))
- (list '-M "file" "generate model.cxx in <file>"
+ (list "-M" "file" "generate model.cxx in <file>"
+ #f
(lambda (arg) (file-write arg cgen-model.cxx)))
- (list '-N "file" "generate model.h in <file>"
+ (list "-N" "file" "generate model.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-model.h)))
)
)
(define sim-arguments
(list
- (list '-A "file" "generate arch.h in <file>"
+ (list "-A" "file" "generate arch.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-arch.h)))
- (list '-B "file" "generate arch.c in <file>"
+ (list "-B" "file" "generate arch.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-arch.c)))
- (list '-C "file" "generate cpu-<cpu>.h in <file>"
+ (list "-C" "file" "generate cpu-<cpu>.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-cpu.h)))
- (list '-U "file" "generate cpu-<cpu>.c in <file>"
+ (list "-U" "file" "generate cpu-<cpu>.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-cpu.c)))
- (list '-N "file" "generate cpu-all.h in <file>"
+ (list "-N" "file" "generate cpu-all.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-cpuall.h)))
- (list '-F "file" "generate memops.h in <file>"
+ (list "-F" "file" "generate memops.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-mem-ops.h)))
- (list '-G "file" "generate defs.h in <file>"
+ (list "-G" "file" "generate defs.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-defs.h)))
- (list '-P "file" "generate semops.h in <file>"
+ (list "-P" "file" "generate semops.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-sem-ops.h)))
- (list '-T "file" "generate decode.h in <file>"
+ (list "-T" "file" "generate decode.h in <file>"
+ #f
(lambda (arg) (file-write arg cgen-decode.h)))
- (list '-D "file" "generate decode.c in <file>"
+ (list "-D" "file" "generate decode.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-decode.c)))
- (list '-E "file" "generate extract.c in <file>"
+ (list "-E" "file" "generate extract.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-extract.c)))
- (list '-R "file" "generate read.c in <file>"
+ (list "-R" "file" "generate read.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-read.c)))
- (list '-W "file" "generate write.c in <file>"
+ (list "-W" "file" "generate write.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-write.c)))
- (list '-S "file" "generate semantics.c in <file>"
+ (list "-S" "file" "generate semantics.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-semantics.c)))
- (list '-X "file" "generate sem-switch.c in <file>"
+ (list "-X" "file" "generate sem-switch.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-sem-switch.c)))
- (list '-O "file" "generate ops.c in <file>"
+ (list "-O" "file" "generate ops.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-ops.c)))
- (list '-M "file" "generate model.c in <file>"
+ (list "-M" "file" "generate model.c in <file>"
+ #f
(lambda (arg) (file-write arg cgen-model.c)))
- (list '-L "file" "generate mainloop.in in <file>"
+ (list "-L" "file" "generate mainloop.in in <file>"
+ #f
(lambda (arg) (file-write arg cgen-mainloop.in)))
)
)
(define stest-arguments
(list
- (list '-B "file" "generate build.sh"
+ (list "-B" "file" "generate build.sh"
+ #f
(lambda (arg) (file-write arg cgen-build.sh)))
- (list '-E "file" "generate the testsuite .exp"
+ (list "-E" "file" "generate the testsuite .exp"
+ #f
(lambda (arg) (file-write arg cgen-allinsn.exp)))
)
)
-gen-mach-table-decls
gen-hw-table-decls
"\n"
- (lambda () (gen-extra-cpu.h srcdir (current-arch-name))) ; from <arch>.opc
+ (lambda () (gen-extra-cpu.h (opc-file-path) (current-arch-name)))
"
#endif /* @ARCH@_CPU_H */
#include \"libiberty.h\"
#include \"xregex.h\"
\n"
- (lambda () (gen-extra-cpu.c srcdir (current-arch-name))) ; from <arch>.opc
+ (lambda () (gen-extra-cpu.c (opc-file-path) (current-arch-name)))
gen-attr-table-defns
-gen-isa-table-defns
-gen-mach-table-defns
(string-write
; No need for copyright, appended to file with one.
"\n"
- (lambda () (gen-extra-asm.c srcdir (current-arch-name))) ; from <arch>.opc
+ (lambda () (gen-extra-asm.c (opc-file-path) (current-arch-name)))
"\n"
-gen-parse-switch
(lambda () (gen-handler-table "parse" opc-parse-handlers))
(string-write
; No need for copyright, appended to file with one.
"\n"
- (lambda () (gen-extra-dis.c srcdir (current-arch-name))) ; from <arch>.opc
+ (lambda () (gen-extra-dis.c (opc-file-path) (current-arch-name)))
"\n"
-gen-print-switch
(lambda () (gen-handler-table "print" opc-print-handlers))
#define @ARCH@_IBLD_H
"
- (lambda () (gen-extra-ibld.h srcdir (current-arch-name))) ; from <arch>.opc
+ (lambda () (gen-extra-ibld.h (opc-file-path) (current-arch-name)))
"\n"
gen-insn-builders
"
#define @ARCH@_OPC_H
"
- (lambda () (gen-extra-opc.h srcdir (current-arch-name))) ; from <arch>.opc
+ (lambda () (gen-extra-opc.h (opc-file-path) (current-arch-name)))
-gen-insn-enum
-gen-ifield-decls
-gen-init-macros
#include \"@prefix@-opc.h\"
#include \"libiberty.h\"
\n"
- (lambda () (gen-extra-opc.c srcdir (current-arch-name))) ; from <arch>.opc
+ (lambda () (gen-extra-opc.c (opc-file-path) (current-arch-name)))
-gen-hash-decls
-gen-ifmt-table
-gen-insn-opcode-table
)
\f
; Extra target specific code generation.
-; For now, such code lives in <arch>.opc.
; Pick out a section from the .opc file.
; The section is delimited with:
; FIXME: This is a pretty involved bit of code. 'twould be nice to split
; it up into manageable chunks.
-(define (read-cpu.opc srcdir cpu delim)
- (let ((file (string-append srcdir "/cpu/"
- (symbol->string (current-arch-name))
- ".opc"))
+(define (read-cpu.opc opc-file delim)
+ (let ((file opc-file)
(start-delim (string-append "/* -- " delim))
(end-delim "/* -- "))
(if (file-exists? file)
))
)
-; FIXME: collapse into one?
-(define (gen-extra-cpu.h srcdir arch)
+(define (gen-extra-cpu.h opc-file arch)
(logit 2 "Generating extra cpu.h stuff from " arch ".opc ...\n")
- (read-cpu.opc srcdir arch "cpu.h")
+ (read-cpu.opc opc-file "cpu.h")
)
-(define (gen-extra-cpu.c srcdir arch)
+(define (gen-extra-cpu.c opc-file arch)
(logit 2 "Generating extra cpu.c stuff from " arch ".opc ...\n")
- (read-cpu.opc srcdir arch "cpu.c")
+ (read-cpu.opc opc-file "cpu.c")
)
-(define (gen-extra-opc.h srcdir arch)
+(define (gen-extra-opc.h opc-file arch)
(logit 2 "Generating extra opc.h stuff from " arch ".opc ...\n")
- (read-cpu.opc srcdir arch "opc.h")
+ (read-cpu.opc opc-file "opc.h")
)
-(define (gen-extra-opc.c srcdir arch)
+(define (gen-extra-opc.c opc-file arch)
(logit 2 "Generating extra opc.c stuff from " arch ".opc ...\n")
- (read-cpu.opc srcdir arch "opc.c")
+ (read-cpu.opc opc-file "opc.c")
)
-(define (gen-extra-asm.c srcdir arch)
+(define (gen-extra-asm.c opc-file arch)
(logit 2 "Generating extra asm.c stuff from " arch ".opc ...\n")
- (read-cpu.opc srcdir arch "asm.c")
+ (read-cpu.opc opc-file "asm.c")
)
-(define (gen-extra-dis.c srcdir arch)
+(define (gen-extra-dis.c opc-file arch)
(logit 2 "Generating extra dis.c stuff from " arch ".opc ...\n")
- (read-cpu.opc srcdir arch "dis.c")
+ (read-cpu.opc opc-file "dis.c")
)
-(define (gen-extra-ibld.h srcdir arch)
+(define (gen-extra-ibld.h opc-file arch)
(logit 2 "Generating extra ibld.h stuff from " arch ".opc ...\n")
- (read-cpu.opc srcdir arch "ibld.h")
+ (read-cpu.opc opc-file "ibld.h")
)
-(define (gen-extra-ibld.c srcdir arch)
+(define (gen-extra-ibld.c opc-file arch)
(logit 2 "Generating extra ibld.c stuff from " arch ".opc ...\n")
- (read-cpu.opc srcdir arch "ibld.c")
+ (read-cpu.opc opc-file "ibld.c")
)
\f
; For debugging.
(cons (cons opt #f) (cdr argv))))))
)
-; Convert old style option spec to new style.
-; This involves converting a symbol option name to a string.
-
-(define (-opt-spec-update spec-list)
- (map (lambda (spec)
- (if (symbol? (car spec))
- (cons (symbol->string (car spec)) (cdr spec))
- spec))
- spec-list)
-)
-
; Used to ensure backtraces are printed if an error occurs.
(define (catch-with-backtrace thunk)
; arguments specified up til now, then continue with next batch of args".
(define common-arguments
- '(("-a" "arch" "set arch, specifies name of .cpu file to load")
+ '(("-a" "arch-file" "specify path of .cpu file to load")
("-b" #f "use debugging evaluator, for backtraces")
("-d" #f "start interactive debugging session")
("-f" "flags" "specify a set of flags to control code generation")
)
)
+; Accessors for application option specs
+(define (opt-get-first-pass opt)
+ (or (list-ref opt 3) (lambda args #f)))
+(define (opt-get-second-pass opt)
+ (or (list-ref opt 4) (lambda args #f)))
+
; Parse options and call generators.
; ARGS is a #:keyword delimited list of arguments.
; #:app-name name
; ARGS has been processed, now we can process ARGV.
(let (
- (opt-spec (append common-arguments (-opt-spec-update opt-spec)))
+ (opt-spec (append common-arguments opt-spec))
(app-args nil) ; application's args are queued here
(repl? #f)
- (arch #f)
+ (arch-file #f)
(keep-mach "all") ; default is all machs
(keep-isa "all") ; default is all isas
(flags "")
((missing) (cgen-usage 'missing arg opt-spec))
(else
(cond ((str=? "-a" (car opt))
- (set! arch arg)
+ (set! arch-file arg)
)
((str=? "-b" (car opt))
(if (memq 'debug-extensions *features*)
; All arguments have been parsed.
- (if (not arch)
+ (if (not arch-file)
(error "-a option missing, no architecture specified"))
(if repl?
(debug-repl nil))
- (cpu-load (string-append srcdir "/cpu/" arch ".cpu")
+ (cpu-load arch-file
keep-mach keep-isa flags
app-init! app-finish! app-analyze!)
; Start another repl loop if -d.
(if repl?
(debug-repl nil))
- ; Done with processing the arguments. Call the application's
- ; file generators.
+ ; Done with processing the arguments.
+ ; Application arguments are processed in two passes.
+ ; This is because the app may have arguments that specify things
+ ; that affect file generation (e.g. to specify another input file)
+ ; and we don't want to require an ordering of the options.
+
+ (for-each (lambda (opt-arg)
+ (let ((opt (car opt-arg))
+ (arg (cdr opt-arg)))
+ (if (cadr opt)
+ ((opt-get-first-pass opt) arg)
+ ((opt-get-first-pass opt)))))
+ (reverse app-args))
(for-each (lambda (opt-arg)
(let ((opt (car opt-arg))
(arg (cdr opt-arg)))
(if (cadr opt)
- ((cadddr opt) arg)
- ((cadddr opt)))))
+ ((opt-get-second-pass opt) arg)
+ ((opt-get-second-pass opt)))))
(reverse app-args))
)
)