Skip to content

Instantly share code, notes, and snippets.

@olegslavkin
Last active June 22, 2020 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save olegslavkin/2966ae0580873f57e46fb38255e82db3 to your computer and use it in GitHub Desktop.
Save olegslavkin/2966ae0580873f57e46fb38255e82db3 to your computer and use it in GitHub Desktop.
Compile gcc-0.9 (vax11/780) simh

Все указанные действия производились в среде:

CentOS 7.7
Docker 19.03.5

Скачиваем и запускаем контейнер:

PROJECT=~/Projects/4.2bsd
mkdir -p $PROJECT && cd $PROJECT
container=vax780_42bsd
sudo docker rm -f $container
sudo docker run -it --rm -v $(pwd):/machines -p 2323:2323 -p 2324:2324 -p 8880-8887:8880-8887 --name $container rattydave/alpine-simh:core
sudo docker exec -d $container vax780 /machines/boot.ini

Скачиваем и производит установку 4.2BSD. Далее скачиваем исходные файлы gcc-0.9 и откомпилированный bison-1.00.

В начале необходимо установить bison (монтируем tape) и запускаем simh. В 4.2BSD выполняем команды: Редактируем переменную PATH

vi /.login
/usr/local => /usr/local/bin
logout

Разархивируем tar с bison

mt rew
tar xvf /dev/rmt12

Следуюшим шагом необходимо подготовить tap с исходными файлами gcc. Скачаем скрипт создания tap из tar файла и на хосте выполняем команды:

cd $PROJECT
bzip -d gcc-0.9.tar.bz2
./mk-dist-tape.py -o gcc-0.9.tap gcc-0.9.tar

Далее монтируем tape в симулятор и запускаем simh.

cd /usr/src
mt rew
tar xpvf /dev/rmt12
cd /usr/src/gcc-0.9

Попытка № 1 компиляции компилятора gcc-0.9 для системы vax780 на эмуляторе simh (V4.0-0 Beta git commit id: 0da9a49c)

login: root
Last login: Fri Feb 17 23:37:18 on tty01
4.2 BSD UNIX #9: Wed Nov 2 16:00:29 PST 1983

Would you like to play a game?

You have mail.
Don't login as root, use su
myname# cd /usr/tmp/gcc-0.9
myname# ln -s config-vax.h config.h
myname# ln -s tm-vax.h tm.h
myname# ln -s vax.md md
myname# make
cc -c -g -I. gcc.c
cc -g -I. -c obstack.c
ld -o gcc /lib/crt0.o gcc.o -lg obstack.o  -lc
cc -g -I. -c toplev.c
bison -v parse.y
parse.y contains 12 shift/reduce conflicts.
cc -g -I. -c parse.tab.c
cc -g -I. -c tree.c
cc -g -I. -c print-tree.c
cc -g -I. -c decl.c
cc -g -I. -c typecheck.c
cc -g -I. -c stor-layout.c
cc -g -I. -c fold-const.c
cc -g -I. -c varasm.c
cc -g -I. -c rtl.c
cc -c -g -I. genflags.c
cc -o genflags -g genflags.o rtl.o obstack.o 
genflags md > insn-flags.h
cc -c -g -I. gencodes.c
cc -o gencodes -g gencodes.o rtl.o obstack.o 
gencodes md > insn-codes.h
cc -g -I. -c expr.c
cc -g -I. -c stmt.c
cc -g -I. -c expmed.c
cc -g -I. -c explow.c
cc -c -g -I. genconfig.c
cc -o genconfig -g genconfig.o rtl.o obstack.o 
genconfig md > insn-config.h
cc -g -I. -c optabs.c
cc -g -I. -c symout.c
cc -g -I. -c dbxout.c
cc -g -I. -c emit-rtl.c
cc -c -g -I. genemit.c
cc -o genemit -g genemit.o rtl.o obstack.o 
genemit md > insn-emit.c
cc -c -g -I. insn-emit.c
cc -g -I. -c jump.c
cc -g -I. -c cse.c
cc -g -I. -c loop.c
cc -g -I. -c flow.c
cc -g -I. -c stupid.c
cc -g -I. -c combine.c
cc -g -I. -c regclass.c
cc -g -I. -c local-alloc.c
cc -g -I. -c global-alloc.c
cc -g -I. -c reload.c
cc -g -I. -c reload1.c
cc -g -I. -c final.c
cc -g -I. -c recog.c
cc -c -g -I. genrecog.c
cc -o genrecog -g genrecog.o rtl.o obstack.o 
genrecog md > insn-recog.c
cc -c -g -I. insn-recog.c
cc -c -g -I. genextract.c
cc -o genextract -g genextract.o rtl.o obstack.o 
genextract md > insn-extract.c
cc -c -g -I. insn-extract.c
cc -c -g -I. genoutput.c
cc -o genoutput -g genoutput.o rtl.o obstack.o 
genoutput md > insn-output.c
cc -c -g -I. insn-output.c
ld -o cc1 /lib/crt0.o toplev.o parse.tab.o tree.o print-tree.o  decl.o typecheck.o stor-layout.o fold-const.o  varasm.o rtl.o expr.o stmt.o expmed.o explow.o optabs.o  symout.o dbxout.o emit-rtl.o insn-emit.o  jump.o cse.o loop.o flow.o stupid.o combine.o  regclass.o local-alloc.o global-alloc.o reload.o reload1.o  final.o recog.o insn-recog.o insn-extract.o insn-output.o -lg obstack.o  -lc
Undefined:
_yydebug
*** Error code 1

Stop.
myname# 

Гугление по данной ошибке ничего не нашлось, но поиск grep'ом показал, что toplev.c:999 использует yydebug = 1, но нигде в проекте она не инициализируется, только (extern int yydebug). В /usr/local/share/bison.simple есть такой код

#ifdef YYDEBUG
int yydebug = 0;                /*  nonzero means print parse trace     */
#endif

пробуем собрать с опцией YYDEBUG

