From 2047b79761480d767e5f1ddf0e24ac8be7320df8 Mon Sep 17 00:00:00 2001 From: bernhardheld Date: Sat, 8 Feb 2003 22:02:32 +0000 Subject: [PATCH] delete files compiled from lyx git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2226 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- doc/Makefile | 24 +- doc/sdccman.html/WARNINGS | 9 - doc/sdccman.html/contents_motif.gif | Bin 225 -> 0 bytes doc/sdccman.html/footnode.html | 73 - doc/sdccman.html/index.html | 348 -- doc/sdccman.html/index_motif.gif | Bin 180 -> 0 bytes doc/sdccman.html/next_motif.gif | Bin 172 -> 0 bytes doc/sdccman.html/next_motif_gr.gif | Bin 172 -> 0 bytes doc/sdccman.html/node1.html | 210 -- doc/sdccman.html/node10.html | 130 - doc/sdccman.html/node11.html | 90 - doc/sdccman.html/node12.html | 164 - doc/sdccman.html/node13.html | 181 - doc/sdccman.html/node14.html | 182 - doc/sdccman.html/node15.html | 181 - doc/sdccman.html/node16.html | 81 - doc/sdccman.html/node17.html | 102 - doc/sdccman.html/node18.html | 231 -- doc/sdccman.html/node19.html | 152 - doc/sdccman.html/node2.html | 92 - doc/sdccman.html/node20.html | 232 -- doc/sdccman.html/node21.html | 435 --- doc/sdccman.html/node22.html | 198 - doc/sdccman.html/node23.html | 176 - doc/sdccman.html/node24.html | 159 - doc/sdccman.html/node25.html | 162 - doc/sdccman.html/node26.html | 197 - doc/sdccman.html/node27.html | 93 - doc/sdccman.html/node28.html | 193 - doc/sdccman.html/node29.html | 135 - doc/sdccman.html/node3.html | 168 - doc/sdccman.html/node30.html | 135 - doc/sdccman.html/node31.html | 83 - doc/sdccman.html/node32.html | 174 - doc/sdccman.html/node33.html | 145 - doc/sdccman.html/node34.html | 148 - doc/sdccman.html/node35.html | 121 - doc/sdccman.html/node36.html | 135 - doc/sdccman.html/node37.html | 90 - doc/sdccman.html/node38.html | 124 - doc/sdccman.html/node39.html | 903 ----- doc/sdccman.html/node4.html | 120 - doc/sdccman.html/node40.html | 177 - doc/sdccman.html/node41.html | 319 -- doc/sdccman.html/node42.html | 297 -- doc/sdccman.html/node43.html | 85 - doc/sdccman.html/node44.html | 171 - doc/sdccman.html/node45.html | 128 - doc/sdccman.html/node46.html | 165 - doc/sdccman.html/node47.html | 188 - doc/sdccman.html/node48.html | 163 - doc/sdccman.html/node49.html | 133 - doc/sdccman.html/node5.html | 78 - doc/sdccman.html/node50.html | 77 - doc/sdccman.html/node51.html | 82 - doc/sdccman.html/node52.html | 91 - doc/sdccman.html/node53.html | 93 - doc/sdccman.html/node54.html | 320 -- doc/sdccman.html/node55.html | 222 -- doc/sdccman.html/node56.html | 80 - doc/sdccman.html/node57.html | 85 - doc/sdccman.html/node58.html | 91 - doc/sdccman.html/node59.html | 79 - doc/sdccman.html/node6.html | 99 - doc/sdccman.html/node60.html | 113 - doc/sdccman.html/node61.html | 69 - doc/sdccman.html/node62.html | 79 - doc/sdccman.html/node7.html | 79 - doc/sdccman.html/node8.html | 83 - doc/sdccman.html/node9.html | 92 - doc/sdccman.html/previous_motif.gif | Bin 220 -> 0 bytes doc/sdccman.html/previous_motif_gr.gif | Bin 220 -> 0 bytes doc/sdccman.html/sdccman.html | 348 -- doc/sdccman.html/up_motif.gif | Bin 145 -> 0 bytes doc/sdccman.html/up_motif_gr.gif | Bin 145 -> 0 bytes doc/sdccman.pdf | Bin 167768 -> 0 bytes doc/sdccman.txt | 3221 ----------------- doc/test_suite_spec.html/WARNINGS | 2 - doc/test_suite_spec.html/index.html | 478 --- .../next_group_motif_gr.gif | Bin 259 -> 0 bytes .../previous_motif_gr.gif | Bin 220 -> 0 bytes doc/test_suite_spec.html/test_suite_spec.html | 478 --- doc/test_suite_spec.html/up_motif_gr.gif | Bin 145 -> 0 bytes doc/test_suite_spec.pdf | Bin 16017 -> 0 bytes doc/test_suite_spec.txt | 298 -- 85 files changed, 22 insertions(+), 15117 deletions(-) delete mode 100644 doc/sdccman.html/WARNINGS delete mode 100644 doc/sdccman.html/contents_motif.gif delete mode 100644 doc/sdccman.html/footnode.html delete mode 100644 doc/sdccman.html/index.html delete mode 100644 doc/sdccman.html/index_motif.gif delete mode 100644 doc/sdccman.html/next_motif.gif delete mode 100644 doc/sdccman.html/next_motif_gr.gif delete mode 100644 doc/sdccman.html/node1.html delete mode 100644 doc/sdccman.html/node10.html delete mode 100644 doc/sdccman.html/node11.html delete mode 100644 doc/sdccman.html/node12.html delete mode 100644 doc/sdccman.html/node13.html delete mode 100644 doc/sdccman.html/node14.html delete mode 100644 doc/sdccman.html/node15.html delete mode 100644 doc/sdccman.html/node16.html delete mode 100644 doc/sdccman.html/node17.html delete mode 100644 doc/sdccman.html/node18.html delete mode 100644 doc/sdccman.html/node19.html delete mode 100644 doc/sdccman.html/node2.html delete mode 100644 doc/sdccman.html/node20.html delete mode 100644 doc/sdccman.html/node21.html delete mode 100644 doc/sdccman.html/node22.html delete mode 100644 doc/sdccman.html/node23.html delete mode 100644 doc/sdccman.html/node24.html delete mode 100644 doc/sdccman.html/node25.html delete mode 100644 doc/sdccman.html/node26.html delete mode 100644 doc/sdccman.html/node27.html delete mode 100644 doc/sdccman.html/node28.html delete mode 100644 doc/sdccman.html/node29.html delete mode 100644 doc/sdccman.html/node3.html delete mode 100644 doc/sdccman.html/node30.html delete mode 100644 doc/sdccman.html/node31.html delete mode 100644 doc/sdccman.html/node32.html delete mode 100644 doc/sdccman.html/node33.html delete mode 100644 doc/sdccman.html/node34.html delete mode 100644 doc/sdccman.html/node35.html delete mode 100644 doc/sdccman.html/node36.html delete mode 100644 doc/sdccman.html/node37.html delete mode 100644 doc/sdccman.html/node38.html delete mode 100644 doc/sdccman.html/node39.html delete mode 100644 doc/sdccman.html/node4.html delete mode 100644 doc/sdccman.html/node40.html delete mode 100644 doc/sdccman.html/node41.html delete mode 100644 doc/sdccman.html/node42.html delete mode 100644 doc/sdccman.html/node43.html delete mode 100644 doc/sdccman.html/node44.html delete mode 100644 doc/sdccman.html/node45.html delete mode 100644 doc/sdccman.html/node46.html delete mode 100644 doc/sdccman.html/node47.html delete mode 100644 doc/sdccman.html/node48.html delete mode 100644 doc/sdccman.html/node49.html delete mode 100644 doc/sdccman.html/node5.html delete mode 100644 doc/sdccman.html/node50.html delete mode 100644 doc/sdccman.html/node51.html delete mode 100644 doc/sdccman.html/node52.html delete mode 100644 doc/sdccman.html/node53.html delete mode 100644 doc/sdccman.html/node54.html delete mode 100644 doc/sdccman.html/node55.html delete mode 100644 doc/sdccman.html/node56.html delete mode 100644 doc/sdccman.html/node57.html delete mode 100644 doc/sdccman.html/node58.html delete mode 100644 doc/sdccman.html/node59.html delete mode 100644 doc/sdccman.html/node6.html delete mode 100644 doc/sdccman.html/node60.html delete mode 100644 doc/sdccman.html/node61.html delete mode 100644 doc/sdccman.html/node62.html delete mode 100644 doc/sdccman.html/node7.html delete mode 100644 doc/sdccman.html/node8.html delete mode 100644 doc/sdccman.html/node9.html delete mode 100644 doc/sdccman.html/previous_motif.gif delete mode 100644 doc/sdccman.html/previous_motif_gr.gif delete mode 100644 doc/sdccman.html/sdccman.html delete mode 100644 doc/sdccman.html/up_motif.gif delete mode 100644 doc/sdccman.html/up_motif_gr.gif delete mode 100644 doc/sdccman.pdf delete mode 100644 doc/sdccman.txt delete mode 100644 doc/test_suite_spec.html/WARNINGS delete mode 100644 doc/test_suite_spec.html/index.html delete mode 100644 doc/test_suite_spec.html/next_group_motif_gr.gif delete mode 100644 doc/test_suite_spec.html/previous_motif_gr.gif delete mode 100644 doc/test_suite_spec.html/test_suite_spec.html delete mode 100644 doc/test_suite_spec.html/up_motif_gr.gif delete mode 100644 doc/test_suite_spec.pdf delete mode 100644 doc/test_suite_spec.txt diff --git a/doc/Makefile b/doc/Makefile index 72b79f61..6f1b3cee 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -15,16 +15,18 @@ uninstall: $(MANUAL).html: $(MANUAL).tex $(MANUAL).ind ;#$(MANUAL).glo + mkdir -p $@ latex2html -split 5 -show_section_numbers -dir $(MANUAL).html $(MANUAL) $(TSS).html: $(TSS).tex + mkdir -p $@ latex2html -split 0 -dir $(TSS).html $(TSS) %.txt: %.lyx lyx -e text $< %.pdf: %.dvi - pdflatex $* + which pdflatex > /dev/null && pdflatex $* || dvipdf $* %.dvi: %.tex latex $< @@ -39,4 +41,22 @@ $(TSS).html: $(TSS).tex # the glossary, not implemented yet # makeindex -s l2hglo.ist -o $@ $< -include clean.mk +# Deleting all files created by building the program +# -------------------------------------------------- +clean: + rm -rf $(MANUAL).html $(TSS).html + rm -f $(MANUAL).txt $(TSS).txt *.pdf *.dvi *.tex *.ind *.glo *.aux *.idx *.ilg *.log *.toc + +# Deleting all files created by configuring or building the program +# ----------------------------------------------------------------- +distclean: clean + +# Like clean but some files may still exist +# ----------------------------------------- +mostlyclean: clean + +# Deleting everything that can reconstructed by this Makefile. It deletes +# everything deleted by distclean plus files created by bison, etc. +# ----------------------------------------------------------------------- +realclean: distclean + diff --git a/doc/sdccman.html/WARNINGS b/doc/sdccman.html/WARNINGS deleted file mode 100644 index 56ef1e53..00000000 --- a/doc/sdccman.html/WARNINGS +++ /dev/null @@ -1,9 +0,0 @@ -No implementation found for style `fontenc' -No implementation found for style `fancyhdr' -No implementation found for style `url' - -redefining command \url - -previous meaning of \url will be lost - -There is no author for this document. diff --git a/doc/sdccman.html/contents_motif.gif b/doc/sdccman.html/contents_motif.gif deleted file mode 100644 index 7b3c904b289688f8b41c4d2b611430983f853026..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 225 zcmV<703QEGNk%w1VL<>G0Pz3-zrVld=jU&4Z(9HWA^8LW00000EC2ui06_p40008A zjE||y?GK}zO&EZ)-n{z{a)K3v=81;mmA0S4Fj_r^UyT zhZDG{h6k9mHI_(7spd!5_$SH6m{Tf0GPn~R%U byUQCJGa@`pTx@)doQxcx-0b}PTmS$&1>I(T diff --git a/doc/sdccman.html/footnode.html b/doc/sdccman.html/footnode.html deleted file mode 100644 index 1788fc8d..00000000 --- a/doc/sdccman.html/footnode.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - -Footnotes - - - - - - - - - - - - - - - - - -
-
... -anyway1 -
possible exception: if a function is called ONLY from 'interrupt' -functions using a particular bank, it can be declared with the same -'using' attribute as the calling 'interrupt' functions. For instance, -if you have several ISRs using bank one, and all of them call memcpy(), -it might make sense to create a specialized version of memcpy() 'using -1', since this would prevent the ISR from having to save bank zero -to the stack on entry and switch to bank zero before calling the function - -
.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-.
-
-
- - diff --git a/doc/sdccman.html/index.html b/doc/sdccman.html/index.html deleted file mode 100644 index de73f32a..00000000 --- a/doc/sdccman.html/index.html +++ /dev/null @@ -1,348 +0,0 @@ - - - - - -SDCC Compiler User Guide - - - - - - - - - - - - - - - - - -next -up -previous - -contents - -index -
- Next: Contents -   Contents -   Index -
-
- - -

- -

- -

SDCC Compiler User Guide

-

