mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-21 04:42:53 +08:00
ed3ef33944
* NEWS: Mention Guile scripting. * Makefile.in (SUBDIR_GUILE_OBS): New variable. (SUBDIR_GUILE_SRCS, SUBDIR_GUILE_DEPS): New variables (SUBDIR_GUILE_LDFLAGS, SUBDIR_GUILE_CFLAGS): New variables. (INTERNAL_CPPFLAGS): Add GUILE_CPPFLAGS. (CLIBS): Add GUILE_LIBS. (install-guile): New rule. (guile.o): New rule. (scm-arch.o, scm-auto-load.o, scm-block.o): New rules. (scm-breakpoint.o, scm-disasm.o, scm-exception.o): New rules. (scm-frame.o, scm-iterator.o, scm-lazy-string.o): New rules. (scm-math.o, scm-objfile.o, scm-ports.o): New rules. (scm-pretty-print.o, scm-safe-call.o, scm-gsmob.o): New rules. (scm-string.o, scm-symbol.o, scm-symtab.o): New rules. (scm-type.o, scm-utils.o, scm-value.o): New rules. * configure.ac: New option --with-guile. * configure: Regenerate. * config.in: Regenerate. * auto-load.c: Remove #include "python/python.h". Add #include "gdb/section-scripts.h". (source_section_scripts): Handle Guile scripts. (_initialize_auto_load): Add name of Guile objfile script to scripts-directory help text. * breakpoint.c (condition_command): Tweak comment to include Scheme. * breakpoint.h (gdbscm_breakpoint_object): Add forward decl. (struct breakpoint): New member scm_bp_object. * defs.h (enum command_control_type): New value guile_control. * cli/cli-cmds.c: Remove #include "python/python.h". Add #include "extension.h". (show_user): Update comment. (_initialize_cli_cmds): Update help text for "show user". Update help text for max-user-call-depth. * cli/cli-script.c: Remove #include "python/python.h". Add #include "extension.h". (multi_line_command_p): Add guile_control. (print_command_lines): Handle guile_control. (execute_control_command, recurse_read_control_structure): Ditto. (process_next_line): Recognize "guile" commands. * disasm.c (gdb_disassemble_info): Make non-static. * disasm.h: #include "dis-asm.h". (struct gdbarch): Add forward decl. (gdb_disassemble_info): Declare. * extension.c: #include "guile/guile.h". (extension_languages): Add guile. (get_ext_lang_defn): Handle EXT_LANG_GDB. * extension.h (enum extension_language): New value EXT_LANG_GUILE. * gdbtypes.c (get_unsigned_type_max): New function. (get_signed_type_minmax): New function. * gdbtypes.h (get_unsigned_type_max): Declare. (get_signed_type_minmax): Declare. * guile/README: New file. * guile/guile-internal.h: New file. * guile/guile.c: New file. * guile/guile.h: New file. * guile/scm-arch.c: New file. * guile/scm-auto-load.c: New file. * guile/scm-block.c: New file. * guile/scm-breakpoint.c: New file. * guile/scm-disasm.c: New file. * guile/scm-exception.c: New file. * guile/scm-frame.c: New file. * guile/scm-gsmob.c: New file. * guile/scm-iterator.c: New file. * guile/scm-lazy-string.c: New file. * guile/scm-math.c: New file. * guile/scm-objfile.c: New file. * guile/scm-ports.c: New file. * guile/scm-pretty-print.c: New file. * guile/scm-safe-call.c: New file. * guile/scm-string.c: New file. * guile/scm-symbol.c: New file. * guile/scm-symtab.c: New file. * guile/scm-type.c: New file. * guile/scm-utils.c: New file. * guile/scm-value.c: New file. * guile/lib/gdb.scm: New file. * guile/lib/gdb/boot.scm: New file. * guile/lib/gdb/experimental.scm: New file. * guile/lib/gdb/init.scm: New file. * guile/lib/gdb/iterator.scm: New file. * guile/lib/gdb/printing.scm: New file. * guile/lib/gdb/types.scm: New file. * data-directory/Makefile.in (GUILE_SRCDIR): New variable. (VPATH): Add $(GUILE_SRCDIR). (GUILE_DIR): New variable. (GUILE_INSTALL_DIR, GUILE_FILES): New variables. (all): Add stamp-guile dependency. (stamp-guile): New rule. (clean-guile, install-guile, uninstall-guile): New rules. (install-only): Add install-guile dependency. (uninstall): Add uninstall-guile dependency. (clean): Add clean-guile dependency. doc/ * Makefile.in (GDB_DOC_FILES): Add guile.texi. * gdb.texinfo (Auto-loading): Add set/show auto-load guile-scripts. (Extending GDB): New menu entries Guile, Multiple Extension Languages. (Guile docs): Include guile.texi. (objfile-gdbdotext file): Add objfile-gdb.scm. (dotdebug_gdb_scripts section): Mention Guile scripts. (Multiple Extension Languages): New node. * guile.texi: New file. testsuite/ * configure.ac (AC_OUTPUT): Add gdb.guile. * configure: Regenerate. * lib/gdb-guile.exp: New file. * lib/gdb.exp (get_target_charset): New function. * gdb.base/help.exp: Update expected output from "apropos apropos". * gdb.guile/Makefile.in: New file. * gdb.guile/guile.exp: New file. * gdb.guile/scm-arch.c: New file. * gdb.guile/scm-arch.exp: New file. * gdb.guile/scm-block.c: New file. * gdb.guile/scm-block.exp: New file. * gdb.guile/scm-breakpoint.c: New file. * gdb.guile/scm-breakpoint.exp: New file. * gdb.guile/scm-disasm.c: New file. * gdb.guile/scm-disasm.exp: New file. * gdb.guile/scm-equal.c: New file. * gdb.guile/scm-equal.exp: New file. * gdb.guile/scm-error.exp: New file. * gdb.guile/scm-error.scm: New file. * gdb.guile/scm-frame-args.c: New file. * gdb.guile/scm-frame-args.exp: New file. * gdb.guile/scm-frame-args.scm: New file. * gdb.guile/scm-frame-inline.c: New file. * gdb.guile/scm-frame-inline.exp: New file. * gdb.guile/scm-frame.c: New file. * gdb.guile/scm-frame.exp: New file. * gdb.guile/scm-generics.exp: New file. * gdb.guile/scm-gsmob.exp: New file. * gdb.guile/scm-iterator.c: New file. * gdb.guile/scm-iterator.exp: New file. * gdb.guile/scm-math.c: New file. * gdb.guile/scm-math.exp: New file. * gdb.guile/scm-objfile-script-gdb.in: New file. * gdb.guile/scm-objfile-script.c: New file. * gdb.guile/scm-objfile-script.exp: New file. * gdb.guile/scm-objfile.c: New file. * gdb.guile/scm-objfile.exp: New file. * gdb.guile/scm-ports.exp: New file. * gdb.guile/scm-pretty-print.c: New file. * gdb.guile/scm-pretty-print.exp: New file. * gdb.guile/scm-pretty-print.scm: New file. * gdb.guile/scm-section-script.c: New file. * gdb.guile/scm-section-script.exp: New file. * gdb.guile/scm-section-script.scm: New file. * gdb.guile/scm-symbol.c: New file. * gdb.guile/scm-symbol.exp: New file. * gdb.guile/scm-symtab-2.c: New file. * gdb.guile/scm-symtab.c: New file. * gdb.guile/scm-symtab.exp: New file. * gdb.guile/scm-type.c: New file. * gdb.guile/scm-type.exp: New file. * gdb.guile/scm-value-cc.cc: New file. * gdb.guile/scm-value-cc.exp: New file. * gdb.guile/scm-value.c: New file. * gdb.guile/scm-value.exp: New file. * gdb.guile/source2.scm: New file. * gdb.guile/types-module.cc: New file. * gdb.guile/types-module.exp: New file.
230 lines
9.2 KiB
Plaintext
230 lines
9.2 KiB
Plaintext
README for gdb/guile
|
||
====================
|
||
|
||
This file contains important notes for gdb/guile developers.
|
||
["gdb/guile" refers to the directory you found this file in]
|
||
|
||
Nomenclature:
|
||
|
||
In the implementation we use "Scheme" or "Guile" depending on context.
|
||
And sometimes it doesn't matter.
|
||
Guile is Scheme, and for the most part this is what we present to the user
|
||
as well. However, to highlight the fact that it is Guile, the GDB commands
|
||
that invoke Scheme functions are named "guile" and "guile-repl",
|
||
abbreviated "gu" and "gr" respectively.
|
||
|
||
Co-existence with Python:
|
||
|
||
Keep the user interfaces reasonably consistent, but don't shy away from
|
||
providing a clearer (or more Scheme-friendly/consistent) user interface
|
||
where appropriate.
|
||
|
||
Additions to Python support or Scheme support don't require corresponding
|
||
changes in the other scripting language.
|
||
|
||
Scheme-wrapped breakpoints are created lazily so that if the user
|
||
doesn't use Scheme s/he doesn't pay any cost.
|
||
|
||
Importing the gdb module into Scheme:
|
||
|
||
To import the gdb module:
|
||
(gdb) guile (use-modules (gdb))
|
||
|
||
If you want to add a prefix to gdb module symbols:
|
||
(gdb) guile (use-modules ((gdb) #:renamer (symbol-prefix-proc 'gdb:)))
|
||
This gives every symbol a "gdb:" prefix which is a common convention.
|
||
OTOH it's more to type.
|
||
|
||
Implementation/Hacking notes:
|
||
|
||
Don't use scm_is_false.
|
||
For this C function, () == #f (a la Lisp) and it's not clear how treating
|
||
them as equivalent for truth values will affect the GDB interface.
|
||
Until the effect is clear avoid them.
|
||
Instead use gdbscm_is_false, gdbscm_is_true, gdbscm_is_bool.
|
||
There are macros in guile-internal.h to enforce this.
|
||
|
||
Use gdbscm_foo as the name of functions that implement Scheme procedures
|
||
to provide consistent naming in error messages. The user can see "gdbscm"
|
||
in the name and immediately know where the function came from.
|
||
|
||
All smobs contain gdb_smob or chained_gdb_smob as the first member.
|
||
This provides a mechanism for extending them in the Scheme side without
|
||
tying GDB to the details.
|
||
|
||
The lifetime of a smob, AIUI, is decided by the containing SCM.
|
||
When there is no longer a reference to the containing SCM then the
|
||
smob can be GC'd. Objects that have references from outside of Scheme,
|
||
e.g., breakpoints, need to be protected from GC.
|
||
|
||
Don't do something that can cause a Scheme exception inside a TRY_CATCH,
|
||
and, in code that can be called from Scheme, don't do something that can
|
||
cause a GDB exception outside a TRY_CATCH.
|
||
This makes the code a little tricky to write sometimes, but it is a
|
||
rule imposed by the programming environment. Bugs often happen because
|
||
this rule is broken. Learn it, follow it.
|
||
|
||
Coding style notes:
|
||
|
||
- If you find violations to these rules, let's fix the code.
|
||
Some attempt has been made to be consistent, but it's early.
|
||
Over time we want things to be more consistent, not less.
|
||
|
||
- None of this really needs to be read. Instead, do not be creative:
|
||
Monkey-See-Monkey-Do hacking should generally Just Work.
|
||
|
||
- Absence of the word "typically" means the rule is reasonably strict.
|
||
|
||
- The gdbscm_initialize_foo function (e.g., gdbscm_initialize_values)
|
||
is the last thing to appear in the file, immediately preceded by any
|
||
tables of exported variables and functions.
|
||
|
||
- In addition to these of course, follow GDB coding conventions.
|
||
|
||
General naming rules:
|
||
|
||
- The word "object" absent any modifier (like "GOOPS object") means a
|
||
Scheme object (of any type), and is never used otherwise.
|
||
If you want to refer to, e.g., a GOOPS object, say "GOOPS object".
|
||
|
||
- Do not begin any function, global variable, etc. name with scm_.
|
||
That's what the Guile implementation uses.
|
||
(kinda obvious, just being complete).
|
||
|
||
- The word "invalid" carries a specific connotation. Try not to use it
|
||
in a different way. It means the underlying GDB object has disappeared.
|
||
For example, a <gdb:objfile> smob becomes "invalid" when the underlying
|
||
objfile is removed from GDB.
|
||
|
||
- We typically use the word "exception" to mean Scheme exceptions,
|
||
and we typically use the word "error" to mean GDB errors.
|
||
|
||
Comments:
|
||
|
||
- function comments for functions implementing Scheme procedures begin with
|
||
a description of the Scheme usage. Example:
|
||
/* (gsmob-aux gsmob) -> object */
|
||
|
||
- the following comment appears after the copyright header:
|
||
/* See README file in this directory for implementation notes, coding
|
||
conventions, et.al. */
|
||
|
||
Smob naming:
|
||
|
||
- gdb smobs are named, internally, "gdb:foo"
|
||
- in Guile they become <gdb:foo>, that is the convention for naming classes
|
||
and smobs have rudimentary GOOPS support (they can't be inherited from,
|
||
but generics can work with them)
|
||
- in comments use the Guile naming for smobs,
|
||
i.e., <gdb:foo> instead of gdb:foo.
|
||
Note: This only applies to smobs. Exceptions are also named gdb:foo,
|
||
but since they are not "classes" they are not wrapped in <>.
|
||
- smob names are stored in a global, and for simplicity we pass this
|
||
global as the "expected type" parameter to SCM_ASSERT_TYPE, thus in
|
||
this instance smob types are printed without the <>.
|
||
[Hmmm, this rule seems dated now. Plus I18N rules in GDB are not always
|
||
clear, sometimes we pass the smob name through _(), however it's not
|
||
clear that's actually a good idea.]
|
||
|
||
Type naming:
|
||
|
||
- smob structs are typedefs named foo_smob
|
||
|
||
Variable naming:
|
||
|
||
- "scm" by itself is reserved for arbitrary Scheme objects
|
||
|
||
- variables that are pointers to smob structs are named <char>_smob or
|
||
<char><char>_smob, e.g., f_smob for a pointer to a frame smob
|
||
|
||
- variables that are gdb smob objects are typically named <char>_scm or
|
||
<char><char>_scm, e.g., f_scm for a <gdb:frame> object
|
||
|
||
- the name of the first argument for method-like functions is "self"
|
||
|
||
Function naming:
|
||
|
||
General:
|
||
|
||
- all non-static functions have a prefix,
|
||
either gdbscm_ or <char><char>scm_ [or <char><char><char>scm_]
|
||
|
||
- all functions that implement Scheme procedures have a gdbscm_ prefix,
|
||
this is for consistency and readability of Scheme exception text
|
||
|
||
- static functions typically have a prefix
|
||
- the prefix is typically <char><char>scm_ where the first two letters
|
||
are unique to the file or class the function works with.
|
||
E.g., the scm-arch.c prefix is arscm_.
|
||
This follows something used in gdb/python in some places,
|
||
we make it formal.
|
||
|
||
- if the function is of a general nature, or no other prefix works,
|
||
use gdbscm_
|
||
|
||
Conversion functions:
|
||
|
||
- the from/to in function names follows from libguile's existing style
|
||
- conversions from/to Scheme objects are named:
|
||
prefix_scm_from_foo: converts from foo to scm
|
||
prefix_scm_to_foo: converts from scm to foo
|
||
|
||
Exception handling:
|
||
|
||
- functions that may throw a Scheme exception have an _unsafe suffix
|
||
- This does not apply to functions that implement Scheme procedures.
|
||
- This does not apply to functions whose explicit job is to throw
|
||
an exception. Adding _unsafe to gdbscm_throw is kinda superfluous. :-)
|
||
- functions that can throw a GDB error aren't adorned with _unsafe
|
||
|
||
- "_safe" in a function name means it will never throw an exception
|
||
- Generally unnecessary, since the convention is to mark the ones that
|
||
*can* throw an exception. But sometimes it's useful to highlight the
|
||
fact that the function is safe to call without worrying about exception
|
||
handling.
|
||
|
||
- except for functions that implement Scheme procedures, all functions
|
||
that can throw exceptions (GDB or Scheme) say so in their function comment
|
||
|
||
- functions that don't throw an exception, but still need to indicate to
|
||
the caller that one happened (i.e., "safe" functions), either return
|
||
a <gdb:exception> smob as a result or pass it back via a parameter.
|
||
For this reason don't pass back <gdb:exception> smobs for any other
|
||
reason. There are functions that explicitly construct <gdb:exception>
|
||
smobs. They're obviously the, umm, exception.
|
||
|
||
Internal functions:
|
||
|
||
- internal Scheme functions begin with "%" and are intentionally undocumented
|
||
in the manual
|
||
|
||
Standard Guile/Scheme conventions:
|
||
|
||
- predicates that return Scheme values have the suffix _p and have suffix "?"
|
||
in the Scheme procedure's name
|
||
- functions that implement Scheme procedures that modify state have the
|
||
suffix _x and have suffix "!" in the Scheme procedure's name
|
||
- object predicates that return a C truth value are named prefix_is_foo
|
||
- functions that set something have "set" at the front (except for a prefix)
|
||
write this: gdbscm_set_gsmob_aux_x implements (set-gsmob-aux! ...)
|
||
not this: gdbscm_gsmob_set_aux_x implements (gsmob-set-aux! ...)
|
||
|
||
Doc strings:
|
||
|
||
- there are lots of existing examples, they should be pretty consistent,
|
||
use them as boilerplate/examples
|
||
- begin with a one line summary (can be multiple lines if necessary)
|
||
- if the arguments need description:
|
||
- blank line
|
||
- " Arguments: arg1 arg2"
|
||
" arg1: blah ..."
|
||
" arg2: blah ..."
|
||
- if the result requires more description:
|
||
- blank line
|
||
- " Returns:"
|
||
" Blah ..."
|
||
- if it's important to list exceptions that can be thrown:
|
||
- blank line
|
||
- " Throws:"
|
||
" exception-name: blah ..."
|