myname# make CFLAGS=' -g -I. -DYYDEBUG'
cc -c -g -I. -DYYDEBUG gcc.c
cc -g -I. -DYYDEBUG -c obstack.c
ld -o gcc /lib/crt0.o gcc.o -lg obstack.o  -lc
cc -g -I. -DYYDEBUG -c toplev.c
bison -v parse.y
parse.y contains 12 shift/reduce conflicts.
cc -g -I. -DYYDEBUG -c parse.tab.c
cc -g -I. -DYYDEBUG -c tree.c
cc -g -I. -DYYDEBUG -c print-tree.c
cc -g -I. -DYYDEBUG -c decl.c
cc -g -I. -DYYDEBUG -c typecheck.c
cc -g -I. -DYYDEBUG -c stor-layout.c
cc -g -I. -DYYDEBUG -c fold-const.c
cc -g -I. -DYYDEBUG -c varasm.c
cc -g -I. -DYYDEBUG -c rtl.c
cc -c -g -I. -DYYDEBUG genflags.c
cc -o genflags -g genflags.o rtl.o obstack.o 
genflags md > insn-flags.h
cc -c -g -I. -DYYDEBUG gencodes.c
cc -o gencodes -g gencodes.o rtl.o obstack.o 
gencodes md > insn-codes.h
cc -g -I. -DYYDEBUG -c expr.c
cc -g -I. -DYYDEBUG -c stmt.c
cc -g -I. -DYYDEBUG -c expmed.c
cc -g -I. -DYYDEBUG -c explow.c
cc -c -g -I. -DYYDEBUG genconfig.c
cc -o genconfig -g genconfig.o rtl.o obstack.o 
genconfig md > insn-config.h
cc -g -I. -DYYDEBUG -c optabs.c
cc -g -I. -DYYDEBUG -c symout.c
cc -g -I. -DYYDEBUG -c dbxout.c
cc -g -I. -DYYDEBUG -c emit-rtl.c
cc -c -g -I. -DYYDEBUG genemit.c
cc -o genemit -g genemit.o rtl.o obstack.o 
genemit md > insn-emit.c
cc -c -g -I. -DYYDEBUG insn-emit.c
cc -g -I. -DYYDEBUG -c jump.c
cc -g -I. -DYYDEBUG -c cse.c
cc -g -I. -DYYDEBUG -c loop.c
cc -g -I. -DYYDEBUG -c flow.c
cc -g -I. -DYYDEBUG -c stupid.c
cc -g -I. -DYYDEBUG -c combine.c
cc -g -I. -DYYDEBUG -c regclass.c
cc -g -I. -DYYDEBUG -c local-alloc.c
cc -g -I. -DYYDEBUG -c global-alloc.c
cc -g -I. -DYYDEBUG -c reload.c
cc -g -I. -DYYDEBUG -c reload1.c
cc -g -I. -DYYDEBUG -c final.c
cc -g -I. -DYYDEBUG -c recog.c
cc -c -g -I. -DYYDEBUG genrecog.c
cc -o genrecog -g genrecog.o rtl.o obstack.o 
genrecog md > insn-recog.c
cc -c -g -I. -DYYDEBUG insn-recog.c
cc -c -g -I. -DYYDEBUG genextract.c
cc -o genextract -g genextract.o rtl.o obstack.o 
genextract md > insn-extract.c
cc -c -g -I. -DYYDEBUG insn-extract.c
cc -c -g -I. -DYYDEBUG genoutput.c
cc -o genoutput -g genoutput.o rtl.o obstack.o 
genoutput md > insn-output.c
cc -c -g -I. -DYYDEBUG insn-output.c
ld -o cc1 /lib/crt0.o toplev.o parse.tab.o tree.o print-tree.o  decl.o typecheck.o stor-layout.o fold-const.o  varasm.o rtl.o expr.o stmt.o expmed.o explow.o optabs.o  symout.o dbxout.o emit-rtl.o insn-emit.o  jump.o cse.o loop.o flow.o stupid.o combine.o  regclass.o local-alloc.o global-alloc.o reload.o reload1.o  final.o recog.o insn-recog.o insn-extract.o insn-output.o -lg obstack.o  -lc
cc -g -I. -DYYDEBUG -c cccp.c
echo expect 40 shift/reduce conflicts
expect 40 shift/reduce conflicts
yacc cexp.y

conflicts: 40 shift/reduce
cc -g -I. -DYYDEBUG -c y.tab.c
cc -o cccp -g cccp.o y.tab.o
rm -f cpp
ln cccp cpp
myname# 

Ура! В этот раз компиляция проходит успешно.

Попробуем компилятор в действии, напишем классический helloworld

myname#  vi hello.c
#include <stdio.h>
int main() {
        printf("Hello from gcc v0.9\n");
        return 0;
}
myname# ./gcc -v -o hello hello.c
 cpp -Dvax hello.c /tmp/cc000137.cpp
 cc1 /tmp/cc000137.cpp -quiet -dumpbase hello.c -noreg -o /tmp/cc000137.s
 as -o hello.o /tmp/cc000137.s
 ld -o hello /lib/crt0.o hello.o -lc
_end: ld:user attempt to redfine loader-defined symbol
_main: hello.o: multiply defined
myname# ls -all /usr/tmp/gcc-0.9/hello
-rwxrwxr-x  1 root         8192 Feb 18 06:32 /usr/tmp/gcc-0.9/hello
myname# ./hello
Hello from gcc v0.9
myname#

Работает!

Идем дальше... Далее по мануалу, необходимо удалить все объектные файлы и указать в качестве компилятора самого себя. Но...