- - - - - -

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/index_motif.gif b/doc/sdccman.html/index_motif.gif deleted file mode 100644 index b9b3108aa825869554c0400b04f6bcf0d5c0549e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmV;l089TzNk%w1VJiR_0Pz3-zrVld=jU&4Z(9HWA^8LW00000EC2ui04o3(0007o zjE||y?GKkQpxTSG-d4=Og(Bxs<9U`K%97tTuyG5huuRvlHJ?3e<5gmVBFxw;8Uepv za5zi~nX@L8d3j>DS1Wg0&F;FlZ&kUZVzl9@_jg>6!R5E6U14AM=PCWGXU2ncgvX_o iLxY$IG{@Lz^4PK{DWc+mnW?$S*|{0u87ewj0029U2vWoV diff --git a/doc/sdccman.html/next_motif.gif b/doc/sdccman.html/next_motif.gif deleted file mode 100644 index 928a32db8a5a427395c147681cc70a022da9cc79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmV;d08{@*Nk%w1VI=?<0Pz3-zrVld=jU&4Z(9HWA^8LW00000EC2ui03`qz0007g zjE||y?Z1QpwAzdF6*A}#V%!v#-{_g@)>Q-cu3}3Hu`2^Nfa3dZ+VyHW%gtsZ`jV7k z@%j8Ij}~W)c{NUP6)X3OWa^|{8nl?rh|gZ1@{(qofnsWu+nmFHSnaq>lB41zSVC9` aa)_v*xHx0L5h*!IS!o$ynW>ps0028PsZ2Kj diff --git a/doc/sdccman.html/next_motif_gr.gif b/doc/sdccman.html/next_motif_gr.gif deleted file mode 100644 index 011fa0411e50107820cadb80fe6810262da2e2b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmV;d08{@*Nk%w1VI=?<0Pz3-zrVld=jU&4Z-Rn?A^8LW00000EC2ui03`qz0007g zjE||y?Z1QpwAzdF6*A}#V%!v#-{_g@)>Q-cu3}3Hu`2^Nfa3dZ+VyHW%gtsZ`jV7k z@%j8Ij}~W)c{NUP6)X3OWa^|{8nl?rh|gZ1@{(qofnsWu+nmFHSnaq>lB41zSVC9` aa)_v*xHx0L5h*!IS!o$ynW>ps002ATRZU_5 diff --git a/doc/sdccman.html/node1.html b/doc/sdccman.html/node1.html deleted file mode 100644 index 403f4323..00000000 --- a/doc/sdccman.html/node1.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - -Contents - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -index -
- Next: 1. Introduction - Up: SDCC Compiler User Guide - Previous: SDCC Compiler User Guide -   Index -
-
- -
- -

-Contents -

- - - - - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node10.html b/doc/sdccman.html/node10.html deleted file mode 100644 index b321e251..00000000 --- a/doc/sdccman.html/node10.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - -2. Installation - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 2.1 Linux/Unix Installation - Up: SDCC Compiler User Guide - Previous: 1.7 Wishes for the -   Contents -   Index -
-
- - -

-2. Installation -

- -

-


- -Subsections - - - -

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node11.html b/doc/sdccman.html/node11.html deleted file mode 100644 index 9fb745ad..00000000 --- a/doc/sdccman.html/node11.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - -2.1 Linux/Unix Installation - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 2.2 Windows Installation - Up: 2. Installation - Previous: 2. Installation -   Contents -   Index -
-
- - -

-2.1 Linux/Unix Installation -

- -

- -

    -
  1. Download the source package, it will be named something like sdcc-2.x.x.tgz.
  2. -
  3. Bring up a command line terminal, such as xterm.
  4. -
  5. Unpack the file using a command like: "tar --xzf sdcc-2.x.x.tgz", this will create a sub-directory -called sdcc with all of the sources.
  6. -
  7. Change directory into the main SDCC directory, for example type: "cd -sdcc".
  8. -
  9. Type "./configure". This configures -the package for compilation on your system.
  10. -
  11. Type "make". All of the source -packages will compile, this can take a while.
  12. -
  13. Type "make install" as root. This -copies the binary executables, the include files, the libraries and -the documentation to the install directories.
  14. -
- -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node12.html b/doc/sdccman.html/node12.html deleted file mode 100644 index 30b48b92..00000000 --- a/doc/sdccman.html/node12.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - -2.2 Windows Installation - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 2.3 Testing out the - Up: 2. Installation - Previous: 2.1 Linux/Unix Installation -   Contents -   Index -
-
- - -Subsections - - - -
- -

-2.2 Windows Installation -

- -

- -<pending: is this complete? where is borland, mingw> -
-
-For installation under Windows you first need to pick between a pre-compiled -binary package, or installing the source package along with the Cygwin -package. The binary package is the quickest to install, while the -Cygwin package includes all of the open source power tools used to -compile the complete SDCC source package in the Windows environment. -If you are not familiar with the Unix command line environment, you -may want to read the section on additional information for Windows -users prior to your initial installation. - -

- -

-2.2.1 Windows Install Using a Binary Package -

- -

- -

    -
  1. Download the binary package and unpack it using your favorite unpacking -tool (gunzip, WinZip, etc). This should unpack to a group of sub-directories. -An example directory structure after unpacking is: c:\usr\local\bin -for the executables, c:\usr\local\share\sdcc\include -and c:\usr\local\share\sdcc\lib -for the include and libraries.
  2. -
  3. Adjust your environment PATH to include the location of the bin directory. -For example, make a setsdcc.bat file with the following: set PATH=c:\usr\local\bin;%PATH%
  4. -
  5. When you compile with sdcc, you may need to specify the location of -the lib and include folders. For example, sdcc -I c:\usr\local\share\sdcc\include --L c:\usr\local\share\sdcc\lib\small -test.c
  6. -
- -

- -

-2.2.2 Windows Install Using Cygwin -

- -

- -

    -
  1. Download and install the cygwin package from the redhat site http://sources.redhat.com/cygwin/. -Currently, this involved downloading a small install program which -then automates downloading and installing selected parts of the package -(a large 80M byte sized dowload for the whole thing).
  2. -
  3. Bring up a Unix/Bash command line terminal from the Cygwin menu.
  4. -
  5. Follow the instructions in the preceding Linux/Unix installation section.
  6. -
- -

-


- - -next - -up - -previous - -contents - -index -
- Next: 2.3 Testing out the - Up: 2. Installation - Previous: 2.1 Linux/Unix Installation -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node13.html b/doc/sdccman.html/node13.html deleted file mode 100644 index 64daa55f..00000000 --- a/doc/sdccman.html/node13.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - -2.3 Testing out the SDCC Compiler - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 2.4 Install Trouble-shooting - Up: 2. Installation - Previous: 2.2 Windows Installation -   Contents -   Index -
-
- - -

-2.3 Testing out the SDCC Compiler -

- -

-The first thing you should do after installing your SDCC compiler -is to see if it runs. Type "sdcc -version" -at the prompt, and the program should run and tell you the version. -If it doesn't run, or gives a message about not finding sdcc program, -then you need to check over your installation. Make sure that the -sdcc bin directory is in your executable search path defined by the -PATH environment setting (see the Trouble-shooting section for suggestions). -Make sure that the sdcc program is in the bin folder, if not perhaps -something did not install correctly. -
- -
-SDCC binaries are commonly installed in a directory arrangement like -this: -
- -
- - - - - - - - - - -
/usr/local/binHolds executables(sdcc, s51, aslink, ...)
/usr/local/share/sdcc/libHolds common C libraries
/usr/local/share/sdcc/includeHolds common C header files
-
- -
-Make sure the compiler works on a very simple example. Type in the -following test.c program using your favorite editor: -
-
-int test(int t) {  -
-    return t+3;  -
-} -
-
-Compile this using the following command: "sdcc --c test.c". If all goes well, the compiler will generate -a test.asm and test.rel file. Congratulations, you've just compiled -your first program with SDCC. We used the -c option to tell SDCC not -to link the generated code, just to keep things simple for this step. -
- -
-The next step is to try it with the linker. Type in "sdcc -test.c". If all goes well the compiler will link with the -libraries and produce a test.ihx output file. If this step fails (no -test.ihx, and the linker generates warnings), then the problem is -most likely that sdcc cannot find the /usr/local/share/sdcc/lib directory -(see the Install trouble-shooting section for suggestions). -
- -
-The final test is to ensure sdcc can use the standard header files -and libraries. Edit test.c and change it to the following: -
- -
-#include <string.h> -
-main() { -
-char str1[10];  -
-    strcpy(str1, "testing");  -
-}  -
  -
-Compile this by typing "sdcc test.c". -This should generate a test.ihx output file, and it should give no -warnings such as not finding the string.h file. If it cannot find -the string.h file, then the problem is that sdcc cannot find the /usr/local/share/sdcc/include -directory (see the Install trouble-shooting section for suggestions). - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 2.4 Install Trouble-shooting - Up: 2. Installation - Previous: 2.2 Windows Installation -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node14.html b/doc/sdccman.html/node14.html deleted file mode 100644 index c2bcf673..00000000 --- a/doc/sdccman.html/node14.html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - -2.4 Install Trouble-shooting - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 2.5 Additional Information for - Up: 2. Installation - Previous: 2.3 Testing out the -   Contents -   Index -
-
- - -Subsections - - - -
- -

-2.4 Install Trouble-shooting -

- -

- -

-2.4.1 SDCC cannot find libraries or header files. -

- -

-The default installation assumes the libraries and header files are -located at ``/usr/local/share/sdcc/lib'' and ``/usr/local/share/sdcc/include''. -An alternative is to specify these locations as compiler options like -this: "sdcc -L /usr/local/sdcc/lib/small -I /usr/local/sdcc/include test.c". - -

- -

-2.4.2 SDCC does not compile correctly. -

- -

-A thing to try is starting from scratch by unpacking the .tgz source -package again in an empty directory. Confure it again and build like: -
- -
-make 2SPMamp;>1 | tee make.log -
- -
-After this you can review the make.log file to locate the problem. -Or a relevant part of this be attached to an email that could be helpful -when requesting help from the mailing list. - -

- -

-2.4.3 What the ''./configure'' does -

- -

-The ''./configure'' command is a script that analyzes your system -and performs some configuration to ensure the source package compiles -on your system. It will take a few minutes to run, and will compile -a few tests to determine what compiler features are installed. - -

- -

-2.4.4 What the ''make'' does. -

- -

-This runs the GNU make tool, which automatically compiles all the -source packages into the final installed binary executables. - -

- -

-2.4.5 What the ''make install'' command does. -

- -

-This will install the compiler, other executables and libraries in -to the appropriate system directories. The default is to copy the -executables to /usr/local/bin and the libraries and header files to -/usr/local/share/sdcc/lib and /usr/local/share/sdcc/include. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 2.5 Additional Information for - Up: 2. Installation - Previous: 2.3 Testing out the -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node15.html b/doc/sdccman.html/node15.html deleted file mode 100644 index cfb91e6f..00000000 --- a/doc/sdccman.html/node15.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - -2.5 Additional Information for Windows Users - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 2.6 SDCC on Other - Up: 2. Installation - Previous: 2.4 Install Trouble-shooting -   Contents -   Index -
-
- - -Subsections - - - -
- -

-2.5 Additional Information for Windows Users -

- -

- -<pending: is this up to date?> -
-
-The standard method of installing on a Unix system involves compiling -the source package. This is easily done under Unix, but under Windows -it can be a more difficult process. The Cygwin is a large package -to download, and the compilation runs considerably slower under Windows -due to the overhead of the Cygwin tool set. An alternative is to install -a pre-compiled Windows binary package. There are various trade-offs -between each of these methods. - -

-The Cygwin package allows a Windows user to run a Unix command line -interface (bash shell) and also implements a Unix like file system -on top of Windows. Included are many of the famous GNU software development -tools which can augment the SDCC compiler.This is great if you have -some experience with Unix command line tools and file system conventions, -if not you may find it easier to start by installing a binary Windows -package. The binary packages work with the Windows file system conventions. - -

- -

-2.5.1 Getting started with Cygwin -

- -

-SDCC is typically distributed as a tarred/gzipped file (.tgz). This -is a packed file similar to a .zip file. Cygwin includes the tools -you will need to unpack the SDCC distribution (tar and gzip). To unpack -it, simply follow the instructions under the Linux/Unix install section. -Before you do this you need to learn how to start a cygwin shell and -some of the basic commands used to move files, change directory, run -commands and so on. The change directory command is ``cd'', -the move command is ``mv''. To print the current -working directory, type ``pwd''. To make a directory, -use ``mkdir''. - -

-There are some basic differences between Unix and Windows file systems -you should understand. When you type in directory paths, Unix and -the Cygwin bash prompt uses forward slashes '/' between directories -while Windows traditionally uses '\' backward slashes. -So when you work at the Cygwin bash prompt, you will need to use the -forward '/' slashes. Unix does not have a concept of drive letters, -such as ``c:``, instead all files systems attach and appear -as directories. - -

- -

-2.5.2 Running SDCC as Native Compiled Executables -

- -

-If you use the pre-compiled binaries, the install directories for -the libraries and header files may need to be specified on the sdcc -command line like this: "sdcc -L c:\usr\local\sdcc\lib\small --I c:\usr\local\sdcc\include -test.c" if you are running outside of a Unix bash shell. - -

-If you have successfully installed and compiled SDCC with the Cygwin -package, it is possible to compile into native .exe files by using -the additional makefiles included for this purpose. For example, with -the Borland 32-bit compiler you would run "make --f Makefile.bcc". A command line version of the Borland -32-bit compiler can be downloaded from the Inprise web site. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 2.6 SDCC on Other - Up: 2. Installation - Previous: 2.4 Install Trouble-shooting -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node16.html b/doc/sdccman.html/node16.html deleted file mode 100644 index 4d1ab700..00000000 --- a/doc/sdccman.html/node16.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - -2.6 SDCC on Other Platforms - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 2.7 Advanced Install Options - Up: 2. Installation - Previous: 2.5 Additional Information for -   Contents -   Index -
-
- - -

-2.6 SDCC on Other Platforms -

- -

- -

    -
  • FreeBSD and other non-GNU Unixes - Make sure the GNU make -is installed as the default make tool.
  • -
  • SDCC has been ported to run under a variety of operating systems and -processors. If you can run GNU GCC/make then chances are good SDCC -can be compiled and run on your system.
  • -
- -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node17.html b/doc/sdccman.html/node17.html deleted file mode 100644 index 1d146b19..00000000 --- a/doc/sdccman.html/node17.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - -2.7 Advanced Install Options - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 2.8 Components of SDCC - Up: 2. Installation - Previous: 2.6 SDCC on Other -   Contents -   Index -
-
- - -

-2.7 Advanced Install Options -

- -

-The ``configure'' command has several options. The most commonly -used option is -prefix=<directory name>, where <directory name> is -the final location for the sdcc executables and libraries, (default -location is /usr/local). The installation process will create the -following directory structure under the <directory name> specified -(if they do not already exist). -
- -
-bin/ - binary exectables (add to PATH environment variable) -
-bin/share/ -
-bin/share/sdcc/include/ - include header files -
-bin/share/sdcc/lib/ -
-bin/share/sdcc/lib/small/ - Object & library files for small model -library -
-bin/share/sdcc/lib/large/ - Object & library files for large model -library -
-bin/share/sdcc/lib/ds390/ - Object & library files forDS80C390 library -
- -
-The command ''./configure -prefix=/usr/local'' -will configure the compiler to be installed in directory /usr/local. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node18.html b/doc/sdccman.html/node18.html deleted file mode 100644 index eb14aa95..00000000 --- a/doc/sdccman.html/node18.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - -2.8 Components of SDCC - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3. Using SDCC - Up: 2. Installation - Previous: 2.7 Advanced Install Options -   Contents -   Index -
-
- - -Subsections - - - -
- -

-2.8 Components of SDCC -

- -

-SDCC is not just a compiler, but a collection of tools by various -developers. These include linkers, assemblers, simulators and other -components. Here is a summary of some of the components. Note that -the included simulator and assembler have separate documentation which -you can find in the source package in their respective directories. -As SDCC grows to include support for other processors, other packages -from various developers are included and may have their own sets of -documentation. -
- -
-You might want to look at the files which are installed in <installdir>. -At the time of this writing, we find the following programs: -
- -
-In <installdir>/bin: - -

- -

    -
  • sdcc - The compiler.
  • -
  • sdcpp - The C preprocessor.
  • -
  • asx8051 - The assembler for 8051 type processors.
  • -
  • as-z80, as-gbz80 - The Z80 and GameBoy Z80 assemblers.
  • -
  • aslink -The linker for 8051 type processors.
  • -
  • link-z80, link-gbz80 - The Z80 and GameBoy Z80 linkers.
  • -
  • s51 - The ucSim 8051 simulator.
  • -
  • sdcdb - The source debugger.
  • -
  • packihx - A tool to pack Intel hex files.
  • -
-In <installdir>/share/sdcc/include - -

- -

    -
  • the include files
  • -
-In <installdir>/share/sdcc/lib - -

- -

    -
  • the sources of the runtime library and the subdirs small large and -ds390 with the precompiled relocatables.
  • -
-In <installdir>/share/sdcc/doc - -

- -

    -
  • the documentation
  • -
-As development for other processors proceeds, this list will expand -to include executables to support processors like AVR, PIC, etc. - -

- -

-2.8.1 sdcc - The Compiler -

- -

-This is the actual compiler, it in turn uses the c-preprocessor and -invokes the assembler and linkage editor. - -

- -

-2.8.2 sdcpp (C-Preprocessor) -

- -

-The preprocessor is a modified version of the GNU preprocessor. The -C preprocessor is used to pull in #include sources, process #ifdef -statements, #defines and so on. - -

- -

-2.8.3 asx8051, as-z80, as-gbz80, aslink, link-z80, link-gbz80 (The Assemblers -and Linkage Editors) -

- -

-This is retargettable assembler & linkage editor, it was developed -by Alan Baldwin. John Hartman created the version for 8051, and I -(Sandeep) have made some enhancements and bug fixes for it to work -properly with the SDCC. - -

- -

-2.8.4 s51 - Simulator -

- -

-S51 is a freeware, opensource simulator developed by Daniel Drotos -( mailto:drdani@mazsola.iit.uni-miskolc.hu). The simulator is -built as part of the build process. For more information visit Daniel's -website at: http://mazsola.iit.uni-miskolc.hu/ drdani/embedded/s51 -. - -

- -

-2.8.5 sdcdb - Source Level Debugger -

- -

-Sdcdb is the companion source level debugger. The current version -of the debugger uses Daniel's Simulator S51, but can be easily changed -to use other simulators. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3. Using SDCC - Up: 2. Installation - Previous: 2.7 Advanced Install Options -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node19.html b/doc/sdccman.html/node19.html deleted file mode 100644 index c86e2826..00000000 --- a/doc/sdccman.html/node19.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - -3. Using SDCC - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.1 Compiling - Up: SDCC Compiler User Guide - Previous: 2.8 Components of SDCC -   Contents -   Index -
-
- - -

-3. Using SDCC -

- -

-


- -Subsections - - - -

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node2.html b/doc/sdccman.html/node2.html deleted file mode 100644 index b51405cb..00000000 --- a/doc/sdccman.html/node2.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - -1. Introduction - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 1.1 About SDCC - Up: SDCC Compiler User Guide - Previous: Contents -   Contents -   Index -
-
- - -

-1. Introduction -

- -

-


- -Subsections - - - -

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node20.html b/doc/sdccman.html/node20.html deleted file mode 100644 index 52b85d92..00000000 --- a/doc/sdccman.html/node20.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - -3.1 Compiling - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.2 Command Line Options - Up: 3. Using SDCC - Previous: 3. Using SDCC -   Contents -   Index -
-
- - -Subsections - - - -
- -

-3.1 Compiling -

- -

- -

-3.1.1 Single Source File Projects -

- -

-For single source file 8051 projects the process is very simple. Compile -your programs with the following command "sdcc -sourcefile.c". This will compile, assemble and link your -source file. Output files are as follows -
- -
-sourcefile.asm - Assembler source file created by the compiler -
-sourcefile.lst - Assembler listing file created by the Assembler -
-sourcefile.rst - Assembler listing file updated with linkedit information, -created by linkage editor -
-sourcefile.sym - symbol listing for the sourcefile, created by the -assembler -
-sourcefile.rel - Object file created by the assembler, input to Linkage -editor -
-sourcefile.map - The memory map for the load module, created by the -Linker -
-sourcefile.ihx - The load module in Intel hex format (you can select -the Motorola S19 format with -out-fmt-s19) -
-sourcefile.cdb - An optional file (with -debug) containing debug -information -
- -

- -

-3.1.2 Projects with Multiple Source Files -

- -

-SDCC can compile only ONE file at a time. Let us for example assume -that you have a project containing the following files: -
- -
-foo1.c (contains some functions) -
-foo2.c (contains some more functions) -
-foomain.c (contains more functions and the function main) -
- -
-The first two files will need to be compiled separately with the commands: - -
- -
-sdcc -c foo1.c -
-sdcc -c foo2.c -
- -
-Then compile the source file containing the main() function -and link the files together with the following command: -
- -
-sdcc foomain.c foo1.rel foo2.rel -
- -
-Alternatively, foomain.c can be separately compiled as well: -
-
-sdcc -c foomain.c -
-sdcc foomain.rel foo1.rel foo2.rel -
-
-The file containing the main() function MUST -be the FIRST file specified in the command line, since the -linkage editor processes file in the order they are presented to it. - -

- -

-3.1.3 Projects with Additional Libraries -

- -

-Some reusable routines may be compiled into a library, see the documentation -for the assembler and linkage editor (which are in <installdir>/share/sdcc/doc) -for how to create a .lib library file. Libraries created in -this manner can be included in the command line. Make sure you include -the -L <library-path> option to tell the linker where to look for -these files if they are not in the current directory. Here is an example, -assuming you have the source file foomain.c and a library foolib.lib -in the directory mylib (if that is not the same as your current -project): -
- -
-sdcc foomain.c foolib.lib -L mylib -
-
-Note here that mylib must be an absolute path name. -
- -
-The most efficient way to use libraries is to keep seperate modules -in seperate source files. The lib file now should name all the modules.rel -files. For an example see the standard library file libsdcc.lib -in the directory <installdir>/share/lib/small. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.2 Command Line Options - Up: 3. Using SDCC - Previous: 3. Using SDCC -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node21.html b/doc/sdccman.html/node21.html deleted file mode 100644 index f3614e91..00000000 --- a/doc/sdccman.html/node21.html +++ /dev/null @@ -1,435 +0,0 @@ - - - - - -3.2 Command Line Options - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.3 MCS51/DS390 Storage Class - Up: 3. Using SDCC - Previous: 3.1 Compiling -   Contents -   Index -
-
- - -Subsections - - - -
- -

-3.2 Command Line Options -

- -

- -

-3.2.1 Processor Selection Options -

- -

- -

    -
  • [-mmcs51]Generate code for the MCS51 (8051) family of processors. -This is the default processor target.
  • -
  • [-mds390]Generate code for the DS80C390 processor.
  • -
  • [-mz80]Generate code for the Z80 family of processors.
  • -
  • [-mgbz80]Generate code for the GameBoy Z80 processor.
  • -
  • [-mavr]Generate code for the Atmel AVR processor(In development, -not complete).
  • -
  • [-mpic14]Generate code for the PIC 14-bit processors(In development, -not complete).
  • -
  • [-mtlcs900h]Generate code for the Toshiba TLCS-900H processor(In -development, not complete).
  • -
-

- -

-3.2.2 Preprocessor Options -

- -

- -

    -
  • [-I<path>]The additional location where the pre processor -will look for <..h> or ``..h'' files.
  • -
  • [-D<macro[=value]>]Command line definition of macros. -Passed to the pre processor.
  • -
  • [-M]Tell the preprocessor to output a rule suitable for make -describing the dependencies of each object file. For each source file, -the preprocessor outputs one make-rule whose target is the object -file name for that source file and whose dependencies are all the -files `#include'd in it. This rule may be a single line or may be -continued with `\'-newline if it is long. The list -of rules is printed on standard output instead of the preprocessed -C program. `-M' implies `-E'.
  • -
  • [-C]Tell the preprocessor not to discard comments. Used with -the `-E' option.
  • -
  • [-MM]Like `-M' but the output mentions only the user header -files included with `#include ``file"'. System header -files included with `#include <file>' are omitted.
  • -
  • [-Aquestion(answer)]Assert the answer answer for question, -in case it is tested with a preprocessor conditional such as `#if -#question(answer)'. `-A-' disables the standard assertions that normally -describe the target machine.
  • -
  • [-Aquestion](answer) Assert the answer answer for question, -in case it is tested with a preprocessor conditional such as `#if -#question(answer)'. `-A-' disables the standard assertions that normally -describe the target machine.
  • -
  • [-Umacro]Undefine macro macro. `-U' options are evaluated -after all `-D' options, but before any `-include' and `-imacros' options.
  • -
  • [-dM]Tell the preprocessor to output only a list of the macro -definitions that are in effect at the end of preprocessing. Used with -the `-E' option.
  • -
  • [-dD]Tell the preprocessor to pass all macro definitions -into the output, in their proper sequence in the rest of the output.
  • -
  • [-dN]Like `-dD' except that the macro arguments and contents -are omitted. Only `#define name' is included in the output.
  • -
-

- -

-3.2.3 Linker Options -

- -

- -

    -
  • [-L -lib-path]<absolute path to additional libraries> This -option is passed to the linkage editor's additional libraries search -path. The path name must be absolute. Additional library files may -be specified in the command line. See section Compiling programs for -more details.
  • -
  • [-xram-loc<Value>]The start location of the external ram, -default value is 0. The value entered can be in Hexadecimal or Decimal -format, e.g.: -xram-loc 0x8000 or -xram-loc 32768.
  • -
  • [-code-loc<Value>]The start location of the code segment, -default value 0. Note when this option is used the interrupt vector -table is also relocated to the given address. The value entered can -be in Hexadecimal or Decimal format, e.g.: -code-loc 0x8000 or -code-loc -32768.
  • -
  • [-stack-loc<Value>]The initial value of the stack pointer. -The default value of the stack pointer is 0x07 if only register bank -0 is used, if other register banks are used then the stack pointer -is initialized to the location above the highest register bank used. -eg. if register banks 1 & 2 are used the stack pointer will default -to location 0x18. The value entered can be in Hexadecimal or Decimal -format, eg. -stack-loc 0x20 or -stack-loc 32. If all four register -banks are used the stack will be placed after the data segment (equivalent -to -stack-after-data)
  • -
  • [-stack-after-data]This option will cause the stack to be -located in the internal ram after the data segment.
  • -
  • [-data-loc<Value>]The start location of the internal ram -data segment, the default value is 0x30.The value entered can be in -Hexadecimal or Decimal format, eg. -data-loc 0x20 or -data-loc 32.
  • -
  • [-idata-loc<Value>]The start location of the indirectly -addressable internal ram, default value is 0x80. The value entered -can be in Hexadecimal or Decimal format, eg. -idata-loc 0x88 or -idata-loc -136.
  • -
  • [-out-fmt-ihx]The linker output (final object code) is in -Intel Hex format. (This is the default option).
  • -
  • [-out-fmt-s19]The linker output (final object code) is in -Motorola S19 format.
  • -
-

- -

-3.2.4 MCS51 Options -

- -

- -

    -
  • [-model-large]Generate code for Large model programs see -section Memory Models for more details. If this option is used all -source files in the project should be compiled with this option. In -addition the standard library routines are compiled with small model, -they will need to be recompiled.
  • -
  • [-model-small]Generate code for Small Model programs see -section Memory Models for more details. This is the default model.
  • -
-

- -

-3.2.5 DS390 Options -

- -

- -

    -
  • [-model-flat24]Generate 24-bit flat mode code. This is the -one and only that the ds390 code generator supports right now and -is default when using -mds390. See section Memory Models for -more details.
  • -
  • [-stack-10bit]Generate code for the 10 bit stack mode of -the Dallas DS80C390 part. This is the one and only that the ds390 -code generator supports right now and is default when using -mds390. -In this mode, the stack is located in the lower 1K of the internal -RAM, which is mapped to 0x400000. Note that the support is incomplete, -since it still uses a single byte as the stack pointer. This means -that only the lower 256 bytes of the potential 1K stack space will -actually be used. However, this does allow you to reclaim the precious -256 bytes of low RAM for use for the DATA and IDATA segments. The -compiler will not generate any code to put the processor into 10 bit -stack mode. It is important to ensure that the processor is in this -mode before calling any re-entrant functions compiled with this option. -In principle, this should work with the -stack-auto option, -but that has not been tested. It is incompatible with the -xstack -option. It also only makes sense if the processor is in 24 bit contiguous -addressing mode (see the -model-flat24 option).
  • -
-

- -

-3.2.6 Optimization Options -

- -

- -

    -
  • [-nogcse]Will not do global subexpression elimination, this -option may be used when the compiler creates undesirably large stack/data -spaces to store compiler temporaries. A warning message will be generated -when this happens and the compiler will indicate the number of extra -bytes it allocated. It recommended that this option NOT be used, #pragma NOGCSE -can be used to turn off global subexpression elimination for a given -function only.
  • -
  • [-noinvariant]Will not do loop invariant optimizations, -this may be turned off for reasons explained for the previous option. -For more details of loop optimizations performed see section Loop -Invariants.It recommended that this option NOT be used, #pragma NOINVARIANT -can be used to turn off invariant optimizations for a given function -only.
  • -
  • [-noinduction]Will not do loop induction optimizations, -see section strength reduction for more details.It is recommended -that this option is NOT used, #pragma NOINDUCTION can be used to -turn off induction optimizations for a given function only.
  • -
  • [-nojtbound] Will not generate boundary condition check -when switch statements are implemented using jump-tables. See section -Switch Statements for more details. It is recommended that this option -is NOT used, #pragma NOJTBOUND can be used to turn off boundary -checking for jump tables for a given function only.
  • -
  • [-noloopreverse]Will not do loop reversal optimization.
  • -
-

- -

-3.2.7 Other Options -

- -

- -

    -
  • [-c -compile-only]will compile and assemble the source, -but will not call the linkage editor.
  • -
  • [-E]Run only the C preprocessor. Preprocess all the C source -files specified and output the results to standard output.
  • -
  • [-stack-auto]All functions in the source file will be compiled -as reentrant, i.e. the parameters and local variables will -be allocated on the stack. see section Parameters and Local Variables -for more details. If this option is used all source files in the project -should be compiled with this option.
  • -
  • [-xstack]Uses a pseudo stack in the first 256 bytes in the -external ram for allocating variables and passing parameters. See -section on external stack for more details.
  • -
  • [-callee-saves]function1[,function2][,function3].... -The compiler by default uses a caller saves convention for register -saving across function calls, however this can cause unneccessary -register pushing & popping when calling small functions from larger -functions. This option can be used to switch the register saving convention -for the function names specified. The compiler will not save registers -when calling these functions, no extra code will be generated 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 interprocedural analysis) will be able to determine the appropriate -scheme to use for each function call. DO NOT use this option for built-in -functions such as _muluint..., if this option is used for a library -function the appropriate library function needs to be recompiled with -the same option. If the project consists of multiple source files -then all the source file should be compiled with the same -callee-saves -option string. Also see #pragma CALLEE-SAVES.
  • -
  • [-debug]When this option is used the compiler will generate -debug information, that can be used with the SDCDB. The debug information -is collected in a file with .cdb extension. For more information see -documentation for SDCDB.
  • -
  • [-regextend] This option is obsolete and isn't -supported anymore.
  • -
  • [-noregparms]This option is obsolete and isn't -supported anymore.
  • -
  • [-peep-file<filename>]This option can be used to use additional -rules to be used by the peep hole optimizer. See section Peep Hole -optimizations for details on how to write these rules.
  • -
  • [-S]Stop after the stage of compilation proper; do not assemble. -The output is an assembler code file for the input file specified.
  • -
  • [-Wa_asmOption[,asmOption]...]Pass the asmOption to -the assembler.
  • -
  • [-Wl_linkOption[,linkOption]...]Pass the linkOption -to the linker.
  • -
  • [-int-long-reent] Integer (16 bit) and long (32 bit) libraries -have been compiled as reentrant. Note by default these libraries are -compiled as non-reentrant. See section Installation for more details.
  • -
  • [-cyclomatic]This option will cause the compiler to generate -an information message for each function in the source file. The message -contains some important information about the function. The -number of edges and nodes the compiler detected in the control flow -graph of the function, and most importantly the cyclomatic complexity -see section on Cyclomatic Complexity for more details.
  • -
  • [-float-reent] Floating point library is compiled as reentrant.See -section Installation for more details.
  • -
  • [-nooverlay] The compiler will not overlay parameters and -local variables of any function, see section Parameters and local -variables for more details.
  • -
  • [-main-return]This option can be used when the code generated -is called by a monitor program. The compiler will generate a 'ret' -upon return from the 'main' function. The default option is to lock -up i.e. generate a 'ljmp '.
  • -
  • [-no-peep] Disable peep-hole optimization.
  • -
  • [-peep-asm] Pass the inline assembler code through the peep -hole optimizer. This can cause unexpected changes to inline assembler -code, please go through the peephole optimizer rules defined in the -source file tree '<target>/peeph.def' before using this option.
  • -
  • [-iram-size<Value>]Causes the linker to check if the interal -ram usage is within limits of the given value.
  • -
  • [-nostdincl]This will prevent the compiler from passing -on the default include path to the preprocessor.
  • -
  • [-nostdlib]This will prevent the compiler from passing on -the default library path to the linker.
  • -
  • [-verbose]Shows the various actions the compiler is performing.
  • -
  • [-V]Shows the actual commands the compiler is executing.
  • -
-

- -

-3.2.8 Intermediate Dump Options -

- -

-The following options are provided for the purpose of retargetting -and debugging the compiler. These provided a means to dump the intermediate -code (iCode) generated by the compiler in human readable form at various -stages of the compilation process. - -

- -

    -
  • [-dumpraw]This option will cause the compiler to dump the -intermediate code into a file of named <source filename>.dumpraw -just after the intermediate code has been generated for a function, -i.e. before any optimizations are done. The basic blocks at this stage -ordered in the depth first number, so they may not be in sequence -of execution.
  • -
  • [-dumpgcse]Will create a dump of iCode's, after global subexpression -elimination, into a file named <source filename>.dumpgcse.
  • -
  • [-dumpdeadcode]Will create a dump of iCode's, after deadcode -elimination, into a file named <source filename>.dumpdeadcode.
  • -
  • [-dumploop]Will create a dump of iCode's, after loop optimizations, -into a file named <source filename>.dumploop.
  • -
  • [-dumprange]Will create a dump of iCode's, after live range -analysis, into a file named <source filename>.dumprange.
  • -
  • [-dumlrange]Will dump the life ranges for all symbols.
  • -
  • [-dumpregassign]Will create a dump of iCode's, after register -assignment, into a file named <source filename>.dumprassgn.
  • -
  • [-dumplrange]Will create a dump of the live ranges of iTemp's
  • -
  • [-dumpall]Will cause all the above mentioned dumps to be -created.
  • -
-

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.3 MCS51/DS390 Storage Class - Up: 3. Using SDCC - Previous: 3.1 Compiling -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node22.html b/doc/sdccman.html/node22.html deleted file mode 100644 index a110bef6..00000000 --- a/doc/sdccman.html/node22.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - -3.3 MCS51/DS390 Storage Class Language Extensions - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.4 Pointers - Up: 3. Using SDCC - Previous: 3.2 Command Line Options -   Contents -   Index -
-
- - -Subsections - - - -
- -

-3.3 MCS51/DS390 Storage Class Language Extensions -

- -

-In addition to the ANSI storage classes SDCC allows the following -MCS51 specific storage classes. - -

- -

-3.3.1 xdata -

- -

-Variables declared with this storage class will be placed in the extern -RAM. This is the default storage class for Large Memory model, -e.g.: -
- -
-xdata unsigned char xduc; - -

- -

-3.3.2 data -

- -

-This is the default storage class for Small Memory model. -Variables declared with this storage class will be allocated in the -internal RAM, e.g.: -
- -
-data int iramdata; - -

- -

-3.3.3 idata -

- -

-Variables declared with this storage class will be allocated into -the indirectly addressable portion of the internal ram of a 8051, -e.g.: -
- -
-idata int idi; - -

- -

-3.3.4 bit -

- -

-This is a data-type and a storage class specifier. When a variable -is declared as a bit, it is allocated into the bit addressable memory -of 8051, e.g.: -
- -
-bit iFlag; - -

- -

-3.3.5 sfr / sbit -

- -

-Like the bit keyword, sfr / sbit signifies both a data-type -and storage class, they are used to describe the special function -registers and special bit variables of a 8051, eg: -
- -
-sfr at 0x80 P0; /* special function register P0 at location -0x80 */  -
-sbit at 0xd7 CY; /* CY (Carry Flag) */ - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.4 Pointers - Up: 3. Using SDCC - Previous: 3.2 Command Line Options -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node23.html b/doc/sdccman.html/node23.html deleted file mode 100644 index d408a4dc..00000000 --- a/doc/sdccman.html/node23.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - -3.4 Pointers - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.5 Parameters & Local - Up: 3. Using SDCC - Previous: 3.3 MCS51/DS390 Storage Class -   Contents -   Index -
-
- - -

-3.4 Pointers -

- -

-SDCC allows (via language extensions) pointers to explicitly point -to any of the memory spaces of the 8051. In addition to the explicit -pointers, the compiler also allows a _generic class of pointers -which can be used to point to any of the memory spaces. -
- -
-Pointer declaration examples: -
- -
-/* pointer physically in xternal ram pointing to object -in internal ram */   -
-data unsigned char * xdata p;  -
  -
-/* pointer physically in code rom pointing to data in xdata -space */   -
-xdata unsigned char * code p;  -
  -
-/* pointer physically in code space pointing to data in -code space */   -
-code unsigned char * code p;  -
  -
-/* the folowing is a generic pointer physically located -in xdata space */  -
-char * xdata p; -
- -
-Well you get the idea. -
- -
-For compatibility with the previous version of the compiler, -the following syntax for pointer declaration is still supported but -will disappear int the near future. -
-
-unsigned char _xdata *ucxdp; /* pointer to data -in external ram */   -
-unsigned char _data  *ucdp ; /* pointer to data -in internal ram */   -
-unsigned char _code  *uccp ; /* pointer to data -in R/O code space */  -
-unsigned char _idata *uccp;  /* pointer to upper -128 bytes of ram */ -
- -
-All unqualified pointers are treated as 3-byte (4-byte for the ds390) -generic pointers. These type of pointers can also to be explicitly -declared. -
- -
-unsigned char _generic *ucgp; -
- -
-The highest order byte of the generic pointers contains the -data space information. Assembler support routines are called whenever -data is stored or retrieved using generic pointers. These are -useful for developing reusable library routines. Explicitly specifying -the pointer type will generate the most efficient code. Pointers declared -using a mixture of OLD and NEW style could have unpredictable results. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.5 Parameters & Local - Up: 3. Using SDCC - Previous: 3.3 MCS51/DS390 Storage Class -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node24.html b/doc/sdccman.html/node24.html deleted file mode 100644 index 0d8c000d..00000000 --- a/doc/sdccman.html/node24.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -3.5 Parameters & Local Variables - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.6 Overlaying - Up: 3. Using SDCC - Previous: 3.4 Pointers -   Contents -   Index -
-
- - -

-3.5 Parameters & Local Variables -

- -

-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 -static so by default functions are non-reentrant. - -

-They can be placed on the stack either by using the -stack-auto -compiler option or by using the reentrant keyword in the function -declaration, e.g.: -
- -
-unsigned char foo(char i) reentrant   -
-{   -
-...   -
-}  -
- -
-Since stack space on 8051 is limited, the reentrant keyword -or the -stack-auto option should be used sparingly. Note that -the reentrant keyword just means that the parameters & local variables -will be allocated to the stack, it does not mean that the function -is register bank independent. -
- -
-Local variables can be assigned storage classes and absolute addresses, -e.g.: -
- -
-unsigned char foo() {  -
-    xdata unsigned char i;  -
-    bit bvar;  -
-    data at 0x31 unsiged char j;  -
-    ...   -
-}  -
  -
-In the above example the variable i will be allocated in the -external ram, bvar in bit addressable space and j in -internal ram. When compiled with -stack-auto or when a function -is declared as reentrant this can only be done for static variables. - -

-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. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.6 Overlaying - Up: 3. Using SDCC - Previous: 3.4 Pointers -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node25.html b/doc/sdccman.html/node25.html deleted file mode 100644 index 24fb960c..00000000 --- a/doc/sdccman.html/node25.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - -3.6 Overlaying - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.7 Interrupt Service Routines - Up: 3. Using SDCC - Previous: 3.5 Parameters & Local -   Contents -   Index -
-
- - -

-3.6 Overlaying -

- -

-For non-reentrant 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 overlayable segment if the function has no other function -calls and the function is non-reentrant and the memory model is small. -If an explicit storage class is specified for a local variable, it -will NOT be overlayed. - -

-Note that the compiler (not the linkage editor) makes the decision -for overlaying the data items. Functions that are called from an interrupt -service routine should be preceded by a #pragma NOOVERLAY if they -are not reentrant. - -

-Also note that the compiler does not do any processing of inline 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 NOOVERLAY should be used. - -

-Parameters and Local variables of functions that contain 16 or 32 -bit multiplication or division will NOT be overlayed since these are -implemented using external functions, e.g.: -
- -
-#pragma SAVE   -
-#pragma NOOVERLAY   -
-void set_error(unsigned char errcd)   -
-{  -
-    P3 = errcd;  -
-}   -
-#pragma RESTORE   -
  -
-void some_isr () interrupt 2 using 1   -
-{  -
-    ...  -
-    set_error(10);  -
-    ...   -
-}  -
  -
-In the above example the parameter errcd for the function set_error -would be assigned to the overlayable segment if the #pragma NOOVERLAY -was not present, this could cause unpredictable runtime behavior when -called from an ISR. The #pragma NOOVERLAY ensures that the parameters -and local variables for the function are NOT overlayed. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.7 Interrupt Service Routines - Up: 3. Using SDCC - Previous: 3.5 Parameters & Local -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node26.html b/doc/sdccman.html/node26.html deleted file mode 100644 index ad0afe25..00000000 --- a/doc/sdccman.html/node26.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - -3.7 Interrupt Service Routines - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.8 Critical Functions - Up: 3. Using SDCC - Previous: 3.6 Overlaying -   Contents -   Index -
-
- - -

-3.7 Interrupt Service Routines -

- -

-SDCC allows interrupt service routines to be coded in C, with some -extended keywords. -
- -
-void timer_isr (void) interrupt 2 using 1   -
-{   -
-..   -
-}  -
  -
-The number following the interrupt keyword is the interrupt -number this routine will service. The compiler will insert a call -to this routine in the interrupt vector table for the interrupt number -specified. The using keyword is used to tell the compiler to -use the specified register bank (8051 specific) when generating code -for this function. Note that when some function is called from an -interrupt service routine it should be preceded by a #pragma NOOVERLAY -if it is not reentrant. A special note here, int (16 bit) and long -(32 bit) integer division, multiplication & modulus operations are -implemented using external support routines developed in ANSI-C, if -an interrupt service routine needs to do any of these operations then -the support routines (as mentioned in a following section) will have -to be recompiled using the -stack-auto option and the source -file will need to be compiled using the -int-long-rent compiler -option. - -

-If you have multiple source files in your project, interrupt service -routines can be present in any of them, but a prototype of the isr -MUST be present or included in the file that contains the function -main. - -

-Interrupt Numbers and the corresponding address & descriptions for -the Standard 8051 are listed below. SDCC will automatically adjust -the interrupt vector table to the maximum interrupt number specified. -
- -

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Interrupt #DescriptionVector Address
0External 00x0003
1Timer 00x000B
2External 10x0013
3Timer 10x001B
4Serial0x0023
-
- -
-If the interrupt service routine is defined without using a -register bank or with register bank 0 (using 0), the compiler will -save the registers used by itself on the stack upon entry and restore -them at exit, however if such an interrupt service routine calls another -function then the entire register bank will be saved on the stack. -This scheme may be advantageous for small interrupt service routines -which have low register usage. - -

-If the interrupt service routine is defined to be using a specific -register bank then only a, b & dptr are save and restored, -if such an interrupt service routine calls another function (using -another register bank) then the entire register bank of the called -function will be saved on the stack. This scheme is recommended for -larger interrupt service routines. - -

-Calling other functions from an interrupt service routine is not recommended, -avoid it if possible. -
- -
-Also see the _naked modifier. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.8 Critical Functions - Up: 3. Using SDCC - Previous: 3.6 Overlaying -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node27.html b/doc/sdccman.html/node27.html deleted file mode 100644 index 1df40554..00000000 --- a/doc/sdccman.html/node27.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - -3.8 Critical Functions - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.9 Naked Functions - Up: 3. Using SDCC - Previous: 3.7 Interrupt Service Routines -   Contents -   Index -
-
- - -

-3.8 Critical Functions -

- -

-A special keyword may be associated with a function declaring it as -critical. SDCC will generate code to disable all interrupts -upon entry to a critical function and enable them back before returning. -Note that nesting critical functions may cause unpredictable results. -
- -
-int foo () critical   -
-{   -
-...   -
-...   -
-}  -
- -
-The critical attribute maybe used with other attributes like reentrant. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node28.html b/doc/sdccman.html/node28.html deleted file mode 100644 index 043321ac..00000000 --- a/doc/sdccman.html/node28.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - -3.9 Naked Functions - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.10 Functions using private - Up: 3. Using SDCC - Previous: 3.8 Critical Functions -   Contents -   Index -
-
- - -

-3.9 Naked Functions -

- -

-A special keyword may be associated with a function declaring it as -_naked. The _naked function modifier attribute prevents -the compiler from generating prologue and epilogue code for that function. -This means that the user is entirely responsible for such things as -saving any registers that may need to be preserved, selecting the -proper register bank, generating the return instruction at -the end, etc. Practically, this means that the contents of the function -must be written in inline assembler. This is particularly useful for -interrupt functions, which can have a large (and often unnecessary) -prologue/epilogue. For example, compare the code generated by these -two functions: -
- -
-data unsigned char counter;  -
-void simpleInterrupt(void) interrupt 1  -
-{  -
-    counter++;  -
-}  -
  -
-void nakedInterrupt(void) interrupt 2 _naked  -
-{  -
-    _asm  -
-      inc     _counter  -
-      reti    ; MUST explicitly include ret in _naked -function.  -
-    _endasm;  -
-} -
- -
-For an 8051 target, the generated simpleInterrupt looks like: -
- -
-_simpleIterrupt:  -
-    push    acc  -
-    push    b  -
-    push    dpl  -
-    push    dph  -
-    push    psw  -
-    mov     psw,#0x00  -
-    inc     _counter  -
-    pop     psw  -
-    pop     dph  -
-    pop     dpl  -
-    pop     b  -
-    pop     acc  -
-    reti -
- -
-whereas nakedInterrupt looks like: -
- -
-_nakedInterrupt:  -
-    inc    _counter  -
-    reti   ; MUST explicitly include ret(i) in _naked -function. -
- -
-While there is nothing preventing you from writing C code inside a -_naked function, there are many ways to shoot yourself in the foot -doing this, and is is recommended that you stick to inline assembler. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.10 Functions using private - Up: 3. Using SDCC - Previous: 3.8 Critical Functions -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node29.html b/doc/sdccman.html/node29.html deleted file mode 100644 index b3549b52..00000000 --- a/doc/sdccman.html/node29.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - -3.10 Functions using private banks - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.11 Absolute Addressing - Up: 3. Using SDCC - Previous: 3.9 Naked Functions -   Contents -   Index -
-
- - -

-3.10 Functions using private banks -

- -

-The using attribute (which tells the compiler to use a register -bank other than the default bank zero) should only be applied to interrupt -functions (see note 1 below). This will in most circumstances make -the generated ISR code more efficient since it will not have to save -registers on the stack. - -

-The using attribute will have no effect on the generated code -for a non-interrupt function (but may occasionally be useful -anyway1). -
-(pending: I don't think this has been done yet) - -

-An interrupt function using a non-zero bank will assume that -it can trash that register bank, and will not save it. Since high-priority -interrupts can interrupt low-priority ones on the 8051 and friends, -this means that if a high-priority ISR using a particular bank -occurs while processing a low-priority ISR using the same bank, -terrible and bad things can happen. To prevent this, no single register -bank should be used by both a high priority and a low priority -ISR. This is probably most easily done by having all high priority -ISRs use one bank and all low priority ISRs use another. If you have -an ISR which can change priority at runtime, you're on your own: I -suggest using the default bank zero and taking the small performance -hit. - -

-It is most efficient if your ISR calls no other functions. If your -ISR must call other functions, it is most efficient if those functions -use the same bank as the ISR (see note 1 below); the next best is -if the called functions use bank zero. It is very inefficient to call -a function using a different, non-zero bank from an ISR. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.11 Absolute Addressing - Up: 3. Using SDCC - Previous: 3.9 Naked Functions -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node3.html b/doc/sdccman.html/node3.html deleted file mode 100644 index f04dc52e..00000000 --- a/doc/sdccman.html/node3.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - - -1.1 About SDCC - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 1.2 Open Source - Up: 1. Introduction - Previous: 1. Introduction -   Contents -   Index -
-
- - -

-1.1 About SDCC -

- -

- -SDCC is a Freeware, retargettable, optimizing ANSI-C compiler -by Sandeep Dutta designed for 8 bit Microprocessors. The -current version targets Intel MCS51 based Microprocessors(8051,8052, -etc), Zilog Z80 based MCUs, and the Dallas DS80C390 variant. It can -be retargetted for other microprocessors, support for PIC, AVR and -186 is under development. The entire source code for the compiler -is distributed under GPL. SDCC uses ASXXXX & ASLINK, a Freeware, -retargettable assembler & linker. SDCC has extensive language extensions -suitable for utilizing various microcontrollers and underlying hardware -effectively. -
- -
-In addition to the MCU specific optimizations SDCC also does a host -of standard optimizations like: - -

- -

    -
  • global sub expression elimination,
  • -
  • loop optimizations (loop invariant, strength reduction of induction -variables and loop reversing),
  • -
  • constant folding & propagation,
  • -
  • copy propagation,
  • -
  • dead code elimination
  • -
  • jumptables for switch statements.
  • -
-For the back-end SDCC uses a global register allocation scheme which -should be well suited for other 8 bit MCUs. -
- -
-The peep hole optimizer uses a rule based substitution mechanism which -is MCU independent. -
- -
-Supported data-types are: - -

- -

    -
  • char (8 bits, 1 byte),
  • -
  • short and int (16 bits, 2 bytes),
  • -
  • long (32 bit, 4 bytes)
  • -
  • float (4 byte IEEE).
  • -
-The compiler also allows inline assembler code to be embedded -anywhere in a function. In addition, routines developed in assembly -can also be called. -
- -
-SDCC also provides an option (-cyclomatic) to report the relative -complexity of a function. These functions can then be further optimized, -or hand coded in assembly if needed. -
- -
-SDCC also comes with a companion source level debugger SDCDB, the -debugger currently uses ucSim a freeware simulator for 8051 and other -micro-controllers. -
- -
-The latest version can be downloaded from http://sdcc.sourceforge.net/. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 1.2 Open Source - Up: 1. Introduction - Previous: 1. Introduction -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node30.html b/doc/sdccman.html/node30.html deleted file mode 100644 index c400b98a..00000000 --- a/doc/sdccman.html/node30.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - -3.11 Absolute Addressing - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.12 Startup Code - Up: 3. Using SDCC - Previous: 3.10 Functions using private -   Contents -   Index -
-
- - -

-3.11 Absolute Addressing -

- -

-Data items can be assigned an absolute address with the at <address> -keyword, in addition to a storage class, e.g.: -
- -
-xdata at 0x8000 unsigned char PORTA_8255 ;  -
- -
-In the above example the PORTA_8255 will be allocated to the location -0x8000 of the external ram. Note that this feature is provided to -give the programmer access to memory mapped devices attached -to the controller. 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) and the linker -output files (.rst) and (.map) are a good places to look for such -overlaps. -
- -
-Absolute address can be specified for variables in all storage classes, -e.g.: -
- -
-bit at 0x02 bvar;  -
  -
-The above example will allocate the variable at offset 0x02 in the -bit-addressable 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. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.12 Startup Code - Up: 3. Using SDCC - Previous: 3.10 Functions using private -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node31.html b/doc/sdccman.html/node31.html deleted file mode 100644 index eefc4a57..00000000 --- a/doc/sdccman.html/node31.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - -3.12 Startup Code - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.13 Inline Assembler Code - Up: 3. Using SDCC - Previous: 3.11 Absolute Addressing -   Contents -   Index -
-
- - -

-3.12 Startup Code -

- -

-The compiler inserts a call to the C routine _sdcc__external__startup() -at the start of the CODE area. This routine is in the runtime library. -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 Other wise static & global -variables will be initialized before the function main is invoked. -You could add a _sdcc__external__startup() 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. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node32.html b/doc/sdccman.html/node32.html deleted file mode 100644 index 9edc9a03..00000000 --- a/doc/sdccman.html/node32.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - -3.13 Inline Assembler Code - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.14 int(16 bit) and - Up: 3. Using SDCC - Previous: 3.12 Startup Code -   Contents -   Index -
-
- - -

-3.13 Inline Assembler Code -

- -

-SDCC allows the use of in-line assembler with a few restriction as -regards labels. All labels defined within inline assembler code has -to be of the form nnnnn$ where nnnn is a number less than -100 (which implies a limit of utmost 100 inline assembler labels per -function). It is strongly recommended that each assembly -instruction (including labels) be placed in a separate line (as the -example shows). When the -peep-asm command line option is -used, the inline assembler code will be passed through the peephole -optimizer. This might cause some unexpected changes in the inline -assembler code. Please go throught the peephole optimizer rules defined -in file SDCCpeeph.def carefully before using this option. -
- -
-_asm   -
-    mov     b,#10   -
-00001$:   -
-    djnz    b,00001$   -
-_endasm ; -
- -
-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 _asm ... _endasm; keyword pair. -
- -
-Inline assembler code cannot reference any C-Labels, however it can -reference labels defined by the inline assembler, e.g.: -
- -
-foo() {   -
-    /* some c code */   -
-    _asm   -
-      ; some assembler code   -
-      ljmp $0003   -
-    _endasm;   -
-    /* some more c code */   -
-clabel:  /* inline assembler cannot reference this label -*/   -
-    _asm  -
-    $0003: ;label (can be reference by inline assembler -only)   -
-    _endasm ;   -
-    /* some more c code */  -
-}  -
  -
-In other words inline assembly code can access labels defined in inline -assembly within the scope of the funtion. - -

-The same goes the other way, ie. labels defines in inline assembly -CANNOT be accessed by C statements. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.14 int(16 bit) and - Up: 3. Using SDCC - Previous: 3.12 Startup Code -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node33.html b/doc/sdccman.html/node33.html deleted file mode 100644 index 874f3679..00000000 --- a/doc/sdccman.html/node33.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -3.14 int(16 bit) and long (32 bit) Support - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.15 Floating Point Support - Up: 3. Using SDCC - Previous: 3.13 Inline Assembler Code -   Contents -   Index -
-
- - -

-3.14 int(16 bit) and long (32 bit) Support -

- -

-For signed & unsigned int (16 bit) and long (32 bit) variables, division, -multiplication and modulus operations are implemented by support routines. -These support routines are all developed in ANSI-C to facilitate porting -to other MCUs, although some model specific assembler optimations -are used. The following files contain the described routine, all of -them can be found in <installdir>/share/sdcc/lib. -
- -
-<pending: tabularise this> -
- -
-_mulsint.c - signed 16 bit multiplication (calls _muluint) -
-_muluint.c - unsigned 16 bit multiplication -
-_divsint.c - signed 16 bit division (calls _divuint) -
-_divuint.c - unsigned 16 bit division -
-_modsint.c - signed 16 bit modulus (call _moduint) -
-_moduint.c - unsigned 16 bit modulus -
-_mulslong.c - signed 32 bit multiplication (calls _mululong) -
-_mululong.c - unsigned32 bit multiplication -
-_divslong.c - signed 32 division (calls _divulong) -
-_divulong.c - unsigned 32 division -
-_modslong.c - signed 32 bit modulus (calls _modulong) -
-_modulong.c - unsigned 32 bit modulus -
- -
-Since they are compiled as non-reentrant, interrupt service -routines should not do any of the above operations. If this is unavoidable -then the above routines will need to be compiled with the -stack-auto -option, after which the source program will have to be compiled with --int-long-rent option. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.15 Floating Point Support - Up: 3. Using SDCC - Previous: 3.13 Inline Assembler Code -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node34.html b/doc/sdccman.html/node34.html deleted file mode 100644 index 4da62036..00000000 --- a/doc/sdccman.html/node34.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -3.15 Floating Point Support - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.16 MCS51 Memory Models - Up: 3. Using SDCC - Previous: 3.14 int(16 bit) and -   Contents -   Index -
-
- - -

-3.15 Floating Point Support -

- -

-SDCC supports IEEE (single precision 4bytes) floating point numbers.The -floating point support routines are derived from gcc's floatlib.c -and consists of the following routines: -
- -
-<pending: tabularise this> -
- -
-_fsadd.c - add floating point numbers -
-_fssub.c - subtract floating point numbers -
-_fsdiv.c - divide floating point numbers -
-_fsmul.c - multiply floating point numbers -
-_fs2uchar.c - convert floating point to unsigned char -
-_fs2char.c - convert floating point to signed char -
-_fs2uint.c - convert floating point to unsigned int -
-_fs2int.c - convert floating point to signed int -
-_fs2ulong.c - convert floating point to unsigned long -
-_fs2long.c - convert floating point to signed long -
-_uchar2fs.c - convert unsigned char to floating point -
-_char2fs.c - convert char to floating point number -
-_uint2fs.c - convert unsigned int to floating point -
-_int2fs.c - convert int to floating point numbers -
-_ulong2fs.c - convert unsigned long to floating point number -
-_long2fs.c - convert long to floating point number -
- -
-Note if all these routines are used simultaneously the data space -might overflow. For serious floating point usage it is strongly recommended -that the large model be used. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.16 MCS51 Memory Models - Up: 3. Using SDCC - Previous: 3.14 int(16 bit) and -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node35.html b/doc/sdccman.html/node35.html deleted file mode 100644 index bfd4fc68..00000000 --- a/doc/sdccman.html/node35.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - -3.16 MCS51 Memory Models - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.17 DS390 Memory Models - Up: 3. Using SDCC - Previous: 3.15 Floating Point Support -   Contents -   Index -
-
- - -

-3.16 MCS51 Memory Models -

- -

-SDCC allows two memory models for MCS51 code, small and large. Modules -compiled with different memory models should never be combined -together or the results would be unpredictable. The library routines -supplied with the compiler are compiled as both small and large. The -compiled library modules are contained in seperate directories as -small and large so that you can link to either set. - -

-When the large model is used all variables declared without a storage -class will be allocated into the external ram, this includes all parameters -and local variables (for non-reentrant functions). When the small -model is used variables without storage class are allocated in the -internal ram. - -

-Judicious usage of the processor specific storage classes and the -'reentrant' function type will yield much more efficient code, than -using the large model. Several optimizations are disabled when the -program is compiled using the large model, it is therefore strongly -recommdended that the small model be used unless absolutely required. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.17 DS390 Memory Models - Up: 3. Using SDCC - Previous: 3.15 Floating Point Support -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node36.html b/doc/sdccman.html/node36.html deleted file mode 100644 index 0cd5465c..00000000 --- a/doc/sdccman.html/node36.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - -3.17 DS390 Memory Models - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 3.18 Defines Created by - Up: 3. Using SDCC - Previous: 3.16 MCS51 Memory Models -   Contents -   Index -
-
- - -

-3.17 DS390 Memory Models -

- -

-The only model supported is Flat 24. This generates code for the 24 -bit contiguous addressing mode of the Dallas DS80C390 part. In this -mode, up to four meg of external RAM or code space can be directly -addressed. See the data sheets at www.dalsemi.com for further information -on this part. -
- -
-In older versions of the compiler, this option was used with the MCS51 -code generator (-mmcs51). Now, however, the '390 has it's own -code generator, selected by the -mds390 switch. -
- -
-Note that the compiler does not generate any code to place the processor -into 24 bitmode (although tinibios in the ds390 libraries will -do that for you). If you don't use tinibios, the boot loader -or similar code must ensure that the processor is in 24 bit contiguous -addressing mode before calling the SDCC startup code. -
- -
-Like the -model-large option, variables will by default be -placed into the XDATA segment. -
- -
-Segments may be placed anywhere in the 4 meg address space using the -usual -*-loc options. Note that if any segments are located above -64K, the -r flag must be passed to the linker to generate the proper -segment relocations, and the Intel HEX output format must be used. -The -r flag can be passed to the linker by using the option -Wl-r -on the sdcc command line. However, currently the linker can not handle -code segments > 64k. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 3.18 Defines Created by - Up: 3. Using SDCC - Previous: 3.16 MCS51 Memory Models -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node37.html b/doc/sdccman.html/node37.html deleted file mode 100644 index 984d3a24..00000000 --- a/doc/sdccman.html/node37.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - -3.18 Defines Created by the Compiler - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 4. SDCC Technical Data - Up: 3. Using SDCC - Previous: 3.17 DS390 Memory Models -   Contents -   Index -
-
- - -

-3.18 Defines Created by the Compiler -

- -

-The compiler creates the following #defines. - -

- -

    -
  • SDCC - this Symbol is always defined.
  • -
  • SDCC_mcs51 or SDCC_ds390 or SDCC_z80, etc - depending on the model -used (e.g.: -mds390)
  • -
  • __mcs51 or __ds390 or __z80, etc - depending on the model used -(e.g. -mz80)
  • -
  • SDCC_STACK_AUTO - this symbol is defined when -stack-auto -option is used.
  • -
  • SDCC_MODEL_SMALL - when -model-small is used.
  • -
  • SDCC_MODEL_LARGE - when -model-large is used.
  • -
  • SDCC_USE_XSTACK - when -xstack option is used.
  • -
  • SDCC_STACK_TENBIT - when -mds390 is used
  • -
  • SDCC_MODEL_FLAT24 - when -mds390 is used
  • -
- -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node38.html b/doc/sdccman.html/node38.html deleted file mode 100644 index a9efd939..00000000 --- a/doc/sdccman.html/node38.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - -4. SDCC Technical Data - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 4.1 Optimizations - Up: SDCC Compiler User Guide - Previous: 3.18 Defines Created by -   Contents -   Index -
-
- - -

-4. SDCC Technical Data -

- -

-


- -Subsections - - - -

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node39.html b/doc/sdccman.html/node39.html deleted file mode 100644 index 2596e8ea..00000000 --- a/doc/sdccman.html/node39.html +++ /dev/null @@ -1,903 +0,0 @@ - - - - - -4.1 Optimizations - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 4.2 Pragmas - Up: 4. SDCC Technical Data - Previous: 4. SDCC Technical Data -   Contents -   Index -
-
- - -Subsections - - - -
- -

-4.1 Optimizations -

- -

-SDCC performs a host of standard optimizations in addition to some -MCU specific optimizations. - -

- -

-4.1.1 Sub-expression Elimination -

- -

-The compiler does local and global common subexpression elimination, -e.g.: -
- -
-i = x + y + 1;   -
-j = x + y; -
- -
-will be translated to -
- -
-iTemp = x + y   -
-i = iTemp + 1   -
-j = iTemp  -
- -
-Some subexpressions are not as obvious as the above example, e.g.: -
- -
-a->b[i].c = 10;   -
-a->b[i].d = 11; -
- -
-In this case the address arithmetic a->b[i] will be computed only -once; the equivalent code in C would be. -
- -
-iTemp = a->b[i];   -
-iTemp.c = 10;   -
-iTemp.d = 11; -
- -
-The compiler will try to keep these temporary variables in registers. - -

- -

-4.1.2 Dead-Code Elimination -

- -

- -int global;   -
-void f () {   -
-  int i;   -
-  i = 1;  /* dead store */   -
-  global = 1; /* dead store */   -
-  global = 2;   -
-  return;   -
-  global = 3; /* unreachable */   -
-} -
- -
-will be changed to -
- -
-int global; void f ()   -
-{  -
-  global = 2;   -
-  return;   -
-} - -

- -

-4.1.3 Copy-Propagation -

- -

- -int f() {   -
-  int i, j;   -
-  i = 10;   -
-  j = i;   -
-  return j;   -
-} -
- -
-will be changed to -
- -
-int f() {   -
-    int i,j;   -
-    i = 10;   -
-    j = 10;   -
-    return 10;   -
-}  -
  -
-Note: the dead stores created by this copy propagation will be eliminated -by dead-code elimination. - -

- -

-4.1.4 Loop Optimizations -

- -

-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, loop induction optimization causes an increase -in register pressure, which may cause unwanted spilling of other temporary -variables into the stack / 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 -noinduction option) or for a given function only -using #pragma NOINDUCTION. -
- -
-Loop Invariant: -
- -
-for (i = 0 ; i < 100 ; i ++)   -
-    f += k + l; -
- -
-changed to -
- -
-itemp = k + l;   -
-for (i = 0; i < 100; i++)   -
-  f += itemp; -
- -
-As mentioned previously some loop invariants are not as apparent, -all static address computations are also moved out of the loop. -
- -
-Strength Reduction, this optimization substitutes an expression by -a cheaper expression: -
- -
-for (i=0;i < 100; i++)  -
-  ar[i*5] = i*3; -
- -
-changed to -
- -
-itemp1 = 0;   -
-itemp2 = 0;   -
-for (i=0;i< 100;i++) {   -
-    ar[itemp1] = itemp2;   -
-    itemp1 += 5;   -
-    itemp2 += 3;   -
-} -
- -
-The more expensive multiplication is changed to a less expensive addition. - -

