Adding a Source Language to GDB
To add other languages to GDB’s expression parser, follow the following steps:
Create the expression parser
This should reside in a file ''lang''-exp.y. Routines for building parsed expressions into a union exp_element list are in parse.c.
Since we can’t depend upon everyone having Bison, and YACC produces parsers that define a bunch of global names, the following lines must be included at the top of the YACC parser, to prevent the various parsers from defining the same global names:
#define yyparse ''lang''_parse #define yylex ''lang''_lex #define yyerror ''lang''_error #define yylval ''lang''_lval #define yychar ''lang''_char #define yydebug ''lang''_debug #define yypact ''lang''_pact #define yyr1 ''lang''_r1 #define yyr2 ''lang''_r2 #define yydef ''lang''_def #define yychk ''lang''_chk #define yypgo ''lang''_pgo #define yyact ''lang''_act #define yyexca ''lang''_exca #define yyerrflag ''lang''_errflag #define yynerrs ''lang''_nerrs
At the bottom of your parser, define a struct language_defn and initialize it with the right values for your language. Define an initialize_''lang'' routine and have it call ‘add_language(''lang''_language_defn)’ to tell the rest of GDB that your language exists. You’ll need some other supporting variables and functions, which will be used via pointers from your ''lang''_language_defn. See the declaration of struct language_defn in language.h, and the other *-exp.y files, for more information.
Add any evaluation routines, if necessary
If you need new opcodes (that represent the operations of the language), add them to the enumerated type in expression.h. Add support code for these operations in the evaluate_subexp function defined in the file eval.c. Add cases for new opcodes in two functions from parse.c: prefixify_subexp and length_of_subexp. These compute the number of exp_elements that a given operation takes up.
Update some existing code
Add an enumerated identifier for your language to the enumerated type enum language in defs.h.
Update the routines in language.c so your language is included. These routines include type predicates and such, which (in some cases) are language dependent. If your language does not appear in the switch statement, an error is reported.
Also included in language.c is the code that updates the variable current_language, and the routines that translate the language_''lang'' enumerated identifier into a printable string.
Update the function _initialize_language to include your language. This function picks the default language upon startup, so is dependent upon which languages that GDB is built for.
Update allocate_symtab in symfile.c and/or symbol-reading code so that the language of each symtab (source file) is set properly. This is used to determine the language to use at each stack frame level. Currently, the language is set based upon the extension of the source file. If the language can be better inferred from the symbol information, please set the language of the symtab in the symbol-reading code.
Add helper code to print_subexp (in expprint.c) to handle any new expression opcodes you have added to expression.h. Also, add the printed representations of your operators to op_print_tab.
Add a place of call
Add a call to ''lang''_parse() and ''lang''_error in parse_exp_1 (defined in parse.c).
Add dependencies in Makefile.in. Make sure you update the macro variables such as HFILES and OBJS, otherwise your code may not get linked in, or, worse yet, it may not get tarred into the distribution!