myname# rm -f *.o
myname# make CC=./gcc CFLAGS="-g -O -I."
./gcc -c -g -O -I. gcc.c
Assembler:
"/tmp/cc001960.s", line 698: "jaoblss" is not followed by a ':' for a label definition
"/tmp/cc001960.s", line 794: "jaoblss" is not followed by a ':' for a label definition
"/tmp/cc001960.s", line 1187: "jaoblss" is not followed by a ':' for a label definition
"/tmp/cc001960.s", line 1399: "jaoblss" is not followed by a ':' for a label definition
"/tmp/cc001960.s", line 1429: "jaoblss" is not followed by a ':' for a label definition
"/tmp/cc001960.s", line 1691: "jaoblss" is not followed by a ':' for a label definition
./gcc -g -O -I. -c obstack.c
/usr/include/obstack.h: No such file or directory
In function _obstack_begin:
obstack.c:105: parse error
obstack.c:106: variable chunk used but not declared
obstack.c:106: undefined struct tag obstack
obstack.c:106: request for member chunk in something not a structure or union
obstack.c:107: parse error
obstack.c:107: undefined struct tag obstack
obstack.c:107: request for member chunk_size in something not a structure or union
obstack.c:108: undefined struct tag obstack
obstack.c:108: request for member next_free in something not a structure or union
obstack.c:108: undefined struct tag obstack
obstack.c:108: request for member object_base in something not a structure or union
obstack.c:108: variable chunk used but not declared
obstack.c:109: undefined struct tag obstack
obstack.c:109: request for member chunk_limit in something not a structure or union
obstack.c:109: variable chunk used but not declared
obstack.c:110: variable chunk used but not declared
obstack.c:110: undefined struct tag obstack
obstack.c:110: request for member chunk_size in something not a structure or union
obstack.c:111: variable chunk used but not declared
In function _obstack_newchunk:
obstack.c:126: parse error
obstack.c:127: redeclaration of _Ll
obstack.c:127: parse error
obstack.c:129: undefined struct tag obstack
obstack.c:129: request for member next_free in something not a structure or union
obstack.c:129: undefined struct tag obstack
obstack.c:129: request for member object_base in something not a structure or union
obstack.c:133: undefined struct tag obstack
obstack.c:133: request for member chunk_size in something not a structure or union
obstack.c:134: undefined struct tag obstack
obstack.c:134: request for member chunk_size in something not a structure or union
obstack.c:137: variable new_chunk used but not declared
obstack.c:137: undefined struct tag obstack
obstack.c:137: request for member chunk in something not a structure or union
obstack.c:137: parse error
obstack.c:138: variable new_chunk used but not declared
obstack.c:138: variable old_chunk used but not declared
obstack.c:139: variable new_chunk used but not declared
obstack.c:139: undefined struct tag obstack
obstack.c:139: request for member chunk_limit in something not a structure or union
obstack.c:139: variable new_chunk used but not declared
obstack.c:142: undefined struct tag obstack
obstack.c:142: request for member object_base in something not a structure or union
obstack.c:142: variable new_chunk used but not declared
obstack.c:143: undefined struct tag obstack
obstack.c:143: request for member object_base in something not a structure or union
obstack.c:143: variable new_chunk used but not declared
obstack.c:144: undefined struct tag obstack
obstack.c:144: request for member next_free in something not a structure or union
obstack.c:144: undefined struct tag obstack
obstack.c:144: request for member object_base in something not a structure or union
In function _obstack_free:
obstack.c:153: parse error
obstack.c:154: redeclaration of _Ll
obstack.c:154: parse error
obstack.c:156: variable lp used but not declared
obstack.c:156: undefined struct tag obstack
obstack.c:156: request for member chunk in something not a structure or union
obstack.c:157: variable lp used but not declared
obstack.c:157: variable lp used but not declared
obstack.c:157: variable lp used but not declared
obstack.c:159: variable plp used but not declared
obstack.c:159: variable lp used but not declared
obstack.c:160: variable lp used but not declared
obstack.c:161: variable lp used but not declared
obstack.c:161: variable plp used but not declared
obstack.c:163: variable lp used but not declared
obstack.c:165: undefined struct tag obstack
obstack.c:165: request for member object_base in something not a structure or union
obstack.c:165: undefined struct tag obstack
obstack.c:165: request for member next_free in something not a structure or union
obstack.c:166: undefined struct tag obstack
obstack.c:166: request for member chunk_limit in something not a structure or union
obstack.c:166: variable lp used but not declared
obstack.c:167: undefined struct tag obstack
obstack.c:167: request for member chunk in something not a structure or union
obstack.c:167: variable lp used but not declared
ld -o gcc /lib/crt0.o gcc.o -lg obstack.o  -lc
ld:gcc.o: cannot open
*** Error code 4

Stop.
myname# 