- -

-4.1.5 Loop Reversing -

- -

-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 ``decrement and jump if not zero'' 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). - -

- -

    -
  • The 'for' loop is of the form -
    - -
    -for (<symbol> = <expression> ; <sym> [< | <=] <expression> -; [<sym>++ | <sym> += 1])  -
    -    <for body>
  • -
  • The <for body> does not contain ``continue'' or 'break''.
  • -
  • All goto's are contained within the loop.
  • -
  • No function calls within the loop.
  • -
  • The loop control variable <sym> is not assigned any value within the -loop
  • -
  • The loop control variable does NOT participate in any arithmetic operation -within the loop.
  • -
  • There are NO switch statements in the loop.
  • -
-Note djnz instruction can be used for 8-bit values only, therefore -it is advantageous to declare loop control symbols as char. -Ofcourse this may not be possible on all situations. - -

- -

-4.1.6 Algebraic Simplifications -

- -

-SDCC does numerous algebraic simplifications, the following is a small -sub-set of these optimizations. -
- -
-i = j + 0 ; /* changed to */ i = j;   -
-i /= 2; /* changed to */ i >>= 1;   -
-i = j - j ; /* changed to */ i = 0;   -
-i = j / 1 ; /* changed to */ i = j; -
- -
-Note the subexpressions given above are generally introduced by macro -expansions or as a result of copy/constant propagation. - -

- -

-4.1.7 'switch' Statements -

- -

-SDCC changes switch statements to jump tables when the following conditions -are true. - -

- -

    -
  • The case labels are in numerical sequence, the labels need not be -in order, and the starting number need not be one or zero. -
    - -
    -switch(i) {                         switch (i) -{   -
    -case 4:...                          case 1: ...   -
    -case 5:...                          case 2: ...   -
    -case 3:...                          case 3: ...   -
    -case 6:...                          case 4: ...   -
    -}                                   }  -
      -
    -Both the above switch statements will be implemented using a jump-table.
  • -
  • The number of case labels is at least three, since it takes two conditional -statements to handle the boundary conditions.
  • -
  • 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.
  • -
-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.: -
- -
-switch (i) {   -
-case 1: ...   -
-case 2: ...   -
-case 3: ...   -
-case 4: ...   -
-case 9: ...   -
-case 10: ...   -
-case 11: ...   -
-case 12: ...   -
-} -
- -
-If the above switch statement is broken down into two switch statements -
- -
-switch (i) {   -
-case 1: ...   -
-case 2: ...   -
-case 3: ...   -
-case 4: ...   -
-}  -
  -
-and  -
  -
-switch (i) {   -
-case 9:  ...   -
-case 10: ...   -
-case 11: ...   -
-case 12: ...   -
-}  -
  -
-then both the switch statements will be implemented using jump-tables -whereas the unmodified switch statement will not be. - -

- -

-4.1.8 Bit-shifting Operations. -

- -

-Bit shifting is one of the most frequently used operation in embedded -programming. SDCC tries to implement bit-shift operations in the most -efficient way possible, e.g.: -
  -
-unsigned char i;  -
-...   -
-i>>= 4;   -
-...  -
- -
-generates the following code: -
  -
-mov a,_i   -
-swap a   -
-anl a,#0x0f   -
-mov _i,a -
- -
-In general SDCC will never setup a loop if the shift count is known. -Another example: -
- -
-unsigned int i;   -
-...   -
-i >>= 9;   -
-... -
- -
-will generate: -
- -
-mov a,(_i + 1)   -
-mov (_i + 1),#0x00   -
-clr c   -
-rrc a   -
-mov _i,a -
- -
-Note that SDCC stores numbers in little-endian format (i.e. lowest -order first). - -

- -

-4.1.9 Bit-rotation -

- -

-A special case of the bit-shift operation is bit rotation, SDCC recognizes -the following expression to be a left bit-rotation: -
- -
-unsigned char i;   -
-...   -
-i = ((i << 1) | (i >> -7)); -
-... -
- -
-will generate the following code: -
- -
-mov a,_i   -
-rl a   -
-mov _i,a -
- -
-SDCC uses pattern matching on the parse tree to determine this operation.Variations -of this case will also be recognized as bit-rotation, i.e.: -
- -
-i = ((i >> 7) | (i << -1)); /* left-bit rotation */ - -

- -

-4.1.10 Highest Order Bit -

- -

-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.: -
- -
- unsigned int gint;   -
  -
-foo () {   -
-unsigned char hob;   -
-  ...   -
-  hob = (gint >> 15) & 1;   -
-  ..   -
-} -
- -
-will generate the following code: -
  -
-                             61 -;  hob.c 7   -
-   000A E5*01                62         -mov  a,(_gint + 1)   -
-   000C 33                   63         -rlc  a   -
-   000D E4                   64         -clr  a   -
-   000E 13                   65         -rrc  a   -
-   000F F5*02                66         -mov  _foo_hob_1_1,a  -
  -
-Variations of this case however will not 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.: -
- -
-xyz = gint + ((gint >> 15) & 1); -
- -
-will still be recognized. - -

- -

-4.1.11 Peep-hole Optimizer -

- -

