forget difference between big and small commands - obsolete with vm.
[minix.git] / commands / i386 / acd.descr
blob36593e314a02e714298d55107960960ef066415c
1 # ACD pass description for the ACK compilers.
3 # Pre-set variables.
4 #   PROGRAM             - Name the compiler driver is called with.
5 #   ARCH                - Default target architecture.
7 # Library directories search path.
8 L =     /lib /usr/lib
10 # ACK Compilers support search path.
11 A =     $L $L/ack
13 # ARCH must be defined.
14 ifndef ARCH
15         error "\$ARCH is not predefined"
17 # Get ARCH from the environment if set.
18 import ARCH
20 # Compiler passes.
21 ACK_CPP =       $A/cpp.ansi $CPP_F $PREDEF $NOLINENO
22 ACK_CEM =       $A/em_cemcom.ansi -L $CPP_F $PREDEF \
23                     -Vw${W}.${W}i${W}.${W}p${P}.${W}f4.${W}s2.2l4.${W}d8.${W}
24 ACK_M2 =        $A/em_m2 -I$MOD_INCL -WR \
25                     -Vw${W}.${W}i${W}.${W}p${P}.${W}l4.${W}f4.${W}d8.${W}
26 ACK_PC =        $A/em_pc \
27                     -Vw${W}.${W}i${W}.${W}l4.${W}p${P}.${W}f8.${W}S${W}.${W}
28 MOD_INCL =      $A/m2 +
29 ACK_DECODE =    $A/em_decode
30 ACK_ENCODE =    $A/em_encode
31 ACK_OPT =       $A/em_opt
32 ACK_EGO =       $A/em_ego -P $A/ego -M$EGO_DESCR
33 EGO_DESCR =     $A/ego/${ARCH}descr +
34 ACK_OPT2 =      $A/em_opt2
35 ACK_CG =        $A/$ARCH/cg
36 ACK_AS =        $A/$ARCH/as \-
37 ACK_LED =       $A/em_led -a0:$W -a1:$W -a2:$W -a3:$W
38 ACK_CV =        $A/cv
39 ASMCONV =       /usr/bin/asmconv
40 AAL =           /usr/bin/aal
42 # Minix predefined symbols.
43 CPP_F =         -D__minix -D__minix3 -D__$ARCH
45 # Library path.
46 LIBPATH = $USERLIBPATH $A/$ARCH
48 # Default output "model".
49 MODEL = -sep
51 # Floating point is done in software.
52 LIBS = -fsoft
54 # Default optimization level.
55 OPT_LEVEL = 1
57 # Call names.
58 if $PROGRAM = acc
59         PROGRAM = cc
60 if $PROGRAM = apc
61         PROGRAM = pc
62 if $PROGRAM = am2
63         PROGRAM = m2
64 if $PROGRAM = kcc
65         PROGRAM = cc
67 # Default transformation target.
68 stop .out
70 # Select the runtime environment by option or program name.
71 arg -.c
72 if $PROGRAM = cc
73         ifndef RTSO
74                 RTSO = -.c
75         LIBS = $LIBS + -.c
77 arg -.mod
78 if $PROGRAM = m2
79         ifndef RTSO
80                 RTSO = -.mod
81         LIBS = $LIBS + -.mod
83 arg -.p
84 if $PROGRAM = pc
85         ifndef RTSO
86                 RTSO = -.p
87         LIBS = $LIBS + -.p
89 # Omit the runtime startoff, but keep the libraries.
90 arg -.o
91         RTSO =
93 arg -.$any
94         error ".$any: unknown language"
96 # Select the target architecture.
97 arg -m$arch
98         ARCH = $arch
100 # Preprocessor directives.
101 arg -D$name
102 arg -D $name
103         CPP_F = $CPP_F -D$name
104 arg -U$name
105 arg -U $name
106         CPP_F = $CPP_F -U$name
107 arg -I$dir
108 arg -I $dir
109         CPP_F = $CPP_F -I$dir
110         ACK_M2 = $ACK_M2 -I$dir
112 # Debugging.
113 arg -g                          # Add debugging info.
114         ACK_CEM = $ACK_CEM -g
115         ACK_CG = $ACK_CG -gdb
117 arg -n                          # Suppress line numbers.
118         ACK_M2 = $ACK_M2 -L
119         ACK_PC = $ACK_PC -L
120 arg -a                          # Enable assertions.
121 arg -A                          # Enable array bound checks.
122         ACK_M2 = $ACK_M2 $*
123         ACK_PC = $ACK_PC $*
125 # Language checking.
126 arg -w                          # No warnings.
127         ACK_CEM = $ACK_CEM $*
128         ACK_M2 = $ACK_M2 $*
129         ACK_PC = $ACK_PC $*
131 arg -ws                         # No strict warnings.
132         ACK_CEM = $ACK_CEM -s
133         ACK_M2 = $ACK_M2 -wR
135 arg -wa                         # No warnings and no strict warnings.
136         ACK_CEM = $ACK_CEM -a
137         ACK_M2 = $ACK_M2 -wR
139 arg -wo                         # No warnings about old style C.
140         ACK_CPP = $ACK_CPP -o
141         ACK_CEM = $ACK_CEM -o
142         ACK_M2 = $ACK_M2 -wO
144 arg -3                          # Only accept 3rd generation Modula-2.
145         ACK_M2 = $ACK_M2 $*
147 arg -_                          # Allow underscores in identifiers.
148         ACK_M2 = $ACK_M2 -U
149         ACK_PC = $ACK_PC -U
151 arg -w$any
152 arg -F
153 arg -m
154         # Ignore strange -w flags, and past and present i86 compiler flags.
156 # Stop suffix.
157 arg -c
158         stop .o
160 arg -c.$stop
161         stop .$stop
163 arg -E
164         stop .E
166 arg -P
167         CPP_F = $CPP_F -P
168         stop .i
170 arg -S
171         stop .s
173 # Optimization.
174 arg -O
175         OPT_LEVEL = 1
177 arg -OS                         # Optimize for size.
178         ACK_EGO = $ACK_EGO -S
179 arg -OT                         # Optimize for time.
180         ACK_EGO = $ACK_EGO -T
182 arg -O$n
183         numeric $n
184         OPT_LEVEL = $n
186 # Library search path.
187 arg -L$dir
188 arg -L $dir
189         USERLIBPATH = $USERLIBPATH $dir/$ARCH $dir
191 # -llib must be searched in $LIBPATH later.
192 arg -l$lib
193 arg -l $lib
194         $> = $LIBPATH/lib$lib.a
196 # Software floating point, hardware floating point, or no floating point.
197 arg -f
198 arg -fp
199 arg -fsoft
200         LIBS = $LIBS + -fsoft
202 arg -fhard
203         LIBS = $LIBS - -fsoft
205 arg -fnone
206         LIBS = $LIBS + -fnone
208 # Output model.
209 arg -com
210         MODEL =                 # Common I&D.
212 arg -sep
213 arg -i                          # Separate I&D.
214         MODEL = -sep
216 arg -r                          # Relocatable object (combined .o)
217         MODEL = -r
219 # Strip executable.
220 arg -s
221         ACK_LED = $ACK_LED -s
223 # Size of heap+stack.
224 arg -stack $size
225         ACK_CV = $ACK_CV -S $size
227 # Change output file.
228 arg -o$out
229 arg -o $out
230         OUT = $out
232 # Complain about just -D, -U, -I, ...
233 arg -D; arg -U; arg -I; arg -L; arg -l; arg -o; arg -stack
234         error "argument expected after '$*'"
236 arg -R$pass-$flag               # The ACK way of passing options to passes.
237 arg -Wack-R$pass-$flag          # The ACD way.
238         if $pass = cpp
239                 ACK_CPP = $ACK_CPP -$flag
240         if $pass = cem
241                 ACK_CEM = $ACK_CEM -$flag
242         if $pass = m2
243                 ACK_M2 = $ACK_M2 -$flag
244         if $pass = pc
245                 ACK_PC = $ACK_PC -$flag
246         if $pass = opt
247                 ACK_OPT = $ACK_OPT -$flag
248         if $pass = ego
249                 ACK_EGO = $ACK_EGO -$flag
250         if $pass = opt2
251                 ACK_OPT2 = $ACK_OPT2 -$flag
252         if $pass = cg
253                 ACK_CG = $ACK_CG -$flag
254         if $pass = as
255                 ACK_AS = $ACK_AS -$flag
256         if $pass = led
257                 ACK_LED = $ACK_LED -$flag
259 arg -Was-$dialect               # Default assembly dialect.
260         ASDIALECT = $dialect
262 arg -W$any
263         # Ignore any other -W options.
265 # Complain about unknown options, don't give them to the loader.
266 arg -$any
267         error "$*: unknown option"
269 # Do the scanning phase early, we need to know the architecture.
270 scan
272 # The word and pointer sizes of the target.
273 if $ARCH = i86
274         W = 2; P = 2
275 if $ARCH = i386
276         W = 4; P = 4
278 ifndef W
279         error "$ARCH: unsupported architecture"
281 # Optimize -O2 or higher?
282 if (0 1 - $OPT_LEVEL) = (0 1)
283         ACK_EGO = $ACK_EGO -O$OPT_LEVEL
284         ACK_OPT = $ACK_OPT -m0  # Leave multiplication optimization to opt2.
285         prefer .m .gk
287 # Tell cem to reverse bitfields on the i386 to be compatible with gcc.
288 if $ARCH = i386
289         ACK_CEM = $ACK_CEM -Vr
291 # Predefined preprocessor flags.
292 PREDEF = -D_EM_WSIZE=$W -D_EM_PSIZE=$P -D_EM_SSIZE=2 -D_EM_LSIZE=4 \
293          -D_EM_FSIZE=4 -D_EM_DSIZE=8 -D__ACK__ -D_ACK
295 # Preprocess C source.
296 transform .c .i
297         $ACK_CPP $* > $>
299 # Preprocess any type of file and send it to standard output or $OUT.
300 transform "" .E
301         if $* = "-"
302                 file =          # Standard input.
303         else
304                 file = $*
305         ifndef OUT
306                 $ACK_CPP $file
307         else
308                 $ACK_CPP $file > $OUT
310 # Compile C source to EM-code.
311 transform .c .k
312 transform .i .k
313         $ACK_CEM $* $>
314         ifndef RTSO
315                 RTSO = -.c
316         LIBS = $LIBS + -.c
318 # Compile Modula-2 source to EM-code.
319 transform .mod .k
320         ifhash $*
321                 apply .c .i
322         $ACK_M2 $* $>
323         ifndef RTSO
324                 RTSO = -.mod
325         LIBS = $LIBS + -.mod
327 # Compile Pascal source to EM-code.
328 transform .p .k
329         ifhash $*
330                 apply .c .i
331         $ACK_PC $* $>
332         ifndef RTSO
333                 RTSO = -.p
334         LIBS = $LIBS + -.p
336 # Compact EM to readable EM.
337 transform .k .e
338 transform .m .e
339 transform .gk .e
340 transform .g .e
341         $ACK_DECODE $* > $>
343 # Readable EM to compact EM.
344 transform .e .k
345         ifhash $*
346                 NOLINENO = -P   # Encode chokes on cpp line directives.
347                 apply .c .i
348                 unset NOLINENO
349         $ACK_ENCODE $* > $>
351 # Peephole optimization.
352 transform .k .m
353         $ACK_OPT $* > $>
355 # Global optimization.
356 transform .m .gk
357         $ACK_EGO $* > $>
359 # Second peephole optimization after global optimization.
360 transform .gk .g
361         $ACK_OPT2 $* > $>
363 # EM-code to target machine assembly.
364 transform .m .ack.s
365 transform .g .ack.s
366 transform .m .s
367 transform .g .s
368         if $ARCH = i386
369                 $ACK_CG -F__fp_hook $* > $>
370         else
371                 $ACK_CG $* > $>
373 # How to treat plain .s?
374 ifndef ASDIALECT
375         transform .s .ack.s
376                 $> = $*
378 # Assembly to object file.
379 transform .ack.s .o
380         ifhash $*
381                 apply .c .i
382         if $> = $<.o
383                 ifdef OUT
384                         $> = $OUT
385         $ACK_AS -o $> $*
387 # Combine object files and libraries to an executable.
388 combine (.o .a) .out
389         if $MODEL = ()
390                 model = -b0:0
391         if $MODEL = (-sep)
392                 model = -b0:0 -b1:0
393         rtso =
394         if $RTSO = -.c
395                 rtso = $A/$ARCH/crtso.o
396         if $RTSO = -.mod
397                 rtso = $A/$ARCH/m2rtso.o
398         if $RTSO = -.p
399                 rtso = $A/$ARCH/prtso.o
400         libm2 = ; libp = ; libd = ; libc = ; libfp =
401         if (-.mod - $LIBS) = ()
402                 libm2 = $A/$ARCH/libm2.a
403                 libc = $A/$ARCH/libc.a
404         if (-.p - $LIBS) = ()
405                 libp = $A/$ARCH/libp.a
406                 libc = $A/$ARCH/libc.a
407         if (-.c - $LIBS) = ()
408                 libd = $A/$ARCH/libd.a
409                 libc = $A/$ARCH/libc.a
410         if (-fsoft - $LIBS) = ()
411                 libfp = $A/$ARCH/libfp.a
412         libs = $libm2 $libp $libd $libc $libfp $A/$ARCH/libe.a
413         ifndef OUT
414                 OUT = a.out
415         if (-r - $MODEL) = ()
416                 # Combine to an object file.
417                 $ACK_LED -r -o $OUT $*
418         else
419                 # Combine to an executable.
420                 mktemp EXE
421                 $ACK_LED $model -o $EXE $rtso $* $libs $A/$ARCH/end.a
422                 $ACK_CV -x -m$ARCH $EXE $OUT
424 # Add object files to a library.
425 combine (.o) .a
426         if $> = $<.a
427                 ifdef OUT
428                         $> = $OUT
429         $AAL cr $> $*
431 # Assembly conversions.
433 # ACK assembly to ACK Xenix assembly.
434 transform .ack.s .ncc.s
435         ifhash $*
436                 apply .c .i
437         $ASMCONV -m$ARCH ack ncc $* $>
439 # ACK assembly to GNU assembly.
440 transform .ack.s .gnu.s
441         ifhash $*
442                 apply .c .i
443         $ASMCONV -m$ARCH ack gnu $* $>
445 # ACK Xenix assembly to ACK assembly.
446 transform .ncc.s .ack.s
447         ifhash $*
448                 apply .c .i
449         $ASMCONV -m$ARCH ncc ack $* $>
451 # ACK Xenix assembly to GNU assembly.
452 transform .ncc.s .gnu.s
453         ifhash $*
454                 apply .c .i
455         $ASMCONV -m$ARCH ncc gnu $* $>
457 # BCC assembly to ACK assembly.
458 transform .bas.s .ack.s
459         ifhash $*
460                 apply .c .i
461         $ASMCONV -m$ARCH bas ack $* $>
463 # BCC assembly to ACK Xenix assembly.
464 transform .bas.s .ncc.s
465         ifhash $*
466                 apply .c .i
467         $ASMCONV -m$ARCH bas ncc $* $>
469 # BCC assembly to GNU assembly.
470 transform .bas.s .gnu.s
471         ifhash $*
472                 apply .c .i
473         $ASMCONV -m$ARCH bas gnu $* $>
475 #ifdef ASDIALECT
476         # Treat plain .s as being in the given dialect.
477         transform .s .$ASDIALECT.s
478                 $> = $*