:( Опять неудача, смотрим, что на этот раз надо... Похоже не может найти заголовочный файл

/usr/include/obstack.h: No such file or directory

На как не игрался с ключом -I в CFLAGS ничего не получалось. И даже если всеже скопировать obstack.h в указанный путь комипиляция завершалась неудачно. Только что откомпилированный gcc не хотел компилировать самого себя. А ведь Столманн в утверждал обратное...

myname# cp obstack.h /usr/include
myname# make CC=./gcc CFLAGS='-g -I.'
./gcc -c -g -I. gcc.c
./gcc -g -I. -c obstack.c
ld -o gcc /lib/crt0.o gcc.o -lg obstack.o  -lc
./gcc -g -I. -c toplev.c
bison -v parse.y
parse.y contains 12 shift/reduce conflicts.
./gcc -g -I. -c parse.tab.c
./gcc -g -I. -c tree.c
./gcc -g -I. -c print-tree.c
./gcc -g -I. -c decl.c
Assembler:
"/tmp/cc002407.s", line 4304: WARNING: Caution: G or H format floating point operators
"/tmp/cc002407.s", line 4304: WARNING: These are not defined for all implementations of the VAX architecture.

./gcc -g -I. -c typecheck.c
./gcc -g -I. -c stor-layout.c
./gcc -g -I. -c fold-const.c
./gcc -g -I. -c varasm.c
./gcc -g -I. -c rtl.c
./gcc -c -g -I. genflags.c
./gcc -o genflags -g genflags.o rtl.o obstack.o 
genflags md > insn-flags.h
./gcc -c -g -I. gencodes.c
./gcc -o gencodes -g gencodes.o rtl.o obstack.o 
gencodes md > insn-codes.h
./gcc -g -I. -c expr.c
./gcc -g -I. -c stmt.c
./gcc -g -I. -c expmed.c
./gcc -g -I. -c explow.c
./gcc -c -g -I. genconfig.c
./gcc -o genconfig -g genconfig.o rtl.o obstack.o 
genconfig md > insn-config.h
./gcc -g -I. -c optabs.c
./gcc -g -I. -c symout.c
./gcc -g -I. -c dbxout.c
./gcc -g -I. -c emit-rtl.c
./gcc -c -g -I. genemit.c
./gcc -o genemit -g genemit.o rtl.o obstack.o 
genemit md > insn-emit.c
./gcc -c -g -I. insn-emit.c
./gcc -g -I. -c jump.c
./gcc -g -I. -c cse.c
./gcc -g -I. -c loop.c
./gcc -g -I. -c flow.c
./gcc -g -I. -c stupid.c
./gcc -g -I. -c combine.c
./gcc -g -I. -c regclass.c
./gcc -g -I. -c local-alloc.c
./gcc -g -I. -c global-alloc.c
./gcc -g -I. -c reload.c
./gcc -g -I. -c reload1.c
./gcc -g -I. -c final.c
./gcc -g -I. -c recog.c
./gcc -c -g -I. genrecog.c
./gcc -o genrecog -g genrecog.o rtl.o obstack.o 
genrecog md > insn-recog.c
./gcc -c -g -I. insn-recog.c
./gcc -c -g -I. genextract.c
./gcc -o genextract -g genextract.o rtl.o obstack.o 
genextract md > insn-extract.c
./gcc -c -g -I. insn-extract.c
./gcc -c -g -I. genoutput.c
./gcc -o genoutput -g genoutput.o rtl.o obstack.o 
genoutput md > insn-output.c
./gcc -c -g -I. insn-output.c
ld -o cc1 /lib/crt0.o toplev.o parse.tab.o tree.o print-tree.o  decl.o typecheck.o stor-layout.o fold-const.o  varasm.o rtl.o expr.o stmt.o expmed.o explow.o optabs.o  symout.o dbxout.o emit-rtl.o insn-emit.o  jump.o cse.o loop.o flow.o stupid.o combine.o  regclass.o local-alloc.o global-alloc.o reload.o reload1.o  final.o recog.o insn-recog.o insn-extract.o insn-output.o -lg obstack.o  -lc
Undefined:
_yydebug
_umodsi3
_lshrsi3
_udivsi3
_umulsi3
*** Error code 1

Stop.
myname#

И если с _yydebug можно, что-то сделать, то что делать с _umodsi3, _lshrsi3, _udivsi3, _umulsi3 пока не понятно.

Недостающие библиотечные функции которых нехватало для успешной компиляции для vax были реализованы в файле vaxlib.c. Но указаный исходный файл не компилировался при текущих Makefile. Для того, чтобы успешно откомпилировать изменил Makefile. Но важный момент необходимо чтобы vaxlib.c компилировался компилятором cc, поэтому у нас два файла, один для первой страдии компиляции, а второй соответственно для второй.

cp Makefile Makefile.vaxlib
vi Makefile.vaxlib

OBJS = toplev.o parse.tab.o tree.o print-tree.o \
 decl.o typecheck.o stor-layout.o fold-const.o \
 varasm.o rtl.o expr.o stmt.o expmed.o explow.o optabs.o \
 symout.o dbxout.o emit-rtl.o insn-emit.o \
 jump.o cse.o loop.o flow.o stupid.o combine.o \
 regclass.o local-alloc.o global-alloc.o reload.o reload1.o \
 final.o recog.o insn-recog.o insn-extract.o insn-output.o vaxlib.o <-- Добавить vaxlib.o

cp Makefile Makefile.gcc
vi Makefile.gcc

gcc: gcc.o $(OBSTACK1)
        ld -o gcc /lib/crt0.o gcc.o vaxlib.o -lg $(LIBS) -lc <-- Добавить vaxlib.o
...
cccp: cccp.o y.tab.o
        cc -o cccp -g cccp.o vaxlib.o y.tab.o <-- Добавить vaxlib.o

После этого запускаем процесс компиляции 1 стадии.

myname# make CFLAGS+=' -g -I. -DYYDEBUG' -f Makefile.vaxlib
cc -c -g -I. -DYYDEBUG gcc.c
cc -g -I. -DYYDEBUG -c obstack.c
ld -o gcc /lib/crt0.o gcc.o -lg obstack.o  -lc
cc -g -I. -DYYDEBUG -c toplev.c
bison -v parse.y
parse.y contains 12 shift/reduce conflicts.
cc -g -I. -DYYDEBUG -c parse.tab.c
cc -g -I. -DYYDEBUG -c tree.c
cc -g -I. -DYYDEBUG -c print-tree.c
cc -g -I. -DYYDEBUG -c decl.c
cc -g -I. -DYYDEBUG -c typecheck.c
cc -g -I. -DYYDEBUG -c stor-layout.c
cc -g -I. -DYYDEBUG -c fold-const.c
cc -g -I. -DYYDEBUG -c varasm.c
cc -g -I. -DYYDEBUG -c rtl.c
cc -c -g -I. -DYYDEBUG genflags.c
cc -o genflags -g genflags.o rtl.o obstack.o 
genflags md > insn-flags.h
cc -c -g -I. -DYYDEBUG gencodes.c
cc -o gencodes -g gencodes.o rtl.o obstack.o 
gencodes md > insn-codes.h
cc -g -I. -DYYDEBUG -c expr.c
cc -g -I. -DYYDEBUG -c stmt.c
cc -g -I. -DYYDEBUG -c expmed.c
cc -g -I. -DYYDEBUG -c explow.c
cc -c -g -I. -DYYDEBUG genconfig.c
cc -o genconfig -g genconfig.o rtl.o obstack.o 
genconfig md > insn-config.h
cc -g -I. -DYYDEBUG -c optabs.c
cc -g -I. -DYYDEBUG -c symout.c
cc -g -I. -DYYDEBUG -c dbxout.c
cc -g -I. -DYYDEBUG -c emit-rtl.c
cc -c -g -I. -DYYDEBUG genemit.c
cc -o genemit -g genemit.o rtl.o obstack.o 
genemit md > insn-emit.c
cc -c -g -I. -DYYDEBUG insn-emit.c
cc -g -I. -DYYDEBUG -c jump.c
cc -g -I. -DYYDEBUG -c cse.c
cc -g -I. -DYYDEBUG -c loop.c
cc -g -I. -DYYDEBUG -c flow.c
cc -g -I. -DYYDEBUG -c stupid.c
cc -g -I. -DYYDEBUG -c combine.c
cc -g -I. -DYYDEBUG -c regclass.c
cc -g -I. -DYYDEBUG -c local-alloc.c
cc -g -I. -DYYDEBUG -c global-alloc.c
cc -g -I. -DYYDEBUG -c reload.c
cc -g -I. -DYYDEBUG -c reload1.c
cc -g -I. -DYYDEBUG -c final.c
cc -g -I. -DYYDEBUG -c recog.c
cc -c -g -I. -DYYDEBUG genrecog.c
cc -o genrecog -g genrecog.o rtl.o obstack.o 
genrecog md > insn-recog.c
cc -c -g -I. -DYYDEBUG insn-recog.c
cc -c -g -I. -DYYDEBUG genextract.c
cc -o genextract -g genextract.o rtl.o obstack.o 
genextract md > insn-extract.c
cc -c -g -I. -DYYDEBUG insn-extract.c
cc -c -g -I. -DYYDEBUG genoutput.c
cc -o genoutput -g genoutput.o rtl.o obstack.o 
genoutput md > insn-output.c
cc -c -g -I. -DYYDEBUG insn-output.c
cc -g -I. -DYYDEBUG -c vaxlib.c
ld -o cc1 /lib/crt0.o toplev.o parse.tab.o tree.o print-tree.o  decl.o typecheck.o stor-layout.o fold-const.o  varasm.o rtl.o expr.o stmt.o expmed.o explow.o optabs.o  symout.o dbxout.o emit-rtl.o insn-emit.o  jump.o cse.o loop.o flow.o stupid.o combine.o  regclass.o local-alloc.o global-alloc.o reload.o reload1.o  final.o recog.o insn-recog.o insn-extract.o insn-output.o vaxlib.o -lg obstack.o  -lc
cc -g -I. -DYYDEBUG -c cccp.c
echo expect 40 shift/reduce conflicts
expect 40 shift/reduce conflicts
yacc cexp.y

conflicts: 40 shift/reduce
cc -g -I. -DYYDEBUG -c y.tab.c
cc -o cccp -g cccp.o y.tab.o
rm -f cpp
ln cccp cpp
myname#

mkdir stage1
cp gcc cc1 cpp stage1

myname# ls -all stage1
total 1190
drwxrwxr-x  2 root          512 Feb 18 08:16 .
drwxr-xr-x  3 219          3584 Feb 18 08:16 ..
-rwxrwxr-x  1 root      1069056 Feb 18 08:16 cc1
-rwxrwxr-x  1 root       101376 Feb 18 08:16 cpp
-rwxrwxr-x  1 root        33792 Feb 18 08:16 gcc

myname# ls -all *.o
-rw-rw-r--  1 root        82819 Feb 18 08:36 cccp.o
-rw-rw-r--  1 root        34127 Feb 18 08:36 combine.o
-rw-rw-r--  1 root        50605 Feb 18 08:36 cse.o
-rw-rw-r--  1 root        22907 Feb 18 08:36 dbxout.o
-rw-rw-r--  1 root        50631 Feb 18 08:35 decl.o
-rw-rw-r--  1 root        16883 Feb 18 08:36 emit-rtl.o
-rw-rw-r--  1 root        29277 Feb 18 08:36 explow.o
-rw-rw-r--  1 root        31475 Feb 18 08:36 expmed.o
-rw-rw-r--  1 root        70513 Feb 18 08:36 expr.o
-rw-rw-r--  1 root        21504 Feb 18 08:36 final.o
-rw-rw-r--  1 root        33481 Feb 18 08:36 flow.o
-rw-rw-r--  1 root        32889 Feb 18 08:35 fold-const.o
-rw-rw-r--  1 root        22756 Feb 18 08:35 gcc.o
-rw-rw-r--  1 root         6006 Feb 18 08:35 gencodes.o
-rw-rw-r--  1 root         7674 Feb 18 08:36 genconfig.o
-rw-rw-r--  1 root        10585 Feb 18 08:36 genemit.o
-rw-rw-r--  1 root         9273 Feb 18 08:36 genextract.o
-rw-rw-r--  1 root         7589 Feb 18 08:35 genflags.o
-rw-rw-r--  1 root        12961 Feb 18 08:36 genoutput.o
-rw-rw-r--  1 root        25474 Feb 18 08:36 genrecog.o
-rw-rw-r--  1 root        20011 Feb 18 08:36 global-alloc.o
-rw-rw-r--  1 root        25645 Feb 18 08:36 insn-emit.o
-rw-rw-r--  1 root        46021 Feb 18 08:36 insn-extract.o
-rw-rw-r--  1 root        31635 Feb 18 08:36 insn-output.o
-rw-rw-r--  1 root        59382 Feb 18 08:36 insn-recog.o
-rw-rw-r--  1 root        15316 Feb 18 08:36 jump.o
-rw-rw-r--  1 root        24281 Feb 18 08:36 local-alloc.o
-rw-rw-r--  1 root        24476 Feb 18 08:36 loop.o
-rw-rw-r--  1 root         2398 Feb 18 08:35 obstack.o
-rw-rw-r--  1 root        37313 Feb 18 08:36 optabs.o
-rw-rw-r--  1 root        64723 Feb 18 08:35 parse.tab.o
-rw-rw-r--  1 root        22105 Feb 18 08:35 print-tree.o
-rw-rw-r--  1 root        24221 Feb 18 08:36 recog.o
-rw-rw-r--  1 root        12729 Feb 18 08:36 regclass.o
-rw-rw-r--  1 root        50396 Feb 18 08:36 reload.o
-rw-rw-r--  1 root        24394 Feb 18 08:36 reload1.o
-rw-rw-r--  1 root        25630 Feb 18 08:35 rtl.o
-rw-rw-r--  1 root        35331 Feb 18 08:36 stmt.o
-rw-rw-r--  1 root        23947 Feb 18 08:35 stor-layout.o
-rw-rw-r--  1 root        12538 Feb 18 08:36 stupid.o
-rw-rw-r--  1 root        30130 Feb 18 08:36 symout.o
-rw-rw-r--  1 root        39425 Feb 18 08:35 toplev.o
-rw-rw-r--  1 root        41527 Feb 18 08:35 tree.o
-rw-rw-r--  1 root        57957 Feb 18 08:35 typecheck.o
-rw-rw-r--  1 root        31504 Feb 18 08:35 varasm.o
-rw-rw-r--  1 root         1134 Feb 18 08:36 vaxlib.o
-rw-rw-r--  1 root        14143 Feb 18 08:36 y.tab.o
myname#

Далее, согласно оригинальному мануалу, необходимо компилировать без оптимизации (с опцией -O). Но с данной опцией у меня не заработало.

make CC=./gcc CFLAGS='-g -I. -DYYDEBUG' -f Makefile.gcc
myname# make CC=./gcc CFLAGS='-g -I. -DYYDEBUG' -f Makefile.gcc
./gcc -c -g -I. -DYYDEBUG gcc.c
./gcc -g -I. -DYYDEBUG -c obstack.c
ld -o gcc /lib/crt0.o gcc.o -lg obstack.o  -lc
./gcc -g -I. -DYYDEBUG -c toplev.c
bison -v parse.y
parse.y contains 12 shift/reduce conflicts.
./gcc -g -I. -DYYDEBUG -c parse.tab.c
./gcc -g -I. -DYYDEBUG -c tree.c
./gcc -g -I. -DYYDEBUG -c print-tree.c
./gcc -g -I. -DYYDEBUG -c decl.c
Assembler:
"/tmp/cc005600.s", line 4304: WARNING: Caution: G or H format floating point operators
"/tmp/cc005600.s", line 4304: WARNING: These are not defined for all implementations of the VAX architecture.

./gcc -g -I. -DYYDEBUG -c typecheck.c
./gcc -g -I. -DYYDEBUG -c stor-layout.c
./gcc -g -I. -DYYDEBUG -c fold-const.c
./gcc -g -I. -DYYDEBUG -c varasm.c
./gcc -g -I. -DYYDEBUG -c rtl.c
./gcc -c -g -I. -DYYDEBUG genflags.c
./gcc -o genflags -g genflags.o rtl.o obstack.o 
genflags md > insn-flags.h
./gcc -c -g -I. -DYYDEBUG gencodes.c
./gcc -o gencodes -g gencodes.o rtl.o obstack.o 
gencodes md > insn-codes.h
./gcc -g -I. -DYYDEBUG -c expr.c
./gcc -g -I. -DYYDEBUG -c stmt.c
./gcc -g -I. -DYYDEBUG -c expmed.c
./gcc -g -I. -DYYDEBUG -c explow.c
./gcc -c -g -I. -DYYDEBUG genconfig.c
./gcc -o genconfig -g genconfig.o rtl.o obstack.o 
genconfig md > insn-config.h
./gcc -g -I. -DYYDEBUG -c optabs.c
./gcc -g -I. -DYYDEBUG -c symout.c
./gcc -g -I. -DYYDEBUG -c dbxout.c
./gcc -g -I. -DYYDEBUG -c emit-rtl.c
./gcc -c -g -I. -DYYDEBUG genemit.c
./gcc -o genemit -g genemit.o rtl.o obstack.o 
genemit md > insn-emit.c
./gcc -c -g -I. -DYYDEBUG insn-emit.c
./gcc -g -I. -DYYDEBUG -c jump.c
./gcc -g -I. -DYYDEBUG -c cse.c
./gcc -g -I. -DYYDEBUG -c loop.c
./gcc -g -I. -DYYDEBUG -c flow.c
./gcc -g -I. -DYYDEBUG -c stupid.c
./gcc -g -I. -DYYDEBUG -c combine.c
./gcc -g -I. -DYYDEBUG -c regclass.c
./gcc -g -I. -DYYDEBUG -c local-alloc.c
./gcc -g -I. -DYYDEBUG -c global-alloc.c
./gcc -g -I. -DYYDEBUG -c reload.c
./gcc -g -I. -DYYDEBUG -c reload1.c
./gcc -g -I. -DYYDEBUG -c final.c
./gcc -g -I. -DYYDEBUG -c recog.c
./gcc -c -g -I. -DYYDEBUG genrecog.c
./gcc -o genrecog -g genrecog.o rtl.o obstack.o 
genrecog md > insn-recog.c
./gcc -c -g -I. -DYYDEBUG insn-recog.c
./gcc -c -g -I. -DYYDEBUG genextract.c
./gcc -o genextract -g genextract.o rtl.o obstack.o 
genextract md > insn-extract.c
./gcc -c -g -I. -DYYDEBUG insn-extract.c
./gcc -c -g -I. -DYYDEBUG genoutput.c
./gcc -o genoutput -g genoutput.o rtl.o obstack.o 
genoutput md > insn-output.c
./gcc -c -g -I. -DYYDEBUG insn-output.c
ld -o cc1 /lib/crt0.o toplev.o parse.tab.o tree.o print-tree.o  decl.o typecheck.o stor-layout.o fold-const.o  varasm.o rtl.o expr.o stmt.o expmed.o explow.o optabs.o  symout.o dbxout.o emit-rtl.o insn-emit.o  jump.o cse.o loop.o flow.o stupid.o combine.o  regclass.o local-alloc.o global-alloc.o reload.o reload1.o  final.o recog.o insn-recog.o insn-extract.o insn-output.o  vaxlib.o -lg obstack.o  -lc
./gcc -g -I. -DYYDEBUG -c cccp.c
Assembler:
"/tmp/cc005787.s", line 875: WARNING: Immediate constant type long mismatches instruction type word
echo expect 40 shift/reduce conflicts
expect 40 shift/reduce conflicts
yacc cexp.y

conflicts: 40 shift/reduce
./gcc -g -I. -DYYDEBUG -c y.tab.c
cc -o cccp -g cccp.o vaxlib.o y.tab.o
rm -f cpp
ln cccp cpp
myname#

mkdir stage2
cp gcc cc1 cpp stage2

myname# ls -all stage2
total 1020
drwxrwxr-x  2 root          512 Feb 18 09:00 .
drwxr-xr-x  4 219          3584 Feb 18 09:00 ..
-rwxrwxr-x  1 root       906240 Feb 18 09:00 cc1
-rwxrwxr-x  1 root        90112 Feb 18 09:00 cpp
-rwxrwxr-x  1 root        31744 Feb 18 09:00 gcc

myname# ls -all *.o
-rw-rw-r--  1 root        70613 Feb 18 09:00 cccp.o
-rw-rw-r--  1 root        25966 Feb 18 09:00 combine.o
-rw-rw-r--  1 root        40044 Feb 18 08:59 cse.o
-rw-rw-r--  1 root        21086 Feb 18 08:59 dbxout.o
-rw-rw-r--  1 root        42268 Feb 18 08:59 decl.o
-rw-rw-r--  1 root        14942 Feb 18 08:59 emit-rtl.o
-rw-rw-r--  1 root        24460 Feb 18 08:59 explow.o
-rw-rw-r--  1 root        27151 Feb 18 08:59 expmed.o
-rw-rw-r--  1 root        58637 Feb 18 08:59 expr.o
-rw-rw-r--  1 root        18115 Feb 18 09:00 final.o
-rw-rw-r--  1 root        26759 Feb 18 08:59 flow.o
-rw-rw-r--  1 root        28870 Feb 18 08:59 fold-const.o
-rw-rw-r--  1 root        20524 Feb 18 08:59 gcc.o
-rw-rw-r--  1 root         5979 Feb 18 08:59 gencodes.o
-rw-rw-r--  1 root         7451 Feb 18 08:59 genconfig.o
-rw-rw-r--  1 root        10056 Feb 18 08:59 genemit.o
-rw-rw-r--  1 root         8921 Feb 18 09:00 genextract.o
-rw-rw-r--  1 root         7358 Feb 18 08:59 genflags.o
-rw-rw-r--  1 root        12284 Feb 18 09:00 genoutput.o
-rw-rw-r--  1 root        23036 Feb 18 09:00 genrecog.o
-rw-rw-r--  1 root        16680 Feb 18 09:00 global-alloc.o
-rw-rw-r--  1 root        23951 Feb 18 08:59 insn-emit.o
-rw-rw-r--  1 root        43116 Feb 18 09:00 insn-extract.o
-rw-rw-r--  1 root        29492 Feb 18 09:00 insn-output.o
-rw-rw-r--  1 root        58453 Feb 18 09:00 insn-recog.o
-rw-rw-r--  1 root        12626 Feb 18 08:59 jump.o
-rw-rw-r--  1 root        18965 Feb 18 09:00 local-alloc.o
-rw-rw-r--  1 root        19064 Feb 18 08:59 loop.o
-rw-rw-r--  1 root         2254 Feb 18 08:59 obstack.o
-rw-rw-r--  1 root        33223 Feb 18 08:59 optabs.o
-rw-rw-r--  1 root        60894 Feb 18 08:59 parse.tab.o
-rw-rw-r--  1 root        22396 Feb 18 08:59 print-tree.o
-rw-rw-r--  1 root        20013 Feb 18 09:00 recog.o
-rw-rw-r--  1 root        10469 Feb 18 09:00 regclass.o
-rw-rw-r--  1 root        38714 Feb 18 09:00 reload.o
-rw-rw-r--  1 root        18321 Feb 18 09:00 reload1.o
-rw-rw-r--  1 root        23001 Feb 18 08:59 rtl.o
-rw-rw-r--  1 root        30355 Feb 18 08:59 stmt.o
-rw-rw-r--  1 root        21122 Feb 18 08:59 stor-layout.o
-rw-rw-r--  1 root        10222 Feb 18 08:59 stupid.o
-rw-rw-r--  1 root        28133 Feb 18 08:59 symout.o
-rw-rw-r--  1 root        36967 Feb 18 08:59 toplev.o
-rw-rw-r--  1 root        36793 Feb 18 08:59 tree.o
-rw-rw-r--  1 root        47589 Feb 18 08:59 typecheck.o
-rw-rw-r--  1 root        28409 Feb 18 08:59 varasm.o
-rw-rw-r--  1 root         1134 Feb 18 08:44 vaxlib.o
-rw-rw-r--  1 root        12749 Feb 18 09:00 y.tab.o
myname#

На последнем шаге необходимо установить скомпилированный gcc. Тут все делаем по документации

cp cc1 /usr/local/lib/gcc-cc1
cp /lib/cpp /lib/cpp.bsd
rm /lib/cpp
cp cpp /usr/local/lib/gcc-cpp
ln -s /usr/local/lib/gcc-cpp /lib/cpp
cp gcc /usr/local/bin/gcc

Промеряем, что hello world компилируется успешно.

cd tmp
cp /usr/tmp/gcc-0.9/hello.c .

myname# /usr/local/bin/gcc -v -o hello hello.c
 /usr/local/lib/gcc-cpp -Dvax hello.c /tmp/cc005821.cpp
 /usr/local/lib/gcc-cc1 /tmp/cc005821.cpp -quiet -dumpbase hello.c -noreg -o /tmp/cc005821.s
 as -o hello.o /tmp/cc005821.s
 ld -o hello /lib/crt0.o hello.o -lc

myname# ls -all hello
-rwxrwxr-x  1 root         8192 Feb 18 09:05 hello

myname# ./hello
Hello from gcc v0.9

Для удаление выполните команды

rm /lib/cpp
mv /lib/cpp.bsd /lib/cpp
rm /usr/local/lib/gcc-cpp
rm /usr/local/lib/gcc-cc1
rm /usr/local/bin/gcc

Компляция GDB-2.0

TODO: описать процесс компиляции GDB source

Отладка GCC v0.9

cd /usr/src/gcc-0.9
gdb stage1/gcc
set-args -v -o /tmp/hello /usr/src/hello/hello.c
tbreak main 
run

Отладка CPP

cd /usr/src/gcc-0.9
gdb stage1/cpp
set-args -Dvax /usr/src/hello/hello.c /tmp/cc000186.cpp 
tbreak main
run

@olegslavkin
Copy link
Author

olegslavkin commented Jun 15, 2020

vax11780# pwd
/usr/src/gcc-0.9

vax11780# stage1/gcc -v -o /tmp/hello /usr/src/hello/hello.c
 /usr/local/lib/gcc-cpp -Dvax /usr/src/hello/hello.c /tmp/cc000154.cpp
 /usr/local/lib/gcc-cc1 /tmp/cc000154.cpp -quiet -dumpbase /usr/src/hello/hello.c -noreg -o /tmp/cc000154.s
 as -o hello.o /tmp/cc000154.s
 ld -o /tmp/hello /lib/crt0.o hello.o -lc
vax11780#

@olegslavkin
Copy link
Author

olegslavkin commented Jun 16, 2020

tee /usr/src/hello/empty.c > /dev/null << EOL
int main () {}
EOL

cd /usr/src/gcc-0.9
stage1/gcc -v -o /tmp/empty /usr/src/hello/empty.c

 /usr/local/lib/gcc-cpp -Dvax /usr/src/hello/empty.c /tmp/cc000920.cpp
 /usr/local/lib/gcc-cc1 /tmp/cc000920.cpp -quiet -dumpbase /usr/src/hello/empty.c -noreg -o /tmp/cc000920.s
 as -o empty.o /tmp/cc000920.s
 ld -o /tmp/empty /lib/crt0.o empty.o -lc

Debug C Compiler

cd /usr/src/gcc-0.9
/usr/local/lib/gcc-cpp -Dvax /usr/src/hello/empty.c /tmp/cc000001.cpp
/usr/src/gdb-2.0/gdb stage1/cc1
set-args /tmp/cc000001.cpp -quiet -dumpbase /usr/src/hello/empty.c -noreg -o /tmp/cc000001.s
break yylex
run

@olegslavkin
Copy link
Author

olegslavkin commented Jun 16, 2020

return 1

tee /usr/src/hello/r1.c > /dev/null << EOL
int main () {return 1;}
EOL

cd /usr/src/gcc-0.9
stage1/gcc -v -o /tmp/empty /usr/src/hello/r1.c

vax11780# stage1/gcc -v -o /tmp/empty /usr/src/hello/r1.c
 /usr/local/lib/gcc-cpp -Dvax /usr/src/hello/r1.c /tmp/cc001481.cpp
 /usr/local/lib/gcc-cc1 /tmp/cc001481.cpp -quiet -dumpbase /usr/src/hello/r1.c -noreg -o /tmp/cc001481.s
#/usr/local/lib/gcc-cc1 /tmp/cc001481.cpp -quiet -dumpbase /usr/src/hello/r1.c -dtrjsLfclg -noreg -o /tmp/cc001481.s
 as -o r1.o /tmp/cc001481.s
 ld -o /tmp/empty /lib/crt0.o r1.o -lc

@olegslavkin
Copy link
Author

tee /usr/src/hello/ex2.c > /dev/null << EOL
int main () {
int a = 1 + 2;
return a;
}
EOL 

cd /usr/src/gcc-0.9
stage1/cpp -Dvax /usr/src/hello/ex2.c /tmp/cc000002.cpp
stage1/cc1 /tmp/cc000002.cpp -quiet -dumpbase /usr/src/hello/ex2.c -drjsLfclg -noreg -o /tmp/cc000002.s

@olegslavkin
Copy link
Author

olegslavkin commented Jun 21, 2020

vi /usr/src/hello/ex3.c
int add (a,b)
 int a;
 int b;
{
return a+b;
}
int main() {
int c = 5;
int d = 10;

return add (5,10);
}

cd /usr/src/gcc-0.9
stage1/cpp -Dvax /usr/src/hello/ex3.c /tmp/cc000003.cpp
stage1/cc1 /tmp/cc000003.cpp -quiet -dumpbase /usr/src/hello/ex3.c -drjsLfclg -noreg -o /tmp/cc000003.s

gdb -q stage1/cc1
set-args  /tmp/cc000003.cpp -quiet -dumpbase /usr/src/hello/ex3.c -drjsLfclg -noreg -o /tmp/cc000003.s

@olegslavkin
Copy link
Author

vi /usr/src/hello/ex5.c
a(){}

cd /usr/src/gcc-0.9
stage1/cpp -Dvax /usr/src/hello/ex5.c /tmp/cc000005.cpp
gdb -q stage1/cc1
set-args /tmp/cc000005.cpp -quiet -dumpbase /usr/src/hello/ex5.c -noreg -o /tmp/cc000005.s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment