From 2a11a00cc529e259348dbac1f651b32b0ccfc4d3 Mon Sep 17 00:00:00 2001 From: frief Date: Sat, 23 Aug 2003 20:10:48 +0000 Subject: [PATCH] various additions and updates. Rearranged sections git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2848 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 6 +- doc/sdccman.lyx | 6626 ++++++++++++++++++++++++----------------------- 2 files changed, 3329 insertions(+), 3303 deletions(-) diff --git a/ChangeLog b/ChangeLog index e4a18c46..663cab9c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2003-08-23 Frieder Ferlemann + + * doc/sdccman.lyx: various additions and updates. Rearranged sections + 2003-08-22 Jesus Calvino-Fraga Z80 and MCS51 linkers complaint if a public symbol is defined @@ -101,7 +105,7 @@ Rules 246.x, 247.x relate to bitfields, the others speed up access to xdata mapped I/O devices. - * src/mcs51/peeph.def: added 26 peepholes 246.x - 248.x, 180.x + * src/mcs51/peeph.def: added 26 peepholes 246.x - 248.x, 180.x 2003-08-16 Erik Petrich diff --git a/doc/sdccman.lyx b/doc/sdccman.lyx index 2cbf8a91..fe3c79a4 100644 --- a/doc/sdccman.lyx +++ b/doc/sdccman.lyx @@ -463,8 +463,12 @@ code banking \newline \family default -If you can think of some more, please see the chapter 9 about filing feature - requests +If you can think of some more, please see the chapter +\begin_inset LatexCommand \ref{sub:Requesting-Features} + +\end_inset + + about filing feature requests \begin_inset LatexCommand \index{Requesting features} \end_inset @@ -479,7 +483,7 @@ If you can think of some more, please see the chapter 9 about filing feature \layout Section \pagebreak_top -Installation +Installing SDCC \begin_inset LatexCommand \index{Installation} \end_inset @@ -4313,7 +4317,7 @@ Processor Selection Options \series default - Generate code for the MCS51 + Generate code for the Intel MCS51 \begin_inset LatexCommand \index{MCS51} \end_inset @@ -6748,6 +6752,121 @@ status Collapsed \size default \bar default Will cause all the above mentioned dumps to be created. +\layout Subsubsection + +Redirecting output on Windows Shells +\layout Standard + +By default SDCC writes it's error messages to +\begin_inset Quotes sld +\end_inset + +standard error +\begin_inset Quotes srd +\end_inset + +. + To force all messages to +\begin_inset Quotes sld +\end_inset + +standard output +\begin_inset Quotes srd +\end_inset + + use +\series bold +- +\series default +\emph on + +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + + +\series bold +\emph default +- +\series default +use-stdout +\begin_inset LatexCommand \index{-\/-use-stdout} + +\end_inset + +. + Aditionaly, if you happen to have visual studio installed in your windows + machine, you can use it to compile your sources using a custom build and + the SDCC - +\emph on + +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + + +\emph default +-vc +\begin_inset LatexCommand \index{-\/-vc} + +\end_inset + + option. + Something like this should work: +\newline + +\newline + +\series bold +c: +\backslash +sdcc +\backslash +bin +\backslash +sdcc.exe - +\series default +\emph on + +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + + +\series bold +\emph default +-vc - +\series default +\emph on + +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + + +\series bold +\emph default +-model-large -c $(InputPath) \layout Subsection Environment variables @@ -7245,14 +7364,14 @@ sbit at 0xd7 CY; /* CY (Carry Flag \end_inset ) */ -\layout Subsection +\layout Subsubsection Pointers \begin_inset LatexCommand \index{Pointers} \end_inset - + to MCS51/DS390 specific memory spaces \layout Standard SDCC allows (via language extensions) pointers to explicitly point to any @@ -7336,274 +7455,539 @@ generic code. \layout Subsection -Parameters -\begin_inset LatexCommand \index{Parameters} - -\end_inset - - & Local Variables -\begin_inset LatexCommand \index{Local variable} +Absolute Addressing +\begin_inset LatexCommand \index{Absolute addressing} \end_inset \layout Standard -Automatic (local) variables and parameters to functions can either be placed - on the stack or in data-space. - The default action of the compiler is to place these variables in the internal - RAM (for small model) or external RAM (for large model). - This in fact makes them +Data items can be assigned an absolute address with the \emph on -static -\begin_inset LatexCommand \index{static} +at +\begin_inset LatexCommand \index{at} \end_inset - +
\emph default - so by default functions are non-reentrant -\begin_inset LatexCommand \index{reentrant} - -\end_inset + keyword, in addition to a storage class, e.g.: +\layout Verse -. -\newline -\newline -They can be placed on the stack -\begin_inset LatexCommand \index{stack} +\family typewriter +xdata +\begin_inset LatexCommand \index{xdata} \end_inset - either by using the -\emph on - - -\begin_inset ERT -status Collapsed + at +\begin_inset LatexCommand \index{at} + +\end_inset + 0x7ffe unsigned int chksum; \layout Standard -\backslash -/ +In the above example the variable chksum will located at 0x7ffe and 0x7fff + of the external ram. + The compiler does not actually reserve any space for variables declared + in this way (they are implemented with an equate in the assembler). + Thus it is left to the programmer to make sure there are no overlaps with + other variables that are declared without the absolute address. + The assembler listing file (.lst +\begin_inset LatexCommand \index{.lst} + \end_inset --stack-auto -\begin_inset LatexCommand \index{-\/-stack-auto} +) and the linker output files (.rst +\begin_inset LatexCommand \index{.rst} \end_inset - -\emph default - option or by using the -\emph on -reentrant -\begin_inset LatexCommand \index{reentrant} +) and (.map +\begin_inset LatexCommand \index{.map} \end_inset +) are good places to look for such overlaps. +\layout Standard +In case of memory mapped I/O devices the keyword +\emph on +volatile \emph default - keyword in the function declaration, e.g.: + should be used to tell the compiler that accesses might not be optimized + away: \layout Verse \family typewriter -unsigned char foo(char i) reentrant -\newline -{ -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -... - -\newline -} -\layout Standard +volatile +\begin_inset LatexCommand \index{volatile} -Since stack space on 8051 is limited, the -\emph on -reentrant -\emph default -keyword or the -\emph on - - -\begin_inset ERT -status Collapsed +\end_inset -\layout Standard + xdata +\begin_inset LatexCommand \index{xdata} -\backslash -/ \end_inset --stack-auto -\emph default - option should be used sparingly. - Note that the reentrant keyword just means that the parameters & local - variables will be allocated to the stack, it -\emph on -does not -\emph default - mean that the function is register bank independent. -\newline - -\newline -Local variables can be assigned storage classes and absolute -\begin_inset LatexCommand \index{Absolute addressing} + at +\begin_inset LatexCommand \index{at} \end_inset - addresses, e.g.: + 0x8000 unsigned char PORTA_8255; +\layout Standard + +Absolute address can be specified for variables in all storage classes, + e.g.: \layout Verse \family typewriter -unsigned char foo() -\newline -{ -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ +bit +\begin_inset LatexCommand \index{bit} + +\end_inset + + at +\begin_inset LatexCommand \index{at} + +\end_inset + + 0x02 bvar; +\layout Standard + +The above example will allocate the variable at offset 0x02 in the bit-addressab +le space. + There is no real advantage to assigning absolute addresses to variables + in this manner, unless you want strict control over all the variables allocated. + One possible use would be to write hardware portable code. + For example, if you have a routine that uses one or more of the microcontroller + I/O pins, and such pins are different for two different hardwares, you + can declare the I/O pins in your routine using: +\layout Verse + + +\family typewriter +extern bit SDI; +\newline +extern bit SCLK; +\newline +extern bit CPOL; +\newline + +\newline +void DS1306_put(unsigned char value) +\newline +{ +\newline \SpecialChar ~ -xdata unsigned char i; +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +unsigned char mask=0x80; +\newline + \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -bit bvar; +while(mask) \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -data at 0x31 unsigned char j; +{ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -... - +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +SDI=(value & mask)?1:0; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +SCLK=!CPOL; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +SCLK=CPOL; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mask/=2; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +} \newline } \layout Standard -In the above example the variable -\emph on -i -\emph default - will be allocated in the external ram, -\emph on -bvar -\emph default - in bit addressable space and -\emph on - j -\emph default - in internal ram. - When compiled with -\emph on -- -\begin_inset ERT -status Collapsed +Then, someplace in the code for the first hardware you would use +\layout Verse + +\family typewriter +bit at 0x80 SDI;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* I/O port 0, bit 0 */ +\newline +bit at 0x81 SCLK;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* I/O port 0, bit 1 */ +\newline +bit CPOL;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* This is a variable, let the linker allocate this one */ \layout Standard -\backslash -/ -\end_inset +Similarly, for the second hardware you would use +\layout Verse --stack-auto -\emph default - or when a function is declared as -\emph on -reentrant -\emph default - this should only be done for static variables. + +\family typewriter +bit at 0x83 SDI;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* I/O port 0, bit 3 */ +\newline +bit at 0x91 SCLK;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* I/O port 1, bit 1 */ +\newline +bit CPOL;\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* This is a variable, let the linker allocate this one */ \layout Standard -Parameters however are not allowed any storage class, (storage classes for - parameters will be ignored), their allocation is governed by the memory - model in use, and the reentrancy options. +and you can use the same hardware dependent routine without changes, as + for example in a library. + This is somehow similar to sbit, but only one absolute address has to be + specified in the whole project. \layout Subsection -Overlaying -\begin_inset LatexCommand \label{sub:Overlaying} +Parameters +\begin_inset LatexCommand \index{Parameters} \end_inset - -\begin_inset LatexCommand \index{Overlaying} + & Local Variables +\begin_inset LatexCommand \index{Local variable} \end_inset \layout Standard -For non-reentrant -\begin_inset LatexCommand \index{reentrant} - -\end_inset - - functions SDCC will try to reduce internal ram space usage by overlaying - parameters and local variables of a function (if possible). - Parameters and local variables of a function will be allocated to an overlayabl -e segment if the function has +Automatic (local) variables and parameters to functions can either be placed + on the stack or in data-space. + The default action of the compiler is to place these variables in the internal + RAM (for small model) or external RAM (for large model). + This in fact makes them \emph on -no other function calls and the function is non-reentrant and the memory - model -\begin_inset LatexCommand \index{Memory model} +static +\begin_inset LatexCommand \index{static} \end_inset - is small. \emph default - If an explicit storage class -\begin_inset LatexCommand \index{Storage class} + so by default functions are non-reentrant +\begin_inset LatexCommand \index{reentrant} \end_inset - is specified for a local variable, it will NOT be overlayed. -\layout Standard +. +\newline -Note that the compiler (not the linkage editor) makes the decision for overlayin -g the data items. - Functions that are called from an interrupt service routine should be preceded - by a #pragma\SpecialChar ~ -NOOVERLAY -\begin_inset LatexCommand \index{\#pragma NOOVERLAY} +\newline +They can be placed on the stack +\begin_inset LatexCommand \index{stack} \end_inset - if they are not reentrant. + either by using the +\emph on + - +\begin_inset ERT +status Collapsed + \layout Standard -Also note that the compiler does not do any processing of inline -\begin_inset LatexCommand \index{inline} +\backslash +/ +\end_inset + +-stack-auto +\begin_inset LatexCommand \index{-\/-stack-auto} \end_inset - assembler code, so the compiler might incorrectly assign local variables - and parameters of a function into the overlay segment if the inline assembler - code calls other c-functions that might use the overlay. - In that case the #pragma\SpecialChar ~ -NOOVERLAY should be used. -\layout Standard -Parameters and Local variables of functions that contain 16 or 32 bit multiplica -tion -\begin_inset LatexCommand \index{Multiplication} +\emph default + option or by using the +\emph on +reentrant +\begin_inset LatexCommand \index{reentrant} \end_inset - or division -\begin_inset LatexCommand \index{Division} + +\emph default + keyword in the function declaration, e.g.: +\layout Verse + + +\family typewriter +unsigned char foo(char i) reentrant +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +... + +\newline +} +\layout Standard + +Since stack space on 8051 is limited, the +\emph on +reentrant +\emph default +keyword or the +\emph on + - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-stack-auto +\emph default + option should be used sparingly. + Note that the reentrant keyword just means that the parameters & local + variables will be allocated to the stack, it +\emph on +does not +\emph default + mean that the function is register bank independent. +\newline + +\newline +Local variables can be assigned storage classes and absolute +\begin_inset LatexCommand \index{Absolute addressing} + +\end_inset + + addresses, e.g.: +\layout Verse + + +\family typewriter +unsigned char foo() +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +xdata unsigned char i; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +bit bvar; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +data at 0x31 unsigned char j; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +... + +\newline +} +\layout Standard + +In the above example the variable +\emph on +i +\emph default + will be allocated in the external ram, +\emph on +bvar +\emph default + in bit addressable space and +\emph on + j +\emph default + in internal ram. + When compiled with +\emph on +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-stack-auto +\emph default + or when a function is declared as +\emph on +reentrant +\emph default + this should only be done for static variables. +\layout Standard + +Parameters however are not allowed any storage class, (storage classes for + parameters will be ignored), their allocation is governed by the memory + model in use, and the reentrancy options. +\layout Subsection + +Overlaying +\begin_inset LatexCommand \label{sub:Overlaying} + +\end_inset + + +\begin_inset LatexCommand \index{Overlaying} + +\end_inset + + +\layout Standard + +For non-reentrant +\begin_inset LatexCommand \index{reentrant} + +\end_inset + + functions SDCC will try to reduce internal ram space usage by overlaying + parameters and local variables of a function (if possible). + Parameters and local variables of a function will be allocated to an overlayabl +e segment if the function has +\emph on +no other function calls and the function is non-reentrant and the memory + model +\begin_inset LatexCommand \index{Memory model} + +\end_inset + + is small. + +\emph default + If an explicit storage class +\begin_inset LatexCommand \index{Storage class} + +\end_inset + + is specified for a local variable, it will NOT be overlayed. +\layout Standard + +Note that the compiler (not the linkage editor) makes the decision for overlayin +g the data items. + Functions that are called from an interrupt service routine should be preceded + by a #pragma\SpecialChar ~ +NOOVERLAY +\begin_inset LatexCommand \index{\#pragma NOOVERLAY} + +\end_inset + + if they are not reentrant. +\layout Standard + +Also note that the compiler does not do any processing of inline +\begin_inset LatexCommand \index{inline} + +\end_inset + + assembler code, so the compiler might incorrectly assign local variables + and parameters of a function into the overlay segment if the inline assembler + code calls other c-functions that might use the overlay. + In that case the #pragma\SpecialChar ~ +NOOVERLAY should be used. +\layout Standard + +Parameters and Local variables of functions that contain 16 or 32 bit multiplica +tion +\begin_inset LatexCommand \index{Multiplication} + +\end_inset + + or division +\begin_inset LatexCommand \index{Division} \end_inset @@ -8546,175 +8930,210 @@ It is most efficient if your ISR calls no other functions. \layout Subsection -Absolute Addressing -\begin_inset LatexCommand \index{Absolute addressing} +Startup Code +\begin_inset LatexCommand \index{Startup code} \end_inset \layout Standard -Data items can be assigned an absolute address with the +The compiler inserts a call to the C routine \emph on -at -\begin_inset LatexCommand \index{at} +_sdcc_external_startup() +\begin_inset LatexCommand \index{\_sdcc\_external\_startup()} \end_inset -
-\emph default - keyword, in addition to a storage class, e.g.: -\layout Verse - -\family typewriter -xdata -\begin_inset LatexCommand \index{xdata} +\series bold +\emph default + +\series default +at the start of the CODE area. + This routine is in the runtime library +\begin_inset LatexCommand \index{Runtime library} \end_inset - at -\begin_inset LatexCommand \index{at} - -\end_inset +. + By default this routine returns 0, if this routine returns a non-zero value, + the static & global variable initialization will be skipped and the function + main will be invoked. + Otherwise static & global variables will be initialized before the function + main is invoked. + You could add a +\emph on +_sdcc_external_startup() +\emph default + routine to your program to override the default if you need to setup hardware + or perform some other critical operation prior to static & global variable + initialization. + See also the compiler option +\emph on +- +\begin_inset ERT +status Collapsed - 0x7ffe unsigned int chksum; \layout Standard -In the above example the variable chksum will located at 0x7ffe and 0x7fff - of the external ram. - The compiler does not actually reserve any space for variables declared - in this way (they are implemented with an equate in the assembler). - Thus it is left to the programmer to make sure there are no overlaps with - other variables that are declared without the absolute address. - The assembler listing file (.lst -\begin_inset LatexCommand \index{.lst} - +\backslash +/ \end_inset -) and the linker output files (.rst -\begin_inset LatexCommand \index{.rst} +-no-xinit +\emph default +- +\emph on +opt +\emph default + +\begin_inset LatexCommand \index{-\/-no-xinit-opt} \end_inset -) and (.map -\begin_inset LatexCommand \index{.map} +. +\layout Subsection + +Inline Assembler Code +\begin_inset LatexCommand \index{Assembler routines} \end_inset -) are good places to look for such overlaps. + \layout Standard -In case of memory mapped I/O devices the keyword +SDCC allows the use of in-line assembler with a few restriction as regards + labels. + All labels defined within inline assembler code \emph on -volatile +has to be \emph default - should be used to tell the compiler that accesses might not be optimized - away: -\layout Verse - + of the form +\emph on +nnnnn$ +\emph default + where nnnn is a number less than 100 (which implies a limit of utmost 100 + inline assembler labels +\emph on +per function +\emph default +\noun on +) +\noun default +. + It is strongly recommended that each assembly instruction (including labels) + be placed in a separate line (as the example shows). + When the - +\begin_inset ERT +status Collapsed -\family typewriter -volatile -\begin_inset LatexCommand \index{volatile} +\layout Standard +\backslash +/ \end_inset - xdata -\begin_inset LatexCommand \index{xdata} +- +\emph on +peep-asm +\begin_inset LatexCommand \index{-\/-peep-asm} \end_inset - at -\begin_inset LatexCommand \index{at} -\end_inset +\emph default + command line option is used, the inline assembler code will be passed through + the peephole optimizer +\begin_inset LatexCommand \index{Peephole optimizer} - 0x8000 unsigned char PORTA_8255; -\layout Standard +\end_inset -Absolute address can be specified for variables in all storage classes, - e.g.: +. + This might cause some unexpected changes in the inline assembler code. + Please go through the peephole optimizer rules defined in file +\emph on +SDCCpeeph.def +\emph default + carefully before using this option. \layout Verse \family typewriter -bit -\begin_inset LatexCommand \index{bit} - -\end_inset - - at -\begin_inset LatexCommand \index{at} +_asm +\begin_inset LatexCommand \index{\_asm} \end_inset - 0x02 bvar; -\layout Standard - -The above example will allocate the variable at offset 0x02 in the bit-addressab -le space. - There is no real advantage to assigning absolute addresses to variables - in this manner, unless you want strict control over all the variables allocated. - One possible use would be to write hardware portable code. - For example, if you have a routine that uses one or more of the microcontroller - I/O pins, and such pins are different for two different hardwares, you - can declare the I/O pins in your routine using: -\layout Verse - - -\family typewriter -extern bit SDI; -\newline -extern bit SCLK; -\newline -extern bit CPOL; -\newline - -\newline -void DS1306_put(unsigned char value) -\newline -{ + \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -unsigned char mask=0x80; -\newline - -\newline +mov\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -while(mask) +b,#10 \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -{ +00001$: \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +djnz\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ -SDI=(value & mask)?1:0; +b,00001$ +\newline +_endasm +\begin_inset LatexCommand \index{\_endasm} + +\end_inset + + ; +\layout Standard + +The inline assembler code can contain any valid code understood by the assembler +, this includes any assembler directives and comment lines. + The compiler does not do any validation of the code within the +\family typewriter +_asm ... + _endasm; +\family default + keyword pair. + +\newline + +\newline +Inline assembler code cannot reference any C-Labels, however it can reference + labels +\begin_inset LatexCommand \index{Labels} + +\end_inset + + defined by the inline assembler, e.g.: +\layout Verse + + +\family typewriter +foo() { \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +/* some c code */ +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -SCLK=!CPOL; +_asm \newline \SpecialChar ~ \SpecialChar ~ @@ -8722,9 +9141,7 @@ SCLK=!CPOL; \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -SCLK=CPOL; +; some assembler code \newline \SpecialChar ~ \SpecialChar ~ @@ -8732,180 +9149,107 @@ SCLK=CPOL; \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -mask/=2; +ljmp $0003 \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -} +_endasm; \newline -} -\layout Standard - -Then, someplace in the code for the first hardware you would use -\layout Verse - - -\family typewriter -bit at 0x80 SDI;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* I/O port 0, bit 0 */ -\newline -bit at 0x81 SCLK;\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ -/* I/O port 0, bit 1 */ +/* some more c code */ \newline -bit CPOL;\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ +clabel:\SpecialChar ~ \SpecialChar ~ +/* inline assembler cannot reference this label */ +\newline \SpecialChar ~ -/* This is a variable, let the linker allocate this one */ -\layout Standard - -Similarly, for the second hardware you would use -\layout Verse - - -\family typewriter -bit at 0x83 SDI;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* I/O port 0, bit 3 */ +_asm \newline -bit at 0x91 SCLK;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* I/O port 1, bit 1 */ -\newline -bit CPOL;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +$0003: ;label (can be reference by inline assembler only) +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +_endasm ; +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* This is a variable, let the linker allocate this one */ +/* some more c code */ +\newline +} \layout Standard -and you can use the same hardware dependent routine without changes, as - for example in a library. - This is somehow similar to sbit, but only one absolute address has to be - specified in the whole project. -\layout Subsection +In other words inline assembly code can access labels defined in inline + assembly within the scope of the function. + The same goes the other way, ie. + labels defines in inline assembly CANNOT be accessed by C statements. +\layout Standard -Startup Code -\begin_inset LatexCommand \index{Startup code} +An example acessing a C variable is in section +\begin_inset LatexCommand \ref{sub:Naked-Functions} \end_inset +. +\layout Subsection -\layout Standard - -The compiler inserts a call to the C routine -\emph on -_sdcc_external_startup() -\begin_inset LatexCommand \index{\_sdcc\_external\_startup()} +Interfacing with Assembler Code +\begin_inset LatexCommand \index{Assembler routines} \end_inset -\series bold -\emph default - -\series default -at the start of the CODE area. - This routine is in the runtime library -\begin_inset LatexCommand \index{Runtime library} +\layout Subsubsection + +Global Registers used for Parameter Passing +\begin_inset LatexCommand \index{Parameter passing} \end_inset -. - By default this routine returns 0, if this routine returns a non-zero value, - the static & global variable initialization will be skipped and the function - main will be invoked. - Otherwise static & global variables will be initialized before the function - main is invoked. - You could add a -\emph on -_sdcc_external_startup() -\emph default - routine to your program to override the default if you need to setup hardware - or perform some other critical operation prior to static & global variable - initialization. - See also the compiler option -\emph on -- -\begin_inset ERT -status Collapsed \layout Standard -\backslash -/ -\end_inset - --no-xinit -\emph default -- +The compiler always uses the global registers \emph on -opt -\emph default - -\begin_inset LatexCommand \index{-\/-no-xinit-opt} +DPL, DPH +\begin_inset LatexCommand \index{DPTR, DPH, DPL} \end_inset -. -\layout Subsection - -Inline Assembler Code -\begin_inset LatexCommand \index{Assembler routines} +, B +\begin_inset LatexCommand \index{B (register)} \end_inset - -\layout Standard - -SDCC allows the use of in-line assembler with a few restriction as regards - labels. - All labels defined within inline assembler code -\emph on -has to be -\emph default - of the form -\emph on -nnnnn$ + \emph default - where nnnn is a number less than 100 (which implies a limit of utmost 100 - inline assembler labels +and \emph on -per function + ACC +\begin_inset LatexCommand \index{ACC} + +\end_inset + + \emph default -\noun on -) -\noun default -. - It is strongly recommended that each assembly instruction (including labels) - be placed in a separate line (as the example shows). - When the - + to pass the first parameter to a routine. + The second parameter onwards is either allocated on the stack (for reentrant + routines or if - \begin_inset ERT status Collapsed @@ -8915,106 +9259,77 @@ status Collapsed / \end_inset -- -\emph on -peep-asm -\begin_inset LatexCommand \index{-\/-peep-asm} +-stack-auto is used) or in data / xdata memory (depending on the memory + model). + +\layout Subsubsection -\end_inset +Assembler Routine(non-reentrant +\begin_inset LatexCommand \index{reentrant} +\end_inset -\emph default - command line option is used, the inline assembler code will be passed through - the peephole optimizer -\begin_inset LatexCommand \index{Peephole optimizer} +) +\begin_inset LatexCommand \index{Assembler routines (non-reentrant)} \end_inset -. - This might cause some unexpected changes in the inline assembler code. - Please go through the peephole optimizer rules defined in file -\emph on -SDCCpeeph.def -\emph default - carefully before using this option. + +\layout Standard + +In the following example the function c_func calls an assembler routine + asm_func, which takes two parameters. \layout Verse \family typewriter -_asm -\begin_inset LatexCommand \index{\_asm} - -\end_inset +extern int asm_func(unsigned char, unsigned char); +\newline - +\newline +int c_func (unsigned char i, unsigned char j) +\newline +{ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -b,#10 +return asm_func(i,j); \newline -00001$: +} +\newline + +\newline +int main() +\newline +{ \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -djnz\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -b,00001$ +return c_func(10,9); \newline -_endasm -\begin_inset LatexCommand \index{\_endasm} - -\end_inset - - ; +} \layout Standard -The inline assembler code can contain any valid code understood by the assembler -, this includes any assembler directives and comment lines. - The compiler does not do any validation of the code within the -\family typewriter -_asm ... - _endasm; -\family default - keyword pair. - -\newline - -\newline -Inline assembler code cannot reference any C-Labels, however it can reference - labels -\begin_inset LatexCommand \index{Labels} - -\end_inset - - defined by the inline assembler, e.g.: +The corresponding assembler function is: \layout Verse \family typewriter -foo() { +.globl _asm_func_PARM_2 \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* some c code */ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_asm +.globl _asm_func \newline \SpecialChar ~ \SpecialChar ~ @@ -9022,7 +9337,11 @@ _asm \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -; some assembler code +\SpecialChar ~ +\SpecialChar ~ +.area OSEG +\newline +_asm_func_PARM_2: \newline \SpecialChar ~ \SpecialChar ~ @@ -9030,63 +9349,314 @@ _asm \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ljmp $0003 +\SpecialChar ~ +\SpecialChar ~ +.ds 1 \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_endasm; -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* some more c code */ +.area CSEG \newline -clabel:\SpecialChar ~ -\SpecialChar ~ -/* inline assembler cannot reference this label */ +_asm_func: \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_asm +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov a,dpl \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -$0003: ;label (can be reference by inline assembler only) +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +add a,_asm_func_PARM_2 \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -_endasm ; +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov dpl,a \newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -/* some more c code */ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +dpl +\begin_inset LatexCommand \index{DPTR, DPH, DPL} + +\end_inset + +,#0x00 \newline -} +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +ret \layout Standard -In other words inline assembly code can access labels defined in inline - assembly within the scope of the function. - The same goes the other way, ie. - labels defines in inline assembly CANNOT be accessed by C statements. +Note here that the return values are placed in 'dpl' - One byte return value, + 'dpl' LSB & 'dph' MSB for two byte values. + 'dpl', 'dph' and 'b' for three byte values (generic pointers) and 'dpl','dph',' +b' & 'acc' for four byte values. \layout Standard -An example acessing a C variable is in section -\begin_inset LatexCommand \ref{sub:Naked-Functions} +The parameter naming convention is __PARM_, where n is + the parameter number starting from 1, and counting from the left. + The first parameter is passed in +\begin_inset Quotes eld +\end_inset +dpl +\begin_inset Quotes erd \end_inset -. + for One bye parameter, +\begin_inset Quotes eld +\end_inset + +dptr +\begin_inset Quotes erd +\end_inset + + if two bytes, +\begin_inset Quotes eld +\end_inset + +b,dptr +\begin_inset Quotes erd +\end_inset + + for three bytes and +\begin_inset Quotes eld +\end_inset + +acc,b,dptr +\begin_inset Quotes erd +\end_inset + + for four bytes, the variable name for the second parameter will be __PARM_2. +\newline + +\newline +Assemble the assembler routine with the following command: +\newline + +\newline + +\family sans +\series bold +asx8051 -losg asmfunc.asm +\newline + +\newline + +\family default +\series default +Then compile and link the assembler routine to the C source file with the + following command: +\newline + +\newline + +\family sans +\series bold +sdcc cfunc.c asmfunc.rel +\layout Subsubsection + +Assembler Routine(reentrant +\begin_inset LatexCommand \index{reentrant} + +\end_inset + +) +\begin_inset LatexCommand \index{Assembler routines (reentrant)} + +\end_inset + + +\layout Standard + +In this case the second parameter onwards will be passed on the stack, the + parameters are pushed from right to left i.e. + after the call the left most parameter will be on the top of the stack. + Here is an example: +\layout Verse + + +\family typewriter +extern int asm_func(unsigned char, unsigned char); +\newline + +\newline +int c_func (unsigned char i, unsigned char j) reentrant +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return asm_func(i,j); +\newline +} +\newline + +\newline +int main() +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return c_func(10,9); +\newline +} +\layout Standard + +The corresponding assembler routine is: +\layout Verse + + +\family typewriter +.globl _asm_func +\newline +_asm_func: +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +push _bp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov _bp,sp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov r2,dpl +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov a,_bp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +clr c +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +add a,#0xfd +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov r0,a +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +add a,#0xfc +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov r1,a +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov a,@r0 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +add a,r2 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov dpl,a +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov dph,#0x00 +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +mov sp,_bp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +pop _bp +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +ret +\layout Standard + +The compiling and linking procedure remains the same, however note the extra + entry & exit linkage required for the assembler code, _bp is the stack + frame pointer and is used to compute the offset into the stack for parameters + and local variables. \layout Subsection int (16 bit) @@ -10190,38 +10760,284 @@ status Collapsed However, currently the linker can not handle code segments > 64k. \layout Subsection -Defines Created by the Compiler -\begin_inset LatexCommand \index{Defines created by the compiler} +Pragmas +\begin_inset LatexCommand \index{Pragmas} \end_inset \layout Standard -The compiler creates the following #defines -\begin_inset LatexCommand \index{\#defines} +SDCC supports the following #pragma directives. +\layout Itemize + +SAVE +\begin_inset LatexCommand \index{\#pragma SAVE} \end_inset -: -\newline + - this will save all current options to the SAVE/RESTORE stack. + See RESTORE. +\layout Itemize -\layout Standard +RESTORE +\begin_inset LatexCommand \index{\#pragma RESTORE} +\end_inset -\begin_inset Tabular - - - - - - -\begin_inset Text + - will restore saved options from the last save. + SAVEs & RESTOREs can be nested. + SDCC uses a SAVE/RESTORE stack: SAVE pushes current options to the stack, + RESTORE pulls current options from the stack. + See SAVE. +\layout Itemize -\layout Standard +NOGCSE +\begin_inset LatexCommand \index{\#pragma NOGCSE} +\end_inset -\series bold + - will stop global common subexpression elimination. +\layout Itemize + +NOINDUCTION +\begin_inset LatexCommand \index{\#pragma NOINDUCTION} + +\end_inset + + - will stop loop induction optimizations. +\layout Itemize + +NOJTBOUND +\begin_inset LatexCommand \index{\#pragma NOJTBOUND} + +\end_inset + + - will not generate code for boundary value checking, when switch statements + are turned into jump-tables (dangerous). + +\layout Itemize + +NOOVERLAY +\begin_inset LatexCommand \index{\#pragma NOOVERLAY} + +\end_inset + + - the compiler will not overlay the parameters and local variables of a + function. +\layout Itemize + +LESS_PEDANTIC +\begin_inset LatexCommand \index{\#pragma LESS\_PEDANTIC} + +\end_inset + + - the compiler will not warn you anymore for obvious mistakes, you'r on + your own now ;-( +\layout Itemize + +NOLOOPREVERSE +\begin_inset LatexCommand \index{\#pragma NOLOOPREVERSE} + +\end_inset + + - Will not do loop reversal optimization +\layout Itemize + +EXCLUDE +\begin_inset LatexCommand \index{\#pragma EXCLUDE} + +\end_inset + + NONE | {acc[,b[,dpl[,dph]]] - The exclude pragma disables generation of + pair of push/pop +\begin_inset LatexCommand \index{push/pop} + +\end_inset + + instruction in ISR function (using interrupt +\begin_inset LatexCommand \index{interrupt} + +\end_inset + + keyword). + The directive should be placed immediately before the ISR function definition + and it affects ALL ISR functions following it. + To enable the normal register saving for ISR functions use #pragma\SpecialChar ~ +EXCLUDE\SpecialChar ~ +none +\begin_inset LatexCommand \index{\#pragma EXCLUDE} + +\end_inset + +. +\layout Itemize + +NOIV +\begin_inset LatexCommand \index{\#pragma NOIV} + +\end_inset + + - Do not generate interrupt vector table entries for all ISR functions + defined after the pragma. + This is useful in cases where the interrupt vector table must be defined + manually, or when there is a secondary, manually defined interrupt vector + table (e.g. + for the autovector feature of the Cypress EZ-USB FX2). +\layout Itemize + +CALLEE-SAVES +\begin_inset LatexCommand \index{\#pragma CALLEE-SAVES} + +\end_inset + + +\begin_inset LatexCommand \index{function prologue} + +\end_inset + + function1[,function2[,function3...]] - The compiler by default uses a caller + saves convention for register saving across function calls, however this + can cause unnecessary register pushing & popping when calling small functions + from larger functions. + This option can be used to switch off the register saving convention for + the function names specified. + The compiler will not save registers when calling these functions, extra + code need to be manually inserted at the entry & exit for these functions + to save & restore the registers used by these functions, this can SUBSTANTIALLY + reduce code & improve run time performance of the generated code. + In the future the compiler (with inter procedural analysis) may be able + to determine the appropriate scheme to use for each function call. + If - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-callee-saves command line option is used, the function names specified + in #pragma\SpecialChar ~ +CALLEE-SAVES +\begin_inset LatexCommand \index{\#pragma CALLEE-SAVES} + +\end_inset + + is appended to the list of functions specified in the command line. +\layout Standard + +The pragma's are intended to be used to turn-off certain optimizations which + might cause the compiler to generate extra stack / data space to store + compiler generated temporary variables. + This usually happens in large functions. + Pragma directives should be used as shown in the following example, they + are used to control options & optimizations for a given function; pragmas + should be placed before and/or after a function, placing pragma's inside + a function body could have unpredictable results. +\layout Verse + + +\family typewriter +#pragma SAVE +\begin_inset LatexCommand \index{\#pragma SAVE} + +\end_inset + + \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* save the current settings */ +\newline +#pragma NOGCSE +\begin_inset LatexCommand \index{\#pragma NOGCSE} + +\end_inset + + \SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +/* turnoff global subexpression elimination */ +\newline +#pragma NOINDUCTION +\begin_inset LatexCommand \index{\#pragma NOINDUCTION} + +\end_inset + + /* turn off induction optimizations */ +\newline +int foo () +\newline +{ +\newline +\SpecialChar ~ + \SpecialChar ~ + ... + +\newline +\SpecialChar ~ + \SpecialChar ~ + /* large code */ +\newline +\SpecialChar ~ + \SpecialChar ~ + ... + +\newline +} +\newline +#pragma RESTORE +\begin_inset LatexCommand \index{\#pragma RESTORE} + +\end_inset + + /* turn the optimizations back on */ +\layout Standard + +The compiler will generate a warning message when extra space is allocated. + It is strongly recommended that the SAVE and RESTORE pragma's be used when + changing options for a function. +\layout Subsection + +Defines Created by the Compiler +\begin_inset LatexCommand \index{Defines created by the compiler} + +\end_inset + + +\layout Standard + +The compiler creates the following #defines +\begin_inset LatexCommand \index{\#defines} + +\end_inset + +: +\newline + +\layout Standard + + +\begin_inset Tabular + + + + + + +\begin_inset Text + +\layout Standard + + +\series bold #define \end_inset @@ -10535,34 +11351,53 @@ when \newline -\layout Subsection +\layout Section +\pagebreak_top +Debugging with SDCDB +\begin_inset LatexCommand \index{sdcdb} -Redirecting output on Windows Shells +\end_inset + + \layout Standard -By default SDCC writes it's error messages to -\begin_inset Quotes sld -\end_inset +SDCC is distributed with a source level debugger +\begin_inset LatexCommand \index{Debugger} -standard error -\begin_inset Quotes srd \end_inset . - To force all messages to -\begin_inset Quotes sld -\end_inset + The debugger uses a command line interface, the command repertoire of the + debugger has been kept as close to gdb +\begin_inset LatexCommand \index{gdb} -standard output -\begin_inset Quotes srd \end_inset - use -\series bold -- -\series default -\emph on + (the GNU debugger) as possible. + The configuration and build process is part of the standard compiler installati +on, which also builds and installs the debugger in the target directory + specified during configuration. + The debugger allows you debug BOTH at the C source and at the ASM source + level. + Sdcdb is available on Unix platforms only. +\layout Subsection + +Compiling for Debugging +\layout Standard + +The \SpecialChar \- +\SpecialChar \- +debug option must be specified for all files for which debug information + is to be generated. + The complier generates a .adb file for each of these files. + The linker creates the .cdb file from the .adb files and the address information. + This .cdb is used by the debugger. +\layout Subsection +How the Debugger Works +\layout Standard + +When the - \begin_inset ERT status Collapsed @@ -10572,55 +11407,74 @@ status Collapsed / \end_inset +-debug option is specified the compiler generates extra symbol information + some of which are put into the the assembler source and some are put into + the .adb file. + Then the linker creates the .cdb file from the individual .adb files with + the address information for the symbols. + The debugger reads the symbolic information generated by the compiler & + the address information generated by the linker. + It uses the SIMULATOR (Daniel's S51) to execute the program, the program + execution is controlled by the debugger. + When a command is issued for the debugger, it translates it into appropriate + commands for the simulator. +\layout Subsection + +Starting the Debugger +\layout Standard + +The debugger can be started using the following command line. + (Assume the file you are debugging has the file name foo). +\newline + +\newline +\family sans \series bold -\emph default -- +sdcdb foo +\newline + +\family default \series default -use-stdout -\begin_inset LatexCommand \index{-\/-use-stdout} -\end_inset +\newline +The debugger will look for the following files. +\layout Itemize -. - Aditionaly, if you happen to have visual studio installed in your windows - machine, you can use it to compile your sources using a custom build and - the SDCC - -\emph on +foo.c - the source file. +\layout Itemize -\begin_inset ERT -status Collapsed +foo.cdb - the debugger symbol information file. +\layout Itemize -\layout Standard +foo.ihx - the Intel hex format +\begin_inset LatexCommand \index{Intel hex format} -\backslash -/ \end_inset + object file. +\layout Subsection -\emph default --vc -\begin_inset LatexCommand \index{-\/-vc} - -\end_inset +Command Line Options. +\layout Itemize - option. - Something like this should work: -\newline +- +\begin_inset ERT +status Collapsed -\newline +\layout Standard -\series bold -c: -\backslash -sdcc -\backslash -bin \backslash -sdcc.exe - -\series default -\emph on +/ +\end_inset +-directory= this option can used to specify the directory + search list. + The debugger will look into the directory list specified for source, cdb + & ihx files. + The items in the directory list must be separated by ':', e.g. + if the source files can be in the directories /home/src1 and /home/src2, + the - \begin_inset ERT status Collapsed @@ -10630,13 +11484,7 @@ status Collapsed / \end_inset - -\series bold -\emph default --vc - -\series default -\emph on - +-directory option should be - \begin_inset ERT status Collapsed @@ -10646,487 +11494,280 @@ status Collapsed / \end_inset +-directory=/home/src1:/home/src2. + Note there can be no spaces in the option. + +\layout Itemize -\series bold -\emph default --model-large -c $(InputPath) -\layout Section -\pagebreak_top -SDCC Technical Data -\layout Subsection - -Optimizations -\begin_inset LatexCommand \index{Optimizations} +-cd - change to the . +\layout Itemize -\end_inset +-fullname - used by GUI front ends. +\layout Itemize +-cpu - this argument is passed to the simulator please see the + simulator docs for details. +\layout Itemize -\layout Standard +-X this options is passed to the simulator please see + the simulator docs for details. +\layout Itemize -SDCC performs a host of standard optimizations in addition to some MCU specific - optimizations. - -\layout Subsubsection +-s passed to simulator see the simulator docs for details. +\layout Itemize -Sub-expression Elimination -\begin_inset LatexCommand \index{Subexpression elimination} +-S passed to simulator see the simulator docs for details. +\layout Subsection -\end_inset +Debugger Commands. +\layout Standard +As mentioned earlier the command interface for the debugger has been deliberatel +y kept as close the GNU debugger gdb, as possible. + This will help the integration with existing graphical user interfaces + (like ddd, xxgdb or xemacs) existing for the GNU debugger. + If you use a graphical user interface for the debugger you can skip the + next sections. +\layout Subsubsection* +break [line | file:line | function | file:function] \layout Standard -The compiler does local and global common subexpression elimination, e.g.: - -\layout Verse +Set breakpoint at specified line or function: +\newline +\newline -\family typewriter -i = x + y + 1; +\family sans +\series bold +sdcdb>break 100 \newline -j = x + y; +sdcdb>break foo.c:100 +\newline +sdcdb>break funcfoo +\newline +sdcdb>break foo.c:funcfoo +\layout Subsubsection* + +clear [line | file:line | function | file:function ] \layout Standard -will be translated to -\layout Verse +Clear breakpoint at specified line or function: +\newline +\newline -\family typewriter -iTemp = x + y; +\family sans +\series bold +sdcdb>clear 100 \newline -i = iTemp + 1; +sdcdb>clear foo.c:100 \newline -j = iTemp; +sdcdb>clear funcfoo +\newline +sdcdb>clear foo.c:funcfoo +\layout Subsubsection* + +continue \layout Standard -Some subexpressions are not as obvious as the above example, e.g.: -\layout Verse +Continue program being debugged, after breakpoint. +\layout Subsubsection* +finish +\layout Standard -\family typewriter -a->b[i].c = 10; -\newline -a->b[i].d = 11; +Execute till the end of the current function. +\layout Subsubsection* + +delete [n] \layout Standard -In this case the address arithmetic a->b[i] will be computed only once; - the equivalent code in C would be. -\layout Verse +Delete breakpoint number 'n'. + If used without any option clear ALL user defined break points. +\layout Subsubsection* +info [break | stack | frame | registers ] +\layout Itemize -\family typewriter -iTemp = a->b[i]; -\newline -iTemp.c = 10; -\newline -iTemp.d = 11; -\layout Standard +info break - list all breakpoints +\layout Itemize -The compiler will try to keep these temporary variables in registers. -\layout Subsubsection +info stack - show the function call stack. +\layout Itemize -Dead-Code Elimination -\begin_inset LatexCommand \index{Dead-code elimination} +info frame - show information about the current execution frame. +\layout Itemize -\end_inset +info registers - show content of all registers. +\layout Subsubsection* +step +\layout Standard -\layout Verse +Step program until it reaches a different source line. +\layout Subsubsection* +next +\layout Standard -\family typewriter -int global; -\newline +Step program, proceeding through subroutine calls. +\layout Subsubsection* -\newline -void f () { -\newline -\SpecialChar ~ -\SpecialChar ~ -int i; -\newline -\SpecialChar ~ -\SpecialChar ~ -i = 1; \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -/* dead store */ -\newline -\SpecialChar ~ -\SpecialChar ~ -global = 1;\SpecialChar ~ -/* dead store */ -\newline -\SpecialChar ~ -\SpecialChar ~ -global = 2; -\newline -\SpecialChar ~ -\SpecialChar ~ -return; -\newline -\SpecialChar ~ -\SpecialChar ~ -global = 3;\SpecialChar ~ -/* unreachable */ -\newline -} +run \layout Standard -will be changed to -\layout Verse - - -\family typewriter -int global; -\newline +Start debugged program. +\layout Subsubsection* -\newline -void f () { -\newline -\SpecialChar ~ -\SpecialChar ~ -global = 2; -\newline -\SpecialChar ~ -\SpecialChar ~ -return; -\newline -} -\layout Subsubsection +ptype variable +\layout Standard -Copy-Propagation -\begin_inset LatexCommand \index{Copy propagation} +Print type information of the variable. +\layout Subsubsection* -\end_inset +print variable +\layout Standard +print value of variable. +\layout Subsubsection* -\layout Verse +file filename +\layout Standard +load the given file name. + Note this is an alternate method of loading file for debugging. +\layout Subsubsection* -\family typewriter -int f() { -\newline -\SpecialChar ~ -\SpecialChar ~ -int i, j; -\newline -\SpecialChar ~ -\SpecialChar ~ -i = 10; -\newline -\SpecialChar ~ -\SpecialChar ~ -j = i; -\newline -\SpecialChar ~ -\SpecialChar ~ -return j; -\newline -} +frame \layout Standard -will be changed to -\layout Verse - +print information about current frame. +\layout Subsubsection* -\family typewriter -int f() { -\newline -\SpecialChar ~ -\SpecialChar ~ -int i, j; -\newline -\SpecialChar ~ -\SpecialChar ~ -i = 10; -\newline -\SpecialChar ~ -\SpecialChar ~ -j = 10; -\newline -\SpecialChar ~ -\SpecialChar ~ -return 10; -\newline -} +set srcmode \layout Standard -Note: the dead stores created by this copy propagation will be eliminated - by dead-code elimination. -\layout Subsubsection - -Loop Optimizations -\begin_inset LatexCommand \index{Loop optimization} +Toggle between C source & assembly source. +\layout Subsubsection* -\end_inset +! simulator command +\layout Standard +Send the string following '!' to the simulator, the simulator response is + displayed. + Note the debugger does not interpret the command being sent to the simulator, + so if a command like 'go' is sent the debugger can loose its execution + context and may display incorrect values. +\layout Subsubsection* +quit. \layout Standard -Two types of loop optimizations are done by SDCC loop invariant lifting - and strength reduction of loop induction variables. - In addition to the strength reduction the optimizer marks the induction - variables and the register allocator tries to keep the induction variables - in registers for the duration of the loop. - Because of this preference of the register allocator -\begin_inset LatexCommand \index{Register allocation} - -\end_inset +"Watch me now. + Iam going Down. + My name is Bobby Brown" +\layout Subsection -, loop induction optimization causes an increase in register pressure, which - may cause unwanted spilling of other temporary variables into the stack -\begin_inset LatexCommand \index{stack} +Interfacing with XEmacs +\begin_inset LatexCommand \index{XEmacs} \end_inset - / data space. - The compiler will generate a warning message when it is forced to allocate - extra space either on the stack or data space. - If this extra space allocation is undesirable then induction optimization - can be eliminated either for the entire source file (with - -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset --noinduction option) or for a given function only using #pragma\SpecialChar ~ -NOINDUCTION -\begin_inset LatexCommand \index{\#pragma NOINDUCTION} +\begin_inset LatexCommand \index{Emacs} \end_inset . -\newline +\layout Standard +Two files (in emacs lisp) are provided for the interfacing with XEmacs, + sdcdb.el and sdcdbsrc.el. + These two files can be found in the $(prefix)/bin directory after the installat +ion is complete. + These files need to be loaded into XEmacs for the interface to work. + This can be done at XEmacs startup time by inserting the following into + your '.xemacs' file (which can be found in your HOME directory): \newline -Loop Invariant: -\layout Verse - -\family typewriter -for (i = 0 ; i < 100 ; i ++) \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -f += k + l; -\layout Standard -changed to -\layout Verse +\family typewriter +(load-file sdcdbsrc.el) +\family default +\newline -\family typewriter -itemp = k + l; \newline -for (i = 0; i < 100; i++) +.xemacs is a lisp file so the () around the command is REQUIRED. + The files can also be loaded dynamically while XEmacs is running, set the + environment variable 'EMACSLOADPATH' to the installation bin directory + (/bin), then enter the following command ESC-x load-file sdcdbsrc. + To start the interface enter the following command: \newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -f += itemp; -\layout Standard -As mentioned previously some loop invariants are not as apparent, all static - address computations are also moved out of the loop. \newline +\family sans +\series bold +ESC-x sdcdbsrc +\family default +\series default + \newline -Strength Reduction -\begin_inset LatexCommand \index{Strength reduction} -\end_inset +\newline +You will prompted to enter the file name to be debugged. + +\newline -, this optimization substitutes an expression by a cheaper expression: -\layout Verse +\newline +The command line options that are passed to the simulator directly are bound + to default values in the file sdcdbsrc.el. + The variables are listed below, these values maybe changed as required. +\layout Itemize +sdcdbsrc-cpu-type '51 +\layout Itemize -\family typewriter -for (i=0;i < 100; i++) -\newline -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -ar[i*5] = i*3; +sdcdbsrc-frequency '11059200 +\layout Itemize + +sdcdbsrc-serial nil \layout Standard -changed to -\layout Verse +The following is a list of key mapping for the debugger interface. +\layout Standard +\SpecialChar ~ \family typewriter -itemp1 = 0; -\newline -itemp2 = 0; + \newline -for (i=0;i< 100;i++) { +;; Current Listing :: \newline +;;key\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ar[itemp1] = itemp2; -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -itemp1 += 5; -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -itemp2 += 3; -\newline -} -\layout Standard - -The more expensive multiplication -\begin_inset LatexCommand \index{Multiplication} - -\end_inset - - is changed to a less expensive addition. -\layout Subsubsection - -Loop Reversing -\begin_inset LatexCommand \index{Loop reversing} - -\end_inset - - -\layout Standard - -This optimization is done to reduce the overhead of checking loop boundaries - for every iteration. - Some simple loops can be reversed and implemented using a -\begin_inset Quotes eld -\end_inset - -decrement and jump if not zero -\begin_inset Quotes erd -\end_inset - - instruction. - SDCC checks for the following criterion to determine if a loop is reversible - (note: more sophisticated compilers use data-dependency analysis to make - this determination, SDCC uses a more simple minded analysis). -\layout Itemize - -The 'for' loop is of the form -\newline - -\newline - -\family typewriter -for( = ; [< | <=] ; [++ | - += 1]) -\newline \SpecialChar ~ \SpecialChar ~ +binding\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - -\layout Itemize - -The does not contain -\begin_inset Quotes eld -\end_inset - -continue -\begin_inset Quotes erd -\end_inset - - or 'break -\begin_inset Quotes erd -\end_inset - -. -\layout Itemize - -All goto's are contained within the loop. -\layout Itemize - -No function calls within the loop. -\layout Itemize - -The loop control variable is not assigned any value within the loop -\layout Itemize - -The loop control variable does NOT participate in any arithmetic operation - within the loop. -\layout Itemize - -There are NO switch statements in the loop. -\layout Subsubsection - -Algebraic Simplifications -\layout Standard - -SDCC does numerous algebraic simplifications, the following is a small sub-set - of these optimizations. -\layout Verse - - -\family typewriter -i = j + 0 ; /* changed to */ i = j; -\newline -i /= 2;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - /* changed to */ i >>= 1; -\newline -i = j - j ; /* changed to */ i = 0; -\newline -i = j / 1 ; /* changed to */ i = j; -\layout Standard - -Note the subexpressions -\begin_inset LatexCommand \index{Subexpression} - -\end_inset - - given above are generally introduced by macro expansions or as a result - of copy/constant propagation. -\layout Subsubsection - -'switch' Statements -\begin_inset LatexCommand \index{switch statement} - -\end_inset - - -\layout Standard - -SDCC changes switch statements to jump tables -\begin_inset LatexCommand \index{jump tables} - -\end_inset - - when the following conditions are true. - -\layout Itemize - -The case labels are in numerical sequence, the labels need not be in order, - and the starting number need not be one or zero. -\begin_deeper -\layout Verse - - -\family typewriter -switch(i) {\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11143,6 +11784,9 @@ switch(i) {\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +Comment +\newline +;;---\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11152,14 +11796,12 @@ switch(i) {\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -switch (i) { -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 4: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +------\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11181,15 +11823,16 @@ case 4: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +-------- +\newline +;; +\newline +;; n\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 0: ... - -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 5: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11198,6 +11841,7 @@ case 5: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + sdcdb-next-from-src\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11207,6 +11851,9 @@ case 5: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +SDCDB next command +\newline +;; b\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11215,15 +11862,12 @@ case 5: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 1: ... - -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 3: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + sdcdb-back-from-src\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11233,6 +11877,9 @@ case 3: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +SDCDB back command +\newline +;; c\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11246,19 +11893,19 @@ case 3: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + sdcdb-cont-from-src\SpecialChar ~ \SpecialChar ~ -case 2: ... - -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 6: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +SDCDB continue command +\newline +;; s\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11272,6 +11919,7 @@ case 6: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + sdcdb-step-from-src\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11279,10 +11927,11 @@ case 6: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -case 3: ... - +\SpecialChar ~ +\SpecialChar ~ +SDCDB step command \newline -}\SpecialChar ~ +;; ?\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11296,6 +11945,7 @@ case 3: ... \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + sdcdb-whatis-c-sexp\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11305,6 +11955,9 @@ case 3: ... \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +SDCDB ptypecommand for data at +\newline +;;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11318,350 +11971,59 @@ case 3: ... \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -} -\layout Standard - -Both the above switch statements will be implemented using a jump-table. - The example to the right side is slightly more efficient as the check for - the lower bound of the jump-table is not needed. -\end_deeper -\layout Itemize - -The number of case labels is at least three, since it takes two conditional - statements to handle the boundary conditions. -\layout Itemize - -The number of case labels is less than 84, since each label takes 3 bytes - and a jump-table can be utmost 256 bytes long. -\layout Standard - -Switch statements which have gaps in the numeric sequence or those that - have more that 84 case labels can be split into more than one switch statement - for efficient code generation, e.g.: -\layout Verse - - -\family typewriter -switch (i) { -\newline \SpecialChar ~ \SpecialChar ~ -case 1: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 2: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 3: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 4: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 9: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 10: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 11: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 12: ... - -\newline -} -\layout Standard - -If the above switch statement is broken down into two switch statements -\layout Verse - - -\family typewriter -switch (i) { -\newline \SpecialChar ~ \SpecialChar ~ -case 1: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 2: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 3: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 4: ... - -\newline -} -\layout Standard - -and -\layout Verse - - -\family typewriter -switch (i) { -\newline \SpecialChar ~ \SpecialChar ~ -case 9: \SpecialChar ~ -... - -\newline \SpecialChar ~ \SpecialChar ~ -case 10: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 11: ... - -\newline \SpecialChar ~ \SpecialChar ~ -case 12:\SpecialChar ~ -... - -\newline -} -\layout Standard - -then both the switch statements will be implemented using jump-tables whereas - the unmodified switch statement will not be. - You might also consider dummy cases 0 and 5 to 8 in this example. - The pragma NOJTBOUND -\begin_inset LatexCommand \index{\#pragma NOJTBOUND} - -\end_inset - - can be used to turn off checking the -\emph on -j -\emph default -ump -\emph on -t -\emph default -able -\emph on -bound -\emph default -aries. -\layout Subsubsection - -Bit-shifting Operations -\begin_inset LatexCommand \index{Bit shifting} - -\end_inset - -. -\layout Standard - -Bit shifting is one of the most frequently used operation in embedded programmin -g. - SDCC tries to implement bit-shift operations in the most efficient way - possible, e.g.: -\layout Verse - - -\family typewriter -unsigned char i; -\newline -... - -\newline -i >>= 4; -\newline -... -\layout Standard - -generates the following code: -\layout Verse - - -\family typewriter -mov a,_i -\newline -swap a -\newline -anl a,#0x0f -\newline -mov _i,a -\layout Standard - -In general SDCC will never setup a loop if the shift count is known. - Another example: -\layout Verse - - -\family typewriter -unsigned int i; -\newline -... - -\newline -i >>= 9; + buffer point \newline -... -\layout Standard - -will generate: -\layout Verse - - -\family typewriter -mov\SpecialChar ~ +;; x\SpecialChar ~ \SpecialChar ~ -a,(_i + 1) -\newline -mov\SpecialChar ~ \SpecialChar ~ -(_i + 1),#0x00 -\newline -clr\SpecialChar ~ \SpecialChar ~ -c -\newline -rrc\SpecialChar ~ \SpecialChar ~ -a -\newline -mov\SpecialChar ~ \SpecialChar ~ -_i,a -\layout Standard - -Note that SDCC stores numbers in little-endian format (i.e. - lowest order first). -\layout Subsubsection - -Bit-rotation -\begin_inset LatexCommand \index{Bit rotation} - -\end_inset - - -\layout Standard - -A special case of the bit-shift operation is bit rotation, SDCC recognizes - the following expression to be a left bit-rotation: -\layout Verse - - -\family typewriter -unsigned char i; -\newline -... - -\newline -i = ((i << 1) | (i >> 7)); -\family default - -\newline - -\family typewriter -... -\layout Standard - -will generate the following code: -\layout Verse - - -\family typewriter -mov\SpecialChar ~ \SpecialChar ~ -a,_i -\newline -rl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -a -\newline -mov\SpecialChar ~ \SpecialChar ~ -_i,a -\layout Standard - -SDCC uses pattern matching on the parse tree to determine this operation.Variatio -ns of this case will also be recognized as bit-rotation, i.e.: -\layout Verse - - -\family typewriter -i = ((i >> 7) | (i << 1)); /* left-bit rotation */ -\layout Subsubsection - -Highest Order Bit -\begin_inset LatexCommand \index{Highest Order Bit} - -\end_inset - - -\layout Standard - -It is frequently required to obtain the highest order bit of an integral - type (long, int, short or char types). - SDCC recognizes the following expression to yield the highest order bit - and generates optimized code for it, e.g.: -\layout Verse - - -\family typewriter -unsigned int gint; -\newline - -\newline -foo () { -\newline \SpecialChar ~ \SpecialChar ~ -unsigned char hob; -\newline \SpecialChar ~ \SpecialChar ~ -... - -\newline + sdcdbsrc-delete\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -hob = (gint >> 15) & 1; -\newline \SpecialChar ~ \SpecialChar ~ -.. - -\newline -} -\layout Standard - -will generate the following code: -\layout Verse - - -\family typewriter \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11671,6 +12033,9 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +SDCDB Delete all breakpoints if no arg +\newline +;;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11687,10 +12052,6 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 61 ;\SpecialChar ~ - hob.c 7 -\newline -000A E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11705,7 +12066,6 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 62\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11713,11 +12073,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - mov\SpecialChar ~ \SpecialChar ~ - a,(_gint + 1) -\newline -000C 23\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11725,6 +12081,9 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +given or delete arg (C-u arg x) +\newline +;; m\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11735,20 +12094,16 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 63\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + sdcdbsrc-frame\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - rl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - a -\newline -000D 54 01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11757,13 +12112,15 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +SDCDB Display current frame if no arg, +\newline +;;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 64\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11771,11 +12128,7 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - anl\SpecialChar ~ \SpecialChar ~ - a,#0x01 -\newline -000F F5*02\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -11790,826 +12143,14 @@ will generate the following code: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - 65\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - mov\SpecialChar ~ -\SpecialChar ~ - _foo_hob_1_1,a -\layout Standard - -Variations of this case however will -\emph on -not -\emph default - be recognized. - It is a standard C expression, so I heartily recommend this be the only - way to get the highest order bit, (it is portable). - Of course it will be recognized even if it is embedded in other expressions, - e.g.: -\layout Verse - - -\family typewriter -xyz = gint + ((gint >> 15) & 1); -\layout Standard - -will still be recognized. -\layout Subsubsection - -Peephole Optimizer -\begin_inset LatexCommand \index{Peephole optimizer} - -\end_inset - - -\layout Standard - -The compiler uses a rule based, pattern matching and re-writing mechanism - for peep-hole optimization. - It is inspired by -\emph on -copt -\emph default - a peep-hole optimizer by Christopher W. - Fraser (cwfraser@microsoft.com). - A default set of rules are compiled into the compiler, additional rules - may be added with the -\emph on -- -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --peep-file -\begin_inset LatexCommand \index{-\/-peep-file} - -\end_inset - - -\emph default - option. - The rule language is best illustrated with examples. -\layout Verse - - -\family typewriter -replace { -\newline -\SpecialChar ~ -\SpecialChar ~ -mov %1,a -\newline -\SpecialChar ~ -\SpecialChar ~ -mov a,%1 -\newline -} by { -\newline -\SpecialChar ~ -\SpecialChar ~ -mov %1,a -\newline -} -\layout Standard - -The above rule will change the following assembly -\begin_inset LatexCommand \index{Assembler routines} - -\end_inset - - sequence: -\layout Verse - - -\family typewriter -mov r1,a -\newline -mov a,r1 -\layout Standard - -to -\layout Verse - - -\family typewriter -mov r1,a -\layout Standard - -Note: All occurrences of a -\emph on -%n -\emph default - (pattern variable) must denote the same string. - With the above rule, the assembly sequence: -\layout Verse - - -\family typewriter -mov r1,a -\newline -mov a,r2 -\layout Standard - -will remain unmodified. -\newline - -\newline -Other special case optimizations may be added by the user (via -\emph on -- -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --peep-file option -\emph default -). - E.g. - some variants of the 8051 MCU allow only -\family typewriter -ajmp -\family default - and -\family typewriter -acall -\family default -. - The following two rules will change all -\family typewriter -ljmp -\family default - and -\family typewriter -lcall -\family default - to -\family typewriter -ajmp -\family default - and -\family typewriter -acall -\layout Verse - - -\family typewriter -replace { lcall %1 } by { acall %1 } -\newline -replace { ljmp %1 } by { ajmp %1 } -\layout Standard - -The -\emph on -inline-assembler code -\emph default - is also passed through the peep hole optimizer, thus the peephole optimizer - can also be used as an assembly level macro expander. - The rules themselves are MCU dependent whereas the rule language infra-structur -e is MCU independent. - Peephole optimization rules for other MCU can be easily programmed using - the rule language. -\newline - -\newline -The syntax for a rule is as follows: -\layout Verse - - -\family typewriter -rule := replace [ restart ] '{' ' -\backslash -n' -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - '}' by '{' ' -\backslash -n' -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - ' -\backslash -n' -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ - '}' [if ] ' -\backslash -n' -\layout Standard - - := assembly instruction (each instruction including - labels must be on a separate line). -\newline - -\newline -The optimizer will apply to the rules one by one from the top in the sequence - of their appearance, it will terminate when all rules are exhausted. - If the 'restart' option is specified, then the optimizer will start matching - the rules again from the top, this option for a rule is expensive (performance) -, it is intended to be used in situations where a transformation will trigger - the same rule again. - An example of this (not a good one, it has side effects) is the following - rule: -\layout Verse - - -\family typewriter -replace restart { -\newline -\SpecialChar ~ -\SpecialChar ~ -pop %1 -\newline -\SpecialChar ~ -\SpecialChar ~ -push %1 } by { -\newline -\SpecialChar ~ -\SpecialChar ~ -; nop -\newline -} -\layout Standard - -Note that the replace pattern cannot be a blank, but can be a comment line. - Without the 'restart' option only the inner most 'pop' 'push' pair would - be eliminated, i.e.: -\layout Verse - - -\family typewriter -pop ar1 -\newline -pop ar2 -\newline -push ar2 -\newline -push ar1 -\layout Standard - -would result in: -\layout Verse - - -\family typewriter -pop ar1 -\newline -; nop -\newline -push ar1 -\layout Standard - - -\emph on -with -\emph default - the restart option the rule will be applied again to the resulting code - and then all the pop-push pairs will be eliminated to yield: -\layout Verse - - -\family typewriter -; nop -\newline -; nop -\layout Standard - -A conditional function can be attached to a rule. - Attaching rules are somewhat more involved, let me illustrate this with - an example. -\layout Verse - - -\family typewriter -replace { -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ -ljmp %5 -\newline -%2: -\newline -} by { -\newline -\SpecialChar ~ - \SpecialChar ~ - \SpecialChar ~ -sjmp %5 -\newline -%2: -\newline -} if labelInRange -\layout Standard - -The optimizer does a look-up of a function name table defined in function - -\emph on -callFuncByName -\emph default - in the source file SDCCpeeph.c, with the name -\emph on -labelInRange -\emph default -. - If it finds a corresponding entry the function is called. - Note there can be no parameters specified for these functions, in this - case the use of -\emph on -%5 -\emph default - is crucial, since the function -\emph on -labelInRange -\emph default - expects to find the label in that particular variable (the hash table containin -g the variable bindings is passed as a parameter). - If you want to code more such functions, take a close look at the function - labelInRange and the calling mechanism in source file SDCCpeeph.c. - Currently implemented are -\emph on -labelInRange, labelRefCount, labelIsReturnOnly, operandsNotSame, xramMovcOption, - 24bitMode, portIsDS390, 24bitModeAndPortDS390 -\emph default -and -\emph on - notVolatile -\emph default -. -\layout Standard - -I know this whole thing is a little kludgey, but maybe some day we will - have some better means. - If you are looking at this file, you will see the default rules that are - compiled into the compiler, you can add your own rules in the default set - there if you get tired of specifying the - -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --peep-file option. -\layout Subsection - -Pragmas -\begin_inset LatexCommand \index{Pragmas} - -\end_inset - - -\layout Standard - -SDCC supports the following #pragma directives. -\layout Itemize - -SAVE -\begin_inset LatexCommand \index{\#pragma SAVE} - -\end_inset - - - this will save all current options to the SAVE/RESTORE stack. - See RESTORE. -\layout Itemize - -RESTORE -\begin_inset LatexCommand \index{\#pragma RESTORE} - -\end_inset - - - will restore saved options from the last save. - SAVEs & RESTOREs can be nested. - SDCC uses a SAVE/RESTORE stack: SAVE pushes current options to the stack, - RESTORE pulls current options from the stack. - See SAVE. -\layout Itemize - -NOGCSE -\begin_inset LatexCommand \index{\#pragma NOGCSE} - -\end_inset - - - will stop global common subexpression elimination. -\layout Itemize - -NOINDUCTION -\begin_inset LatexCommand \index{\#pragma NOINDUCTION} - -\end_inset - - - will stop loop induction optimizations. -\layout Itemize - -NOJTBOUND -\begin_inset LatexCommand \index{\#pragma NOJTBOUND} - -\end_inset - - - will not generate code for boundary value checking, when switch statements - are turned into jump-tables (dangerous). - -\layout Itemize - -NOOVERLAY -\begin_inset LatexCommand \index{\#pragma NOOVERLAY} - -\end_inset - - - the compiler will not overlay the parameters and local variables of a - function. -\layout Itemize - -LESS_PEDANTIC -\begin_inset LatexCommand \index{\#pragma LESS\_PEDANTIC} - -\end_inset - - - the compiler will not warn you anymore for obvious mistakes, you'r on - your own now ;-( -\layout Itemize - -NOLOOPREVERSE -\begin_inset LatexCommand \index{\#pragma NOLOOPREVERSE} - -\end_inset - - - Will not do loop reversal optimization -\layout Itemize - -EXCLUDE -\begin_inset LatexCommand \index{\#pragma EXCLUDE} - -\end_inset - - NONE | {acc[,b[,dpl[,dph]]] - The exclude pragma disables generation of - pair of push/pop -\begin_inset LatexCommand \index{push/pop} - -\end_inset - - instruction in ISR function (using interrupt -\begin_inset LatexCommand \index{interrupt} - -\end_inset - - keyword). - The directive should be placed immediately before the ISR function definition - and it affects ALL ISR functions following it. - To enable the normal register saving for ISR functions use #pragma\SpecialChar ~ -EXCLUDE\SpecialChar ~ -none -\begin_inset LatexCommand \index{\#pragma EXCLUDE} - -\end_inset - -. -\layout Itemize - -NOIV -\begin_inset LatexCommand \index{\#pragma NOIV} - -\end_inset - - - Do not generate interrupt vector table entries for all ISR functions - defined after the pragma. - This is useful in cases where the interrupt vector table must be defined - manually, or when there is a secondary, manually defined interrupt vector - table (e.g. - for the autovector feature of the Cypress EZ-USB FX2). -\layout Itemize - -CALLEE-SAVES -\begin_inset LatexCommand \index{\#pragma CALLEE-SAVES} - -\end_inset - - -\begin_inset LatexCommand \index{function prologue} - -\end_inset - - function1[,function2[,function3...]] - The compiler by default uses a caller - saves convention for register saving across function calls, however this - can cause unnecessary register pushing & popping when calling small functions - from larger functions. - This option can be used to switch off the register saving convention for - the function names specified. - The compiler will not save registers when calling these functions, extra - code need to be manually inserted at the entry & exit for these functions - to save & restore the registers used by these functions, this can SUBSTANTIALLY - reduce code & improve run time performance of the generated code. - In the future the compiler (with inter procedural analysis) may be able - to determine the appropriate scheme to use for each function call. - If - -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --callee-saves command line option is used, the function names specified - in #pragma\SpecialChar ~ -CALLEE-SAVES -\begin_inset LatexCommand \index{\#pragma CALLEE-SAVES} - -\end_inset - - is appended to the list of functions specified in the command line. -\layout Standard - -The pragma's are intended to be used to turn-off certain optimizations which - might cause the compiler to generate extra stack / data space to store - compiler generated temporary variables. - This usually happens in large functions. - Pragma directives should be used as shown in the following example, they - are used to control options & optimizations for a given function; pragmas - should be placed before and/or after a function, placing pragma's inside - a function body could have unpredictable results. -\layout Verse - - -\family typewriter -#pragma SAVE -\begin_inset LatexCommand \index{\#pragma SAVE} - -\end_inset - - \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -/* save the current settings */ -\newline -#pragma NOGCSE -\begin_inset LatexCommand \index{\#pragma NOGCSE} - -\end_inset - - \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -/* turnoff global subexpression elimination */ -\newline -#pragma NOINDUCTION -\begin_inset LatexCommand \index{\#pragma NOINDUCTION} - -\end_inset - - /* turn off induction optimizations */ -\newline -int foo () -\newline -{ -\newline -\SpecialChar ~ - \SpecialChar ~ - ... - -\newline -\SpecialChar ~ - \SpecialChar ~ - /* large code */ -\newline -\SpecialChar ~ - \SpecialChar ~ - ... - -\newline -} -\newline -#pragma RESTORE -\begin_inset LatexCommand \index{\#pragma RESTORE} - -\end_inset - - /* turn the optimizations back on */ -\layout Standard - -The compiler will generate a warning message when extra space is allocated. - It is strongly recommended that the SAVE and RESTORE pragma's be used when - changing options for a function. -\layout Subsection - -Library Routines -\emph on - -\layout Standard - - -\emph on - -\emph default - -\layout Enumerate - -Compiler support routines (_gptrget, _mulint etc) -\layout Enumerate - -Stdclib functions (puts, printf, strcat etc) -\layout Enumerate - -Math functions (sin, pow, sqrt etc) -\layout Standard - -Libraries included in SDCC should have a license at least as liberal as - the GNU Lesser General Public License -\begin_inset LatexCommand \index{GNU Lesser General Public License, LGPL} - -\end_inset - - -\emph on -LGPL -\emph default -. -\layout Comment - -license statements for the libraries are missing. - sdcc/device/lib/ser_ir.c f.e. - comes with a GPL (as opposed to LGPL) License - this will not be liberal - enough for many embedded programmers. -\layout Subsection - -Interfacing with Assembly Routines -\begin_inset LatexCommand \index{Assembler routines} - -\end_inset - - -\layout Subsubsection - -Global Registers used for Parameter Passing -\begin_inset LatexCommand \index{Parameter passing} - -\end_inset - - -\layout Standard - -The compiler always uses the global registers -\emph on -DPL, DPH -\begin_inset LatexCommand \index{DPTR, DPH, DPL} - -\end_inset - -, B -\begin_inset LatexCommand \index{B (register)} - -\end_inset - - -\emph default -and -\emph on - ACC -\begin_inset LatexCommand \index{ACC} - -\end_inset - - -\emph default - to pass the first parameter to a routine. - The second parameter onwards is either allocated on the stack (for reentrant - routines or if - -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --stack-auto is used) or in data / xdata memory (depending on the memory - model). - -\layout Subsubsection - -Assembler Routine(non-reentrant -\begin_inset LatexCommand \index{reentrant} - -\end_inset - -) -\begin_inset LatexCommand \index{Assembler routines (non-reentrant)} - -\end_inset - - -\layout Standard - -In the following example the function c_func calls an assembler routine - asm_func, which takes two parameters. -\layout Verse - - -\family typewriter -extern int asm_func(unsigned char, unsigned char); -\newline - -\newline -int c_func (unsigned char i, unsigned char j) -\newline -{ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -return asm_func(i,j); -\newline -} -\newline - -\newline -int main() -\newline -{ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -return c_func(10,9); -\newline -} -\layout Standard - -The corresponding assembler function is: -\layout Verse - - -\family typewriter -.globl _asm_func_PARM_2 -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -12618,20 +12159,17 @@ The corresponding assembler function is: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -.globl _asm_func -\newline \SpecialChar ~ \SpecialChar ~ +given or display frame arg +\newline +;;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -.area OSEG -\newline -_asm_func_PARM_2: -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -12640,8 +12178,6 @@ _asm_func_PARM_2: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -.ds 1 -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -12650,10 +12186,6 @@ _asm_func_PARM_2: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -.area CSEG -\newline -_asm_func: -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -12662,8 +12194,6 @@ _asm_func: \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov a,dpl -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -12672,8 +12202,6 @@ mov a,dpl \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -add a,_asm_func_PARM_2 -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -12682,8 +12210,9 @@ add a,_asm_func_PARM_2 \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov dpl,a +buffer point \newline +;; !\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -12692,511 +12221,261 @@ mov dpl,a \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -dpl -\begin_inset LatexCommand \index{DPTR, DPH, DPL} - -\end_inset - -,#0x00 -\newline \SpecialChar ~ \SpecialChar ~ + sdcdbsrc-goto-sdcdb\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ret -\layout Standard - -Note here that the return values are placed in 'dpl' - One byte return value, - 'dpl' LSB & 'dph' MSB for two byte values. - 'dpl', 'dph' and 'b' for three byte values (generic pointers) and 'dpl','dph',' -b' & 'acc' for four byte values. -\layout Standard - -The parameter naming convention is __PARM_, where n is - the parameter number starting from 1, and counting from the left. - The first parameter is passed in -\begin_inset Quotes eld -\end_inset - -dpl -\begin_inset Quotes erd -\end_inset - - for One bye parameter, -\begin_inset Quotes eld -\end_inset - -dptr -\begin_inset Quotes erd -\end_inset - - if two bytes, -\begin_inset Quotes eld -\end_inset - -b,dptr -\begin_inset Quotes erd -\end_inset - - for three bytes and -\begin_inset Quotes eld -\end_inset - -acc,b,dptr -\begin_inset Quotes erd -\end_inset - - for four bytes, the variable name for the second parameter will be __PARM_2. -\newline - -\newline -Assemble the assembler routine with the following command: -\newline - -\newline - -\family sans -\series bold -asx8051 -losg asmfunc.asm -\newline - -\newline - -\family default -\series default -Then compile and link the assembler routine to the C source file with the - following command: -\newline - -\newline - -\family sans -\series bold -sdcc cfunc.c asmfunc.rel -\layout Subsubsection - -Assembler Routine(reentrant -\begin_inset LatexCommand \index{reentrant} - -\end_inset - -) -\begin_inset LatexCommand \index{Assembler routines (reentrant)} - -\end_inset - - -\layout Standard - -In this case the second parameter onwards will be passed on the stack, the - parameters are pushed from right to left i.e. - after the call the left most parameter will be on the top of the stack. - Here is an example: -\layout Verse - - -\family typewriter -extern int asm_func(unsigned char, unsigned char); -\newline - -\newline -int c_func (unsigned char i, unsigned char j) reentrant -\newline -{ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +Goto the SDCDB output buffer \newline +;; p\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -return asm_func(i,j); -\newline -} -\newline - -\newline -int main() -\newline -{ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -return c_func(10,9); -\newline -} -\layout Standard - -The corresponding assembler routine is: -\layout Verse - - -\family typewriter -.globl _asm_func -\newline -_asm_func: -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -push _bp -\newline \SpecialChar ~ + sdcdb-print-c-sexp\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov _bp,sp -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov r2,dpl +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +SDCDB print command for data at \newline +;;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov a,_bp -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -clr c -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -add a,#0xfd -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov r0,a -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -add a,#0xfc -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov r1,a -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov a,@r0 -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -add a,r2 -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov dpl,a -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov dph,#0x00 -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -mov sp,_bp +\SpecialChar ~ + buffer point \newline +;; g\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -pop _bp +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + sdcdbsrc-goto-sdcdb\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +Goto the SDCDB output buffer \newline +;; t\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -ret -\layout Standard - -The compiling and linking procedure remains the same, however note the extra - entry & exit linkage required for the assembler code, _bp is the stack - frame pointer and is used to compute the offset into the stack for parameters - and local variables. -\layout Subsection - -External Stack -\begin_inset LatexCommand \label{sub:External-Stack} - -\end_inset - - -\begin_inset LatexCommand \index{stack} - -\end_inset - - -\begin_inset LatexCommand \index{External stack} - -\end_inset - - -\layout Standard - -The external stack is located at the start of the external ram segment, - and is 256 bytes in size. - When - -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --xstack option is used to compile the program, the parameters and local - variables of all reentrant functions are allocated in this area. - This option is provided for programs with large stack space requirements. - When used with the - -\begin_inset ERT -status Collapsed - -\layout Standard - -\backslash -/ -\end_inset - --stack-auto option, all parameters and local variables are allocated on - the external stack (note support libraries will need to be recompiled with - the same options). -\layout Standard - -The compiler outputs the higher order address byte of the external ram segment - into PORT P2, therefore when using the External Stack option, this port - MAY NOT be used by the application program. -\layout Subsection - -ANSI-Compliance -\begin_inset LatexCommand \index{ANSI-compliance} - -\end_inset - - -\layout Standard - -Deviations from the compliance: -\layout Itemize - -functions are not always reentrant. -\layout Itemize - -structures cannot be assigned values directly, cannot be passed as function - parameters or assigned to each other and cannot be a return value from - a function, e.g.: -\begin_deeper -\layout Verse - - -\family typewriter -struct s { ... - }; +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + sdcdbsrc-mode\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +Toggles Sdcdbsrc mode (turns it off) \newline -struct s s1, s2; +;; \newline -foo() +;; C-c C-f\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + sdcdb-finish-from-src\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +SDCDB finish command \newline -{ +;; +\newline +;; C-x SPC\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + sdcdb-break\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +Set break for line with point \newline +;; ESC t\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + sdcdbsrc-mode\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -... - -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -s1 = s2 ; /* is invalid in SDCC although allowed in ANSI */ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -... - -\newline -} -\newline -struct s foo1 (struct s parms) /* invalid in SDCC although allowed in ANSI - */ -\newline -{ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +Toggle Sdcdbsrc mode \newline +;; ESC m\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -struct s rets; -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -... - -\newline \SpecialChar ~ + sdcdbsrc-srcmode\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -return rets;/* is invalid in SDCC although allowed in ANSI */ -\newline -} -\end_deeper -\layout Itemize - -'long long -\begin_inset LatexCommand \index{long long (not supported)} - -\end_inset - -' (64 bit integers -\begin_inset LatexCommand \index{int (64 bit) (not supported)} - -\end_inset - -) not supported. -\layout Itemize - -'double -\begin_inset LatexCommand \index{double (not supported)} - -\end_inset - -' precision floating point -\begin_inset LatexCommand \index{Floating point support} - -\end_inset - -not supported. -\layout Itemize - -No support for setjmp and longjmp (for now). -\layout Itemize - -Old K&R style -\begin_inset LatexCommand \index{K\&R style} - -\end_inset - - function declarations are NOT allowed. -\begin_deeper -\layout Verse - - -\family typewriter -foo(i,j) /* this old style of function declarations */ -\newline -int i,j; /* are valid in ANSI but not valid in SDCC */ -\newline -{ -\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -... - -\newline -} -\end_deeper -\layout Itemize - -functions declared as pointers must be dereferenced during the call. -\begin_deeper -\layout Verse - - -\family typewriter -int (*foo)(); -\newline -... - -\newline -/* has to be called like this */ -\newline -(*foo)(); /* ANSI standard allows calls to be made like 'foo()' */ -\end_deeper -\layout Subsection - -Cyclomatic Complexity -\begin_inset LatexCommand \index{Cyclomatic complexity} - -\end_inset - - -\layout Standard - -Cyclomatic complexity of a function is defined as the number of independent - paths the program can take during execution of the function. - This is an important number since it defines the number test cases you - have to generate to validate the function. - The accepted industry standard for complexity number is 10, if the cyclomatic - complexity reported by SDCC exceeds 10 you should think about simplification - of the function logic. - Note that the complexity level is not related to the number of lines of - code in a function. - Large functions can have low complexity, and small functions can have large - complexity levels. - -\newline - -\newline -SDCC uses the following formula to compute the complexity: +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ + Toggle list mode \newline - -\layout Standard - -complexity = (number of edges in control flow graph) - (number of nodes - in control flow graph) + 2; +;; \newline -\newline -Having said that the industry standard is 10, you should be aware that in - some cases it be may unavoidable to have a complexity level of less than - 10. - For example if you have switch statement with more than 10 case labels, - each case label adds one to the complexity level. - The complexity level is by no means an absolute measure of the algorithmic - complexity of the function, it does however provide a good starting point - for which functions you might look at for further optimization. \layout Section \pagebreak_top TIPS @@ -14427,145 +13706,84 @@ sdcc/doc \layout Section \pagebreak_top -Retargetting for other MCUs. -\layout Standard - -The issues for retargetting the compiler are far too numerous to be covered - by this document. - What follows is a brief description of each of the seven phases of the - compiler and its MCU dependency. -\layout Itemize - -Parsing the source and building the annotated parse tree. - This phase is largely MCU independent (except for the language extensions). - Syntax & semantic checks are also done in this phase, along with some initial - optimizations like back patching labels and the pattern matching optimizations - like bit-rotation etc. -\layout Itemize - -The second phase involves generating an intermediate code which can be easy - manipulated during the later phases. - This phase is entirely MCU independent. - The intermediate code generation assumes the target machine has unlimited - number of registers, and designates them with the name iTemp. - The compiler can be made to dump a human readable form of the code generated - by using the - -\begin_inset ERT -status Collapsed - -\layout Standard +Support +\begin_inset LatexCommand \index{Support} -\backslash -/ \end_inset --dumpraw option. -\layout Itemize -This phase does the bulk of the standard optimizations and is also MCU independe -nt. - This phase can be broken down into several sub-phases: -\newline +\layout Standard -\newline -Break down intermediate code (iCode) into basic blocks. -\newline -Do control flow & data flow analysis on the basic blocks. -\newline -Do local common subexpression elimination, then global subexpression elimination -\newline -Dead code elimination -\newline -Loop optimizations -\newline -If loop optimizations caused any changes then do 'global subexpression eliminati -on' and 'dead code elimination' again. -\layout Itemize +SDCC has grown to be a large project. + The compiler alone (without the preprocessor, assembler and linker) is + about 40,000 lines of code (blank stripped). + The open source nature of this project is a key to its continued growth + and support. + You gain the benefit and support of many active software developers and + end users. + Is SDCC perfect? No, that's why we need your help. + The developers take pride in fixing reported bugs. + You can help by reporting the bugs and helping other SDCC users. + There are lots of ways to contribute, and we encourage you to take part + in making SDCC a great software package. + +\layout Standard -This phase determines the live-ranges; by live range I mean those iTemp - variables defined by the compiler that still survive after all the optimization -s. - Live range analysis -\begin_inset LatexCommand \index{Live range analysis} +The SDCC project is hosted on the sdcc sourceforge site at +\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc} \end_inset - is essential for register allocation, since these computation determines - which of these iTemps will be assigned to registers, and for how long. -\layout Itemize - -Phase five is register allocation. - There are two parts to this process. -\newline +. + You'll find the complete set of mailing lists +\begin_inset LatexCommand \index{Mailing list} -\newline -The first part I call 'register packing' (for lack of a better term). - In this case several MCU specific expression folding is done to reduce - register pressure. -\newline +\end_inset -\newline -The second part is more MCU independent and deals with allocating registers - to the remaining live ranges. - A lot of MCU specific code does creep into this phase because of the limited - number of index registers available in the 8051. -\layout Itemize +, forums, bug reporting system, patch submission +\begin_inset LatexCommand \index{Patch submission} -The Code generation phase is (unhappily), entirely MCU dependent and very - little (if any at all) of this code can be reused for other MCU. - However the scheme for allocating a homogenized assembler operand for each - iCode operand may be reused. -\layout Itemize +\end_inset -As mentioned in the optimization section the peep-hole optimizer is rule - based system, which can reprogrammed for other MCUs. -\layout Section -\pagebreak_top -SDCDB -\begin_inset LatexCommand \index{sdcdb} + system, download +\begin_inset LatexCommand \index{download} \end_inset - - Source Level Debugger -\begin_inset LatexCommand \index{Debugger} + area and cvs code repository +\begin_inset LatexCommand \index{cvs code repository} \end_inset + there. +\layout Subsection -\layout Standard +Reporting Bugs +\begin_inset LatexCommand \index{Bugs} -SDCC is distributed with a source level debugger. - The debugger uses a command line interface, the command repertoire of the - debugger has been kept as close to gdb -\begin_inset LatexCommand \index{gdb} +\end_inset + + +\begin_inset LatexCommand \index{Reporting bugs} \end_inset - (the GNU debugger) as possible. - The configuration and build process is part of the standard compiler installati -on, which also builds and installs the debugger in the target directory - specified during configuration. - The debugger allows you debug BOTH at the C source and at the ASM source - level. - Sdcdb is available on Unix platforms only. -\layout Subsection -Compiling for Debugging \layout Standard -The \SpecialChar \- -\SpecialChar \- -debug option must be specified for all files for which debug information - is to be generated. - The complier generates a .adb file for each of these files. - The linker creates the .cdb file from the .adb files and the address information. - This .cdb is used by the debugger. -\layout Subsection - -How the Debugger Works +The recommended way of reporting bugs is using the infrastructure of the + sourceforge site. + You can follow the status of bug reports there and have an overview about + the known bugs. \layout Standard -When the - +Bug reports are automatically forwarded to the developer mailing list and + will be fixed ASAP. + When reporting a bug, it is very useful to include a small test program + (the smaller the better) which reproduces the problem. + If you can isolate the problem by looking at the generated assembly code, + this can be very helpful. + Compiling your program with the - \begin_inset ERT status Collapsed @@ -14575,590 +13793,718 @@ status Collapsed / \end_inset --debug option is specified the compiler generates extra symbol information - some of which are put into the the assembler source and some are put into - the .adb file. - Then the linker creates the .cdb file from the individual .adb files with - the address information for the symbols. - The debugger reads the symbolic information generated by the compiler & - the address information generated by the linker. - It uses the SIMULATOR (Daniel's S51) to execute the program, the program - execution is controlled by the debugger. - When a command is issued for the debugger, it translates it into appropriate - commands for the simulator. -\layout Subsection +-dumpall +\begin_inset LatexCommand \index{-\/-dumpall} -Starting the Debugger -\layout Standard +\end_inset -The debugger can be started using the following command line. - (Assume the file you are debugging has the file name foo). -\newline + option can sometimes be useful in locating optimization problems. + When reporting a bug please maker sure you: +\layout Enumerate -\newline +Attach the code you are compiling with SDCC. + +\layout Enumerate -\family sans -\series bold -sdcdb foo -\newline +Specify the exact command you use to run SDCC, or attach your Makefile. + +\layout Enumerate -\family default -\series default +Specify the SDCC version (type "sdcc -v"), your platform, and operating + system. + +\layout Enumerate -\newline -The debugger will look for the following files. -\layout Itemize +Provide an exact copy of any error message or incorrect output. + +\layout Enumerate -foo.c - the source file. -\layout Itemize +Put something meaningful in the subject of your message. +\layout Standard -foo.cdb - the debugger symbol information file. -\layout Itemize +Please attempt to include these 5 important parts, as applicable, in all + requests for support or when reporting any problems or bugs with SDCC. + Though this will make your message lengthy, it will greatly improve your + chance that SDCC users and developers will be able to help you. + Some SDCC developers are frustrated by bug reports without code provided + that they can use to reproduce and ultimately fix the problem, so please + be sure to provide sample code if you are reporting a bug! +\layout Standard -foo.ihx - the Intel hex format -\begin_inset LatexCommand \index{Intel hex format} +Please have a short check that you are using a recent version of SDCC and + the bug is not yet known. + This is the link for reporting bugs: +\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=100599} \end_inset - object file. +. \layout Subsection -Command Line Options. -\layout Itemize +Requesting Features +\begin_inset LatexCommand \label{sub:Requesting-Features} -- -\begin_inset ERT -status Collapsed +\end_inset -\layout Standard -\backslash -/ +\begin_inset LatexCommand \index{Feature request} + \end_inset --directory= this option can used to specify the directory - search list. - The debugger will look into the directory list specified for source, cdb - & ihx files. - The items in the directory list must be separated by ':', e.g. - if the source files can be in the directories /home/src1 and /home/src2, - the - -\begin_inset ERT -status Collapsed -\layout Standard +\begin_inset LatexCommand \index{Requesting features} -\backslash -/ \end_inset --directory option should be - -\begin_inset ERT -status Collapsed \layout Standard -\backslash -/ -\end_inset +Like bug reports feature requests are forwarded to the developer mailing + list. + This is the link for requesting features: +\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599} --directory=/home/src1:/home/src2. - Note there can be no spaces in the option. - -\layout Itemize +\end_inset --cd - change to the . -\layout Itemize +. +\layout Subsection --fullname - used by GUI front ends. -\layout Itemize +Getting Help +\layout Standard --cpu - this argument is passed to the simulator please see the - simulator docs for details. -\layout Itemize +These links should take you directly to the +\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599} --X this options is passed to the simulator please see - the simulator docs for details. -\layout Itemize +\end_inset --s passed to simulator see the simulator docs for details. -\layout Itemize --S passed to simulator see the simulator docs for details. -\layout Subsection +\begin_inset Foot +collapsed false -Debugger Commands. \layout Standard -As mention earlier the command interface for the debugger has been deliberately - kept as close the GNU debugger gdb, as possible. - This will help the integration with existing graphical user interfaces - (like ddd, xxgdb or xemacs) existing for the GNU debugger. -\layout Subsubsection +Traffic on sdcc-devel and sdcc-user is about 100 mails/month each not counting + automated messages (mid 2003) +\end_inset -break [line | file:line | function | file:function] -\layout Standard + and the +\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599} -Set breakpoint at specified line or function: -\newline +\end_inset -\newline +, lists and forums are archived so if you are lucky someone already had + a similar problem. +\layout Subsection + +ChangeLog +\begin_inset LatexCommand \index{Changelog} + +\end_inset -\family sans -\series bold -sdcdb>break 100 -\newline -sdcdb>break foo.c:100 -\newline -sdcdb>break funcfoo -\newline -sdcdb>break foo.c:funcfoo -\layout Subsubsection -clear [line | file:line | function | file:function ] \layout Standard -Clear breakpoint at specified line or function: -\newline +You can follow the status of the cvs version +\begin_inset LatexCommand \index{version} -\newline +\end_inset -\family sans -\series bold -sdcdb>clear 100 -\newline -sdcdb>clear foo.c:100 -\newline -sdcdb>clear funcfoo -\newline -sdcdb>clear foo.c:funcfoo -\layout Subsubsection + of SDCC by watching the file +\begin_inset LatexCommand \htmlurl[ChangeLog]{http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/sdcc/sdcc/ChangeLog?rev=HEAD&content-type=text/plain} -continue -\layout Standard +\end_inset -Continue program being debugged, after breakpoint. -\layout Subsubsection + in the cvs-repository. +\layout Subsection -finish -\layout Standard +Release policy +\begin_inset LatexCommand \index{Release policy} + +\end_inset -Execute till the end of the current function. -\layout Subsubsection -delete [n] \layout Standard -Delete breakpoint number 'n'. - If used without any option clear ALL user defined break points. -\layout Subsubsection +Historically there often were long delays between official releases and + the sourceforge download area tends to get not updated at all. + Current excuses might refer to problems with live range analysis, but if + this is fixed, the next problem rising is that another excuse will have + to be found. + Kidding aside, we have to get better there! On the other hand there are + daily snapshots available at +\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php} -info [break | stack | frame | registers ] -\layout Itemize +\end_inset -info break - list all breakpoints -\layout Itemize +, and you can always built the very last version (hopefully with many bugs + fixed, and features added) from the source code available at +\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source} -info stack - show the function call stack. -\layout Itemize +\end_inset -info frame - show information about the current execution frame. -\layout Itemize +. +\layout Subsection -info registers - show content of all registers. -\layout Subsubsection +Examples +\begin_inset LatexCommand \index{Examples} -step -\layout Standard +\end_inset -Step program until it reaches a different source line. -\layout Subsubsection -next \layout Standard -Step program, proceeding through subroutine calls. -\layout Subsubsection +You'll find some small examples in the directory sdcc/device/examples/ +\layout Comment -run -\layout Standard +Maybe we should include some links to real world applications. + Preferably pointer to pointers (one for each architecture) so this stays + manageable here? +\layout Subsection -Start debugged program. -\layout Subsubsection +Quality control +\begin_inset LatexCommand \index{Quality control} -ptype variable -\layout Standard +\end_inset -Print type information of the variable. -\layout Subsubsection -print variable \layout Standard -print value of variable. -\layout Subsubsection +The compiler is passed through nightly compile and build checks. + The so called +\shape italic +regression tests +\shape default -file filename -\layout Standard +\begin_inset LatexCommand \index{Regression test} -load the given file name. - Note this is an alternate method of loading file for debugging. -\layout Subsubsection +\end_inset -frame -\layout Standard + check that SDCC itself compiles flawlessly on several platforms and checks + the quality of the code generated by SDCC by running the code through simulator +s. + There is a separate document +\shape italic +test_suite.pdf +\begin_inset LatexCommand \index{Test suite} -print information about current frame. -\layout Subsubsection +\end_inset -set srcmode + +\shape default + about this. \layout Standard -Toggle between C source & assembly source. -\layout Subsubsection +You'll find the test code in the directory +\shape italic +sdcc/support/regression +\shape default +. + You can run these tests manually by running +\family sans +make +\family default + in this directory (or f.e. + +\family sans +make test-mcs51 +\family default + if you don't want to run the complete tests). + The test code might also be interesting if you want to look for examples +\begin_inset LatexCommand \index{Examples} -! simulator command -\layout Standard +\end_inset -Send the string following '!' to the simulator, the simulator response is - displayed. - Note the debugger does not interpret the command being sent to the simulator, - so if a command like 'go' is sent the debugger can loose its execution - context and may display incorrect values. -\layout Subsubsection + checking corner cases of SDCC or if you plan to submit patches +\begin_inset LatexCommand \index{Patch submission} -quit. +\end_inset + +. \layout Standard -"Watch me now. - Iam going Down. - My name is Bobby Brown" +The pic port uses a different set of regression tests, you'll find them + in the directory +\shape italic +sdcc/src/regression +\shape default +. +\layout Section +\pagebreak_top +SDCC Technical Data \layout Subsection -Interfacing with XEmacs -\begin_inset LatexCommand \index{XEmacs} +Optimizations +\begin_inset LatexCommand \index{Optimizations} \end_inset -\begin_inset LatexCommand \index{Emacs} +\layout Standard + +SDCC performs a host of standard optimizations in addition to some MCU specific + optimizations. + +\layout Subsubsection + +Sub-expression Elimination +\begin_inset LatexCommand \index{Subexpression elimination} \end_inset -. + \layout Standard -Two files (in emacs lisp) are provided for the interfacing with XEmacs, - sdcdb.el and sdcdbsrc.el. - These two files can be found in the $(prefix)/bin directory after the installat -ion is complete. - These files need to be loaded into XEmacs for the interface to work. - This can be done at XEmacs startup time by inserting the following into - your '.xemacs' file (which can be found in your HOME directory): -\newline +The compiler does local and global common subexpression elimination, e.g.: + +\layout Verse -\newline \family typewriter -(load-file sdcdbsrc.el) -\family default - +i = x + y + 1; \newline +j = x + y; +\layout Standard + +will be translated to +\layout Verse + +\family typewriter +iTemp = x + y; \newline -.xemacs is a lisp file so the () around the command is REQUIRED. - The files can also be loaded dynamically while XEmacs is running, set the - environment variable 'EMACSLOADPATH' to the installation bin directory - (/bin), then enter the following command ESC-x load-file sdcdbsrc. - To start the interface enter the following command: +i = iTemp + 1; \newline +j = iTemp; +\layout Standard -\newline +Some subexpressions are not as obvious as the above example, e.g.: +\layout Verse -\family sans -\series bold -ESC-x sdcdbsrc -\family default -\series default +\family typewriter +a->b[i].c = 10; \newline +a->b[i].d = 11; +\layout Standard + +In this case the address arithmetic a->b[i] will be computed only once; + the equivalent code in C would be. +\layout Verse + +\family typewriter +iTemp = a->b[i]; \newline -You will prompted to enter the file name to be debugged. - +iTemp.c = 10; \newline +iTemp.d = 11; +\layout Standard -\newline -The command line options that are passed to the simulator directly are bound - to default values in the file sdcdbsrc.el. - The variables are listed below, these values maybe changed as required. -\layout Itemize +The compiler will try to keep these temporary variables in registers. +\layout Subsubsection -sdcdbsrc-cpu-type '51 -\layout Itemize +Dead-Code Elimination +\begin_inset LatexCommand \index{Dead-code elimination} -sdcdbsrc-frequency '11059200 -\layout Itemize +\end_inset -sdcdbsrc-serial nil -\layout Standard -The following is a list of key mapping for the debugger interface. -\layout Standard +\layout Verse -\SpecialChar ~ \family typewriter - -\newline -;; Current Listing :: +int global; \newline -;;key\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -binding\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -Comment + +\newline +void f () { \newline -;;---\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -------\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +int i; +\newline \SpecialChar ~ \SpecialChar ~ +i = 1; \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +/* dead store */ +\newline \SpecialChar ~ \SpecialChar ~ +global = 1;\SpecialChar ~ +/* dead store */ +\newline \SpecialChar ~ \SpecialChar ~ +global = 2; +\newline \SpecialChar ~ \SpecialChar ~ +return; +\newline \SpecialChar ~ \SpecialChar ~ --------- +global = 3;\SpecialChar ~ +/* unreachable */ \newline -;; +} +\layout Standard + +will be changed to +\layout Verse + + +\family typewriter +int global; \newline -;; n\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - sdcdb-next-from-src\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -SDCDB next command + \newline -;; b\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - sdcdb-back-from-src\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -SDCDB back command +void f () { \newline -;; c\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ - sdcdb-cont-from-src\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -SDCDB continue command +global = 2; \newline -;; s\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - sdcdb-step-from-src\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -SDCDB step command +return; +\newline +} +\layout Subsubsection + +Copy-Propagation +\begin_inset LatexCommand \index{Copy propagation} + +\end_inset + + +\layout Verse + + +\family typewriter +int f() { \newline -;; ?\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +int i, j; +\newline \SpecialChar ~ \SpecialChar ~ +i = 10; +\newline \SpecialChar ~ \SpecialChar ~ +j = i; +\newline \SpecialChar ~ - sdcdb-whatis-c-sexp\SpecialChar ~ \SpecialChar ~ +return j; +\newline +} +\layout Standard + +will be changed to +\layout Verse + + +\family typewriter +int f() { +\newline \SpecialChar ~ \SpecialChar ~ +int i, j; +\newline \SpecialChar ~ \SpecialChar ~ +i = 10; +\newline \SpecialChar ~ \SpecialChar ~ +j = 10; +\newline \SpecialChar ~ \SpecialChar ~ -SDCDB ptypecommand for data at +return 10; +\newline +} +\layout Standard + +Note: the dead stores created by this copy propagation will be eliminated + by dead-code elimination. +\layout Subsubsection + +Loop Optimizations +\begin_inset LatexCommand \index{Loop optimization} + +\end_inset + + +\layout Standard + +Two types of loop optimizations are done by SDCC loop invariant lifting + and strength reduction of loop induction variables. + In addition to the strength reduction the optimizer marks the induction + variables and the register allocator tries to keep the induction variables + in registers for the duration of the loop. + Because of this preference of the register allocator +\begin_inset LatexCommand \index{Register allocation} + +\end_inset + +, loop induction optimization causes an increase in register pressure, which + may cause unwanted spilling of other temporary variables into the stack +\begin_inset LatexCommand \index{stack} + +\end_inset + + / data space. + The compiler will generate a warning message when it is forced to allocate + extra space either on the stack or data space. + If this extra space allocation is undesirable then induction optimization + can be eliminated either for the entire source file (with - +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-noinduction option) or for a given function only using #pragma\SpecialChar ~ +NOINDUCTION +\begin_inset LatexCommand \index{\#pragma NOINDUCTION} + +\end_inset + +. +\newline + +\newline +Loop Invariant: +\layout Verse + + +\family typewriter +for (i = 0 ; i < 100 ; i ++) \newline -;;\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +f += k + l; +\layout Standard + +changed to +\layout Verse + + +\family typewriter +itemp = k + l; +\newline +for (i = 0; i < 100; i++) +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +f += itemp; +\layout Standard + +As mentioned previously some loop invariants are not as apparent, all static + address computations are also moved out of the loop. +\newline + +\newline +Strength Reduction +\begin_inset LatexCommand \index{Strength reduction} + +\end_inset + +, this optimization substitutes an expression by a cheaper expression: +\layout Verse + + +\family typewriter +for (i=0;i < 100; i++) +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +ar[i*5] = i*3; +\layout Standard + +changed to +\layout Verse + + +\family typewriter +itemp1 = 0; +\newline +itemp2 = 0; +\newline +for (i=0;i< 100;i++) { +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +ar[itemp1] = itemp2; +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +itemp1 += 5; +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +itemp2 += 3; +\newline +} +\layout Standard + +The more expensive multiplication +\begin_inset LatexCommand \index{Multiplication} + +\end_inset + + is changed to a less expensive addition. +\layout Subsubsection + +Loop Reversing +\begin_inset LatexCommand \index{Loop reversing} + +\end_inset + + +\layout Standard + +This optimization is done to reduce the overhead of checking loop boundaries + for every iteration. + Some simple loops can be reversed and implemented using a +\begin_inset Quotes eld +\end_inset + +decrement and jump if not zero +\begin_inset Quotes erd +\end_inset + + instruction. + SDCC checks for the following criterion to determine if a loop is reversible + (note: more sophisticated compilers use data-dependency analysis to make + this determination, SDCC uses a more simple minded analysis). +\layout Itemize + +The 'for' loop is of the form +\newline + +\newline + +\family typewriter +for( = ; [< | <=] ; [++ | + += 1]) +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + +\layout Itemize + +The does not contain +\begin_inset Quotes eld +\end_inset + +continue +\begin_inset Quotes erd +\end_inset + + or 'break +\begin_inset Quotes erd +\end_inset + +. +\layout Itemize + +All goto's are contained within the loop. +\layout Itemize + +No function calls within the loop. +\layout Itemize + +The loop control variable is not assigned any value within the loop +\layout Itemize + +The loop control variable does NOT participate in any arithmetic operation + within the loop. +\layout Itemize + +There are NO switch statements in the loop. +\layout Subsubsection + +Algebraic Simplifications +\layout Standard + +SDCC does numerous algebraic simplifications, the following is a small sub-set + of these optimizations. +\layout Verse + + +\family typewriter +i = j + 0 ; /* changed to */ i = j; +\newline +i /= 2;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + /* changed to */ i >>= 1; +\newline +i = j - j ; /* changed to */ i = 0; +\newline +i = j / 1 ; /* changed to */ i = j; +\layout Standard + +Note the subexpressions +\begin_inset LatexCommand \index{Subexpression} + +\end_inset + + given above are generally introduced by macro expansions or as a result + of copy/constant propagation. +\layout Subsubsection + +'switch' Statements +\begin_inset LatexCommand \index{switch statement} + +\end_inset + + +\layout Standard + +SDCC changes switch statements to jump tables +\begin_inset LatexCommand \index{jump tables} + +\end_inset + + when the following conditions are true. + +\layout Itemize + +The case labels are in numerical sequence, the labels need not be in order, + and the starting number need not be one or zero. +\begin_deeper +\layout Verse + + +\family typewriter +switch(i) {\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15169,9 +14515,6 @@ SDCDB ptypecommand for data at \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - buffer point -\newline -;; x\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15185,12 +14528,14 @@ SDCDB ptypecommand for data at \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - sdcdbsrc-delete\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +switch (i) { +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +case 4: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15199,9 +14544,6 @@ SDCDB ptypecommand for data at \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -SDCDB Delete all breakpoints if no arg -\newline -;;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15219,9 +14561,13 @@ SDCDB Delete all breakpoints if no arg \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +case 0: ... + +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +case 5: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15247,23 +14593,17 @@ SDCDB Delete all breakpoints if no arg \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -given or delete arg (C-u arg x) +case 1: ... + \newline -;; m\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +case 3: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - sdcdbsrc-frame\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15278,9 +14618,6 @@ given or delete arg (C-u arg x) \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -SDCDB Display current frame if no arg, -\newline -;;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15288,9 +14625,13 @@ SDCDB Display current frame if no arg, \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +case 2: ... + +\newline \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +case 6: ...\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15316,6 +14657,10 @@ SDCDB Display current frame if no arg, \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +case 3: ... + +\newline +}\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15327,9 +14672,6 @@ SDCDB Display current frame if no arg, \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -given or display frame arg -\newline -;;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15354,63 +14696,350 @@ given or display frame arg \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +} +\layout Standard + +Both the above switch statements will be implemented using a jump-table. + The example to the right side is slightly more efficient as the check for + the lower bound of the jump-table is not needed. +\end_deeper +\layout Itemize + +The number of case labels is at least three, since it takes two conditional + statements to handle the boundary conditions. +\layout Itemize + +The number of case labels is less than 84, since each label takes 3 bytes + and a jump-table can be utmost 256 bytes long. +\layout Standard + +Switch statements which have gaps in the numeric sequence or those that + have more that 84 case labels can be split into more than one switch statement + for efficient code generation, e.g.: +\layout Verse + + +\family typewriter +switch (i) { +\newline \SpecialChar ~ \SpecialChar ~ +case 1: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 2: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 3: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 4: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 9: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 10: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 11: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 12: ... + +\newline +} +\layout Standard + +If the above switch statement is broken down into two switch statements +\layout Verse + + +\family typewriter +switch (i) { +\newline \SpecialChar ~ \SpecialChar ~ +case 1: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 2: ... + +\newline \SpecialChar ~ \SpecialChar ~ -buffer point +case 3: ... + \newline -;; !\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +case 4: ... + +\newline +} +\layout Standard + +and +\layout Verse + + +\family typewriter +switch (i) { +\newline \SpecialChar ~ \SpecialChar ~ +case 9: \SpecialChar ~ +... + +\newline \SpecialChar ~ \SpecialChar ~ +case 10: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 11: ... + +\newline \SpecialChar ~ \SpecialChar ~ +case 12:\SpecialChar ~ +... + +\newline +} +\layout Standard + +then both the switch statements will be implemented using jump-tables whereas + the unmodified switch statement will not be. + You might also consider dummy cases 0 and 5 to 8 in this example. + The pragma NOJTBOUND +\begin_inset LatexCommand \index{\#pragma NOJTBOUND} + +\end_inset + + can be used to turn off checking the +\emph on +j +\emph default +ump +\emph on +t +\emph default +able +\emph on +bound +\emph default +aries. +\layout Subsubsection + +Bit-shifting Operations +\begin_inset LatexCommand \index{Bit shifting} + +\end_inset + +. +\layout Standard + +Bit shifting is one of the most frequently used operation in embedded programmin +g. + SDCC tries to implement bit-shift operations in the most efficient way + possible, e.g.: +\layout Verse + + +\family typewriter +unsigned char i; +\newline +... + +\newline +i >>= 4; +\newline +... +\layout Standard + +generates the following code: +\layout Verse + + +\family typewriter +mov a,_i +\newline +swap a +\newline +anl a,#0x0f +\newline +mov _i,a +\layout Standard + +In general SDCC will never setup a loop if the shift count is known. + Another example: +\layout Verse + + +\family typewriter +unsigned int i; +\newline +... + +\newline +i >>= 9; +\newline +... +\layout Standard + +will generate: +\layout Verse + + +\family typewriter +mov\SpecialChar ~ \SpecialChar ~ +a,(_i + 1) +\newline +mov\SpecialChar ~ \SpecialChar ~ - sdcdbsrc-goto-sdcdb\SpecialChar ~ +(_i + 1),#0x00 +\newline +clr\SpecialChar ~ \SpecialChar ~ +c +\newline +rrc\SpecialChar ~ \SpecialChar ~ +a +\newline +mov\SpecialChar ~ \SpecialChar ~ +_i,a +\layout Standard + +Note that SDCC stores numbers in little-endian format (i.e. + lowest order first). +\layout Subsubsection + +Bit-rotation +\begin_inset LatexCommand \index{Bit rotation} + +\end_inset + + +\layout Standard + +A special case of the bit-shift operation is bit rotation, SDCC recognizes + the following expression to be a left bit-rotation: +\layout Verse + + +\family typewriter +unsigned char i; +\newline +... + +\newline +i = ((i << 1) | (i >> 7)); +\family default + +\newline + +\family typewriter +... +\layout Standard + +will generate the following code: +\layout Verse + + +\family typewriter +mov\SpecialChar ~ \SpecialChar ~ +a,_i +\newline +rl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +a +\newline +mov\SpecialChar ~ \SpecialChar ~ +_i,a +\layout Standard + +SDCC uses pattern matching on the parse tree to determine this operation.Variatio +ns of this case will also be recognized as bit-rotation, i.e.: +\layout Verse + + +\family typewriter +i = ((i >> 7) | (i << 1)); /* left-bit rotation */ +\layout Subsubsection + +Highest Order Bit +\begin_inset LatexCommand \index{Highest Order Bit} + +\end_inset + + +\layout Standard + +It is frequently required to obtain the highest order bit of an integral + type (long, int, short or char types). + SDCC recognizes the following expression to yield the highest order bit + and generates optimized code for it, e.g.: +\layout Verse + + +\family typewriter +unsigned int gint; +\newline + +\newline +foo () { +\newline \SpecialChar ~ \SpecialChar ~ -Goto the SDCDB output buffer +unsigned char hob; \newline -;; p\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +... + +\newline \SpecialChar ~ \SpecialChar ~ +hob = (gint >> 15) & 1; +\newline \SpecialChar ~ \SpecialChar ~ +.. + +\newline +} +\layout Standard + +will generate the following code: +\layout Verse + + +\family typewriter \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15418,7 +15047,6 @@ Goto the SDCDB output buffer \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - sdcdb-print-c-sexp\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15429,9 +15057,6 @@ Goto the SDCDB output buffer \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -SDCDB print command for data at -\newline -;;\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15440,6 +15065,10 @@ SDCDB print command for data at \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 61 ;\SpecialChar ~ + hob.c 7 +\newline +000A E5*01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15454,6 +15083,7 @@ SDCDB print command for data at \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 62\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15461,7 +15091,11 @@ SDCDB print command for data at \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ + a,(_gint + 1) +\newline +000C 23\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15477,11 +15111,9 @@ SDCDB print command for data at \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - buffer point -\newline -;; g\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 63\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15489,11 +15121,14 @@ SDCDB print command for data at \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + rl\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + a +\newline +000D 54 01\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - sdcdbsrc-goto-sdcdb\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15503,12 +15138,10 @@ SDCDB print command for data at \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -Goto the SDCDB output buffer -\newline -;; t\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 64\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15516,10 +15149,13 @@ Goto the SDCDB output buffer \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + anl\SpecialChar ~ \SpecialChar ~ + a,#0x01 +\newline +000F F5*02\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ - sdcdbsrc-mode\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ @@ -15532,231 +15168,493 @@ Goto the SDCDB output buffer \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + 65\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -Toggles Sdcdbsrc mode (turns it off) -\newline -;; -\newline -;; C-c C-f\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ \SpecialChar ~ + mov\SpecialChar ~ \SpecialChar ~ + _foo_hob_1_1,a +\layout Standard + +Variations of this case however will +\emph on +not +\emph default + be recognized. + It is a standard C expression, so I heartily recommend this be the only + way to get the highest order bit, (it is portable). + Of course it will be recognized even if it is embedded in other expressions, + e.g.: +\layout Verse + + +\family typewriter +xyz = gint + ((gint >> 15) & 1); +\layout Standard + +will still be recognized. +\layout Subsubsection + +Peephole Optimizer +\begin_inset LatexCommand \index{Peephole optimizer} + +\end_inset + + +\layout Standard + +The compiler uses a rule based, pattern matching and re-writing mechanism + for peep-hole optimization. + It is inspired by +\emph on +copt +\emph default + a peep-hole optimizer by Christopher W. + Fraser (cwfraser@microsoft.com). + A default set of rules are compiled into the compiler, additional rules + may be added with the +\emph on +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-peep-file +\begin_inset LatexCommand \index{-\/-peep-file} + +\end_inset + + +\emph default + option. + The rule language is best illustrated with examples. +\layout Verse + + +\family typewriter +replace { +\newline \SpecialChar ~ \SpecialChar ~ - sdcdb-finish-from-src\SpecialChar ~ +mov %1,a +\newline \SpecialChar ~ \SpecialChar ~ +mov a,%1 +\newline +} by { +\newline \SpecialChar ~ \SpecialChar ~ +mov %1,a +\newline +} +\layout Standard + +The above rule will change the following assembly +\begin_inset LatexCommand \index{Assembler routines} + +\end_inset + + sequence: +\layout Verse + + +\family typewriter +mov r1,a +\newline +mov a,r1 +\layout Standard + +to +\layout Verse + + +\family typewriter +mov r1,a +\layout Standard + +Note: All occurrences of a +\emph on +%n +\emph default + (pattern variable) must denote the same string. + With the above rule, the assembly sequence: +\layout Verse + + +\family typewriter +mov r1,a +\newline +mov a,r2 +\layout Standard + +will remain unmodified. +\newline + +\newline +Other special case optimizations may be added by the user (via +\emph on +- +\begin_inset ERT +status Collapsed + +\layout Standard + +\backslash +/ +\end_inset + +-peep-file option +\emph default +). + E.g. + some variants of the 8051 MCU allow only +\family typewriter +ajmp +\family default + and +\family typewriter +acall +\family default +. + The following two rules will change all +\family typewriter +ljmp +\family default + and +\family typewriter +lcall +\family default + to +\family typewriter +ajmp +\family default + and +\family typewriter +acall +\layout Verse + + +\family typewriter +replace { lcall %1 } by { acall %1 } +\newline +replace { ljmp %1 } by { ajmp %1 } +\layout Standard + +The +\emph on +inline-assembler code +\emph default + is also passed through the peep hole optimizer, thus the peephole optimizer + can also be used as an assembly level macro expander. + The rules themselves are MCU dependent whereas the rule language infra-structur +e is MCU independent. + Peephole optimization rules for other MCU can be easily programmed using + the rule language. +\newline + +\newline +The syntax for a rule is as follows: +\layout Verse + + +\family typewriter +rule := replace [ restart ] '{' ' +\backslash +n' +\newline \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + '}' by '{' ' +\backslash +n' +\newline \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + ' +\backslash +n' +\newline \SpecialChar ~ -SDCDB finish command + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ + '}' [if ] ' +\backslash +n' +\layout Standard + + := assembly instruction (each instruction including + labels must be on a separate line). \newline -;; + \newline -;; C-x SPC\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - sdcdb-break\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -Set break for line with point +The optimizer will apply to the rules one by one from the top in the sequence + of their appearance, it will terminate when all rules are exhausted. + If the 'restart' option is specified, then the optimizer will start matching + the rules again from the top, this option for a rule is expensive (performance) +, it is intended to be used in situations where a transformation will trigger + the same rule again. + An example of this (not a good one, it has side effects) is the following + rule: +\layout Verse + + +\family typewriter +replace restart { \newline -;; ESC t\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - sdcdbsrc-mode\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -Toggle Sdcdbsrc mode +pop %1 \newline -;; ESC m\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ - sdcdbsrc-srcmode\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ -\SpecialChar ~ \SpecialChar ~ \SpecialChar ~ +push %1 } by { +\newline \SpecialChar ~ \SpecialChar ~ - Toggle list mode +; nop \newline -;; -\family default +} +\layout Standard + +Note that the replace pattern cannot be a blank, but can be a comment line. + Without the 'restart' option only the inner most 'pop' 'push' pair would + be eliminated, i.e.: +\layout Verse + +\family typewriter +pop ar1 +\newline +pop ar2 +\newline +push ar2 \newline +push ar1 +\layout Standard -\layout Section +would result in: +\layout Verse -Other Processors -\layout Subsection -The Z80 and gbz80 port +\family typewriter +pop ar1 +\newline +; nop +\newline +push ar1 \layout Standard -SDCC can target both the Zilog -\begin_inset LatexCommand \index{Z80} -\end_inset +\emph on +with +\emph default + the restart option the rule will be applied again to the resulting code + and then all the pop-push pairs will be eliminated to yield: +\layout Verse - and the Nintendo Gameboy's Z80-like gbz80 -\begin_inset LatexCommand \index{GameBoy Z80} -\end_inset +\family typewriter +; nop +\newline +; nop +\layout Standard + +A conditional function can be attached to a rule. + Attaching rules are somewhat more involved, let me illustrate this with + an example. +\layout Verse + + +\family typewriter +replace { +\newline +\SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ +ljmp %5 +\newline +%2: +\newline +} by { +\newline +\SpecialChar ~ + \SpecialChar ~ + \SpecialChar ~ +sjmp %5 +\newline +%2: +\newline +} if labelInRange +\layout Standard + +The optimizer does a look-up of a function name table defined in function + +\emph on +callFuncByName +\emph default + in the source file SDCCpeeph.c, with the name +\emph on +labelInRange +\emph default +. + If it finds a corresponding entry the function is called. + Note there can be no parameters specified for these functions, in this + case the use of +\emph on +%5 +\emph default + is crucial, since the function +\emph on +labelInRange +\emph default + expects to find the label in that particular variable (the hash table containin +g the variable bindings is passed as a parameter). + If you want to code more such functions, take a close look at the function + labelInRange and the calling mechanism in source file SDCCpeeph.c. + Currently implemented are +\emph on +labelInRange, labelRefCount, labelIsReturnOnly, operandsNotSame, xramMovcOption, + 24bitMode, portIsDS390, 24bitModeAndPortDS390 +\emph default +and +\emph on + notVolatile +\emph default +. +\layout Standard + +I know this whole thing is a little kludgey, but maybe some day we will + have some better means. + If you are looking at this file, you will see the default rules that are + compiled into the compiler, you can add your own rules in the default set + there if you get tired of specifying the - +\begin_inset ERT +status Collapsed -. - The port is incomplete - long support is incomplete (mul, div and mod are - unimplemented), and both float and bitfield support is missing. - Apart from that the code generated is correct. \layout Standard -As always, the code is the authoritative reference - see z80/ralloc.c and - z80/gen.c. - The stack frame is similar to that generated by the IAR Z80 compiler. - IX is used as the base pointer, HL is used as a temporary register, and - BC and DE are available for holding variables. - IY is currently unused. - Return values are stored in HL. - One bad side effect of using IX as the base pointer is that a functions - stack frame is limited to 127 bytes - this will be fixed in a later version. -\layout Section -\pagebreak_top -Support -\begin_inset LatexCommand \index{Support} - +\backslash +/ \end_inset +-peep-file option. +\layout Subsection +Library Routines +\emph on + \layout Standard -SDCC has grown to be a large project. - The compiler alone (without the preprocessor, assembler and linker) is - about 40,000 lines of code (blank stripped). - The open source nature of this project is a key to its continued growth - and support. - You gain the benefit and support of many active software developers and - end users. - Is SDCC perfect? No, that's why we need your help. - The developers take pride in fixing reported bugs. - You can help by reporting the bugs and helping other SDCC users. - There are lots of ways to contribute, and we encourage you to take part - in making SDCC a great software package. + +\emph on + +\emph default -\layout Standard +\layout Enumerate -The SDCC project is hosted on the sdcc sourceforge site at -\begin_inset LatexCommand \htmlurl{http://sourceforge.net/projects/sdcc} +Compiler support routines (_gptrget, _mulint etc) +\layout Enumerate -\end_inset +Stdclib functions (puts, printf, strcat etc) +\layout Enumerate -. - You'll find the complete set of mailing lists -\begin_inset LatexCommand \index{Mailing list} +Math functions (sin, pow, sqrt etc) +\layout Standard + +Libraries +\begin_inset LatexCommand \index{Libraries} \end_inset -, forums, bug reporting system, patch submission -\begin_inset LatexCommand \index{Patch submission} + included in SDCC should have a license at least as liberal as the GNU Lesser + General Public License +\begin_inset LatexCommand \index{GNU Lesser General Public License, LGPL} \end_inset - system, download -\begin_inset LatexCommand \index{download} + +\emph on +LGPL +\emph default +. +\layout Comment -\end_inset +license statements for the libraries are missing. + sdcc/device/lib/ser_ir.c f.e. + comes with a GPL (as opposed to LGPL) License - this will not be liberal + enough for many embedded programmers. +\layout Subsection - area and cvs code repository -\begin_inset LatexCommand \index{cvs code repository} +External Stack +\begin_inset LatexCommand \label{sub:External-Stack} \end_inset - there. -\layout Subsection -Reporting Bugs -\begin_inset LatexCommand \index{Bugs} +\begin_inset LatexCommand \index{stack} \end_inset -\begin_inset LatexCommand \index{Reporting bugs} +\begin_inset LatexCommand \index{External stack} \end_inset \layout Standard -The recommended way of reporting bugs is using the infrastructure of the - sourceforge site. - You can follow the status of bug reports there and have an overview about - the known bugs. -\layout Standard - -Bug reports are automatically forwarded to the developer mailing list and - will be fixed ASAP. - When reporting a bug, it is very useful to include a small test program - (the smaller the better) which reproduces the problem. - If you can isolate the problem by looking at the generated assembly code, - this can be very helpful. - Compiling your program with the - +The external stack is located at the start of the external ram segment, + and is 256 bytes in size. + When - \begin_inset ERT status Collapsed @@ -15766,236 +15664,360 @@ status Collapsed / \end_inset --dumpall -\begin_inset LatexCommand \index{-\/-dumpall} +-xstack option is used to compile the program, the parameters and local + variables of all reentrant functions are allocated in this area. + This option is provided for programs with large stack space requirements. + When used with the - +\begin_inset ERT +status Collapsed +\layout Standard + +\backslash +/ \end_inset - option can sometimes be useful in locating optimization problems. - When reporting a bug please maker sure you: -\layout Enumerate +-stack-auto option, all parameters and local variables are allocated on + the external stack (note support libraries will need to be recompiled with + the same options). +\layout Standard -Attach the code you are compiling with SDCC. - -\layout Enumerate +The compiler outputs the higher order address byte of the external ram segment + into PORT P2, therefore when using the External Stack option, this port + MAY NOT be used by the application program. +\layout Subsection -Specify the exact command you use to run SDCC, or attach your Makefile. - -\layout Enumerate +ANSI-Compliance +\begin_inset LatexCommand \index{ANSI-compliance} -Specify the SDCC version (type "sdcc -v"), your platform, and operating - system. - -\layout Enumerate +\end_inset -Provide an exact copy of any error message or incorrect output. - -\layout Enumerate -Put something meaningful in the subject of your message. \layout Standard -Please attempt to include these 5 important parts, as applicable, in all - requests for support or when reporting any problems or bugs with SDCC. - Though this will make your message lengthy, it will greatly improve your - chance that SDCC users and developers will be able to help you. - Some SDCC developers are frustrated by bug reports without code provided - that they can use to reproduce and ultimately fix the problem, so please - be sure to provide sample code if you are reporting a bug! -\layout Standard +Deviations from the compliance: +\layout Itemize -Please have a short check that you are using a recent version of SDCC and - the bug is not yet known. - This is the link for reporting bugs: -\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=100599} +functions are not always reentrant. +\layout Itemize -\end_inset +structures cannot be assigned values directly, cannot be passed as function + parameters or assigned to each other and cannot be a return value from + a function, e.g.: +\begin_deeper +\layout Verse -. -\layout Subsection -Requesting Features -\begin_inset LatexCommand \index{Feature request} +\family typewriter +struct s { ... + }; +\newline +struct s s1, s2; +\newline +foo() +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +... + +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +s1 = s2 ; /* is invalid in SDCC although allowed in ANSI */ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +... + +\newline +} +\newline +struct s foo1 (struct s parms) /* invalid in SDCC although allowed in ANSI + */ +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +struct s rets; +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +... + +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +return rets;/* is invalid in SDCC although allowed in ANSI */ +\newline +} +\end_deeper +\layout Itemize -\end_inset +'long long +\begin_inset LatexCommand \index{long long (not supported)} +\end_inset -\begin_inset LatexCommand \index{Requesting features} +' (64 bit integers +\begin_inset LatexCommand \index{int (64 bit) (not supported)} \end_inset +) not supported. +\layout Itemize -\layout Standard +'double +\begin_inset LatexCommand \index{double (not supported)} -Like bug reports feature requests are forwarded to the developer mailing - list. - This is the link for requesting features: -\begin_inset LatexCommand \htmlurl{http://sourceforge.net/tracker/?group_id=599&atid=350599} +\end_inset + +' precision floating point +\begin_inset LatexCommand \index{Floating point support} \end_inset -. -\layout Subsection +not supported. +\layout Itemize -Getting Help -\layout Standard +No support for setjmp and longjmp (for now). +\layout Itemize -These links should take you directly to the -\begin_inset LatexCommand \url[Mailing lists]{http://sourceforge.net/mail/?group_id=599} +Old K&R style +\begin_inset LatexCommand \index{K\&R style} \end_inset + function declarations are NOT allowed. +\begin_deeper +\layout Verse -\begin_inset Foot -collapsed false - -\layout Standard -Traffic on sdcc-devel and sdcc-user is about 100 mails/month each not counting - automated messages (mid 2003) -\end_inset +\family typewriter +foo(i,j) /* this old style of function declarations */ +\newline +int i,j; /* are valid in ANSI but not valid in SDCC */ +\newline +{ +\newline +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +\SpecialChar ~ +... + +\newline +} +\end_deeper +\layout Itemize - and the -\begin_inset LatexCommand \url[Forums]{http://sourceforge.net/forum/?group_id=599} +functions declared as pointers must be dereferenced during the call. +\begin_deeper +\layout Verse -\end_inset -, lists and forums are archived so if you are lucky someone already had - a similar problem. +\family typewriter +int (*foo)(); +\newline +... + +\newline +/* has to be called like this */ +\newline +(*foo)(); /* ANSI standard allows calls to be made like 'foo()' */ +\end_deeper \layout Subsection -ChangeLog -\begin_inset LatexCommand \index{Changelog} +Cyclomatic Complexity +\begin_inset LatexCommand \index{Cyclomatic complexity} \end_inset \layout Standard -You can follow the status of the cvs version -\begin_inset LatexCommand \index{version} +Cyclomatic complexity of a function is defined as the number of independent + paths the program can take during execution of the function. + This is an important number since it defines the number test cases you + have to generate to validate the function. + The accepted industry standard for complexity number is 10, if the cyclomatic + complexity reported by SDCC exceeds 10 you should think about simplification + of the function logic. + Note that the complexity level is not related to the number of lines of + code in a function. + Large functions can have low complexity, and small functions can have large + complexity levels. + +\newline -\end_inset +\newline +SDCC uses the following formula to compute the complexity: +\newline - of SDCC by watching the file -\begin_inset LatexCommand \htmlurl[ChangeLog]{http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/sdcc/sdcc/ChangeLog?rev=HEAD&content-type=text/plain} +\layout Standard -\end_inset +complexity = (number of edges in control flow graph) - (number of nodes + in control flow graph) + 2; +\newline - in the cvs-repository. +\newline +Having said that the industry standard is 10, you should be aware that in + some cases it be may unavoidable to have a complexity level of less than + 10. + For example if you have switch statement with more than 10 case labels, + each case label adds one to the complexity level. + The complexity level is by no means an absolute measure of the algorithmic + complexity of the function, it does however provide a good starting point + for which functions you might look at for further optimization. \layout Subsection -Release policy -\begin_inset LatexCommand \index{Release policy} - -\end_inset - +Other Processors +\layout Subsubsection +The Z80 and gbz80 port \layout Standard -Historically there often were long delays between official releases and - the sourceforge download area tends to get not updated at all. - Current excuses might refer to problems with live range analysis, but if - this is fixed, the next problem rising is that another excuse will have - to be found. - Kidding aside, we have to get better there! On the other hand there are - daily snapshots available at -\begin_inset LatexCommand \htmlurl[snap]{http://sdcc.sourceforge.net/snap.php} +SDCC can target both the Zilog +\begin_inset LatexCommand \index{Z80} \end_inset -, and you can always built the very last version (hopefully with many bugs - fixed, and features added) from the source code available at -\begin_inset LatexCommand \htmlurl[Source]{http://sdcc.sourceforge.net/snap.php#Source} + and the Nintendo Gameboy's Z80-like gbz80 +\begin_inset LatexCommand \index{GameBoy Z80} \end_inset . -\layout Subsection - -Examples -\begin_inset LatexCommand \index{Examples} + The Z80 port is passed through the same +\emph on +regressions tests +\begin_inset LatexCommand \index{Regression test} \end_inset +\emph default + as MCS51 and DS390 ports, so floating point support, support for long variables + and bitfield support is fine. \layout Standard -You'll find some small examples in the directory sdcc/device/examples/ -\layout Comment - -Maybe we should include some links to real world applications. - Preferably pointer to pointers (one for each architecture) so this stays - manageable here? +As always, the code is the authoritative reference - see z80/ralloc.c and + z80/gen.c. + The stack frame is similar to that generated by the IAR Z80 compiler. + IX is used as the base pointer, HL is used as a temporary register, and + BC and DE are available for holding variables. + IY is currently unused. + Return values are stored in HL. + One bad side effect of using IX as the base pointer is that a functions + stack frame is limited to 127 bytes - this will be fixed in a later version. \layout Subsection -Quality control -\begin_inset LatexCommand \index{Quality control} +Retargetting for other MCUs. +\layout Standard -\end_inset +The issues for retargetting the compiler are far too numerous to be covered + by this document. + What follows is a brief description of each of the seven phases of the + compiler and its MCU dependency. +\layout Itemize + +Parsing the source and building the annotated parse tree. + This phase is largely MCU independent (except for the language extensions). + Syntax & semantic checks are also done in this phase, along with some initial + optimizations like back patching labels and the pattern matching optimizations + like bit-rotation etc. +\layout Itemize +The second phase involves generating an intermediate code which can be easy + manipulated during the later phases. + This phase is entirely MCU independent. + The intermediate code generation assumes the target machine has unlimited + number of registers, and designates them with the name iTemp. + The compiler can be made to dump a human readable form of the code generated + by using the - +\begin_inset ERT +status Collapsed \layout Standard -The compiler is passed through nightly compile and build checks. - The so called -\shape italic -regression tests -\shape default +\backslash +/ +\end_inset -\begin_inset LatexCommand \index{Regression test} +-dumpraw option. +\layout Itemize -\end_inset +This phase does the bulk of the standard optimizations and is also MCU independe +nt. + This phase can be broken down into several sub-phases: +\newline - check that SDCC itself compiles flawlessly on several platforms and checks - the quality of the code generated by SDCC by running the code through simulator +\newline +Break down intermediate code (iCode) into basic blocks. +\newline +Do control flow & data flow analysis on the basic blocks. +\newline +Do local common subexpression elimination, then global subexpression elimination +\newline +Dead code elimination +\newline +Loop optimizations +\newline +If loop optimizations caused any changes then do 'global subexpression eliminati +on' and 'dead code elimination' again. +\layout Itemize + +This phase determines the live-ranges; by live range I mean those iTemp + variables defined by the compiler that still survive after all the optimization s. - There is a separate document -\shape italic -test_suite.pdf -\begin_inset LatexCommand \index{Test suite} + Live range analysis +\begin_inset LatexCommand \index{Live range analysis} \end_inset + is essential for register allocation, since these computation determines + which of these iTemps will be assigned to registers, and for how long. +\layout Itemize -\shape default - about this. -\layout Standard - -You'll find the test code in the directory -\shape italic -sdcc/support/regression -\shape default -. - You can run these tests manually by running -\family sans -make -\family default - in this directory (or f.e. - -\family sans -make test-mcs51 -\family default - if you don't want to run the complete tests). - The test code might also be interesting if you want to look for examples -\begin_inset LatexCommand \index{Examples} - -\end_inset +Phase five is register allocation. + There are two parts to this process. +\newline - checking corner cases of SDCC or if you plan to submit patches -\begin_inset LatexCommand \index{Patch submission} +\newline +The first part I call 'register packing' (for lack of a better term). + In this case several MCU specific expression folding is done to reduce + register pressure. +\newline -\end_inset +\newline +The second part is more MCU independent and deals with allocating registers + to the remaining live ranges. + A lot of MCU specific code does creep into this phase because of the limited + number of index registers available in the 8051. +\layout Itemize -. -\layout Standard +The Code generation phase is (unhappily), entirely MCU dependent and very + little (if any at all) of this code can be reused for other MCU. + However the scheme for allocating a homogenized assembler operand for each + iCode operand may be reused. +\layout Itemize -The pic port uses a different set of regression tests, you'll find them - in the directory -\shape italic -sdcc/src/regression -\shape default -. +As mentioned in the optimization section the peep-hole optimizer is rule + based system, which can reprogrammed for other MCUs. \layout Section \pagebreak_top Compiler internals -- 2.47.2