-The compiler uses a rule based, pattern matching and re-writing mechanism -for peep-hole optimization. It is inspired by copt 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 -peep-file <filename> option. The rule language -is best illustrated with examples. -
- -
-replace {   -
-  mov %1,a   -
-  mov a,%1  -
-} by {  -
-  mov %1,a  -
-} -
- -
-The above rule will change the following assembly sequence: -
- -
-  mov r1,a   -
-  mov a,r1 -
- -
-to -
- -
-mov r1,a -
- -
-Note: All occurrences of a %n (pattern variable) must denote -the same string. With the above rule, the assembly sequence: -
- -
-  mov r1,a   -
-  mov a,r2 -
- -
-will remain unmodified. -
- -
-Other special case optimizations may be added by the user (via -peep-file -option). E.g. some variants of the 8051 MCU allow only ajmp -and acall. The following two rules will change all ljmp -and lcall to ajmp and acall -
- -
-replace { lcall %1 } by { acall %1 }   -
-replace { ljmp %1 } by { ajmp %1 } -
- -
-The inline-assembler code 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-structure is MCU independent. Peephole optimization -rules for other MCU can be easily programmed using the rule language. -
- -
-The syntax for a rule is as follows: -
- -
-rule := replace [ restart ] '{' <assembly sequence> '\n' -  -
-                            '}' by '{' '\n' -  -
-                                <assembly -sequence> '\n'   -
-                            '}' [if <functionName> -] '\n'   -
- -
-<assembly sequence> := assembly instruction (each instruction including -labels must be on a separate line). -
- -
-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. A good example -of this the following rule: -
- -
-replace restart {   -
-  pop %1   -
-  push %1 } by {   -
-  ; nop   -
-} -
- -
-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.: -
- -
-  pop ar1   -
-  pop ar2   -
-  push ar2   -
-  push ar1 -
- -
-would result in: -
- -
-  pop ar1   -
-  ; nop   -
-  push ar1 -
- -
-with 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: -
- -
-  ; nop   -
-  ; nop -
- -
-A conditional function can be attached to a rule. Attaching rules -are somewhat more involved, let me illustrate this with an example. -
- -
-replace {   -
-     ljmp %5   -
-%2:  -
-} by {   -
-     sjmp %5   -
-%2:  -
-} if labelInRange -
- -
-The optimizer does a look-up of a function name table defined in function -callFuncByName in the source file SDCCpeeph.c, with the name -labelInRange. 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 %5 is crucial, since the function -labelInRange expects to find the label in that particular variable -(the hash table containing 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. -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 also 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 -peep-file option. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 4.2 Pragmas - Up: 4. SDCC Technical Data - Previous: 4. SDCC Technical Data -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node4.html b/doc/sdccman.html/node4.html deleted file mode 100644 index 41554e80..00000000 --- a/doc/sdccman.html/node4.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - -1.2 Open Source - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 1.3 Typographic conventions - Up: 1. Introduction - Previous: 1.1 About SDCC -   Contents -   Index -
-
- - -

-1.2 Open Source -

- -

-All packages used in this compiler system are opensource and -freeware; source code for all the sub-packages (asxxxx assembler/linker, -pre-processor) is distributed with the package. This documentation -is maintained using a freeware word processor (LYX). - -

-This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published -by the Free Software Foundation; either version 2, or (at your option) -any later version. This program is distributed in the hope that it -will be useful, but WITHOUT ANY WARRANTY; without even the implied -warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -the GNU General Public License for more details. You should have received -a copy of the GNU General Public License along with this program; -if not, write to the Free Software Foundation, 59 Temple Place - Suite -330, Boston, MA 02111-1307, USA. In other words, you are welcome to -use, share and improve this program. You are forbidden to forbid anyone -else to use, share and improve what you give them. Help stamp out -software-hoarding! - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 1.3 Typographic conventions - Up: 1. Introduction - Previous: 1.1 About SDCC -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node40.html b/doc/sdccman.html/node40.html deleted file mode 100644 index 933af376..00000000 --- a/doc/sdccman.html/node40.html +++ /dev/null @@ -1,177 +0,0 @@ - - - - - -4.2 Pragmas - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 4.3 <pending: this is - Up: 4. SDCC Technical Data - Previous: 4.1 Optimizations -   Contents -   Index -
-
- - -

-4.2 Pragmas -

- -

-SDCC supports the following #pragma directives. This directives are -applicable only at a function level. - -

- -

    -
  • SAVE - this will save all the current options.
  • -
  • RESTORE - will restore the saved options from the last save. Note -that SAVES & RESTOREs cannot be nested. SDCC uses the same buffer -to save the options each time a SAVE is called.
  • -
  • NOGCSE - will stop global subexpression elimination.
  • -
  • NOINDUCTION - will stop loop induction optimizations.
  • -
  • NOJTBOUND - will not generate code for boundary value checking, when -switch statements are turned into jump-tables.
  • -
  • NOOVERLAY - the compiler will not overlay the parameters and local -variables of a function.
  • -
  • NOLOOPREVERSE - Will not do loop reversal optimization
  • -
  • EXCLUDE NONE | {acc[,b[,dpl[,dph]]] - The exclude pragma -disables generation of pair of push/pop instruction in ISR function -(using interrupt 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 EXCLUDE none.
  • -
  • CALLEE-SAVES function1[,function2[,function3...]] - The compiler -by default uses a caller saves convention for register saving across -function calls, however this can cause unneccessary register pushing -& popping when calling small functions from larger functions. This -option can be used to switch the register saving convention for the -function names specified. The compiler will not save registers when -calling these functions, extra code will be generated 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 future the compiler -(with interprocedural analysis) will be able to determine the appropriate -scheme to use for each function call. If -callee-saves command line -option is used, the function names specified in #pragma CALLEE-SAVES -is appended to the list of functions specified inthe command line.
  • -
-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. -
- -
-#pragma SAVE /* save the current settings */   -
-#pragma NOGCSE /* turnoff global subexpression elimination -*/   -
-#pragma NOINDUCTION /* turn off induction optimizations -*/   -
-int foo ()   -
-{   -
-    ...   -
-    /* large code */   -
-    ...   -
-}   -
-#pragma RESTORE /* turn the optimizations back on */ -
- -
-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. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 4.3 <pending: this is - Up: 4. SDCC Technical Data - Previous: 4.1 Optimizations -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node41.html b/doc/sdccman.html/node41.html deleted file mode 100644 index 476720c3..00000000 --- a/doc/sdccman.html/node41.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -4.3 <pending: this is messy and incomplete> Library Routines - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 4.4 Interfacing with Assembly - Up: 4. SDCC Technical Data - Previous: 4.2 Pragmas -   Contents -   Index -
-
- - -

-4.3 <pending: this is messy and incomplete> Library Routines -

- -

-The following library routines are provided for your convenience. - -

-stdio.h - Contains the following functions printf & sprintf these -routines are developed by Martijn van Balen <balen@natlab.research.philips.com>. - -

- -%[flags][width][b|B|l|L]type - -

- -           flags: -        left justify output in -specified field width -
-                 +        prefix output with -+/- sign if output is signed type -
-                 space    prefix output with a -blank if it's a signed positive value -
-          width:          specifies minimum number -of characters outputted for numbers -
-                          or strings. -
-                          - For numbers, -spaces are added on the left when needed. -
-                            If width starts -with a zero character, zeroes and used -
-                            instead of -spaces. -
-                          - For strings, -spaces are are added on the left or right (when -
-                            flag '-' is -used) when needed. -
-                          -
-          b/B:            byte argument (used -by d, u, o, x, X) -
-          l/L:            long argument (used -by d, u, o, x, X) -
-          type:  d        decimal number -
-                 u        unsigned decimal -number -
-                 o        unsigned octal number - -
-                 x        unsigned hexadecimal -number (0-9, a-f) -
-                 X        unsigned hexadecimal -number (0-9, A-F) -
-                 c        character -
-                 s        string (generic pointer) - -
-                 p        generic pointer (I:data/idata, -C:code, X:xdata, P:paged) -
-                 f        float (still to be -implemented) - -

-Also contains a very simple version of printf (printf_small). This -simplified version of printf supports only the following formats. - -

-format     output type     argument-type -
-%d         decimal       short/int -
-%ld        decimal       long -
-%hd        decimal       char -
-%x        hexadecimal    short/int -
-%lx       hexadecimal    long -
-%hx       hexadecimal    char -
-%o         octal         short/int -
-%lo        octal         long -
-%ho        octal         char -
-%c        character      char -
-%s        character     _generic pointer - -

-The routine is very stack intesive, -stack-after-data parameter should -be used when using this routine, the routine also takes about 1K of -code space. It also expects an external function named putchar(char) -to be present (this can be changed). When using the %s format the -string / pointer should be cast to a generic pointer. eg. - -

-printf_small(``my str %s, my int %d\n'',(char -_generic *)mystr,myint); - -

- -

    -
  • stdarg.h - contains definition for the following macros to be used -for variable parameter list, note that a function can have a variable -parameter list if and only if it is 'reentrant' - -

    -va_list, va_start, va_arg, va_end. - -

    -

  • -
  • setjmp.h - contains defintion for ANSI setjmp & longjmp routines. -Note in this case setjmp & longjmp can be used between functions -executing within the same register bank, if long jmp is executed from -a function that is using a different register bank from the function -issuing the setjmp function, the results may be unpredictable. The -jump buffer requires 3 bytes of data (the stack pointer & a 16 byte -return address), and can be placed in any address space.
  • -
  • stdlib.h - contains the following functions. - -

    -atoi, atol. - -

    -

  • -
  • string.h - contains the following functions. - -

    -strcpy, strncpy, strcat, strncat, strcmp, strncmp, strchr, strrchr, -strspn, strcspn, strpbrk, strstr, strlen, strtok, memcpy, memcmp, -memset. - -

    -

  • -
  • ctype.h - contains the following routines. - -

    -iscntrl, isdigit, isgraph, islower, isupper, isprint, ispunct, isspace, -isxdigit, isalnum, isalpha. - -

    -

  • -
  • malloc.h - The malloc routines are developed by Dmitry S. Obukhov -(dso@usa.net). These routines will allocate memory from the external -ram. Here is a description on how to use them (as described by the -author). - -

    - -//Example: -
    -     //     #define DYNAMIC_MEMORY_SIZE 0x2000 -
    -     //     ..... -
    -     //     unsigned char xdata dynamic_memory_pool[DYNAMIC_MEMORY_SIZE]; - -
    -     //     unsigned char xdata * current_buffer; -
    -     //     ..... -
    -     //     void main(void) -
    -     //     { -
    -     //         ... -
    -     //         init_dynamic_memory(dynamic_memory_pool,DYNAMIC_MEMORY_SIZE); - -
    -     //         //Now it's possible to use malloc. -
    -     //         ... -
    -     //         current_buffer = malloc(0x100); -
    -     // - -

    -

  • -
  • serial.h - Serial IO routines are also developed by Dmitry S. Obukhov -(dso@usa.net). These routines are interrupt driven with a 256 byte -circular buffer, they also expect external ram to be present. Please -see documentation in file SDCCDIR/sdcc51lib/serial.c. Note the header -file ``serial.h'' MUST be included in the file containing the -'main' function.
  • -
  • ser.h - Alternate serial routine provided by Wolfgang Esslinger <wolfgang@WiredMinds.com> -these routines are more compact and faster. Please see documentation -in file SDCCDIR/sdcc51lib/ser.c
  • -
  • ser_ir.h - Another alternate set of serial routines provided by Josef -Wolf <jw@raven.inka.de>, these routines do not use the external ram.
  • -
  • reg51.h - contains register definitions for a standard 8051
  • -
  • float.h - contains min, max and other floating point related stuff.
  • -
-All library routines are compiled as -model-small, they are all non-reentrant, -if you plan to use the large model or want to make these routines -reentrant, then they will have to be recompiled with the appropriate -compiler option. - -

-Have not had time to do the more involved routines like printf, will -get to them shortly. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 4.4 Interfacing with Assembly - Up: 4. SDCC Technical Data - Previous: 4.2 Pragmas -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node42.html b/doc/sdccman.html/node42.html deleted file mode 100644 index e1433df5..00000000 --- a/doc/sdccman.html/node42.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - -4.4 Interfacing with Assembly Routines - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 4.5 External Stack - Up: 4. SDCC Technical Data - Previous: 4.3 <pending: this is -   Contents -   Index -
-
- - -Subsections - - - -
- -

-4.4 Interfacing with Assembly Routines -

- -

- -

-4.4.1 Global Registers used for Parameter Passing -

- -

-The compiler always uses the global registers DPL,DPH,B and -ACC to pass the first parameter to a routine. The second parameter -onwards is either allocated on the stack (for reentrant routines or -if -stack-auto is used) or in the internal / external ram (depending -on the memory model). - -

- -

-4.4.2 Assembler Routine(non-reentrant) -

- -

-In the following example the function cfunc calls an assembler routine -asm_func, which takes two parameters. -
- -
-extern int asm_func(unsigned char, unsigned char);  -
  -
-int c_func (unsigned char i, unsigned char j)  -
-{  -
-    return asm_func(i,j);  -
-}  -
  -
-int main()  -
-{  -
-    return c_func(10,9);  -
-}  -
  -
-The corresponding assembler function is: -
- -
-.globl _asm_func_PARM_2   -
-        .globl _asm_func   -
-        .area OSEG   -
-_asm_func_PARM_2:  -
-        .ds 1   -
-        .area CSEG   -
-_asm_func:   -
-        mov a,dpl   -
-        add a,_asm_func_PARM_2   -
-        mov dpl,a   -
-        mov dpl,#0x00   -
-        ret  -
  -
-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. - -

-The parameter naming convention is _<function_name>_PARM_<n>, -where n is the parameter number starting from 1, and counting from -the left. The first parameter is passed in ``dpl'' for One bye -parameter, ``dptr'' if two bytes, ``b,dptr'' for three bytes -and ``acc,b,dptr'' for four bytes, the varible name for the second -parameter will be _<function_name>_PARM_2. -
- -
-Assemble the assembler routine with the following command: -
- -
-asx8051 -losg asmfunc.asm -
-
-Then compile and link the assembler routine to the C source file with -the following command: -
- -
-sdcc cfunc.c asmfunc.rel - -

- -

-4.4.3 Assembler Routine(reentrant) -

- -

-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: -
- -
-extern int asm_func(unsigned char, unsigned char);  -
  -
-int c_func (unsigned char i, unsigned char j) reentrant   -
-{   -
-    return asm_func(i,j);   -
-}   -
  -
-int main()   -
-{   -
-    return c_func(10,9);   -
-}  -
- -
-The corresponding assembler routine is: -
- -
-.globl _asm_func   -
-_asm_func:   -
-    push _bp   -
-    mov _bp,sp   -
-    mov r2,dpl  -
-    mov a,_bp   -
-    clr c   -
-    add a,#0xfd   -
-    mov r0,a   -
-    add a,#0xfc  -
-    mov r1,a   -
-    mov a,@r0   -
-    add a,r2  -
-    mov dpl,a   -
-    mov dph,#0x00   -
-    mov sp,_bp   -
-    pop _bp   -
-    ret  -
  -
-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. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 4.5 External Stack - Up: 4. SDCC Technical Data - Previous: 4.3 <pending: this is -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node43.html b/doc/sdccman.html/node43.html deleted file mode 100644 index a17a5923..00000000 --- a/doc/sdccman.html/node43.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - -4.5 External Stack - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 4.6 ANSI-Compliance - Up: 4. SDCC Technical Data - Previous: 4.4 Interfacing with Assembly -   Contents -   Index -
-
- - -

-4.5 External Stack -

- -

-The external stack is located at the start of the external ram segment, -and is 256 bytes in size. When -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 -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). - -

-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. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node44.html b/doc/sdccman.html/node44.html deleted file mode 100644 index e4fe86a8..00000000 --- a/doc/sdccman.html/node44.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - -4.6 ANSI-Compliance - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 4.7 Cyclomatic Complexity - Up: 4. SDCC Technical Data - Previous: 4.5 External Stack -   Contents -   Index -
-
- - -

-4.6 ANSI-Compliance -

- -

-Deviations from the compliancy. - -

- -

    -
  • functions are not always reentrant.
  • -
  • 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.:  -
      -
    -struct s { ... };   -
    -struct s s1, s2;   -
    -foo()   -
    -{   -
    -    ...   -
    -    s1 = s2 ; /* is invalid in SDCC although allowed -in ANSI */   -
    -    ...   -
    -}  -
    -struct s foo1 (struct s parms) /* is invalid in SDCC although -allowed in ANSI */   -
    -{   -
    -    struct s rets;   -
    -    ...   -
    -    return rets;/* is invalid in SDCC although allowed -in ANSI */   -
    -}
  • -
  • 'long long' (64 bit integers) not supported.
  • -
  • 'double' precision floating point not supported.
  • -
  • No support for setjmp and longjmp (for now).
  • -
  • Old K&R style function declarations are NOT allowed. -
      -
    -foo(i,j) /* this old style of function declarations */ -  -
    -int i,j; /* are valid in ANSI but not valid in SDCC */ -  -
    -{   -
    -    ...   -
    -}
  • -
  • functions declared as pointers must be dereferenced during the call. -
      -
    -int (*foo)();  -
    -...   -
    -/* has to be called like this */   -
    -(*foo)(); /* ansi standard allows calls to be made like -'foo()' */
  • -
- -

-


- - -next - -up - -previous - -contents - -index -
- Next: 4.7 Cyclomatic Complexity - Up: 4. SDCC Technical Data - Previous: 4.5 External Stack -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node45.html b/doc/sdccman.html/node45.html deleted file mode 100644 index 18b68c61..00000000 --- a/doc/sdccman.html/node45.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -4.7 Cyclomatic Complexity - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 5. TIPS - Up: 4. SDCC Technical Data - Previous: 4.6 ANSI-Compliance -   Contents -   Index -
-
- - -

-4.7 Cyclomatic Complexity -

- -

-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. -
- -
-SDCC uses the following formula to compute the complexity: -
- -

-complexity = (number of edges in control flow graph) - (number of -nodes in control flow graph) + 2; -
- -
-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. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 5. TIPS - Up: 4. SDCC Technical Data - Previous: 4.6 ANSI-Compliance -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node46.html b/doc/sdccman.html/node46.html deleted file mode 100644 index d9d04ed9..00000000 --- a/doc/sdccman.html/node46.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - -5. TIPS - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 5.1 Notes on MCS51 - Up: SDCC Compiler User Guide - Previous: 4.7 Cyclomatic Complexity -   Contents -   Index -
-
- - -

-5. TIPS -

- -

-Here are a few guidelines that will help the compiler generate more -efficient code, some of the tips are specific to this compiler others -are generally good programming practice. - -

- -

    -
  • Use the smallest data type to represent your data-value. If it is -known in advance that the value is going to be less than 256 then -use a 'char' instead of a 'short' or 'int'.
  • -
  • Use unsigned when it is known in advance that the value is not going -to be negative. This helps especially if you are doing division or -multiplication.
  • -
  • NEVER jump into a LOOP.
  • -
  • Declare the variables to be local whenever possible, especially loop -control variables (induction).
  • -
  • Since the compiler does not do implicit integral promotion, the programmer -should do an explicit cast when integral promotion is required.
  • -
  • Reducing the size of division, multiplication & modulus operations -can reduce code size substantially. Take the following code for example.  -
      -
    -foobar(unsigned int p1, unsigned char ch)  -
    -{  -
    - unsigned char ch1 = p1 % ch ;  -
    - ....   -
    -}  -
    - -
    -For the modulus operation the variable ch will be promoted to unsigned -int first then the modulus operation will be performed (this will -lead to a call to support routine _muduint()), and the result will -be casted to an int. If the code is changed to -
      -
    -foobar(unsigned int p1, unsigned char ch)  -
    -{  -
    - unsigned char ch1 = (unsigned char)p1 % ch ;  -
    - ....   -
    -}  -
    - -
    -It would substantially reduce the code generated (future versions -of the compiler will be smart enough to detect such optimization oppurtunities).
  • -
- -

-


- -Subsections - - - -
- - -next - -up - -previous - -contents - -index -
- Next: 5.1 Notes on MCS51 - Up: SDCC Compiler User Guide - Previous: 4.7 Cyclomatic Complexity -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node47.html b/doc/sdccman.html/node47.html deleted file mode 100644 index 4b600389..00000000 --- a/doc/sdccman.html/node47.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - -5.1 Notes on MCS51 memory layout - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 6. Retargetting for other - Up: 5. TIPS - Previous: 5. TIPS -   Contents -   Index -
-
- - -

-5.1 Notes on MCS51 memory layout -

- -

-The 8051 family of micro controller have a minimum of 128 bytes of -internal memory which is structured as follows -
- -
-- Bytes 00-1F - 32 bytes to hold up to 4 banks of the registers R7 -to R7 -
-- Bytes 20-2F - 16 bytes to hold 128 bit variables and -
-- Bytes 30-7F - 60 bytes for general purpose use. -
- -
-Normally the SDCC compiler will only utilise the first bank of registers, -but it is possible to specify that other banks of registers should -be used in interrupt routines. By default, the compiler will place -the stack after the last bank of used registers, i.e. if the first -2 banks of registers are used, it will position the base of the internal -stack at address 16 (0X10). This implies that as the stack grows, -it will use up the remaining register banks, and the 16 bytes used -by the 128 bit variables, and 60 bytes for general purpose use. - -

-By default, the compiler uses the 60 general purpose bytes to hold -"near data". The compiler/optimiser may also declare -some Local Variables in this area to hold local data. - -

-If any of the 128 bit variables are used, or near data is being used -then care needs to be taken to ensure that the stack does not grow -so much that it starts to over write either your bit variables or -"near data". There is no runtime checking to prevent -this from happening. - -

-The amount of stack being used is affected by the use of the "internal -stack" to save registers before a subroutine call is made -(-stack-auto will declare parameters and local variables on the stack) -and the number of nested subroutines. - -

-If you detect that the stack is over writing you data, then the following -can be done. -xstack will cause an external stack to be used for -saving registers and (if -stack-auto is being used) storing parameters -and local variables. However this will produce more code which will -be slower to execute. - -

- --stack-loc will allow you specify the start of the stack, i.e. you -could start it after any data in the general purpose area. However -this may waste the memory not used by the register banks and if the -size of the "near data" increases, it may creep -into the bottom of the stack. - -

- --stack-after-data, similar to the -stack-loc, but it automatically -places the stack after the end of the "near data". -Again this could waste any spare register space. - -

- --data-loc allows you to specify the start address of the near data. -This could be used to move the "near data" further -away from the stack giving it more room to grow. This will only work -if no bit variables are being used and the stack can grow to use the -bit variable space. -
- -
-Conclusion. -
- -
-If you find that the stack is over writing your bit variables or "near -data" then the approach which best utilised the internal -memory is to position the "near data" after the -last bank of used registers or, if you use bit variables, after the -last bit variable by using the -data-loc, e.g. if two register banks -are being used and no bit variables, -data-loc 16, and use the -stack-after-data -option. - -

-If bit variables are being used, another method would be to try and -squeeze the data area in the unused register banks if it will fit, -and start the stack after the last bit variable. - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 6. Retargetting for other - Up: 5. TIPS - Previous: 5. TIPS -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node48.html b/doc/sdccman.html/node48.html deleted file mode 100644 index 5cf45b15..00000000 --- a/doc/sdccman.html/node48.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - -6. Retargetting for other MCUs. - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 7. SDCDB - Source - Up: SDCC Compiler User Guide - Previous: 5.1 Notes on MCS51 -   Contents -   Index -
-
- - -

-6. Retargetting for other MCUs. -

- -

-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. - -

- -

    -
  • 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.
  • -
  • 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 -dumpraw option.
  • -
  • This phase does the bulk of the standard optimizations and is also -MCU independent. This phase can be broken down into several sub-phases: -
    - -
    -Break down intermediate code (iCode) into basic blocks. -
    -Do control flow & data flow analysis on the basic blocks. -
    -Do local common subexpression elimination, then global subexpression -elimination -
    -Dead code elimination -
    -Loop optimizations -
    -If loop optimizations caused any changes then do 'global subexpression -elimination' and 'dead code elimination' again.
  • -
  • This phase determines the live-ranges; by live range I mean those -iTemp variables defined by the compiler that still survive after all -the optimizations. Live range analysis is essential for register allocation, -since these computation determines which of these iTemps will be assigned -to registers, and for how long.
  • -
  • Phase five is register allocation. There are two parts to this process. -
    - -
    -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. -
    - -
    -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.
  • -
  • 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.
  • -
  • As mentioned in the optimization section the peep-hole optimizer is -rule based system, which can reprogrammed for other MCUs.
  • -
- -

-


- - -next - -up - -previous - -contents - -index -
- Next: 7. SDCDB - Source - Up: SDCC Compiler User Guide - Previous: 5.1 Notes on MCS51 -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node49.html b/doc/sdccman.html/node49.html deleted file mode 100644 index 58b95f19..00000000 --- a/doc/sdccman.html/node49.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - -7. SDCDB - Source Level Debugger - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 7.1 Compiling for Debugging - Up: SDCC Compiler User Guide - Previous: 6. Retargetting for other -   Contents -   Index -
-
- - -

-7. SDCDB - Source Level Debugger -

- -

-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 (the GNU debugger) as possible. The configuration -and build process is part of the standard compiler installation, 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. - -

-


- -Subsections - - - -

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node5.html b/doc/sdccman.html/node5.html deleted file mode 100644 index 40120072..00000000 --- a/doc/sdccman.html/node5.html +++ /dev/null @@ -1,78 +0,0 @@ - - - - - -1.3 Typographic conventions - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 1.4 Compatibility with previous - Up: 1. Introduction - Previous: 1.2 Open Source -   Contents -   Index -
-
- - -

-1.3 Typographic conventions -

- -

-Throughout this manual, we will use the following convention. Commands -you have to type in are printed in "sans -serif". Code samples are printed in typewriter -font. Interesting items and new terms are printed in italicised -type. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node50.html b/doc/sdccman.html/node50.html deleted file mode 100644 index be9844d9..00000000 --- a/doc/sdccman.html/node50.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - -7.1 Compiling for Debugging - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 7.2 How the Debugger - Up: 7. SDCDB - Source - Previous: 7. SDCDB - Source -   Contents -   Index -
-
- - -

-7.1 Compiling for Debugging -

- -

-The debug option must be specified for all files for which debug -information is to be generated. The complier generates a .cdb file -for each of these files. The linker updates the .cdb file with the -address information. This .cdb is used by the debugger. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node51.html b/doc/sdccman.html/node51.html deleted file mode 100644 index 3f715ccb..00000000 --- a/doc/sdccman.html/node51.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - -7.2 How the Debugger Works - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 7.3 Starting the Debugger - Up: 7. SDCDB - Source - Previous: 7.1 Compiling for Debugging -   Contents -   Index -
-
- - -

-7.2 How the Debugger Works -

- -

-When the -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 .cdb file, the linker updates the .cdb file -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. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node52.html b/doc/sdccman.html/node52.html deleted file mode 100644 index 4a9dc91d..00000000 --- a/doc/sdccman.html/node52.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - -7.3 Starting the Debugger - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 7.4 Command Line Options. - Up: 7. SDCDB - Source - Previous: 7.2 How the Debugger -   Contents -   Index -
-
- - -

-7.3 Starting the Debugger -

- -

-The debugger can be started using the following command line. (Assume -the file you are debugging has the file name foo). -
- -
-sdcdb foo -
- -
-The debugger will look for the following files. - -

- -

    -
  • foo.c - the source file.
  • -
  • foo.cdb - the debugger symbol information file.
  • -
  • foo.ihx - the intel hex format object file.
  • -
- -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node53.html b/doc/sdccman.html/node53.html deleted file mode 100644 index 0b8d0fcb..00000000 --- a/doc/sdccman.html/node53.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - -7.4 Command Line Options. - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 7.5 Debugger Commands. - Up: 7. SDCDB - Source - Previous: 7.3 Starting the Debugger -   Contents -   Index -
-
- - -

-7.4 Command Line Options. -

- -

- -

    -
  • -directory=<source file 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 -directory option -should be -directory=/home/src1:/home/src2. Note there can be no -spaces in the option.
  • -
  • -cd <directory> - change to the <directory>.
  • -
  • -fullname - used by GUI front ends.
  • -
  • -cpu <cpu-type> - this argument is passed to the simulator please -see the simulator docs for details.
  • -
  • -X <Clock frequency > this options is passed to the simulator please -see the simulator docs for details.
  • -
  • -s <serial port file> passed to simulator see the simulator docs for -details.
  • -
  • -S <serial in,out> passed to simulator see the simulator docs for -details.
  • -
- -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node54.html b/doc/sdccman.html/node54.html deleted file mode 100644 index 0f64c687..00000000 --- a/doc/sdccman.html/node54.html +++ /dev/null @@ -1,320 +0,0 @@ - - - - - -7.5 Debugger Commands. - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 7.6 Interfacing with XEmacs. - Up: 7. SDCDB - Source - Previous: 7.4 Command Line Options. -   Contents -   Index -
-
- - -Subsections - - - -
- -

-7.5 Debugger Commands. -

- -

-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. - -

- -

-7.5.1 break [line | file:line | function | file:function] -

- -

-Set breakpoint at specified line or function: -
- -
-sdcdb>break 100 -
-sdcdb>break foo.c:100 -
-sdcdb>break funcfoo -
-sdcdb>break foo.c:funcfoo - -

- -

-7.5.2 clear [line | file:line | function | file:function ] -

- -

-Clear breakpoint at specified line or function: -
- -
-sdcdb>clear 100 -
-sdcdb>clear foo.c:100 -
-sdcdb>clear funcfoo -
-sdcdb>clear foo.c:funcfoo - -

- -

-7.5.3 continue -

- -

-Continue program being debugged, after breakpoint. - -

- -

-7.5.4 finish -

- -

-Execute till the end of the current function. - -

- -

-7.5.5 delete [n] -

- -

-Delete breakpoint number 'n'. If used without any option clear ALL -user defined break points. - -

- -

-7.5.6 info [break | stack | frame | registers ] -

- -

- -

    -
  • info break - list all breakpoints
  • -
  • info stack - show the function call stack.
  • -
  • info frame - show information about the current execution frame.
  • -
  • info registers - show content of all registers.
  • -
- -

- -

-7.5.7 step -

- -

-Step program until it reaches a different source line. - -

- -

-7.5.8 next -

- -

-Step program, proceeding through subroutine calls. - -

- -

-7.5.9 run -

- -

-Start debugged program. - -

- -

-7.5.10 ptype variable -

- -

-Print type information of the variable. - -

- -

-7.5.11 print variable -

- -

-print value of variable. - -

- -

-7.5.12 file filename -

- -

-load the given file name. Note this is an alternate method of loading -file for debugging. - -

- -

-7.5.13 frame -

- -

-print information about current frame. - -

- -

-7.5.14 set srcmode -

- -

-Toggle between C source & assembly source. - -

- -

-7.5.15 ! simulator command -

- -

-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. - -

- -

-7.5.16 quit. -

- -

- -"Watch me now. Iam going Down. My name is Bobby Brown" - -

-


- - -next - -up - -previous - -contents - -index -
- Next: 7.6 Interfacing with XEmacs. - Up: 7. SDCDB - Source - Previous: 7.4 Command Line Options. -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node55.html b/doc/sdccman.html/node55.html deleted file mode 100644 index d67d29eb..00000000 --- a/doc/sdccman.html/node55.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - -7.6 Interfacing with XEmacs. - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 8. Other Processors - Up: 7. SDCDB - Source - Previous: 7.5 Debugger Commands. -   Contents -   Index -
-
- - -

-7.6 Interfacing with XEmacs. -

- -

-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 installation 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): -
- -
-(load-file sdcdbsrc.el) -
- -
-.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 -(<installdir>/bin), then enter the following command ESC-x load-file -sdcdbsrc. To start the interface enter the following command: -
- -
-ESC-x sdcdbsrc -
- -
-You will prompted to enter the file name to be debugged. -
- -
-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. - -

- -

    -
  • sdcdbsrc-cpu-type '51
  • -
  • sdcdbsrc-frequency '11059200
  • -
  • sdcdbsrc-serial nil
  • -
-The following is a list of key mapping for the debugger interface. - -

- -   -
-;; Current Listing ::   -
-;;key               binding                      Comment -  -
-;;--               ----                      ---- -  -
-;;   -
-;; n               sdcdb-next-from-src          SDCDB -next command   -
-;; b               sdcdb-back-from-src          SDCDB -back command   -
-;; c               sdcdb-cont-from-src          SDCDB -continue command  -
-;; s               sdcdb-step-from-src          SDCDB -step command   -
-;; ?               sdcdb-whatis-c-sexp          SDCDB -ptypecommand for data at   -
-;;                                               -buffer point   -
-;; x               sdcdbsrc-delete              SDCDB -Delete all breakpoints if no arg   -
-;;                                              given -or delete arg (C-u arg x)   -
-;; m               sdcdbsrc-frame               SDCDB -Display current frame if no arg,   -
-;;                                               given -or display frame arg   -
-;;                                               buffer -point   -
-;; !               sdcdbsrc-goto-sdcdb          Goto -the SDCDB output buffer   -
-;; p               sdcdb-print-c-sexp           SDCDB -print command for data at   -
-;;                                               -buffer point   -
-;; g               sdcdbsrc-goto-sdcdb          Goto -the SDCDB output buffer   -
-;; t               sdcdbsrc-mode                Toggles -Sdcdbsrc mode (turns it off)   -
-;;   -
-;; C-c C-f         sdcdb-finish-from-src        SDCDB -finish command   -
-;;   -
-;; C-x SPC         sdcdb-break                  Set -break for line with point   -
-;; ESC t           sdcdbsrc-mode                Toggle -Sdcdbsrc mode   -
-;; ESC m           sdcdbsrc-srcmode             -Toggle list mode   -
-;; -
- -

-


- - -next - -up - -previous - -contents - -index -
- Next: 8. Other Processors - Up: 7. SDCDB - Source - Previous: 7.5 Debugger Commands. -   Contents -   Index - -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node56.html b/doc/sdccman.html/node56.html deleted file mode 100644 index 021d2ca4..00000000 --- a/doc/sdccman.html/node56.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - -8. Other Processors - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 8.1 The Z80 and - Up: SDCC Compiler User Guide - Previous: 7.6 Interfacing with XEmacs. -   Contents -   Index -
-
- - -

-8. Other Processors -

- -

-


- -Subsections - - - -

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node57.html b/doc/sdccman.html/node57.html deleted file mode 100644 index 2a25ab29..00000000 --- a/doc/sdccman.html/node57.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - -8.1 The Z80 and gbz80 port - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 9. Support - Up: 8. Other Processors - Previous: 8. Other Processors -   Contents -   Index -
-
- - -

-8.1 The Z80 and gbz80 port -

- -

-SDCC can target both the Zilog Z80 and the Nintendo Gameboy's Z80-like -gbz80. The port is incomplete - long support is incomplete (mul, div -and mod are unimplimented), and both float and bitfield support is -missing. Apart from that the code generated is correct. - -

-As always, the code is the authoritave 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 varibles. -IY is currently unusued. 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. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node58.html b/doc/sdccman.html/node58.html deleted file mode 100644 index 72fe3f14..00000000 --- a/doc/sdccman.html/node58.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - -9. Support - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 9.1 Reporting Bugs - Up: SDCC Compiler User Guide - Previous: 8.1 The Z80 and -   Contents -   Index -
-
- - -

-9. Support -

- -

-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. - -

-


- -Subsections - - - -

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node59.html b/doc/sdccman.html/node59.html deleted file mode 100644 index 7733b3b2..00000000 --- a/doc/sdccman.html/node59.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - -9.1 Reporting Bugs - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 10. Acknowledgments - Up: 9. Support - Previous: 9. Support -   Contents -   Index -
-
- - -

-9.1 Reporting Bugs -

- -

-Send an email to the mailing list at 'user-sdcc@sdcc.sourceforge.net' -or 'devel-sdcc@sdcc.sourceforge.net'. Bugs will be fixed ASAP. When -reporting a bug, it is very useful to include a small test program -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 -dumpall option can sometimes be useful in -locating optimization problems. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node6.html b/doc/sdccman.html/node6.html deleted file mode 100644 index e29c6736..00000000 --- a/doc/sdccman.html/node6.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - -1.4 Compatibility with previous versions - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 1.5 System Requirements - Up: 1. Introduction - Previous: 1.3 Typographic conventions -   Contents -   Index -
-
- - -

-1.4 Compatibility with previous versions -

- -

-This version has numerous bug fixes compared with the previous version. -But we also introduced some incompatibilities with older versions. -Not just for the fun of it, but to make the compiler more stable, -efficient and ANSI compliant. -
- -

- -

    -
  • short is now equivalent to int (16 bits), it used to be equivalent -to char (8 bits)
  • -
  • the default directory where include, library and documention files -are stored is no in /usr/local/share
  • -
  • char type parameters to vararg functions are casted to int unless -explicitly casted, e.g.: -
    -  char a=3;  -
    -  printf ("%d %c\n", -a, (char)a); -
    -will push a as an int and as a char resp.
  • -
  • option -regextend has been removed
  • -
  • option -noreparms has been removed
  • -
-<pending: more incompatibilities?> - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node60.html b/doc/sdccman.html/node60.html deleted file mode 100644 index 8851f351..00000000 --- a/doc/sdccman.html/node60.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - -10. Acknowledgments - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: Index - Up: SDCC Compiler User Guide - Previous: 9.1 Reporting Bugs -   Contents -   Index -
-
- - -

-10. Acknowledgments -

- -

-Sandeep Dutta (sandeep.dutta@usa.net) - SDCC, the compiler, MCS51 -code generator, Debugger, AVR port -
-Alan Baldwin (baldwin@shop-pdp.kent.edu) - Initial version of ASXXXX -& ASLINK. -
-John Hartman (jhartman@compuserve.com) - Porting ASXXX & ASLINK for -8051 -
-Dmitry S. Obukhov (dso@usa.net) - malloc & serial i/o routines. -
-Daniel Drotos (drdani@mazsola.iit.uni-miskolc.hu) - for his Freeware -simulator -
-Malini Dutta(malini_dutta@hotmail.com) - my wife for her patience -and support. -
-Unknown - for the GNU C - preprocessor. -
-Michael Hope - The Z80 and Z80GB port, 186 development -
-Kevin Vigor - The DS390 port. -
-Johan Knol - Lots of fixes and enhancements, DS390/TINI libs. -
-Scott Datallo - The PIC port. -
- -
-Thanks to all the other volunteer developers who have helped -with coding, testing, web-page creation, distribution sets, etc. You -know who you are :-) -
- -

-This document was initially written by Sandeep Dutta - -

-All product names mentioned herein may be trademarks of their respective -companies. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node61.html b/doc/sdccman.html/node61.html deleted file mode 100644 index a1da729d..00000000 --- a/doc/sdccman.html/node61.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - -Index - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents -
- Next: About this document ... - Up: SDCC Compiler User Guide - Previous: 10. Acknowledgments -   Contents -
-
- -
- -

-Index -

-
index -
1.7 Wishes for the - -
-

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node62.html b/doc/sdccman.html/node62.html deleted file mode 100644 index 7bbeb778..00000000 --- a/doc/sdccman.html/node62.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - -About this document ... - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Up: SDCC Compiler User Guide - Previous: Index -   Contents -   Index -
-
- - -

-About this document ... -

- SDCC Compiler User Guide

-This document was generated using the -LaTeX2HTML translator Version 99.1 release (March 30, 1999) -

-Copyright © 1993, 1994, 1995, 1996, -Nikos Drakos, -Computer Based Learning Unit, University of Leeds. -
-Copyright © 1997, 1998, 1999, -Ross Moore, -Mathematics Department, Macquarie University, Sydney. -

-The command line arguments were:
- latex2html -split 5 -show_section_numbers -dir sdccman.html sdccman -

-The translation was initiated by Johan Knol on 2001-07-13 -


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node7.html b/doc/sdccman.html/node7.html deleted file mode 100644 index fb897917..00000000 --- a/doc/sdccman.html/node7.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - -1.5 System Requirements - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 1.6 Other Resources - Up: 1. Introduction - Previous: 1.4 Compatibility with previous -   Contents -   Index -
-
- - -

-1.5 System Requirements -

- -

-What do you need before you start installation of SDCC? A computer, -and a desire to compute. The preferred method of installation is to -compile SDCC from source using GNU gcc and make. For Windows some -pre-compiled binary distributions are available for your convenience. -You should have some experience with command line tools and compiler -use. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node8.html b/doc/sdccman.html/node8.html deleted file mode 100644 index 28cb2013..00000000 --- a/doc/sdccman.html/node8.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - -1.6 Other Resources - - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 1.7 Wishes for the - Up: 1. Introduction - Previous: 1.5 System Requirements -   Contents -   Index -
-
- - -

-1.6 Other Resources -

- -

-The SDCC home page at http://sdcc.sourceforge.net/ is a great -place to find distribution sets. You can also find links to the user -mailing lists that offer help or discuss SDCC with other SDCC users. -Web links to other SDCC related sites can also be found here. This -document can be found in the DOC directory of the source package as -a text or HTML file. Some of the other tools (simulator and assembler) -included with SDCC contain their own documentation and can be found -in the source distribution. If you want the latest unreleased software, -the complete source package is available directly by anonymous CVS -on cvs.sdcc.sourceforge.net. - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/node9.html b/doc/sdccman.html/node9.html deleted file mode 100644 index 8ce4696b..00000000 --- a/doc/sdccman.html/node9.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - -1.7 Wishes for the future - - - - - - - - - - - - - - - - - - - -next - -up - -previous - -contents - -index -
- Next: 2. Installation - Up: 1. Introduction - Previous: 1.6 Other Resources -   Contents -   Index -
-
- - -

-1.7 Wishes for the future -

- -

-There are (and always will be) some things that could be done. Here -are some I can think of: -
- -

- -sdcc -c -model-large -o large _atoi.c (where large -could be a different basename or a directory) -
- -

- -char KernelFunction3(char p) at 0x340;  -
  -
-If you can think of some more, please send them to the list. -
- -
-<pending: And then of course a proper index-table> - -

-


-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/previous_motif.gif b/doc/sdccman.html/previous_motif.gif deleted file mode 100644 index c38778c7c4d1675a820227a660cfcbcf7add4261..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmV<203-iLNk%w1VLt#E0Pz3-zrVld=jU&4Z(9HWA^8LW00000EC2ui06zd200085 zjE||y?GK}zNf>~$-n{z{YJwGn=81mem9{RpmhVghaW>?7jS9R-!fA59BIefH_>4a! zU@3e`d%LL+s>2Sc#EcXATz0KftyLUNf}!86ITqyHqds`GU W((C&R94tIc92`)LoUDvo002AL@MJFl diff --git a/doc/sdccman.html/previous_motif_gr.gif b/doc/sdccman.html/previous_motif_gr.gif deleted file mode 100644 index d5398b3e86885ce5a160d654f8b5b48805bfc303..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmV<203-iLNk%w1VLt#E0Pz3-zrVld=jU&4Z-Rn?A^8LW00000EC2ui06zd200085 zjE||y?GK}zNf>~$-n{z{YJwGn=81mem9{RpmhVghaW>?7jS9R-!fA59BIefH_>4a! zU@3e`d%LL+s>2Sc#EcXATz0KftyLUNf}!86ITqyHqds`GU W((C&R94tIc92`)LoUDvo0029`yJcDc diff --git a/doc/sdccman.html/sdccman.html b/doc/sdccman.html/sdccman.html deleted file mode 100644 index de73f32a..00000000 --- a/doc/sdccman.html/sdccman.html +++ /dev/null @@ -1,348 +0,0 @@ - - - - - -SDCC Compiler User Guide - - - - - - - - - - - - - - - - - -next -up -previous - -contents - -index -
- Next: Contents -   Contents -   Index -
-
- - -

- -

- -

SDCC Compiler User Guide

-

- - - - - -

-
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/sdccman.html/up_motif.gif b/doc/sdccman.html/up_motif.gif deleted file mode 100644 index c7c9cf726473d02981a6e9cff6c16e9be35e6a93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 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

