Files
oldlinux-files/Ref-docs/manual gdb/gdbint/gdbint_7.html
2024-02-19 00:21:47 -05:00

260 lines
11 KiB
HTML

<HTML>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- Created on October, 18 2002 by texi2html 1.64 -->
<!--
Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
Karl Berry <karl@freefriends.org>
Olaf Bachmann <obachman@mathematik.uni-kl.de>
and many others.
Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>
Send bugs and suggestions to <texi2html@mathematik.uni-kl.de>
-->
<HEAD>
<TITLE>GDB Internals: Language Support</TITLE>
<META NAME="description" CONTENT="GDB Internals: Language Support">
<META NAME="keywords" CONTENT="GDB Internals: Language Support">
<META NAME="resource-type" CONTENT="document">
<META NAME="distribution" CONTENT="global">
<META NAME="Generator" CONTENT="texi2html 1.64">
</HEAD>
<BODY LANG="" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<A NAME="SEC61"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_6.html#SEC60"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_7.html#SEC62"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_8.html#SEC63"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint.html#SEC_Top"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_8.html#SEC63"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_19.html#SEC186">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H1> 7. Language Support </H1>
<!--docid::SEC61::-->
<P>
<A NAME="IDX127"></A>
GDB's language support is mainly driven by the symbol reader,
although it is possible for the user to set the source language
manually.
</P><P>
GDB chooses the source language by looking at the extension
of the file recorded in the debug info; <TT>`.c'</TT> means C, <TT>`.f'</TT>
means Fortran, etc. It may also use a special-purpose language
identifier if the debug format supports it, like with DWARF.
</P><P>
<HR SIZE="6">
<A NAME="SEC62"></A>
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_7.html#SEC61"> &lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_8.html#SEC63"> &gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_7.html#SEC61"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_7.html#SEC61"> Up </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_8.html#SEC63"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_19.html#SEC186">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<H2> 7.1 Adding a Source Language to GDB </H2>
<!--docid::SEC62::-->
<P>
<A NAME="IDX128"></A>
To add other languages to GDB's expression parser, follow the
following steps:
</P><P>
<DL COMPACT>
<DT><EM>Create the expression parser.</EM>
<DD><P>
<A NAME="IDX129"></A>
This should reside in a file <TT>`<VAR>lang</VAR>-exp.y'</TT>. Routines for
building parsed expressions into a <CODE>union exp_element</CODE> list are in
<TT>`parse.c'</TT>.
</P><P>
<A NAME="IDX130"></A>
Since we can't depend upon everyone having Bison, and YACC produces
parsers that define a bunch of global names, the following lines
<STRONG>must</STRONG> be included at the top of the YACC parser, to prevent the
various parsers from defining the same global names:
</P><P>
<TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>#define yyparse <VAR>lang</VAR>_parse
#define yylex <VAR>lang</VAR>_lex
#define yyerror <VAR>lang</VAR>_error
#define yylval <VAR>lang</VAR>_lval
#define yychar <VAR>lang</VAR>_char
#define yydebug <VAR>lang</VAR>_debug
#define yypact <VAR>lang</VAR>_pact
#define yyr1 <VAR>lang</VAR>_r1
#define yyr2 <VAR>lang</VAR>_r2
#define yydef <VAR>lang</VAR>_def
#define yychk <VAR>lang</VAR>_chk
#define yypgo <VAR>lang</VAR>_pgo
#define yyact <VAR>lang</VAR>_act
#define yyexca <VAR>lang</VAR>_exca
#define yyerrflag <VAR>lang</VAR>_errflag
#define yynerrs <VAR>lang</VAR>_nerrs
</FONT></pre></td></tr></table></P><P>
At the bottom of your parser, define a <CODE>struct language_defn</CODE> and
initialize it with the right values for your language. Define an
<CODE>initialize_<VAR>lang</VAR></CODE> routine and have it call
<SAMP>`add_language(<VAR>lang</VAR>_language_defn)'</SAMP> 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
<CODE><VAR>lang</VAR>_language_defn</CODE>. See the declaration of <CODE>struct
language_defn</CODE> in <TT>`language.h'</TT>, and the other <TT>`*-exp.y'</TT> files,
for more information.
</P><P>
<DT><EM>Add any evaluation routines, if necessary</EM>
<DD><P>
<A NAME="IDX131"></A>
<A NAME="IDX132"></A>
<A NAME="IDX133"></A>
<A NAME="IDX134"></A>
If you need new opcodes (that represent the operations of the language),
add them to the enumerated type in <TT>`expression.h'</TT>. Add support
code for these operations in the <CODE>evaluate_subexp</CODE> function
defined in the file <TT>`eval.c'</TT>. Add cases
for new opcodes in two functions from <TT>`parse.c'</TT>:
<CODE>prefixify_subexp</CODE> and <CODE>length_of_subexp</CODE>. These compute
the number of <CODE>exp_element</CODE>s that a given operation takes up.
</P><P>
<DT><EM>Update some existing code</EM>
<DD><P>
Add an enumerated identifier for your language to the enumerated type
<CODE>enum language</CODE> in <TT>`defs.h'</TT>.
</P><P>
Update the routines in <TT>`language.c'</TT> 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.
</P><P>
<A NAME="IDX135"></A>
Also included in <TT>`language.c'</TT> is the code that updates the variable
<CODE>current_language</CODE>, and the routines that translate the
<CODE>language_<VAR>lang</VAR></CODE> enumerated identifier into a printable
string.
</P><P>
<A NAME="IDX136"></A>
Update the function <CODE>_initialize_language</CODE> to include your
language. This function picks the default language upon startup, so is
dependent upon which languages that GDB is built for.
</P><P>
<A NAME="IDX137"></A>
Update <CODE>allocate_symtab</CODE> in <TT>`symfile.c'</TT> 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.
</P><P>
<A NAME="IDX138"></A>
<A NAME="IDX139"></A>
Add helper code to <CODE>print_subexp</CODE> (in <TT>`expprint.c'</TT>) to handle any new
expression opcodes you have added to <TT>`expression.h'</TT>. Also, add the
printed representations of your operators to <CODE>op_print_tab</CODE>.
</P><P>
<DT><EM>Add a place of call</EM>
<DD><P>
<A NAME="IDX140"></A>
Add a call to <CODE><VAR>lang</VAR>_parse()</CODE> and <CODE><VAR>lang</VAR>_error</CODE> in
<CODE>parse_exp_1</CODE> (defined in <TT>`parse.c'</TT>).
</P><P>
<DT><EM>Use macros to trim code</EM>
<DD><P>
<A NAME="IDX141"></A>
The user has the option of building GDB for some or all of the
languages. If the user decides to build GDB for the language
<VAR>lang</VAR>, then every file dependent on <TT>`language.h'</TT> will have the
macro <CODE>_LANG_<VAR>lang</VAR></CODE> defined in it. Use <CODE>#ifdef</CODE>s to
leave out large routines that the user won't need if he or she is not
using your language.
</P><P>
Note that you do not need to do this in your YACC parser, since if GDB
is not build for <VAR>lang</VAR>, then <TT>`<VAR>lang</VAR>-exp.tab.o'</TT> (the
compiled form of your parser) is not linked into GDB at all.
</P><P>
See the file <TT>`configure.in'</TT> for how GDB is configured
for different languages.
</P><P>
<DT><EM>Edit <TT>`Makefile.in'</TT></EM>
<DD><P>
Add dependencies in <TT>`Makefile.in'</TT>. Make sure you update the macro
variables such as <CODE>HFILES</CODE> and <CODE>OBJS</CODE>, otherwise your code may
not get linked in, or, worse yet, it may not get <CODE>tar</CODE>red into the
distribution!
</DL>
<P>
<A NAME="Host Definition"></A>
</P><P>
<HR SIZE="6">
<TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0>
<TR><TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_7.html#SEC61"> &lt;&lt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_8.html#SEC63"> &gt;&gt; </A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint.html#SEC_Top">Top</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_toc.html#SEC_Contents">Contents</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_19.html#SEC186">Index</A>]</TD>
<TD VALIGN="MIDDLE" ALIGN="LEFT">[<A HREF="gdbint_abt.html#SEC_About"> ? </A>]</TD>
</TR></TABLE>
<BR>
<FONT SIZE="-1">
<address>
<p>Please send FSF &amp; GNU inquiries &amp; questions to <a
href="mailto:gnu@gnu.org">gnu@gnu.org</a>. There are also <a
href="http://www.gnu.org/home.html#ContactInfo">other ways to
contact</a> the FSF.</p>
<p>These pages are maintained by <a
href="http://www.gnu.org/software/gdb/">the GDB developers</a>.</p>
<p>Copyright Free Software Foundation, Inc., 59 Temple Place - Suite
330, Boston, MA 02111, USA.</p>
<p>Verbatim copying and distribution of this entire article is
permitted in any medium, provided this notice is preserved.</p>
</address>
This document was generated
by <I>GDB Administrator</I> on <I>October, 18 2002</I>
using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html
"><I>texi2html</I></A>
</BODY>
</HTML>