diff options
author | Doug Evans <xdje42@gmail.com> | 2014-02-09 19:40:01 -0800 |
---|---|---|
committer | Doug Evans <xdje42@gmail.com> | 2014-02-09 19:40:01 -0800 |
commit | ed3ef33944c39d9a3cea72b9a7cef3c20f0e3461 (patch) | |
tree | 4e67d95b8ea65bb36a9cade5e37df2ad6289052e /gdb/guile/README | |
parent | 7026a7c16ee82d39e84823f8cc3097a9a940ddb2 (diff) | |
download | gdb-ed3ef33944c39d9a3cea72b9a7cef3c20f0e3461.zip gdb-ed3ef33944c39d9a3cea72b9a7cef3c20f0e3461.tar.gz gdb-ed3ef33944c39d9a3cea72b9a7cef3c20f0e3461.tar.bz2 |
Add Guile as an extension language.
* 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.
Diffstat (limited to 'gdb/guile/README')
-rw-r--r-- | gdb/guile/README | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/gdb/guile/README b/gdb/guile/README new file mode 100644 index 0000000..81306e5 --- /dev/null +++ b/gdb/guile/README @@ -0,0 +1,229 @@ +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 ..." |