k6%g@F*EUPi#Qq5I*wGtw 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�!K=h`DPqQjp=@qYJi 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%0A@>l7tz`QwhI7 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ⅆ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 Library Routines - Interfacing with Assembly Routines - Global Registers used for Parameter Passing - Assembler Routine(non-reentrant) - Assembler Routine(reentrant) - External Stack - ANSI-Compliance - Cyclomatic Complexity -TIPS - Notes on MCS51 memory layout -Retargetting for other MCUs. -SDCDB - Source Level Debugger - Compiling for Debugging - How the Debugger Works - Starting the Debugger - Command Line Options. - Debugger Commands. - break [line | file:line | function | file:function] - clear [line | file:line | function | file:function ] - continue - finish - delete [n] - info [break | stack | frame | registers ] - step - next - run - ptype variable - print variable - file filename - frame - set srcmode - ! simulator command - quit. - Interfacing with XEmacs. -Other Processors - The Z80 and gbz80 port -Support - Reporting Bugs -Acknowledgments - - - - Introduction - - About SDCC - -SDCC is a Freeware, retargettable, optimizing ANSI-C compiler -by Sandeep Dutta designed for 8 bit Microprocessors. The -current version targets Intel MCS51 based Microprocessors(8051,8052, -etc), Zilog Z80 based MCUs, and the Dallas DS80C390 variant. -It can be retargetted for other microprocessors, support -for PIC, AVR and 186 is under development. The entire source -code for the compiler is distributed under GPL. SDCC uses -ASXXXX & ASLINK, a Freeware, retargettable assembler & linker. -SDCC has extensive language extensions suitable for utilizing -various microcontrollers and underlying hardware effectively. - - -In addition to the MCU specific optimizations SDCC also does -a host of standard optimizations like: - - global sub expression elimination, - - loop optimizations (loop invariant, strength reduction - of induction variables and loop reversing), - - constant folding & propagation, - - copy propagation, - - dead code elimination - - jumptables for switch statements. - -For the back-end SDCC uses a global register allocation scheme -which should be well suited for other 8 bit MCUs. - -The peep hole optimizer uses a rule based substitution mechanism -which is MCU independent. - -Supported data-types are: - - char (8 bits, 1 byte), - - short and int (16 bits, 2 bytes), - - long (32 bit, 4 bytes) - - float (4 byte IEEE). - -The compiler also allows inline assembler code to be embedded -anywhere in a function. In addition, routines developed -in assembly can also be called. - -SDCC also provides an option (--cyclomatic) to report the -relative complexity of a function. These functions can then -be further optimized, or hand coded in assembly if needed. - - -SDCC also comes with a companion source level debugger SDCDB, -the debugger currently uses ucSim a freeware simulator for -8051 and other micro-controllers. - -The latest version can be downloaded from [http://sdcc.sourceforge.net/]. - - Open Source - -All packages used in this compiler system are opensource -and freeware; source code for all the sub-packages (asxxxx -assembler/linker, pre-processor) is distributed with the -package. This documentation is maintained using a freeware -word processor (LyX). - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version -2, or (at your option) any later version. This program is -distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -Public License for more details. You should have received -a copy of the GNU General Public License along with this -program; if not, write to the Free Software Foundation, -59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -In other words, you are welcome to use, share and improve -this program. You are forbidden to forbid anyone else to -use, share and improve what you give them. Help stamp out -software-hoarding! - - Typographic conventions - -Throughout this manual, we will use the following convention. -Commands you have to type in are printed in "sans serif". -Code samples are printed in typewriter font. Interesting -items and new terms are printed in italicised type. - - Compatibility with previous versions - -This version has numerous bug fixes compared with the previous -version. But we also introduced some incompatibilities with -older versions. Not just for the fun of it, but to make -the compiler more stable, efficient and ANSI compliant. - - - short is now equivalent to int (16 bits), it used to be - equivalent to char (8 bits) - - the default directory where include, library and documention - files are stored is no in /usr/local/share - - char type parameters to vararg functions are casted to - int unless explicitly casted, e.g.: - char a=3; - printf ("%d %c\n", a, (char)a); - will push a as an int and as a char resp. - - option --regextend has been removed - - option --noreparms has been removed - - - - System Requirements - -What do you need before you start installation of SDCC? A -computer, and a desire to compute. The preferred method -of installation is to compile SDCC from source using GNU -gcc and make. For Windows some pre-compiled binary distributions -are available for your convenience. You should have some -experience with command line tools and compiler use. - - Other Resources - -The SDCC home page at [http://sdcc.sourceforge.net/] -is a great place to find distribution sets. You can also -find links to the user mailing lists that offer help or -discuss SDCC with other SDCC users. Web links to other SDCC -related sites can also be found here. This document can -be found in the DOC directory of the source package as a -text or HTML file. Some of the other tools (simulator and -assembler) included with SDCC contain their own documentation -and can be found in the source distribution. If you want -the latest unreleased software, the complete source package -is available directly by anonymous CVS on cvs.sdcc.sourceforge.net. - - Wishes for the future - -There are (and always will be) some things that could be -done. Here are some I can think of: - - -sdcc -c --model-large -o large _atoi.c (where large could -be a different basename or a directory) - - -char KernelFunction3(char p) at 0x340; - -If you can think of some more, please send them to the list. - - - - Installation - - Linux/Unix Installation - - Download the source package, it will be named something - like sdcc-2.x.x.tgz. - - Bring up a command line terminal, such as xterm. - - Unpack the file using a command like: "tar -xzf sdcc-2.x.x.tgz", - this will create a sub-directory called sdcc with all - of the sources. - - Change directory into the main SDCC directory, for example - type: "cd sdcc". - - Type "./configure". This configures the package for compilation - on your system. - - Type "make". All of the source packages will compile, this - can take a while. - - Type "make install" as root. This copies the binary executables, - the include files, the libraries and the documentation - to the install directories. - - Windows Installation - - - -For installation under Windows you first need to pick between -a pre-compiled binary package, or installing the source -package along with the Cygwin package. The binary package -is the quickest to install, while the Cygwin package includes -all of the open source power tools used to compile the complete -SDCC source package in the Windows environment. If you are -not familiar with the Unix command line environment, you -may want to read the section on additional information for -Windows users prior to your initial installation. - - Windows Install Using a Binary Package - - Download the binary package and unpack it using your favorite - unpacking tool (gunzip, WinZip, etc). This should unpack - to a group of sub-directories. An example directory structure - after unpacking is: c:\usr\local\bin for the executables, - c:\usr\local\share\sdcc\include and c:\usr\local\share\sdcc\lib - for the include and libraries. - - Adjust your environment PATH to include the location of - the bin directory. For example, make a setsdcc.bat file - with the following: set PATH=c:\usr\local\bin;%PATH% - - When you compile with sdcc, you may need to specify the - location of the lib and include folders. For example, - sdcc -I c:\usr\local\share\sdcc\include -L c:\usr\local\share\sdcc\lib\small - test.c - - Windows Install Using Cygwin - - Download and install the cygwin package from the redhat - site[http://sources.redhat.com/cygwin/]. Currently, - this involved downloading a small install program which - then automates downloading and installing selected parts - of the package (a large 80M byte sized dowload for the - whole thing). - - Bring up a Unix/Bash command line terminal from the Cygwin - menu. - - Follow the instructions in the preceding Linux/Unix installation - section. - - Testing out the SDCC Compiler - -The first thing you should do after installing your SDCC -compiler is to see if it runs. Type "sdcc --version" at -the prompt, and the program should run and tell you the -version. If it doesn't run, or gives a message about not -finding sdcc program, then you need to check over your installation. -Make sure that the sdcc bin directory is in your executable -search path defined by the PATH environment setting (see -the Trouble-shooting section for suggestions). Make sure -that the sdcc program is in the bin folder, if not perhaps -something did not install correctly. - -SDCC binaries are commonly installed in a directory arrangement -like this: - -+--------------------------------+-------------------------------------------+ -| /usr/local/bin | Holds executables(sdcc, s51, aslink, ...) | -+--------------------------------+-------------------------------------------+ -+--------------------------------+-------------------------------------------+ -| /usr/local/share/sdcc/lib | Holds common C libraries | -+--------------------------------+-------------------------------------------+ -| /usr/local/share/sdcc/include | Holds common C header files | -+--------------------------------+-------------------------------------------+ - - -Make sure the compiler works on a very simple example. Type -in the following test.c program using your favorite editor: - -int test(int t) { - return t+3; -} - -Compile this using the following command: "sdcc -c test.c". -If all goes well, the compiler will generate a test.asm -and test.rel file. Congratulations, you've just compiled -your first program with SDCC. We used the -c option to tell -SDCC not to link the generated code, just to keep things -simple for this step. - -The next step is to try it with the linker. Type in "sdcc -test.c". If all goes well the compiler will link with the -libraries and produce a test.ihx output file. If this step -fails (no test.ihx, and the linker generates warnings), -then the problem is most likely that sdcc cannot find the -/usr/local/share/sdcc/lib directory (see the Install trouble-shooting -section for suggestions). - -The final test is to ensure sdcc can use the standard header -files and libraries. Edit test.c and change it to the following: - -#include -main() { -char str1[10]; - strcpy(str1, "testing"); -} - -Compile this by typing "sdcc test.c". This should generate -a test.ihx output file, and it should give no warnings such -as not finding the string.h file. If it cannot find the -string.h file, then the problem is that sdcc cannot find -the /usr/local/share/sdcc/include directory (see the Install -trouble-shooting section for suggestions). - - Install Trouble-shooting - - SDCC cannot find libraries or header files. - -The default installation assumes the libraries and header -files are located at "/usr/local/share/sdcc/lib" -and "/usr/local/share/sdcc/include". -An alternative is to specify these locations as compiler -options like this: "sdcc -L /usr/local/sdcc/lib/small -I /usr/local/sdcc/include test.c". - - SDCC does not compile correctly. - -A thing to try is starting from scratch by unpacking the -.tgz source package again in an empty directory. Confure -it again and build like: - -make 2&>1 | tee make.log - -After this you can review the make.log file to locate the -problem. Or a relevant part of this be attached to an email -that could be helpful when requesting help from the mailing -list. - - What the "./configure" - does - -The "./configure" command is a script -that analyzes your system and performs some configuration -to ensure the source package compiles on your system. It -will take a few minutes to run, and will compile a few tests -to determine what compiler features are installed. - - What the "make" does. - -This runs the GNU make tool, which automatically compiles -all the source packages into the final installed binary -executables. - - What the "make install" - command does. - -This will install the compiler, other executables and libraries -in to the appropriate system directories. The default is -to copy the executables to /usr/local/bin and the libraries -and header files to /usr/local/share/sdcc/lib and /usr/local/share/sdcc/include. - - Additional Information for Windows Users - - - -The standard method of installing on a Unix system involves -compiling the source package. This is easily done under -Unix, but under Windows it can be a more difficult process. -The Cygwin is a large package to download, and the compilation -runs considerably slower under Windows due to the overhead -of the Cygwin tool set. An alternative is to install a pre-compiled -Windows binary package. There are various trade-offs between -each of these methods. - -The Cygwin package allows a Windows user to run a Unix command -line interface (bash shell) and also implements a Unix like -file system on top of Windows. Included are many of the -famous GNU software development tools which can augment -the SDCC compiler.This is great if you have some experience -with Unix command line tools and file system conventions, -if not you may find it easier to start by installing a binary -Windows package. The binary packages work with the Windows -file system conventions. - - Getting started with Cygwin - -SDCC is typically distributed as a tarred/gzipped file (.tgz). -This is a packed file similar to a .zip file. Cygwin includes -the tools you will need to unpack the SDCC distribution -(tar and gzip). To unpack it, simply follow the instructions -under the Linux/Unix install section. Before you do this -you need to learn how to start a cygwin shell and some of -the basic commands used to move files, change directory, -run commands and so on. The change directory command is -"cd", the move command is "mv". -To print the current working directory, type "pwd". -To make a directory, use "mkdir". - -There are some basic differences between Unix and Windows -file systems you should understand. When you type in directory -paths, Unix and the Cygwin bash prompt uses forward slashes -'/' between directories while Windows traditionally uses -'\' backward slashes. So when you work at the Cygwin bash -prompt, you will need to use the forward '/' slashes. Unix -does not have a concept of drive letters, such as "c:", -instead all files systems attach and appear as directories. - - Running SDCC as Native Compiled Executables - -If you use the pre-compiled binaries, the install directories -for the libraries and header files may need to be specified -on the sdcc command line like this: "sdcc -L c:\usr\local\sdcc\lib\small --I c:\usr\local\sdcc\include test.c" if you are running outside -of a Unix bash shell. - -If you have successfully installed and compiled SDCC with -the Cygwin package, it is possible to compile into native -.exe files by using the additional makefiles included for -this purpose. For example, with the Borland 32-bit compiler -you would run "make -f Makefile.bcc". A command line version -of the Borland 32-bit compiler can be downloaded from the -Inprise web site. - - SDCC on Other Platforms - - FreeBSD and other non-GNU Unixes - Make sure the GNU make - is installed as the default make tool. - - SDCC has been ported to run under a variety of operating - systems and processors. If you can run GNU GCC/make then - chances are good SDCC can be compiled and run on your - system. - - Advanced Install Options - -The "configure" command has several options. -The most commonly used option is --prefix=, -where is the final location for the sdcc -executables and libraries, (default location is /usr/local). -The installation process will create the following directory -structure under the specified (if they -do not already exist). - -bin/ - binary exectables (add to PATH environment variable) -bin/share/ -bin/share/sdcc/include/ - include header files -bin/share/sdcc/lib/ -bin/share/sdcc/lib/small/ - Object & library files for small -model library -bin/share/sdcc/lib/large/ - Object & library files for large -model library -bin/share/sdcc/lib/ds390/ - Object & library files forDS80C390 -library - -The command "./configure --prefix=/usr/local" -will configure the compiler to be installed in directory -/usr/local. - - Components of SDCC - -SDCC is not just a compiler, but a collection of tools by -various developers. These include linkers, assemblers, simulators -and other components. Here is a summary of some of the components. -Note that the included simulator and assembler have separate -documentation which you can find in the source package in -their respective directories. As SDCC grows to include support -for other processors, other packages from various developers -are included and may have their own sets of documentation. - -You might want to look at the files which are installed in -. At the time of this writing, we find the following -programs: - -In /bin: - - sdcc - The compiler. - - sdcpp - The C preprocessor. - - asx8051 - The assembler for 8051 type processors. - - as-z80, as-gbz80 - The Z80 and GameBoy Z80 assemblers. - - aslink -The linker for 8051 type processors. - - link-z80, link-gbz80 - The Z80 and GameBoy Z80 linkers. - - s51 - The ucSim 8051 simulator. - - sdcdb - The source debugger. - - packihx - A tool to pack Intel hex files. - -In /share/sdcc/include - - the include files - -In /share/sdcc/lib - - the sources of the runtime library and the subdirs small - large and ds390 with the precompiled relocatables. - -In /share/sdcc/doc - - the documentation - -As development for other processors proceeds, this list will -expand to include executables to support processors like -AVR, PIC, etc. - - sdcc - The Compiler - -This is the actual compiler, it in turn uses the c-preprocessor -and invokes the assembler and linkage editor. - - sdcpp (C-Preprocessor) - -The preprocessor is a modified version of the GNU preprocessor. -The C preprocessor is used to pull in #include sources, -process #ifdef statements, #defines and so on. - - asx8051, as-z80, as-gbz80, aslink, link-z80, link-gbz80 - (The Assemblers and Linkage Editors) - -This is retargettable assembler & linkage editor, it was -developed by Alan Baldwin. John Hartman created the version -for 8051, and I (Sandeep) have made some enhancements and -bug fixes for it to work properly with the SDCC. - - s51 - Simulator - -S51 is a freeware, opensource simulator developed by Daniel -Drotos ([mailto:drdani@mazsola.iit.uni-miskolc.hu]). -The simulator is built as part of the build process. For -more information visit Daniel's website at: [http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51] . - - sdcdb - Source Level Debugger - -Sdcdb is the companion source level debugger. The current -version of the debugger uses Daniel's Simulator S51, but -can be easily changed to use other simulators. - - Using SDCC - - Compiling - - Single Source File Projects - -For single source file 8051 projects the process is very -simple. Compile your programs with the following command -"sdcc sourcefile.c". This will compile, assemble and link -your source file. Output files are as follows - -sourcefile.asm - Assembler source file created by the compiler -sourcefile.lst - Assembler listing file created by the Assembler -sourcefile.rst - Assembler listing file updated with linkedit -information, created by linkage editor -sourcefile.sym - symbol listing for the sourcefile, created -by the assembler -sourcefile.rel - Object file created by the assembler, input -to Linkage editor -sourcefile.map - The memory map for the load module, created -by the Linker -sourcefile.ihx - The load module in Intel hex format (you -can select the Motorola S19 format with --out-fmt-s19) -sourcefile.cdb - An optional file (with --debug) containing -debug information - - - Projects with Multiple Source Files - -SDCC can compile only ONE file at a time. Let us for example -assume that you have a project containing the following -files: - -foo1.c (contains some functions) -foo2.c (contains some more functions) -foomain.c (contains more functions and the function main) - -The first two files will need to be compiled separately with -the commands: - -sdcc -c foo1.c -sdcc -c foo2.c - -Then compile the source file containing the main() function -and link the files together with the following command: - - -sdcc foomain.c foo1.rel foo2.rel - -Alternatively, foomain.c can be separately compiled as well: - - -sdcc -c foomain.c -sdcc foomain.rel foo1.rel foo2.rel - -The file containing the main() function must be the first -file specified in the command line, since the linkage editor -processes file in the order they are presented to it. - - Projects with Additional Libraries - -Some reusable routines may be compiled into a library, see -the documentation for the assembler and linkage editor (which -are in /share/sdcc/doc) for how to create a -.lib library file. Libraries created in this manner can -be included in the command line. Make sure you include the --L option to tell the linker where to look -for these files if they are not in the current directory. -Here is an example, assuming you have the source file foomain.c -and a library foolib.lib in the directory mylib (if that -is not the same as your current project): - -sdcc foomain.c foolib.lib -L mylib - -Note here that mylib must be an absolute path name. - -The most efficient way to use libraries is to keep seperate -modules in seperate source files. The lib file now should -name all the modules.rel files. For an example see the standard -library file libsdcc.lib in the directory /share/lib/small. - - Command Line Options - - Processor Selection Options - --mmcs51 Generate code for the MCS51 (8051) family of processors. -This is the default processor target. - --mds390 Generate code for the DS80C390 processor. - --mz80 Generate code for the Z80 family of processors. - --mgbz80 Generate code for the GameBoy Z80 processor. - --mavr Generate code for the Atmel AVR processor(In development, -not complete). - --mpic14 Generate code for the PIC 14-bit processors(In development, -not complete). - --mtlcs900h Generate code for the Toshiba TLCS-900H processor(In -development, not complete). - - Preprocessor Options - --I The additional location where the pre processor -will look for <..h> or "..h" -files. - --D Command line definition of macros. Passed -to the pre processor. - --M Tell the preprocessor to output a rule suitable for make -describing the dependencies of each object file. For each -source file, the preprocessor outputs one make-rule whose -target is the object file name for that source file and -whose dependencies are all the files `#include'd in it. -This rule may be a single line or may be continued with -`\'-newline if it is long. The list of rules is printed on -standard output instead of the preprocessed C program. `-M' -implies `-E'. - --C Tell the preprocessor not to discard comments. Used with -the `-E' option. - --MM Like `-M' but the output mentions only the user header -files included with `#include "file"'. -System header files included with `#include ' are -omitted. - --Aquestion(answer) Assert the answer answer for question, -in case it is tested with a preprocessor conditional such -as `#if #question(answer)'. `-A-' disables the standard -assertions that normally describe the target machine. - --Aquestion (answer) Assert the answer answer for question, -in case it is tested with a preprocessor conditional such -as `#if #question(answer)'. `-A-' disables the standard -assertions that normally describe the target machine. - --Umacro Undefine macro macro. `-U' options are evaluated -after all `-D' options, but before any `-include' and `-imacros' -options. - --dM Tell the preprocessor to output only a list of the macro -definitions that are in effect at the end of preprocessing. -Used with the `-E' option. - --dD Tell the preprocessor to pass all macro definitions into -the output, in their proper sequence in the rest of the -output. - --dN Like `-dD' except that the macro arguments and contents -are omitted. Only `#define name' is included in the output. - - Linker Options - --L --lib-path This -option is passed to the linkage editor's additional libraries -search path. The path name must be absolute. Additional -library files may be specified in the command line. See -section Compiling programs for more details. - ---xram-loc The start location of the external ram, -default value is 0. The value entered can be in Hexadecimal -or Decimal format, e.g.: --xram-loc 0x8000 or --xram-loc -32768. - ---code-loc The start location of the code segment, -default value 0. Note when this option is used the interrupt -vector table is also relocated to the given address. The -value entered can be in Hexadecimal or Decimal format, e.g.: ---code-loc 0x8000 or --code-loc 32768. - ---stack-loc The initial value of the stack pointer. -The default value of the stack pointer is 0x07 if only register -bank 0 is used, if other register banks are used then the -stack pointer is initialized to the location above the highest -register bank used. eg. if register banks 1 & 2 are used -the stack pointer will default to location 0x18. The value -entered can be in Hexadecimal or Decimal format, eg. --stack-loc -0x20 or --stack-loc 32. If all four register banks are used -the stack will be placed after the data segment (equivalent -to --stack-after-data) - ---stack-after-data This option will cause the stack to be -located in the internal ram after the data segment. - ---data-loc The start location of the internal ram -data segment, the default value is 0x30.The value entered -can be in Hexadecimal or Decimal format, eg. --data-loc -0x20 or --data-loc 32. - ---idata-loc The start location of the indirectly addressable -internal ram, default value is 0x80. The value entered can -be in Hexadecimal or Decimal format, eg. --idata-loc 0x88 -or --idata-loc 136. - ---out-fmt-ihx The linker output (final object code) is in -Intel Hex format. (This is the default option). - ---out-fmt-s19 The linker output (final object code) is in -Motorola S19 format. - - MCS51 Options - ---model-large Generate code for Large model programs see -section Memory Models for more details. If this option is -used all source files in the project should be compiled -with this option. In addition the standard library routines -are compiled with small model, they will need to be recompiled. - ---model-small Generate code for Small Model programs see -section Memory Models for more details. This is the default -model. - - DS390 Options - ---model-flat24 Generate 24-bit flat mode code. This is the -one and only that the ds390 code generator supports right -now and is default when using -mds390. See section Memory -Models for more details. - ---stack-10bit Generate code for the 10 bit stack mode of -the Dallas DS80C390 part. This is the one and only that -the ds390 code generator supports right now and is default -when using -mds390. In this mode, the stack is located in -the lower 1K of the internal RAM, which is mapped to 0x400000. -Note that the support is incomplete, since it still uses -a single byte as the stack pointer. This means that only -the lower 256 bytes of the potential 1K stack space will -actually be used. However, this does allow you to reclaim -the precious 256 bytes of low RAM for use for the DATA and -IDATA segments. The compiler will not generate any code -to put the processor into 10 bit stack mode. It is important -to ensure that the processor is in this mode before calling -any re-entrant functions compiled with this option. In principle, -this should work with the --stack-auto option, but that -has not been tested. It is incompatible with the --xstack -option. It also only makes sense if the processor is in -24 bit contiguous addressing mode (see the --model-flat24 -option). - - Optimization Options - ---nogcse Will not do global subexpression elimination, this -option may be used when the compiler creates undesirably -large stack/data spaces to store compiler temporaries. A -warning message will be generated when this happens and -the compiler will indicate the number of extra bytes it -allocated. It recommended that this option NOT be used, -#pragma NOGCSE can be used to turn off global subexpression -elimination for a given function only. - ---noinvariant Will not do loop invariant optimizations, this -may be turned off for reasons explained for the previous -option. For more details of loop optimizations performed -see section Loop Invariants.It recommended that this option -NOT be used, #pragma NOINVARIANT can -be used to turn off invariant optimizations for a given -function only. - ---noinduction Will not do loop induction optimizations, see -section strength reduction for more details.It is recommended -that this option is NOT used, #pragma NOINDUCTION -can be used to turn off induction optimizations for a given -function only. - ---nojtbound Will not generate boundary condition check when -switch statements are implemented using jump-tables. See -section Switch Statements for more details. It is recommended -that this option is NOT used, #pragma NOJTBOUND -can be used to turn off boundary checking for jump tables -for a given function only. - ---noloopreverse Will not do loop reversal optimization. - - Other Options - --c --compile-only will compile and assemble the source, -but will not call the linkage editor. - --E Run only the C preprocessor. Preprocess all the C source -files specified and output the results to standard output. - ---stack-auto All functions in the source file will be compiled -as reentrant, i.e. the parameters and local variables will -be allocated on the stack. see section Parameters and Local -Variables for more details. If this option is used all source -files in the project should be compiled with this option. - ---xstack Uses a pseudo stack in the first 256 bytes in the -external ram for allocating variables and passing parameters. -See section on external stack for more details. - ---callee-saves function1[,function2][,function3].... The -compiler by default uses a caller saves convention for register -saving across function calls, however this can cause unneccessary -register pushing & popping when calling small functions -from larger functions. This option can be used to switch -the register saving convention for the function names specified. -The compiler will not save registers when calling these -functions, no extra code will be generated 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 interprocedural analysis) -will be able to determine the appropriate scheme to use -for each function call. DO NOT use this option for built-in -functions such as _muluint..., if this option is used for -a library function the appropriate library function needs -to be recompiled with the same option. If the project consists -of multiple source files then all the source file should -be compiled with the same --callee-saves option string. -Also see #pragma CALLEE-SAVES. - ---debug When this option is used the compiler will generate -debug information, that can be used with the SDCDB. The -debug information is collected in a file with .cdb extension. -For more information see documentation for SDCDB. - ---regextend This option is obsolete and isn't supported -anymore. - ---noregparms This option is obsolete and isn't supported -anymore. - ---peep-file This option can be used to use additional -rules to be used by the peep hole optimizer. See section -Peep Hole optimizations for details on how to write these -rules. - --S Stop after the stage of compilation proper; do not assemble. -The output is an assembler code file for the input file -specified. - --Wa_asmOption[,asmOption]... Pass the asmOption to the assembler. - --Wl_linkOption[,linkOption]... Pass the linkOption to the -linker. - ---int-long-reent Integer (16 bit) and long (32 bit) libraries -have been compiled as reentrant. Note by default these libraries -are compiled as non-reentrant. See section Installation -for more details. - ---cyclomatic This option will cause the compiler to generate -an information message for each function in the source file. -The message contains some important information about the -function. The number of edges and nodes the compiler detected -in the control flow graph of the function, and most importantly -the cyclomatic complexity see section on Cyclomatic Complexity -for more details. - ---float-reent Floating point library is compiled as reentrant.See -section Installation for more details. - ---nooverlay The compiler will not overlay parameters and -local variables of any function, see section Parameters -and local variables for more details. - ---main-return This option can be used when the code generated -is called by a monitor program. The compiler will generate -a 'ret' upon return from the 'main' function. The default -option is to lock up i.e. generate a 'ljmp '. - ---no-peep Disable peep-hole optimization. - ---peep-asm Pass the inline assembler code through the peep -hole optimizer. This can cause unexpected changes to inline -assembler code, please go through the peephole optimizer -rules defined in the source file tree '/peeph.def' -before using this option. - ---iram-size Causes the linker to check if the interal -ram usage is within limits of the given value. - ---nostdincl This will prevent the compiler from passing on -the default include path to the preprocessor. - ---nostdlib This will prevent the compiler from passing on -the default library path to the linker. - ---verbose Shows the various actions the compiler is performing. - --V Shows the actual commands the compiler is executing. - - Intermediate Dump Options - -The following options are provided for the purpose of retargetting -and debugging the compiler. These provided a means to dump -the intermediate code (iCode) generated by the compiler -in human readable form at various stages of the compilation -process. - ---dumpraw This option will cause the compiler to dump the -intermediate code into a file of named .dumpraw -just after the intermediate code has been generated for -a function, i.e. before any optimizations are done. The -basic blocks at this stage ordered in the depth first number, -so they may not be in sequence of execution. - ---dumpgcse Will create a dump of iCode's, after global subexpression -elimination, into a file named .dumpgcse. - ---dumpdeadcode Will create a dump of iCode's, after deadcode -elimination, into a file named .dumpdeadcode. - ---dumploop Will create a dump of iCode's, after loop optimizations, -into a file named .dumploop. - ---dumprange Will create a dump of iCode's, after live range -analysis, into a file named .dumprange. - ---dumlrange Will dump the life ranges for all symbols. - ---dumpregassign Will create a dump of iCode's, after register -assignment, into a file named .dumprassgn. - ---dumplrange Will create a dump of the live ranges of iTemp's - ---dumpall Will cause all the above mentioned dumps to be -created. - - MCS51/DS390 Storage Class Language Extensions - -In addition to the ANSI storage classes SDCC allows the following -MCS51 specific storage classes. - - xdata - -Variables declared with this storage class will be placed -in the extern RAM. This is the default storage class for -Large Memory model, e.g.: - -xdata unsigned char xduc; - - data - -This is the default storage class for Small Memory model. -Variables declared with this storage class will be allocated -in the internal RAM, e.g.: - -data int iramdata; - - idata - -Variables declared with this storage class will be allocated -into the indirectly addressable portion of the internal -ram of a 8051, e.g.: - -idata int idi; - - bit - -This is a data-type and a storage class specifier. When a -variable is declared as a bit, it is allocated into the -bit addressable memory of 8051, e.g.: - -bit iFlag; - - sfr / sbit - -Like the bit keyword, sfr / sbit signifies both a data-type -and storage class, they are used to describe the special -function registers and special bit variables of a 8051, -eg: - -sfr at 0x80 P0; /* special function register P0 at location -0x80 */ -sbit at 0xd7 CY; /* CY (Carry Flag) */ - - Pointers - -SDCC allows (via language extensions) pointers to explicitly -point to any of the memory spaces of the 8051. In addition -to the explicit pointers, the compiler also allows a _generic -class of pointers which can be used to point to any of the -memory spaces. - -Pointer declaration examples: - -/* pointer physically in xternal ram pointing to object in -internal ram */ -data unsigned char * xdata p; - -/* pointer physically in code rom pointing to data in xdata -space */ -xdata unsigned char * code p; - -/* pointer physically in code space pointing to data in code -space */ -code unsigned char * code p; - -/* the folowing is a generic pointer physically located in -xdata space */ -char * xdata p; - -Well you get the idea. - -For compatibility with the previous version of the compiler, -the following syntax for pointer declaration is still supported -but will disappear int the near future. - -unsigned char _xdata *ucxdp; /* pointer to data in external -ram */ -unsigned char _data *ucdp ; /* pointer -to data in internal ram */ -unsigned char _code *uccp ; /* pointer -to data in R/O code space */ -unsigned char _idata *uccp; /* -pointer to upper 128 bytes of ram */ - -All unqualified pointers are treated as 3-byte (4-byte for -the ds390) generic pointers. These type of pointers can -also to be explicitly declared. - -unsigned char _generic *ucgp; - -The highest order byte of the generic pointers contains the -data space information. Assembler support routines are called -whenever data is stored or retrieved using generic pointers. -These are useful for developing reusable library routines. -Explicitly specifying the pointer type will generate the -most efficient code. Pointers declared using a mixture of -OLD and NEW style could have unpredictable results. - - Parameters & Local Variables - -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 static so by default functions -are non-reentrant. - -They can be placed on the stack either by using the --stack-auto -compiler option or by using the reentrant keyword in the -function declaration, e.g.: - -unsigned char foo(char i) reentrant -{ -... -} - -Since stack space on 8051 is limited, the reentrant keyword -or the --stack-auto option should be used sparingly. Note -that the reentrant keyword just means that the parameters -& local variables will be allocated to the stack, it does -not mean that the function is register bank independent. - -Local variables can be assigned storage classes and absolute -addresses, e.g.: - -unsigned char foo() { - xdata unsigned char i; - bit bvar; - data at 0x31 unsiged char j; - ... -} - -In the above example the variable i will be allocated in -the external ram, bvar in bit addressable space and j in -internal ram. When compiled with --stack-auto or when a -function is declared as reentrant this can only be done -for static variables. - -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. - - Overlaying - -For non-reentrant 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 overlayable segment -if the function has no other function calls and the function -is non-reentrant and the memory model is small. If an explicit -storage class is specified for a local variable, it will -NOT be overlayed. - -Note that the compiler (not the linkage editor) makes the -decision for overlaying the data items. Functions that are -called from an interrupt service routine should be preceded -by a #pragma NOOVERLAY if they are not reentrant. - -Also note that the compiler does not do any processing of -inline 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 NOOVERLAY should be used. - -Parameters and Local variables of functions that contain -16 or 32 bit multiplication or division will NOT be overlayed -since these are implemented using external functions, e.g.: - -#pragma SAVE -#pragma NOOVERLAY -void set_error(unsigned char errcd) -{ - P3 = errcd; -} -#pragma RESTORE - -void some_isr () interrupt 2 using 1 -{ - ... - set_error(10); - ... -} - -In the above example the parameter errcd for the function -set_error would be assigned to the overlayable segment if -the #pragma NOOVERLAY was not present, this could -cause unpredictable runtime behavior when called from an -ISR. The #pragma NOOVERLAY ensures that -the parameters and local variables for the function are -NOT overlayed. - - Interrupt Service Routines - -SDCC allows interrupt service routines to be coded in C, -with some extended keywords. - -void timer_isr (void) interrupt 2 using 1 -{ -.. -} - -The number following the interrupt keyword is the interrupt -number this routine will service. The compiler will insert -a call to this routine in the interrupt vector table for -the interrupt number specified. The using keyword is used -to tell the compiler to use the specified register bank -(8051 specific) when generating code for this function. -Note that when some function is called from an interrupt -service routine it should be preceded by a #pragma NOOVERLAY -if it is not reentrant. A special note here, int (16 bit) -and long (32 bit) integer division, multiplication & modulus -operations are implemented using external support routines -developed in ANSI-C, if an interrupt service routine needs -to do any of these operations then the support routines -(as mentioned in a following section) will have to be recompiled -using the --stack-auto option and the source file will need -to be compiled using the --int-long-rent compiler option. - -If you have multiple source files in your project, interrupt -service routines can be present in any of them, but a prototype -of the isr MUST be present or included in the file that -contains the function main. - -Interrupt Numbers and the corresponding address & descriptions -for the Standard 8051 are listed below. SDCC will automatically -adjust the interrupt vector table to the maximum interrupt -number specified. - - -+--------------+--------------+----------------+ -| Interrupt # | Description | Vector Address | -+--------------+--------------+----------------+ -+--------------+--------------+----------------+ -| 0 | External 0 | 0x0003 | -+--------------+--------------+----------------+ -| 1 | Timer 0 | 0x000B | -+--------------+--------------+----------------+ -| 2 | External 1 | 0x0013 | -+--------------+--------------+----------------+ -| 3 | Timer 1 | 0x001B | -+--------------+--------------+----------------+ -| 4 | Serial | 0x0023 | -+--------------+--------------+----------------+ - - -If the interrupt service routine is defined without using -a register bank or with register bank 0 (using 0), the compiler -will save the registers used by itself on the stack upon -entry and restore them at exit, however if such an interrupt -service routine calls another function then the entire register -bank will be saved on the stack. This scheme may be advantageous -for small interrupt service routines which have low register -usage. - -If the interrupt service routine is defined to be using a -specific register bank then only a, b & dptr are save and -restored, if such an interrupt service routine calls another -function (using another register bank) then the entire register -bank of the called function will be saved on the stack. -This scheme is recommended for larger interrupt service -routines. - -Calling other functions from an interrupt service routine -is not recommended, avoid it if possible. - -Also see the _naked modifier. - - Critical Functions - -A special keyword may be associated with a function declaring -it as critical. SDCC will generate code to disable all interrupts -upon entry to a critical function and enable them back before -returning. Note that nesting critical functions may cause -unpredictable results. - -int foo () critical -{ -... -... -} - -The critical attribute maybe used with other attributes like -reentrant. - - Naked Functions - -A special keyword may be associated with a function declaring -it as _naked. The _naked function modifier attribute prevents -the compiler from generating prologue and epilogue code -for that function. This means that the user is entirely -responsible for such things as saving any registers that -may need to be preserved, selecting the proper register -bank, generating the return instruction at the end, etc. -Practically, this means that the contents of the function -must be written in inline assembler. This is particularly -useful for interrupt functions, which can have a large (and -often unnecessary) prologue/epilogue. For example, compare -the code generated by these two functions: - -data unsigned char counter; -void simpleInterrupt(void) interrupt 1 -{ - counter++; -} - -void nakedInterrupt(void) interrupt 2 _naked -{ - _asm - inc _counter - reti ; -MUST explicitly include ret in _naked function. - _endasm; -} - -For an 8051 target, the generated simpleInterrupt looks like: - -_simpleIterrupt: - push acc - push b - push dpl - push dph - push psw - mov psw,#0x00 - inc _counter - pop psw - pop dph - pop dpl - pop b - pop acc - reti - -whereas nakedInterrupt looks like: - -_nakedInterrupt: - inc _counter - reti ; MUST explicitly -include ret(i) in _naked function. - -While there is nothing preventing you from writing C code -inside a _naked function, there are many ways to shoot yourself -in the foot doing this, and is is recommended that you stick -to inline assembler. - - Functions using private banks - -The using attribute (which tells the compiler to use a register -bank other than the default bank zero) should only be applied -to interrupt functions (see note 1 below). This will in -most circumstances make the generated ISR code more efficient -since it will not have to save registers on the stack. - -The using attribute will have no effect on the generated -code for a non-interrupt function (but may occasionally -be useful anyway([footnote] possible exception: if a function is called ONLY -from 'interrupt' functions using a particular bank, it can -be declared with the same 'using' attribute as the calling -'interrupt' functions. For instance, if you have several -ISRs using bank one, and all of them call memcpy(), it might -make sense to create a specialized version of memcpy() 'using -1', since this would prevent the ISR from having to save -bank zero to the stack on entry and switch to bank zero -before calling the function) ). -(pending: I don't think this has been done yet) - -An interrupt function using a non-zero bank will assume that -it can trash that register bank, and will not save it. Since -high-priority interrupts can interrupt low-priority ones -on the 8051 and friends, this means that if a high-priority -ISR using a particular bank occurs while processing a low-priority -ISR using the same bank, terrible and bad things can happen. -To prevent this, no single register bank should be used -by both a high priority and a low priority ISR. This is -probably most easily done by having all high priority ISRs -use one bank and all low priority ISRs use another. If you -have an ISR which can change priority at runtime, you're -on your own: I suggest using the default bank zero and taking -the small performance hit. - -It is most efficient if your ISR calls no other functions. -If your ISR must call other functions, it is most efficient -if those functions use the same bank as the ISR (see note -1 below); the next best is if the called functions use bank -zero. It is very inefficient to call a function using a -different, non-zero bank from an ISR. - - Absolute Addressing - -Data items can be assigned an absolute address with the at -

keyword, in addition to a storage class, e.g.: - -xdata at 0x8000 unsigned char PORTA_8255 ; - -In the above example the PORTA_8255 will be allocated to -the location 0x8000 of the external ram. Note that this -feature is provided to give the programmer access to memory -mapped devices attached to the controller. 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) and the linker output files (.rst) and (.map) are -a good places to look for such overlaps. - -Absolute address can be specified for variables in all storage -classes, e.g.: - -bit at 0x02 bvar; - -The above example will allocate the variable at offset 0x02 -in the bit-addressable 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. - - Startup Code - -The compiler inserts a call to the C routine _sdcc__external__startup() -at the start of the CODE area. This routine is in the runtime -library. 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 Other -wise static & global variables will be initialized before -the function main is invoked. You could add a _sdcc__external__startup() -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. - - Inline Assembler Code - -SDCC allows the use of in-line assembler with a few restriction -as regards labels. All labels defined within inline assembler -code has to be of the form nnnnn$ where nnnn is a number -less than 100 (which implies a limit of utmost 100 inline -assembler labels per function). It is strongly recommended -that each assembly instruction (including labels) be placed -in a separate line (as the example shows). When the --peep-asm -command line option is used, the inline assembler code will -be passed through the peephole optimizer. This might cause -some unexpected changes in the inline assembler code. Please -go throught the peephole optimizer rules defined in file -SDCCpeeph.def carefully before using this option. - -_asm - mov b,#10 - -00001$: - djnz b,00001$ - -_endasm ; - -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 _asm ... _endasm; keyword pair. - -Inline assembler code cannot reference any C-Labels, however -it can reference labels defined by the inline assembler, -e.g.: - -foo() { - /* some c code */ - _asm - ; some assembler code - ljmp $0003 - _endasm; - /* some more c code */ -clabel: /* inline assembler cannot reference -this label */ - _asm - $0003: ;label (can be reference by inline assembler -only) - _endasm ; - /* some more c code */ -} - -In other words inline assembly code can access labels defined -in inline assembly within the scope of the funtion. - -The same goes the other way, ie. labels defines in inline -assembly CANNOT be accessed by C statements. - - int(16 bit) and long (32 bit) Support - -For signed & unsigned int (16 bit) and long (32 bit) variables, -division, multiplication and modulus operations are implemented -by support routines. These support routines are all developed -in ANSI-C to facilitate porting to other MCUs, although -some model specific assembler optimations are used. The -following files contain the described routine, all of them -can be found in /share/sdcc/lib. - - - -_mulsint.c - signed 16 bit multiplication (calls _muluint) -_muluint.c - unsigned 16 bit multiplication -_divsint.c - signed 16 bit division (calls _divuint) -_divuint.c - unsigned 16 bit division -_modsint.c - signed 16 bit modulus (call _moduint) -_moduint.c - unsigned 16 bit modulus -_mulslong.c - signed 32 bit multiplication (calls _mululong) -_mululong.c - unsigned32 bit multiplication -_divslong.c - signed 32 division (calls _divulong) -_divulong.c - unsigned 32 division -_modslong.c - signed 32 bit modulus (calls _modulong) -_modulong.c - unsigned 32 bit modulus - -Since they are compiled as non-reentrant, interrupt service -routines should not do any of the above operations. If this -is unavoidable then the above routines will need to be compiled -with the --stack-auto option, after which the source program -will have to be compiled with --int-long-rent option. - - Floating Point Support - -SDCC supports IEEE (single precision 4bytes) floating point -numbers.The floating point support routines are derived -from gcc's floatlib.c and consists of the following routines: - - - -_fsadd.c - add floating point numbers -_fssub.c - subtract floating point numbers -_fsdiv.c - divide floating point numbers -_fsmul.c - multiply floating point numbers -_fs2uchar.c - convert floating point to unsigned char -_fs2char.c - convert floating point to signed char -_fs2uint.c - convert floating point to unsigned int -_fs2int.c - convert floating point to signed int -_fs2ulong.c - convert floating point to unsigned long -_fs2long.c - convert floating point to signed long -_uchar2fs.c - convert unsigned char to floating point -_char2fs.c - convert char to floating point number -_uint2fs.c - convert unsigned int to floating point -_int2fs.c - convert int to floating point numbers -_ulong2fs.c - convert unsigned long to floating point number -_long2fs.c - convert long to floating point number - -Note if all these routines are used simultaneously the data -space might overflow. For serious floating point usage it -is strongly recommended that the large model be used. - - MCS51 Memory Models - -SDCC allows two memory models for MCS51 code, small and large. -Modules compiled with different memory models should never -be combined together or the results would be unpredictable. -The library routines supplied with the compiler are compiled -as both small and large. The compiled library modules are -contained in seperate directories as small and large so -that you can link to either set. - -When the large model is used all variables declared without -a storage class will be allocated into the external ram, -this includes all parameters and local variables (for non-reentrant -functions). When the small model is used variables without -storage class are allocated in the internal ram. - -Judicious usage of the processor specific storage classes -and the 'reentrant' function type will yield much more efficient -code, than using the large model. Several optimizations -are disabled when the program is compiled using the large -model, it is therefore strongly recommdended that the small -model be used unless absolutely required. - - DS390 Memory Models - -The only model supported is Flat 24. This generates code -for the 24 bit contiguous addressing mode of the Dallas -DS80C390 part. In this mode, up to four meg of external -RAM or code space can be directly addressed. See the data -sheets at www.dalsemi.com for further information on this -part. - -In older versions of the compiler, this option was used with -the MCS51 code generator (-mmcs51). Now, however, the '390 -has it's own code generator, selected by the -mds390 switch. - - -Note that the compiler does not generate any code to place -the processor into 24 bitmode (although tinibios in the -ds390 libraries will do that for you). If you don't use -tinibios, the boot loader or similar code must ensure that -the processor is in 24 bit contiguous addressing mode before -calling the SDCC startup code. - -Like the --model-large option, variables will by default -be placed into the XDATA segment. - -Segments may be placed anywhere in the 4 meg address space -using the usual --*-loc options. Note that if any segments -are located above 64K, the -r flag must be passed to the -linker to generate the proper segment relocations, and the -Intel HEX output format must be used. The -r flag can be -passed to the linker by using the option -Wl-r on the sdcc -command line. However, currently the linker can not handle -code segments > 64k. - - Defines Created by the Compiler - -The compiler creates the following #defines. - - SDCC - this Symbol is always defined. - - SDCC_mcs51 or SDCC_ds390 or SDCC_z80, etc - depending on - the model used (e.g.: -mds390) - - __mcs51 or __ds390 or __z80, etc - depending on the model - used (e.g. -mz80) - - SDCC_STACK_AUTO - this symbol is defined when --stack-auto - option is used. - - SDCC_MODEL_SMALL - when --model-small is used. - - SDCC_MODEL_LARGE - when --model-large is used. - - SDCC_USE_XSTACK - when --xstack option is used. - - SDCC_STACK_TENBIT - when -mds390 is used - - SDCC_MODEL_FLAT24 - when -mds390 is used - - SDCC Technical Data - - Optimizations - -SDCC performs a host of standard optimizations in addition -to some MCU specific optimizations. - - Sub-expression Elimination - -The compiler does local and global common subexpression elimination, -e.g.: - -i = x + y + 1; -j = x + y; - -will be translated to - -iTemp = x + y -i = iTemp + 1 -j = iTemp - -Some subexpressions are not as obvious as the above example, -e.g.: - -a->b[i].c = 10; -a->b[i].d = 11; - -In this case the address arithmetic a->b[i] will be computed -only once; the equivalent code in C would be. - -iTemp = a->b[i]; -iTemp.c = 10; -iTemp.d = 11; - -The compiler will try to keep these temporary variables in -registers. - - Dead-Code Elimination - -int global; -void f () { - int i; - i = 1; /* dead store */ - global = 1; /* dead store */ - global = 2; - return; - global = 3; /* unreachable */ -} - -will be changed to - -int global; void f () -{ - global = 2; - return; -} - - Copy-Propagation - -int f() { - int i, j; - i = 10; - j = i; - return j; -} - -will be changed to - -int f() { - int i,j; - i = 10; - j = 10; - return 10; -} - -Note: the dead stores created by this copy propagation will -be eliminated by dead-code elimination. - - Loop Optimizations - -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, loop induction optimization causes an increase -in register pressure, which may cause unwanted spilling -of other temporary variables into the stack / 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 --noinduction option) or for a -given function only using #pragma NOINDUCTION. - -Loop Invariant: - -for (i = 0 ; i < 100 ; i ++) - f += k + l; - -changed to - -itemp = k + l; -for (i = 0; i < 100; i++) - f += itemp; - -As mentioned previously some loop invariants are not as apparent, -all static address computations are also moved out of the -loop. - -Strength Reduction, this optimization substitutes an expression -by a cheaper expression: - -for (i=0;i < 100; i++) - ar[i*5] = i*3; - -changed to - -itemp1 = 0; -itemp2 = 0; -for (i=0;i< 100;i++) { - ar[itemp1] = itemp2; - itemp1 += 5; - itemp2 += 3; -} - -The more expensive multiplication is changed to a less expensive -addition. - - Loop Reversing - -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 "decrement -and jump if not zero" 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). - - The 'for' loop is of the form - - for ( = ; [< | <=] - ; [++ | += 1]) - - - The does not contain "continue" - or 'break". - - All goto's are contained within the loop. - - No function calls within the loop. - - The loop control variable is not assigned any value - within the loop - - The loop control variable does NOT participate in any arithmetic - operation within the loop. - - There are NO switch statements in the loop. - -Note djnz instruction can be used for 8-bit values only, -therefore it is advantageous to declare loop control symbols -as char. Ofcourse this may not be possible on all situations. - - Algebraic Simplifications - -SDCC does numerous algebraic simplifications, the following -is a small sub-set of these optimizations. - -i = j + 0 ; /* changed to */ i = j; -i /= 2; /* changed to */ i >>= 1; -i = j - j ; /* changed to */ i = 0; -i = j / 1 ; /* changed to */ i = j; - -Note the subexpressions given above are generally introduced -by macro expansions or as a result of copy/constant propagation. - - 'switch' Statements - -SDCC changes switch statements to jump tables when the following -conditions are true. - - The case labels are in numerical sequence, the labels need - not be in order, and the starting number need not be one - or zero. - - switch(i) { - - switch (i) { - case 4:... - - case 1: ... - case 5:... - - case 2: ... - case 3:... - - case 3: ... - case 6:... - - case 4: ... - } - - } - - Both the above switch statements will be implemented using - a jump-table. - - The number of case labels is at least three, since it takes - two conditional statements to handle the boundary conditions. - - 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. - -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.: - -switch (i) { -case 1: ... -case 2: ... -case 3: ... -case 4: ... -case 9: ... -case 10: ... -case 11: ... -case 12: ... -} - -If the above switch statement is broken down into two switch -statements - -switch (i) { -case 1: ... -case 2: ... -case 3: ... -case 4: ... -} - -and - -switch (i) { -case 9: ... -case 10: ... -case 11: ... -case 12: ... -} - -then both the switch statements will be implemented using -jump-tables whereas the unmodified switch statement will -not be. - - Bit-shifting Operations. - -Bit shifting is one of the most frequently used operation -in embedded programming. SDCC tries to implement bit-shift -operations in the most efficient way possible, e.g.: - -unsigned char i; -... -i>>= 4; -... - -generates the following code: - -mov a,_i -swap a -anl a,#0x0f -mov _i,a - -In general SDCC will never setup a loop if the shift count -is known. Another example: - -unsigned int i; -... -i >>= 9; -... - -will generate: - -mov a,(_i + 1) -mov (_i + 1),#0x00 -clr c -rrc a -mov _i,a - -Note that SDCC stores numbers in little-endian format (i.e. -lowest order first). - - Bit-rotation - -A special case of the bit-shift operation is bit rotation, -SDCC recognizes the following expression to be a left bit-rotation: - -unsigned char i; -... -i = ((i << 1) | (i >> 7)); -... - -will generate the following code: - -mov a,_i -rl a -mov _i,a - -SDCC uses pattern matching on the parse tree to determine -this operation.Variations of this case will also be recognized -as bit-rotation, i.e.: - -i = ((i >> 7) | (i << 1)); /* left-bit rotation */ - - Highest Order Bit - -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.: - - unsigned int gint; - -foo () { -unsigned char hob; - ... - hob = (gint >> 15) & 1; - .. -} - -will generate the following code: - - -61 ; hob.c 7 - 000A E5*01 -62 mov -a,(_gint + 1) - 000C 33 -63 rlc -a - 000D E4 -64 clr -a - 000E 13 -65 rrc -a - 000F F5*02 -66 mov -_foo_hob_1_1,a - -Variations of this case however will not 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.: - -xyz = gint + ((gint >> 15) & 1); - -will still be recognized. - - Peep-hole Optimizer - -The compiler uses a rule based, pattern matching and re-writing -mechanism for peep-hole optimization. It is inspired by -copt 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 --peep-file option. -The rule language is best illustrated with examples. - -replace { - mov %1,a - mov a,%1 -} by { - mov %1,a -} - -The above rule will change the following assembly sequence: - - mov r1,a - mov a,r1 - -to - -mov r1,a - -Note: All occurrences of a %n (pattern variable) must denote -the same string. With the above rule, the assembly sequence: - - mov r1,a - mov a,r2 - -will remain unmodified. - -Other special case optimizations may be added by the user -(via --peep-file option). E.g. some variants of the 8051 -MCU allow only ajmp and acall. The following two rules will -change all ljmp and lcall to ajmp and acall - -replace { lcall %1 } by { acall %1 } -replace { ljmp %1 } by { ajmp %1 } - -The inline-assembler code 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-structure -is MCU independent. Peephole optimization rules for other -MCU can be easily programmed using the rule language. - -The syntax for a rule is as follows: - -rule := replace [ restart ] '{' '\n' - - '}' by '{' '\n' - - - - '\n' - - '}' [if -] '\n' - - := assembly instruction (each instruction -including labels must be on a separate line). - -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. A good -example of this the following rule: - -replace restart { - pop %1 - push %1 } by { - ; nop -} - -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.: - - pop ar1 - pop ar2 - push ar2 - push ar1 - -would result in: - - pop ar1 - ; nop - push ar1 - -with 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: - - ; nop - ; nop - -A conditional function can be attached to a rule. Attaching -rules are somewhat more involved, let me illustrate this -with an example. - -replace { - ljmp %5 -%2: -} by { - sjmp %5 -%2: -} if labelInRange - -The optimizer does a look-up of a function name table defined -in function callFuncByName in the source file SDCCpeeph.c, -with the name labelInRange. 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 %5 -is crucial, since the function labelInRange expects to find -the label in that particular variable (the hash table containing -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. 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 also 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 --peep-file option. - - Pragmas - -SDCC supports the following #pragma directives. This directives -are applicable only at a function level. - - SAVE - this will save all the current options. - - RESTORE - will restore the saved options from the last - save. Note that SAVES & RESTOREs cannot be nested. SDCC - uses the same buffer to save the options each time a SAVE - is called. - - NOGCSE - will stop global subexpression elimination. - - NOINDUCTION - will stop loop induction optimizations. - - NOJTBOUND - will not generate code for boundary value checking, - when switch statements are turned into jump-tables. - - NOOVERLAY - the compiler will not overlay the parameters - and local variables of a function. - - NOLOOPREVERSE - Will not do loop reversal optimization - - EXCLUDE NONE | {acc[,b[,dpl[,dph]]] - The exclude pragma - disables generation of pair of push/pop instruction in - ISR function (using interrupt 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 EXCLUDE none. - - CALLEE-SAVES function1[,function2[,function3...]] - The - compiler by default uses a caller saves convention for - register saving across function calls, however this can - cause unneccessary register pushing & popping when calling - small functions from larger functions. This option can - be used to switch the register saving convention for the - function names specified. The compiler will not save registers - when calling these functions, extra code will be generated - 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 future the compiler (with interprocedural analysis) - will be able to determine the appropriate scheme to use - for each function call. If --callee-saves command line - option is used, the function names specified in #pragma CALLEE-SAVES - is appended to the list of functions specified inthe command - line. - -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. - -#pragma SAVE /* save the current settings */ -#pragma NOGCSE /* turnoff global subexpression elimination -*/ -#pragma NOINDUCTION /* turn off induction optimizations */ - -int foo () -{ - ... - /* large code */ - ... -} -#pragma RESTORE /* turn the optimizations back on */ - -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. - - Library Routines - -The following library routines are provided for your convenience. - -stdio.h - Contains the following functions printf & sprintf -these routines are developed by Martijn van Balen . - -%[flags][width][b|B|l|L]type - - flags: -- left justify output -in specified field width - -+ prefix output with -+/- sign if output is signed type - -space prefix output with a blank if -it's a signed positive value - width: -specifies minimum number of characters outputted for numbers - - -or strings. - -- For numbers, spaces are added on the left when needed. - - -If width starts with a zero character, zeroes and used - -instead of spaces. - -- For strings, spaces are are added on the left or right -(when - -flag '-' is used) when needed. - - - b/B: -byte argument (used by d, u, o, x, X) - l/L: -long argument (used by d, u, o, x, X) - type: -d decimal number - -u unsigned decimal number - - -o unsigned octal number - - -x unsigned hexadecimal -number (0-9, a-f) - -X unsigned hexadecimal -number (0-9, A-F) - -c character - -s string (generic pointer) - - -p generic pointer (I:data/idata, -C:code, X:xdata, P:paged) - -f float (still to be -implemented) - -Also contains a very simple version of printf (printf_small). -This simplified version of printf supports only the following -formats. - -format output type argument-type - -%d decimal - short/int -%ld decimal long - -%hd decimal char - -%x hexadecimal short/int - -%lx hexadecimal long - -%hx hexadecimal char - -%o octal short/int - -%lo octal long - -%ho octal char - -%c character char - -%s character _generic -pointer - -The routine is very stack intesive, --stack-after-data parameter -should be used when using this routine, the routine also -takes about 1K of code space. It also expects an external -function named putchar(char) to be present (this can be -changed). When using the %s format the string / pointer -should be cast to a generic pointer. eg. - -printf_small("my str %s, my int %d\n",(char -_generic *)mystr,myint); - - stdarg.h - contains definition for the following macros - to be used for variable parameter list, note that a function - can have a variable parameter list if and only if it is - 'reentrant' - - va_list, va_start, va_arg, va_end. - - setjmp.h - contains defintion for ANSI setjmp & longjmp - routines. Note in this case setjmp & longjmp can be used - between functions executing within the same register bank, - if long jmp is executed from a function that is using - a different register bank from the function issuing the - setjmp function, the results may be unpredictable. The - jump buffer requires 3 bytes of data (the stack pointer - & a 16 byte return address), and can be placed in any - address space. - - stdlib.h - contains the following functions. - - atoi, atol. - - string.h - contains the following functions. - - strcpy, strncpy, strcat, strncat, strcmp, strncmp, strchr, - strrchr, strspn, strcspn, strpbrk, strstr, strlen, strtok, - memcpy, memcmp, memset. - - ctype.h - contains the following routines. - - iscntrl, isdigit, isgraph, islower, isupper, isprint, ispunct, - isspace, isxdigit, isalnum, isalpha. - - malloc.h - The malloc routines are developed by Dmitry - S. Obukhov (dso@usa.net). These routines will allocate - memory from the external ram. Here is a description on - how to use them (as described by the author). - - //Example: - // - #define DYNAMIC_MEMORY_SIZE 0x2000 - // - ..... - // - unsigned char xdata dynamic_memory_pool[DYNAMIC_MEMORY_SIZE]; - - // - unsigned char xdata * current_buffer; - // - ..... - // - void main(void) - // - { - // - ... - // - init_dynamic_memory(dynamic_memory_pool,DYNAMIC_MEMORY_SIZE); - - // - //Now it's possible to use malloc. - // - ... - // - current_buffer = malloc(0x100); - // - - serial.h - Serial IO routines are also developed by Dmitry - S. Obukhov (dso@usa.net). These routines are interrupt - driven with a 256 byte circular buffer, they also expect - external ram to be present. Please see documentation in - file SDCCDIR/sdcc51lib/serial.c. Note the header file - "serial.h" MUST be included in the file containing - the 'main' function. - - ser.h - Alternate serial routine provided by Wolfgang Esslinger - these routines are more compact - and faster. Please see documentation in file SDCCDIR/sdcc51lib/ser.c - - ser_ir.h - Another alternate set of serial routines provided - by Josef Wolf , these routines do not - use the external ram. - - reg51.h - contains register definitions for a standard - 8051 - - float.h - contains min, max and other floating point related - stuff. - -All library routines are compiled as --model-small, they -are all non-reentrant, if you plan to use the large model -or want to make these routines reentrant, then they will -have to be recompiled with the appropriate compiler option. - -Have not had time to do the more involved routines like printf, -will get to them shortly. - - Interfacing with Assembly Routines - - Global Registers used for Parameter Passing - -The compiler always uses the global registers DPL,DPH,B and -ACC to pass the first parameter to a routine. The second -parameter onwards is either allocated on the stack (for -reentrant routines or if --stack-auto is used) or in the -internal / external ram (depending on the memory model). - - Assembler Routine(non-reentrant) - -In the following example the function cfunc calls an assembler -routine asm_func, which takes two parameters. - -extern int asm_func(unsigned char, unsigned char); - -int c_func (unsigned char i, unsigned char j) -{ - return asm_func(i,j); -} - -int main() -{ - return c_func(10,9); -} - -The corresponding assembler function is: - -.globl _asm_func_PARM_2 - .globl _asm_func - .area OSEG -_asm_func_PARM_2: - .ds 1 - .area CSEG -_asm_func: - mov a,dpl - add a,_asm_func_PARM_2 - - mov dpl,a - mov dpl,#0x00 - ret - -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. - -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 "dpl" -for One bye parameter, "dptr" -if two bytes, "b,dptr" -for three bytes and "acc,b,dptr" -for four bytes, the varible name for the second parameter -will be __PARM_2. - -Assemble the assembler routine with the following command: - -asx8051 -losg asmfunc.asm - -Then compile and link the assembler routine to the C source -file with the following command: - -sdcc cfunc.c asmfunc.rel - - Assembler Routine(reentrant) - -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: - -extern int asm_func(unsigned char, unsigned char); - -int c_func (unsigned char i, unsigned char j) reentrant -{ - return asm_func(i,j); -} - -int main() -{ - return c_func(10,9); -} - -The corresponding assembler routine is: - -.globl _asm_func -_asm_func: - push _bp - mov _bp,sp - mov r2,dpl - mov a,_bp - clr c - add a,#0xfd - mov r0,a - add a,#0xfc - mov r1,a - mov a,@r0 - add a,r2 - mov dpl,a - mov dph,#0x00 - mov sp,_bp - pop _bp - ret - -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. - - External Stack - -The external stack is located at the start of the external -ram segment, and is 256 bytes in size. When --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 --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). - -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. - - ANSI-Compliance - -Deviations from the compliancy. - - functions are not always reentrant. - - 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.: - - struct s { ... }; - struct s s1, s2; - foo() - { - ... - s1 = s2 ; /* is invalid in SDCC although - allowed in ANSI */ - ... - } - struct s foo1 (struct s parms) /* is invalid in SDCC although - allowed in ANSI */ - { - struct s rets; - ... - return rets;/* is invalid in SDCC although - allowed in ANSI */ - } - - 'long long' (64 bit integers) not supported. - - 'double' precision floating point not supported. - - No support for setjmp and longjmp (for now). - - Old K&R style function declarations are NOT allowed. - - foo(i,j) /* this old style of function declarations */ - - int i,j; /* are valid in ANSI but not valid in SDCC */ - - { - ... - } - - functions declared as pointers must be dereferenced during - the call. - - int (*foo)(); - ... - /* has to be called like this */ - (*foo)(); /* ansi standard allows calls to be made like - 'foo()' */ - - Cyclomatic Complexity - -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. - -SDCC uses the following formula to compute the complexity: - - -complexity = (number of edges in control flow graph) - (number -of nodes in control flow graph) + 2; - -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. - - TIPS - -Here are a few guidelines that will help the compiler generate -more efficient code, some of the tips are specific to this -compiler others are generally good programming practice. - - Use the smallest data type to represent your data-value. - If it is known in advance that the value is going to be - less than 256 then use a 'char' instead of a 'short' or - 'int'. - - Use unsigned when it is known in advance that the value - is not going to be negative. This helps especially if - you are doing division or multiplication. - - NEVER jump into a LOOP. - - Declare the variables to be local whenever possible, especially - loop control variables (induction). - - Since the compiler does not do implicit integral promotion, - the programmer should do an explicit cast when integral - promotion is required. - - Reducing the size of division, multiplication & modulus - operations can reduce code size substantially. Take the - following code for example. - - foobar(unsigned int p1, unsigned char ch) - { - unsigned char ch1 = p1 % ch ; - .... - } - - For the modulus operation the variable ch will be promoted - to unsigned int first then the modulus operation will - be performed (this will lead to a call to support routine - _muduint()), and the result will be casted to an int. - If the code is changed to - - foobar(unsigned int p1, unsigned char ch) - { - unsigned char ch1 = (unsigned char)p1 % ch ; - .... - } - - It would substantially reduce the code generated (future - versions of the compiler will be smart enough to detect - such optimization oppurtunities). - - Notes on MCS51 memory layout - -The 8051 family of micro controller have a minimum of 128 -bytes of internal memory which is structured as follows - -- Bytes 00-1F - 32 bytes to hold up to 4 banks of the registers -R7 to R7 -- Bytes 20-2F - 16 bytes to hold 128 bit variables and -- Bytes 30-7F - 60 bytes for general purpose use. - -Normally the SDCC compiler will only utilise the first bank -of registers, but it is possible to specify that other banks -of registers should be used in interrupt routines. By default, -the compiler will place the stack after the last bank of -used registers, i.e. if the first 2 banks of registers are -used, it will position the base of the internal stack at -address 16 (0X10). This implies that as the stack grows, -it will use up the remaining register banks, and the 16 -bytes used by the 128 bit variables, and 60 bytes for general -purpose use. - -By default, the compiler uses the 60 general purpose bytes -to hold "near data". The compiler/optimiser may also declare -some Local Variables in this area to hold local data. - -If any of the 128 bit variables are used, or near data is -being used then care needs to be taken to ensure that the -stack does not grow so much that it starts to over write -either your bit variables or "near data". There is no runtime -checking to prevent this from happening. - -The amount of stack being used is affected by the use of -the "internal stack" to save registers before a subroutine -call is made (--stack-auto will declare parameters and local -variables on the stack) and the number of nested subroutines. - -If you detect that the stack is over writing you data, then -the following can be done. --xstack will cause an external -stack to be used for saving registers and (if --stack-auto -is being used) storing parameters and local variables. However -this will produce more code which will be slower to execute. - ---stack-loc will allow you specify the start of the stack, -i.e. you could start it after any data in the general purpose -area. However this may waste the memory not used by the -register banks and if the size of the "near data" increases, -it may creep into the bottom of the stack. - ---stack-after-data, similar to the --stack-loc, but it automatically -places the stack after the end of the "near data". Again -this could waste any spare register space. - ---data-loc allows you to specify the start address of the -near data. This could be used to move the "near data" further -away from the stack giving it more room to grow. This will -only work if no bit variables are being used and the stack -can grow to use the bit variable space. - -Conclusion. - -If you find that the stack is over writing your bit variables -or "near data" then the approach which best utilised the -internal memory is to position the "near data" after the -last bank of used registers or, if you use bit variables, -after the last bit variable by using the --data-loc, e.g. -if two register banks are being used and no bit variables, ---data-loc 16, and use the --stack-after-data option. - -If bit variables are being used, another method would be -to try and squeeze the data area in the unused register -banks if it will fit, and start the stack after the last -bit variable. - - Retargetting for other MCUs. - -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. - - 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. - - 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 --dumpraw option. - - This phase does the bulk of the standard optimizations - and is also MCU independent. This phase can be broken - down into several sub-phases: - - Break down intermediate code (iCode) into basic blocks. - Do control flow & data flow analysis on the basic blocks. - Do local common subexpression elimination, then global - subexpression elimination - Dead code elimination - Loop optimizations - If loop optimizations caused any changes then do 'global - subexpression elimination' and 'dead code elimination' - again. - - This phase determines the live-ranges; by live range I - mean those iTemp variables defined by the compiler that - still survive after all the optimizations. Live range - analysis is essential for register allocation, since these - computation determines which of these iTemps will be assigned - to registers, and for how long. - - Phase five is register allocation. There are two parts - to this process. - - 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. - - 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. - - 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. - - As mentioned in the optimization section the peep-hole - optimizer is rule based system, which can reprogrammed - for other MCUs. - - SDCDB - Source Level Debugger - -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 (the GNU debugger) -as possible. The configuration and build process is part -of the standard compiler installation, 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. - - Compiling for Debugging - -The debug option must be specified for all files -for which debug information is to be generated. The complier -generates a .cdb file for each of these files. The linker -updates the .cdb file with the address information. This -.cdb is used by the debugger. - - How the Debugger Works - -When the --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 .cdb file, -the linker updates the .cdb file 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. - - Starting the Debugger - -The debugger can be started using the following command line. -(Assume the file you are debugging has the file name foo). - -sdcdb foo - -The debugger will look for the following files. - - foo.c - the source file. - - foo.cdb - the debugger symbol information file. - - foo.ihx - the intel hex format object file. - - Command Line Options. - - --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 --directory option should - be --directory=/home/src1:/home/src2. Note there can be - no spaces in the option. - - -cd - change to the . - - -fullname - used by GUI front ends. - - -cpu - this argument is passed to the simulator - please see the simulator docs for details. - - -X this options is passed to the simulator - please see the simulator docs for details. - - -s passed to simulator see the simulator - docs for details. - - -S passed to simulator see the simulator - docs for details. - - Debugger Commands. - -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. - - break [line | file:line | function | file:function] - -Set breakpoint at specified line or function: - -sdcdb>break 100 -sdcdb>break foo.c:100 -sdcdb>break funcfoo -sdcdb>break foo.c:funcfoo - - clear [line | file:line | function | file:function ] - -Clear breakpoint at specified line or function: - -sdcdb>clear 100 -sdcdb>clear foo.c:100 -sdcdb>clear funcfoo -sdcdb>clear foo.c:funcfoo - - continue - -Continue program being debugged, after breakpoint. - - finish - -Execute till the end of the current function. - - delete [n] - -Delete breakpoint number 'n'. If used without any option -clear ALL user defined break points. - - info [break | stack | frame | registers ] - - info break - list all breakpoints - - info stack - show the function call stack. - - info frame - show information about the current execution - frame. - - info registers - show content of all registers. - - step - -Step program until it reaches a different source line. - - next - -Step program, proceeding through subroutine calls. - - run - -Start debugged program. - - ptype variable - -Print type information of the variable. - - print variable - -print value of variable. - - file filename - -load the given file name. Note this is an alternate method -of loading file for debugging. - - frame - -print information about current frame. - - set srcmode - -Toggle between C source & assembly source. - - ! simulator command - -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. - - quit. - -"Watch me now. Iam going Down. My name is Bobby Brown" - - Interfacing with XEmacs. - -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 installation -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): - -(load-file sdcdbsrc.el) - -.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: - -ESC-x sdcdbsrc - -You will prompted to enter the file name to be debugged. - - -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. - - sdcdbsrc-cpu-type '51 - - sdcdbsrc-frequency '11059200 - - sdcdbsrc-serial nil - -The following is a list of key mapping for the debugger interface. - - -;; Current Listing :: -;;key binding Comment - -;;--- ------- ------- - -;; -;; n -sdcdb-next-from-src SDCDB -next command -;; b -sdcdb-back-from-src SDCDB -back command -;; c -sdcdb-cont-from-src SDCDB -continue command -;; s -sdcdb-step-from-src SDCDB -step command -;; ? -sdcdb-whatis-c-sexp SDCDB -ptypecommand for data at -;; -buffer point -;; x -sdcdbsrc-delete SDCDB -Delete all breakpoints if no arg -;; given -or delete arg (C-u arg x) -;; m -sdcdbsrc-frame SDCDB -Display current frame if no arg, -;; given -or display frame arg -;; buffer -point -;; ! -sdcdbsrc-goto-sdcdb Goto -the SDCDB output buffer -;; p -sdcdb-print-c-sexp SDCDB -print command for data at -;; -buffer point -;; g -sdcdbsrc-goto-sdcdb Goto -the SDCDB output buffer -;; t -sdcdbsrc-mode Toggles -Sdcdbsrc mode (turns it off) -;; -;; C-c C-f -sdcdb-finish-from-src SDCDB -finish command -;; -;; C-x SPC -sdcdb-break Set -break for line with point -;; ESC t -sdcdbsrc-mode Toggle -Sdcdbsrc mode -;; ESC m -sdcdbsrc-srcmode -Toggle list mode -;; - - - Other Processors - - The Z80 and gbz80 port - -SDCC can target both the Zilog Z80 and the Nintendo Gameboy's -Z80-like gbz80. The port is incomplete - long support is -incomplete (mul, div and mod are unimplimented), and both -float and bitfield support is missing. Apart from that the -code generated is correct. - -As always, the code is the authoritave 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 varibles. IY is currently unusued. 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. - - Support - -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. - - Reporting Bugs - -Send an email to the mailing list at 'user-sdcc@sdcc.sourceforge.net' -or 'devel-sdcc@sdcc.sourceforge.net'. Bugs will be fixed -ASAP. When reporting a bug, it is very useful to include -a small test program 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 --dumpall option can sometimes be useful in locating -optimization problems. - - Acknowledgments - -Sandeep Dutta (sandeep.dutta@usa.net) - SDCC, the compiler, -MCS51 code generator, Debugger, AVR port -Alan Baldwin (baldwin@shop-pdp.kent.edu) - Initial version -of ASXXXX & ASLINK. -John Hartman (jhartman@compuserve.com) - Porting ASXXX & -ASLINK for 8051 -Dmitry S. Obukhov (dso@usa.net) - malloc & serial i/o routines. - -Daniel Drotos (drdani@mazsola.iit.uni-miskolc.hu) - for his -Freeware simulator -Malini Dutta(malini_dutta@hotmail.com) - my wife for her -patience and support. -Unknown - for the GNU C - preprocessor. -Michael Hope - The Z80 and Z80GB port, 186 development -Kevin Vigor - The DS390 port. -Johan Knol - Lots of fixes and enhancements, DS390/TINI libs. -Scott Datallo - The PIC port. - -Thanks to all the other volunteer developers who have helped -with coding, testing, web-page creation, distribution sets, -etc. You know who you are :-) - - -This document was initially written by Sandeep Dutta - -All product names mentioned herein may be trademarks of their -respective companies. - - diff --git a/doc/test_suite_spec.html/WARNINGS b/doc/test_suite_spec.html/WARNINGS deleted file mode 100644 index caf4aef8..00000000 --- a/doc/test_suite_spec.html/WARNINGS +++ /dev/null @@ -1,2 +0,0 @@ -No implementation found for style `fontenc' -No implementation found for style `url' diff --git a/doc/test_suite_spec.html/index.html b/doc/test_suite_spec.html/index.html deleted file mode 100644 index e4309cf0..00000000 --- a/doc/test_suite_spec.html/index.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - -Proposed Test Suite Design - - - - - - - - - - - - - - - -next_group -up -previous -
-
-
- - -

- -

- -

- -

- -

Proposed Test Suite Design

-

Michael Hope (michaelh@juju.net.nz)

-

13 July 2001

- -

Abstract:

-
-This article describes the goals, requirements, and suggested specification -for a test suite for the output of the Small Device C Compiler (sdcc). -Also included is a short list of existing works. -
-

- -

- -

-Goals -

- -

-The main goals of a test suite for sdcc are - -

- -

    -
  1. To allow developers to run regression tests to check that core changes -do not break any of the many ports.
  2. -
  3. To verify the core.
  4. -
  5. To allow developers to verify individual ports.
  6. -
  7. To allow developers to test port changes.
  8. -
-This design only covers the generated code. It does not cover a test/unit -test framework for the sdcc application itself, which may be useful. - -

-One side effect of (1) is that it requires that the individual ports -pass the tests originally. This may be too hard. See the section on -Exceptions below. - -

- -

-Requirements -

- -

- -

-Coverage -

- -

-The suite is intended to cover language features only. Hardware specific -libraries are explicitly not covered. - -

- -

-Permutations -

- -

-The ports often generate different code for handling different types -(Byte, Word, DWord, and the signed forms). Meta information could -be used to permute the different test cases across the different types. - -

- -

-Exceptions -

- -

-The different ports are all at different levels of development. Test -cases must be able to be disabled on a per port basis. Permutations -also must be able to be disabled on a port level for unsupported cases. -Disabling, as opposed to enabling, on a per port basis seems more -maintainable. - -

- -

-Running -

- -

-The tests must be able to run unaided. The test suite must run on -all platforms that sdcc runs on. A good minimum may be a subset of -Unix command set and common tools, provided by default on a Unix host -and provided through cygwin on a Windows host. - -

-The tests suits should be able to be sub-divided, so that the failing -or interesting tests may be run separately. - -

- -

-Artifcats -

- -

-The test code within the test cases should not generate artifacts. -An artifact occurs when the test code itself interferes with the test -and generates an erroneous result. - -

- -

-Emulators -

- -

-sdcc is a cross compiling compiler. As such, an emulator is needed -for each port to run the tests. - -

- -

-Existing works -

- -

- -

-DejaGnu -

- -

-DejaGnu is a toolkit written in Expect designed to test an interactive -program. It provides a way of specifying an interface to the program, -and given that interface a way of stimulating the program and interpreting -the results. It was originally written by Cygnus Solutions for running -against development boards. I believe the gcc test suite is written -against DejaGnu, perhaps partly to test the Cygnus ports of gcc on -target systems. - -

- -

-gcc test suite -

- -

-I don't know much about the gcc test suite. It was recently removed -from the gcc distribution due to issues with copyright ownership. -The code I saw from older distributions seemed more concerned with -esoteric features of the language. - -

- -

-xUnit -

- -

-The xUnit family, in particular JUnit, is a library of in test assertions, -test wrappers, and test suite wrappers designed mainly for unit testing. -PENDING: More. - -

- -

-CoreLinux++ Assertion framework -

- -

-While not a test suite system, the assertion framework is an interesting -model for the types of assertions that could be used. They include -pre-condition, post-condition, invariants, conditional assertions, -unconditional assertions, and methods for checking conditions. - -

- -

-Specification -

- -

-This specification borrows from the JUnit style of unit testing and -the CoreLinux++ style of assertions. The emphasis is on maintainability -and ease of writing the test cases. - -

- -

-Terms -

- -

-PENDING: Align these terms with the rest of the world. - -

- -

    -
  • An assertion is a statement of how things should be. PENDING: -Better description, an example.
  • -
  • A test point is the smallest unit of a test suite, and consists -of a single assertion that passes if the test passes.
  • -
  • A test case is a set of test points that test a certain feature.
  • -
  • A test suite is a set of test cases that test a certain set -of features.
  • -
- -

- -

-Test cases -

- -

-Test cases shall be contained in their own C file, along with the -meta data on the test. Test cases shall be contained within functions -whose names start with 'test' and which are descriptive of the test -case. Any function that starts with 'test' will be automatically run -in the test suite. - -

-To make the automatic code generation easier, the C code shall have -this format - -

- -

    -
  • Test functions shall start with 'test' to allow automatic detection.
  • -
  • Test functions shall follow the K&R intention style for ease of detection. -i.e. the function name shall start in the left column on a new line -below the return specification.
  • -
- -

- -

-Assertions -

- -

-All assertions shall log the line number, function name, and test -case file when they fail. Most assertions can have a more descriptive -message attached to them. Assertions will be implemented through macros -to get at the line information. This may cause trouble with artifacts. - -

-The following definitions use C++ style default arguments where optional -messages may be inserted. All assertions use double opening and closing -brackets in the macros to allow them to be compiled out without any -side effects. While this is not required for a test suite, they are -there in case any of this code is incorporated into the main product. - -

-Borrowing from JUnit, the assertions shall include - -

- -

    -
  • FAIL((String msg = ``Failed'')). Used when execution should not -get here.
  • -
  • ASSERT((Boolean cond, String msg = ``Assertion failed''). Fails -if cond is false. Parent to REQUIRE and ENSURE.
  • -
-JUnit also includes may sub-cases of ASSERT, such as assertNotNull, -assertEquals, and assertSame. - -

-CoreLinux++ includes the extra assertions - -

- -

    -
  • REQUIRE((Boolean cond, String msg = ``Precondition failed''). -Checks preconditions.
  • -
  • ENSURE((Boolean cond, String msg = ``Postcondition failed''). -Checks post conditions.
  • -
  • CHECK((Boolean cond, String msg = ``Check failed'')). Used to -call a function and to check that the return value is as expected. -i.e. CHECK((fread(in, buf, 10) != -1)). Very similar to ASSERT, but -the function still gets called in a release build.
  • -
  • FORALL and EXISTS. Used to check conditions within part of the code. -For example, can be used to check that a list is still sorted inside -each loop of a sort routine.
  • -
-All of FAIL, ASSERT, REQUIRE, ENSURE, and CHECK shall be available. - -

- -

-Meta data -

- -

-PENDING: It's not really meta data. - -

-Meta data includes permutation information, exception information, -and permutation exceptions. - -

-Meta data shall be global to the file. Meta data names consist of -the lower case alphanumerics. Test case specific meta data (fields) -shall be stored in a comment block at the start of the file. This -is only due to style. - -

-A field definition shall consist of - -

- -

    -
  • The field name
  • -
  • A colon.
  • -
  • A comma separated list of values.
  • -
-The values shall be stripped of leading and trailing white space. - -

-Permutation exceptions are by port only. Exceptions to a field are -specified by a modified field definition. An exception definition -consists of - -

- -

    -
  • The field name.
  • -
  • An opening square bracket.
  • -
  • A comma separated list of ports the exception applies for.
  • -
  • A closing square bracket.
  • -
  • A colon.
  • -
  • The values to use for this field for these ports.
  • -
-An instance of the test case shall be generated for each permutation -of the test case specific meta data fields. - -

-The runtime meta fields are - -

- -

    -
  • port - The port this test is running on.
  • -
  • testcase - The name of this test case.
  • -
  • function - The name of the current function.
  • -
-Most of the runtime fields are not very usable. They are there for -completeness. - -

-Meta fields may be accessed inside the test case by enclosing them -in curly brackets. The curly brackets will be interpreted anywhere -inside the test case, including inside quoted strings. Field names -that are not recognised will be passed through including the brackets. -Note that it is therefore impossible to use some strings within the -test case. - -

-Test case function names should include the permuted fields in the -name to reduce name collisions. - -

- -

-An example -

- -

-I don't know how to do pre-formatted text in LATEX . Sigh. - -

-The following code generates a simple increment test for all combinations -of the storage classes and all combinations of the data sizes. This -is a bad example as the optimiser will often remove most of this code. - -

-/** Test for increment. - -

-type: char, int, long - -

-Z80 port does not fully support longs (4 byte) - -

-type[z80]: char, int - -

-class: ``'', register, static */ - -

-static void - -

-testInc{class}{types}(void) - -

-{ - -

-{class} {type} i = 0; - -

-i = i + 1; - -

-ASSERT((i == 1)); - -

-} - -

-About this document ... -

- Proposed Test Suite Design

-This document was generated using the -LaTeX2HTML translator Version 99.1 release (March 30, 1999) -

-Copyright © 1993, 1994, 1995, 1996, -Nikos Drakos, -Computer Based Learning Unit, University of Leeds. -
-Copyright © 1997, 1998, 1999, -Ross Moore, -Mathematics Department, Macquarie University, Sydney. -

-The command line arguments were:
- latex2html -split 0 -dir test_suite_spec.html test_suite_spec -

-The translation was initiated by Johan Knol on 2001-07-13


- -next_group -up -previous -
- -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/test_suite_spec.html/next_group_motif_gr.gif b/doc/test_suite_spec.html/next_group_motif_gr.gif deleted file mode 100644 index a5888d70fa1ec6f90e3b5dc81dadd8481ac28388..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmV+e0sQ_)Nk%w1VNn1W0Pz3-zrVld=jU&4Z-Rn?A^8LW00000EC2ui08s!K0008i zjE||y?GK}zv@&6U-n{z{hT=F1SU{%g%6?|n#`3JaD2?Z$y$YVM(+q~gV2CFK_FBqL zacT4*0lsE4b%k=W#%XoiBMQM{r|6q}Qo-wT?F3Zbmw98%lm>}S)PR7ba`#g;Z_ zNEl}bD0rx*$0d1Z=eVfVIEMHU$>~`Mx@mcr*+zK@nn)!YO3A8Jx~jFw$H~X4Sn0~$-n{z{YJwGn=81mem9{RpmhVghaW>?7jS9R-!fA59BIefH_>4a! zU@3e`d%LL+s>2Sc#EcXATz0KftyLUNf}!86ITqyHqds`GU W((C&R94tIc92`)LoUDvo0029`yJcDc diff --git a/doc/test_suite_spec.html/test_suite_spec.html b/doc/test_suite_spec.html/test_suite_spec.html deleted file mode 100644 index e4309cf0..00000000 --- a/doc/test_suite_spec.html/test_suite_spec.html +++ /dev/null @@ -1,478 +0,0 @@ - - - - - -Proposed Test Suite Design - - - - - - - - - - - - - - - -next_group -up -previous -
-
-
- - -

- -

- -

- -

- -

Proposed Test Suite Design

-

Michael Hope (michaelh@juju.net.nz)

-

13 July 2001

- -

Abstract:

-
-This article describes the goals, requirements, and suggested specification -for a test suite for the output of the Small Device C Compiler (sdcc). -Also included is a short list of existing works. -
-

- -

- -

-Goals -

- -

-The main goals of a test suite for sdcc are - -

- -

    -
  1. To allow developers to run regression tests to check that core changes -do not break any of the many ports.
  2. -
  3. To verify the core.
  4. -
  5. To allow developers to verify individual ports.
  6. -
  7. To allow developers to test port changes.
  8. -
-This design only covers the generated code. It does not cover a test/unit -test framework for the sdcc application itself, which may be useful. - -

-One side effect of (1) is that it requires that the individual ports -pass the tests originally. This may be too hard. See the section on -Exceptions below. - -

- -

-Requirements -

- -

- -

-Coverage -

- -

-The suite is intended to cover language features only. Hardware specific -libraries are explicitly not covered. - -

- -

-Permutations -

- -

-The ports often generate different code for handling different types -(Byte, Word, DWord, and the signed forms). Meta information could -be used to permute the different test cases across the different types. - -

- -

-Exceptions -

- -

-The different ports are all at different levels of development. Test -cases must be able to be disabled on a per port basis. Permutations -also must be able to be disabled on a port level for unsupported cases. -Disabling, as opposed to enabling, on a per port basis seems more -maintainable. - -

- -

-Running -

- -

-The tests must be able to run unaided. The test suite must run on -all platforms that sdcc runs on. A good minimum may be a subset of -Unix command set and common tools, provided by default on a Unix host -and provided through cygwin on a Windows host. - -

-The tests suits should be able to be sub-divided, so that the failing -or interesting tests may be run separately. - -

- -

-Artifcats -

- -

-The test code within the test cases should not generate artifacts. -An artifact occurs when the test code itself interferes with the test -and generates an erroneous result. - -

- -

-Emulators -

- -

-sdcc is a cross compiling compiler. As such, an emulator is needed -for each port to run the tests. - -

- -

-Existing works -

- -

- -

-DejaGnu -

- -

-DejaGnu is a toolkit written in Expect designed to test an interactive -program. It provides a way of specifying an interface to the program, -and given that interface a way of stimulating the program and interpreting -the results. It was originally written by Cygnus Solutions for running -against development boards. I believe the gcc test suite is written -against DejaGnu, perhaps partly to test the Cygnus ports of gcc on -target systems. - -

- -

-gcc test suite -

- -

-I don't know much about the gcc test suite. It was recently removed -from the gcc distribution due to issues with copyright ownership. -The code I saw from older distributions seemed more concerned with -esoteric features of the language. - -

- -

-xUnit -

- -

-The xUnit family, in particular JUnit, is a library of in test assertions, -test wrappers, and test suite wrappers designed mainly for unit testing. -PENDING: More. - -

- -

-CoreLinux++ Assertion framework -

- -

-While not a test suite system, the assertion framework is an interesting -model for the types of assertions that could be used. They include -pre-condition, post-condition, invariants, conditional assertions, -unconditional assertions, and methods for checking conditions. - -

- -

-Specification -

- -

-This specification borrows from the JUnit style of unit testing and -the CoreLinux++ style of assertions. The emphasis is on maintainability -and ease of writing the test cases. - -

- -

-Terms -

- -

-PENDING: Align these terms with the rest of the world. - -

- -

    -
  • An assertion is a statement of how things should be. PENDING: -Better description, an example.
  • -
  • A test point is the smallest unit of a test suite, and consists -of a single assertion that passes if the test passes.
  • -
  • A test case is a set of test points that test a certain feature.
  • -
  • A test suite is a set of test cases that test a certain set -of features.
  • -
- -

- -

-Test cases -

- -

-Test cases shall be contained in their own C file, along with the -meta data on the test. Test cases shall be contained within functions -whose names start with 'test' and which are descriptive of the test -case. Any function that starts with 'test' will be automatically run -in the test suite. - -

-To make the automatic code generation easier, the C code shall have -this format - -

- -

    -
  • Test functions shall start with 'test' to allow automatic detection.
  • -
  • Test functions shall follow the K&R intention style for ease of detection. -i.e. the function name shall start in the left column on a new line -below the return specification.
  • -
- -

- -

-Assertions -

- -

-All assertions shall log the line number, function name, and test -case file when they fail. Most assertions can have a more descriptive -message attached to them. Assertions will be implemented through macros -to get at the line information. This may cause trouble with artifacts. - -

-The following definitions use C++ style default arguments where optional -messages may be inserted. All assertions use double opening and closing -brackets in the macros to allow them to be compiled out without any -side effects. While this is not required for a test suite, they are -there in case any of this code is incorporated into the main product. - -

-Borrowing from JUnit, the assertions shall include - -

- -

    -
  • FAIL((String msg = ``Failed'')). Used when execution should not -get here.
  • -
  • ASSERT((Boolean cond, String msg = ``Assertion failed''). Fails -if cond is false. Parent to REQUIRE and ENSURE.
  • -
-JUnit also includes may sub-cases of ASSERT, such as assertNotNull, -assertEquals, and assertSame. - -

-CoreLinux++ includes the extra assertions - -

- -

    -
  • REQUIRE((Boolean cond, String msg = ``Precondition failed''). -Checks preconditions.
  • -
  • ENSURE((Boolean cond, String msg = ``Postcondition failed''). -Checks post conditions.
  • -
  • CHECK((Boolean cond, String msg = ``Check failed'')). Used to -call a function and to check that the return value is as expected. -i.e. CHECK((fread(in, buf, 10) != -1)). Very similar to ASSERT, but -the function still gets called in a release build.
  • -
  • FORALL and EXISTS. Used to check conditions within part of the code. -For example, can be used to check that a list is still sorted inside -each loop of a sort routine.
  • -
-All of FAIL, ASSERT, REQUIRE, ENSURE, and CHECK shall be available. - -

- -

-Meta data -

- -

-PENDING: It's not really meta data. - -

-Meta data includes permutation information, exception information, -and permutation exceptions. - -

-Meta data shall be global to the file. Meta data names consist of -the lower case alphanumerics. Test case specific meta data (fields) -shall be stored in a comment block at the start of the file. This -is only due to style. - -

-A field definition shall consist of - -

- -

    -
  • The field name
  • -
  • A colon.
  • -
  • A comma separated list of values.
  • -
-The values shall be stripped of leading and trailing white space. - -

-Permutation exceptions are by port only. Exceptions to a field are -specified by a modified field definition. An exception definition -consists of - -

- -

    -
  • The field name.
  • -
  • An opening square bracket.
  • -
  • A comma separated list of ports the exception applies for.
  • -
  • A closing square bracket.
  • -
  • A colon.
  • -
  • The values to use for this field for these ports.
  • -
-An instance of the test case shall be generated for each permutation -of the test case specific meta data fields. - -

-The runtime meta fields are - -

- -

    -
  • port - The port this test is running on.
  • -
  • testcase - The name of this test case.
  • -
  • function - The name of the current function.
  • -
-Most of the runtime fields are not very usable. They are there for -completeness. - -

-Meta fields may be accessed inside the test case by enclosing them -in curly brackets. The curly brackets will be interpreted anywhere -inside the test case, including inside quoted strings. Field names -that are not recognised will be passed through including the brackets. -Note that it is therefore impossible to use some strings within the -test case. - -

-Test case function names should include the permuted fields in the -name to reduce name collisions. - -

- -

-An example -

- -

-I don't know how to do pre-formatted text in LATEX . Sigh. - -

-The following code generates a simple increment test for all combinations -of the storage classes and all combinations of the data sizes. This -is a bad example as the optimiser will often remove most of this code. - -

-/** Test for increment. - -

-type: char, int, long - -

-Z80 port does not fully support longs (4 byte) - -

-type[z80]: char, int - -

-class: ``'', register, static */ - -

-static void - -

-testInc{class}{types}(void) - -

-{ - -

-{class} {type} i = 0; - -

-i = i + 1; - -

-ASSERT((i == 1)); - -

-} - -

-About this document ... -

- Proposed Test Suite Design

-This document was generated using the -LaTeX2HTML translator Version 99.1 release (March 30, 1999) -

-Copyright © 1993, 1994, 1995, 1996, -Nikos Drakos, -Computer Based Learning Unit, University of Leeds. -
-Copyright © 1997, 1998, 1999, -Ross Moore, -Mathematics Department, Macquarie University, Sydney. -

-The command line arguments were:
- latex2html -split 0 -dir test_suite_spec.html test_suite_spec -

-The translation was initiated by Johan Knol on 2001-07-13


- -next_group -up -previous -
- -
-Johan Knol -
2001-07-13 -
- - diff --git a/doc/test_suite_spec.html/up_motif_gr.gif b/doc/test_suite_spec.html/up_motif_gr.gif deleted file mode 100644 index 6aeb675adad41434cccac4b084c6247d37c7eba1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 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 diff --git a/doc/test_suite_spec.txt b/doc/test_suite_spec.txt deleted file mode 100644 index 47bf4965..00000000 --- a/doc/test_suite_spec.txt +++ /dev/null @@ -1,298 +0,0 @@ - - -Proposed Test Suite Design - -Michael Hope (michaelh@juju.net.nz) - - - -Abstract - -This article describes the goals, requirements, and suggested -specification for a test suite for the output of the Small -Device C Compiler (sdcc). Also included is a short list -of existing works. - - Goals - -The main goals of a test suite for sdcc are - - To allow developers to run regression tests to check that - core changes do not break any of the many ports. - - To verify the core. - - To allow developers to verify individual ports. - - To allow developers to test port changes. - -This design only covers the generated code. It does not cover -a test/unit test framework for the sdcc application itself, -which may be useful. - -One side effect of (1) is that it requires that the individual -ports pass the tests originally. This may be too hard. See -the section on Exceptions below. - - Requirements - - Coverage - -The suite is intended to cover language features only. Hardware -specific libraries are explicitly not covered. - - Permutations - -The ports often generate different code for handling different -types (Byte, Word, DWord, and the signed forms). Meta information -could be used to permute the different test cases across -the different types. - - Exceptions - -The different ports are all at different levels of development. -Test cases must be able to be disabled on a per port basis. -Permutations also must be able to be disabled on a port -level for unsupported cases. Disabling, as opposed to enabling, -on a per port basis seems more maintainable. - - Running - -The tests must be able to run unaided. The test suite must -run on all platforms that sdcc runs on. A good minimum may -be a subset of Unix command set and common tools, provided -by default on a Unix host and provided through cygwin on -a Windows host. - -The tests suits should be able to be sub-divided, so that -the failing or interesting tests may be run separately. - - Artifcats - -The test code within the test cases should not generate artifacts. -An artifact occurs when the test code itself interferes -with the test and generates an erroneous result. - - Emulators - -sdcc is a cross compiling compiler. As such, an emulator -is needed for each port to run the tests. - - Existing works - - DejaGnu - -DejaGnu is a toolkit written in Expect designed to test an -interactive program. It provides a way of specifying an -interface to the program, and given that interface a way -of stimulating the program and interpreting the results. -It was originally written by Cygnus Solutions for running -against development boards. I believe the gcc test suite -is written against DejaGnu, perhaps partly to test the Cygnus -ports of gcc on target systems. - - gcc test suite - -I don't know much about the gcc test suite. It was recently -removed from the gcc distribution due to issues with copyright -ownership. The code I saw from older distributions seemed -more concerned with esoteric features of the language. - - xUnit - -The xUnit family, in particular JUnit, is a library of in -test assertions, test wrappers, and test suite wrappers -designed mainly for unit testing. PENDING: More. - - CoreLinux++ Assertion framework - -While not a test suite system, the assertion framework is -an interesting model for the types of assertions that could -be used. They include pre-condition, post-condition, invariants, -conditional assertions, unconditional assertions, and methods -for checking conditions. - - Specification - -This specification borrows from the JUnit style of unit testing -and the CoreLinux++ style of assertions. The emphasis is -on maintainability and ease of writing the test cases. - - Terms - -PENDING: Align these terms with the rest of the world. - - An assertion is a statement of how things should be. PENDING: - Better description, an example. - - A test point is the smallest unit of a test suite, and - consists of a single assertion that passes if the test - passes. - - A test case is a set of test points that test a certain - feature. - - A test suite is a set of test cases that test a certain - set of features. - - Test cases - -Test cases shall be contained in their own C file, along -with the meta data on the test. Test cases shall be contained -within functions whose names start with 'test' and which -are descriptive of the test case. Any function that starts -with 'test' will be automatically run in the test suite. - -To make the automatic code generation easier, the C code -shall have this format - - Test functions shall start with 'test' to allow automatic - detection. - - Test functions shall follow the K&R intention style for - ease of detection. i.e. the function name shall start - in the left column on a new line below the return specification. - - Assertions - -All assertions shall log the line number, function name, -and test case file when they fail. Most assertions can have -a more descriptive message attached to them. Assertions -will be implemented through macros to get at the line information. -This may cause trouble with artifacts. - -The following definitions use C++ style default arguments -where optional messages may be inserted. All assertions -use double opening and closing brackets in the macros to -allow them to be compiled out without any side effects. -While this is not required for a test suite, they are there -in case any of this code is incorporated into the main product. - -Borrowing from JUnit, the assertions shall include - - FAIL((String msg = "Failed")). - Used when execution should not get here. - - ASSERT((Boolean cond, String msg = "Assertion - failed"). Fails if cond is false. Parent to REQUIRE - and ENSURE. - -JUnit also includes may sub-cases of ASSERT, such as assertNotNull, -assertEquals, and assertSame. - -CoreLinux++ includes the extra assertions - - REQUIRE((Boolean cond, String msg = "Precondition - failed"). Checks preconditions. - - ENSURE((Boolean cond, String msg = "Postcondition - failed"). Checks post conditions. - - CHECK((Boolean cond, String msg = "Check - failed")). Used to call a function and to check - that the return value is as expected. i.e. CHECK((fread(in, - buf, 10) != -1)). Very similar to ASSERT, but the function - still gets called in a release build. - - FORALL and EXISTS. Used to check conditions within part - of the code. For example, can be used to check that a - list is still sorted inside each loop of a sort routine. - -All of FAIL, ASSERT, REQUIRE, ENSURE, and CHECK shall be -available. - - Meta data - -PENDING: It's not really meta data. - -Meta data includes permutation information, exception information, -and permutation exceptions. - -Meta data shall be global to the file. Meta data names consist -of the lower case alphanumerics. Test case specific meta -data (fields) shall be stored in a comment block at the -start of the file. This is only due to style. - -A field definition shall consist of - - The field name - - A colon. - - A comma separated list of values. - -The values shall be stripped of leading and trailing white -space. - -Permutation exceptions are by port only. Exceptions to a -field are specified by a modified field definition. An exception -definition consists of - - The field name. - - An opening square bracket. - - A comma separated list of ports the exception applies for. - - A closing square bracket. - - A colon. - - The values to use for this field for these ports. - -An instance of the test case shall be generated for each -permutation of the test case specific meta data fields. - -The runtime meta fields are - - port - The port this test is running on. - - testcase - The name of this test case. - - function - The name of the current function. - -Most of the runtime fields are not very usable. They are -there for completeness. - -Meta fields may be accessed inside the test case by enclosing -them in curly brackets. The curly brackets will be interpreted -anywhere inside the test case, including inside quoted strings. -Field names that are not recognised will be passed through -including the brackets. Note that it is therefore impossible -to use some strings within the test case. - -Test case function names should include the permuted fields -in the name to reduce name collisions. - - An example - -I don't know how to do pre-formatted text in LaTeX. Sigh. - -The following code generates a simple increment test for -all combinations of the storage classes and all combinations -of the data sizes. This is a bad example as the optimiser -will often remove most of this code. - -/** Test for increment. - -type: char, int, long - -Z80 port does not fully support longs (4 byte) - -type[z80]: char, int - -class: "", register, static */ - -static void - -testInc{class}{types}(void) - -{ - -{class} {type} i = 0; - -i = i + 1; - -ASSERT((i == 1)); - -} -- 2.47.2