ack.git
6 years agoSolve some gcc warnings in ego. kernigh-linuxppc kernigh-pr
George Koehler [Thu, 8 Mar 2018 23:51:07 +0000 (18:51 -0500)]
Solve some gcc warnings in ego.

Some of these are from gcc -Wimplicit

6 years agoRead from new, not old, buffer after realloc.
George Koehler [Thu, 8 Mar 2018 17:04:02 +0000 (12:04 -0500)]
Read from new, not old, buffer after realloc.

This got caught by MALLOC_OPTIONS=S in OpenBSD.  The B compiler filled
the buffer while compiling hilo.b.  Then realloc moved the buffer and
unmapped the old buffer.  The compiler tried to read the old buffer
and segfaulted.

6 years agoFix wr_ranlib() for big-endian machines.
George Koehler [Thu, 8 Mar 2018 16:49:40 +0000 (11:49 -0500)]
Fix wr_ranlib() for big-endian machines.

With this change, I built and ran ack on a big-endian PowerPC Linux
machine.  I used gcc 4.9.4 to build ack, and I only built the linuxppc
back end.

Before this change, wr_ranlib() corrupted a value by changing it from
0x66 to 0x66000066.  This value was too big, so led made a fatal
error, "bad ranlib string offset".

6 years agoAdd instructions like "lwarx". Extend manual.
George Koehler [Wed, 7 Mar 2018 18:37:31 +0000 (13:37 -0500)]
Add instructions like "lwarx".  Extend manual.

Add more page numbers from PowerPC version 2.01.  Remove "xnop" not in
2.01, add "mtcr" from 2.01.  Add "lwarx" and the other instructions
from Book II.  I did not try all the newly added instructions, but
these seem to work: dcbt, dcbtst, icibi, isync, lwarx, stwcx., mftb,
mftbu

In man/powerpc_as.6 (not installed), add a summary of the registers
and addressing modes (like in i386_as.6), describe short forms, update
description of hi16/ha16, add CAVEATS about instructions that some
processors can't run.

6 years agoOptimize procedures that do both a / b and a % b.
George Koehler [Mon, 5 Mar 2018 18:32:06 +0000 (13:32 -0500)]
Optimize procedures that do both a / b and a % b.

Enable this in CS for PowerPC; disable it for all other machines.
PowerPC has no remainder instruction; the back end uses division to
compute remainder.  If CS finds both a / b and a % b, then CS now
rewrites a % b as a - b * (a / b) and computes a / b only once.  This
removes an extra division in the PowerPC code, so it saves both time
and space.

I have not considered whether to enable this optimization for other
machines.  It might be less useful in machines with a remainder
instruction.  Also, if a % b occurs before a / b, the EM code gets a
DUP.  PowerPC ncg handles this DUP well; other back ends might not.

6 years agoCheck AAR earlier to prevent LOI/STI unknown size.
George Koehler [Fri, 2 Mar 2018 21:06:21 +0000 (16:06 -0500)]
Check AAR earlier to prevent LOI/STI unknown size.

In ego, the CS phase may convert a LAR/SAR to AAR LOI/STI so it can
optimize multiple occurrences of AAR of the same array element.  This
conversion should not happen if it would LOI/STI a large or unknown
size.

cs_profit.c okay_lines() checked the size of each occurrence of AAR
except the first.  If the first AAR was the implicit AAR in a LAR/SAR,
then the conversion happened without checking the size.  For unknown
size, this made a bad LOI -1 or STI -1.  Fix by checking the size
earlier: if a LAR/SAR has a bad size, then don't enter it as an AAR.

This Modula-2 code showed the bug.  Given M.def:

    DEFINITION MODULE M;
    TYPE S = SET OF [0..95];
    PROCEDURE F(a: ARRAY OF S; i, j: INTEGER);
    END M.

and M.mod:

    (*$R-*) IMPLEMENTATION MODULE M;
    FROM SYSTEM IMPORT ADDRESS, ADR;
    PROCEDURE G(s: S; p, q: ADDRESS; t: S); BEGIN
      s := s; p := p; q := q; t := t;
    END G;
    PROCEDURE F(a: ARRAY OF S; i, j: INTEGER); BEGIN
      G(a[i + j], ADR(a[i + j]), ADR(a[i + j]), a[i + j])
    END F;
    END M.

then the bug caused an error:

    $ ack -mlinuxppc -O3 -c.e M.mod
    /tmp/Ack_b357d.g, line 57: Argument range error

The bug had put LOI -1 in the code, then em_decode got an error
because -1 is out of range for LOI.

Procedure F has 4 occurrences of `a[i + j]`.  The size of `a[i + j]`
is 96 bits, or 12 bytes, but the EM code hides the size in an array
descriptor, so the size is unknown to CS.  The pragma `(*$R-*)`
disables a range check on `i + j` so CS can work.  EM uses AAR for the
2 `ADR(a[i + j])` and LAR for the other 2 `a[i + j]`.  EM pushes the
arguments to G in reverse order, so the last `a[i + j]` in Modula-2 is
the first LAR in EM.

CS found 4 occurrences of AAR.  The first AAR was an implicit AAR in
LAR.  Because of the bug, CS converted this LAR 4 to AAR 4 LOI -1.

6 years agoFixes for compiling ego with -DTRACE
George Koehler [Thu, 1 Mar 2018 18:19:38 +0000 (13:19 -0500)]
Fixes for compiling ego with -DTRACE

 - In share/debug.c, undo my mistake in commit 9037d13 by changing
   vfprintf back to fprintf in OUTTRACE.

 - In ud/ud.c, move the trace output from stdout to stderr, because
   stdout has ego's output file, which becomes opt2's input file.  If
   trace output goes to stdout, it gets prepended to the output file,
   and opt2 errors with "wrong input file".

I also edit both build.lua files so ego depends on its header files;
this part isn't needed for -DTRACE.

One can now use -DTRACE by adding it to the cflags in both build.lua
files.

6 years agoUse prototypes in ego/cs, ego/sp.
George Koehler [Mon, 5 Feb 2018 21:09:30 +0000 (16:09 -0500)]
Use prototypes in ego/cs, ego/sp.

6 years agoDon't use '-' in option string to getopt().
George Koehler [Mon, 5 Feb 2018 19:55:10 +0000 (14:55 -0500)]
Don't use '-' in option string to getopt().

Using '-' might fail on platforms like FreeBSD.  Commit 50a7031
stopped using '-' in the B compiler and ego.  I now stop using '-' in
mcg, because I can now check that mcg still works.

6 years agoOnly lower "addi sp, sp, X" if X > 0.
George Koehler [Thu, 1 Feb 2018 17:20:31 +0000 (12:20 -0500)]
Only lower "addi sp, sp, X" if X > 0.

If X < 0, then lowering the addi might cause the code to use the stack
space before allocating it.  This is a bug because an asynchronous
signal handler can overwrite the unallocated stack space.

6 years agoTeach mcg to pass our tests.
George Koehler [Tue, 30 Jan 2018 20:53:26 +0000 (15:53 -0500)]
Teach mcg to pass our tests.

Tests pass if one edits the top build.lua to uncomment "qemuppc" from
both vars.plats and vars.plats_with_tests, and one leaves mcg in
plat/qemuppc/descr.

Add or correct some EM instructions in treebuilder.c:
 - "lof", "stf": handle negative offsets in load() and store().
 - "cuu": add using IR_FROMUI.
 - "lim", "sim": keep an entire word in ".ignmask", to be compatible
   with mach/powerpc/libem/trp.s and ncg.  We also keep a word in
   ".ignmask" in ncg for both i386 and m68020.
 - "trp": pass trap number in register.  See comment in
   helper_function_with_arg().
 - "sig": push the old value of .trppc on the stack.
 - "and ?", "ior ?", "xor ?", "com ?", "cms ?", "set ?", "inn ?":
   connect to helper functions in libem.
 - "blm", "bls": drop call to memmove() and use new helper ".bls4",
   because tests/plat/structcopy_e.c can't call memmove().
 - "xor s", "cms s": if s is large, fall back on helper function.
 - "rol", "ror": add by decomposing each rotate into 4 IR ops.
 - "rck s", "bls s": make fatal unless s is word size.
 - "loi": push multiple loads in the correct order.
 - "dup s", "exg s": if s is large, fall back on helper.
 - "dus": add using new helper ".dus4".
 - "lxl", "lxa": follow the static chain, not the dynamic chain.
 - "lor 1": materialise the stack before pushing the stack pointer.
 - "lor 2", "str 2": make fatal.
 - "los", "sts": drop calls to memcpy() and use helpers ".los4" and
   and ".sts4", so lang/m2/libm2/LtoUset.e starts working.
 - "gto": correctly read descriptor.

Change mach/powerpc/mcg/table:
 - ANY.L: add for "asp -8".
 - LOAD.L: work around register corruption.
 - COMPAREUL.I: add for "cms 8".

6 years agoSync qemuppc with linuxppc.
George Koehler [Sun, 28 Jan 2018 02:41:13 +0000 (21:41 -0500)]
Sync qemuppc with linuxppc.

 - Don't reverse bitfields; do use ego (41f3bf7).
 - Use MACHOPT_F=-m2 (3dae9e4).
 - Remove old trap.s (26de4c1).

At this commit, one can build qemuppc with mcg by editing the root
build.lua to uncomment "qemuppc" in "vars.plats".  If one also
uncomments "qemuppc" from "vars.plats_with_tests", then mcg fails to
build the tests.  If one uses ncg (by editing plat/qemuppc/descr to
change "mcg" to "ncg"), then the tests pass.

6 years agoAdd tests for clearing BSS, copying C structs.
George Koehler [Sun, 28 Jan 2018 01:09:16 +0000 (20:09 -0500)]
Add tests for clearing BSS, copying C structs.

The new tests are bss_e.c, structcopy_e.c.  We do clear the BSS before
calling _m_a_i_n, so fix the comments in the other tests.

6 years agoFor osxppc, change size 8 to alignment 4.
George Koehler [Sat, 27 Jan 2018 21:35:48 +0000 (16:35 -0500)]
For osxppc, change size 8 to alignment 4.

You may need to delete and recompile some .o files!  This changes the
alignment of 8-byte values in C structs to match what Apple's gcc
does.  See Apple's "32-bit PowerPC Function Calling Conventions" at

    https://developer.apple.com
      /library/content/documentation/DeveloperTools/Conceptual/LowLevelABI
      /100-32-bit_PowerPC_Function_Calling_Conventions/32bitPowerPC.html

6 years agoUse subfic (val - reg) and mulli (reg * val).
George Koehler [Sat, 27 Jan 2018 20:33:43 +0000 (15:33 -0500)]
Use subfic (val - reg) and mulli (reg * val).

In the instruction list, put /* kills xer */ for sraw, srawi, subfic;
and correct the (now unused) "addi." and "lfdu".

Change MACHOPT_F from -m3 to -m2.  This changes the code for 15 * i
from

    slwi r3,r4,4
    subfic r5,r4,0
    add r3,r3,r5

to

    mulli r3,r4,15

If the sequence "slwi subfic addi" takes 3 cycles and 12 bytes, and
mulli takes 3 cycles and 4 bytes, then mulli is better.

6 years agoGet `ack -mosxppc -g` to partly work with gdb.
George Koehler [Sat, 27 Jan 2018 01:08:03 +0000 (20:08 -0500)]
Get `ack -mosxppc -g` to partly work with gdb.

Copy and adapt code from mach/{i386,m68020}/ncg/mach.c to pass the
debugging stabs from EM to assembly.  The next tools (as, led, cv)
already know how to put the stabs in the Mach-o executable.

Modify the function prolog/prologue so gdb uses fp, not sp, for N_LSYM
and N_PSYM stabs.  Simplify prolog() by reducing differences between
stabs and no stabs, and zero and nonzero framesize.  For files without
stabs, the new prolog has the same number of instructions and memory
accesses as the old prolog, and to run at about the same speed on my
PowerPC Mac.

This is enough to see some info for global and local variables in gdb
for Mac OS X.  I still can't get a backtrace; gdb gets confused
because EM and ncg don't link 0(sp) to the previous stack frame.

I don't expect `ack -mlinuxppc -g` to work with gdb for Linux, because
we prepend underscores to the symbol table, which is correct for
Mach-o but wrong for ELF.

6 years agoAdd some comments before I forget how this stuff works.
George Koehler [Wed, 24 Jan 2018 20:17:32 +0000 (15:17 -0500)]
Add some comments before I forget how this stuff works.

6 years agoAllow sp and fp on the fake stack.
George Koehler [Tue, 23 Jan 2018 23:18:40 +0000 (18:18 -0500)]
Allow sp and fp on the fake stack.

This simplifies parts of the PowerPC table and causes ncg to better
decide whether to push sp or fp to the real stack, or coerce it to
REG3, or coerce it to REG-REG3, or move it to a regvar.  These better
decisions remove extra _mr_ instructions.

The idea comes from mach/powerpc/arm/table, where SP has a property
STACKPOINTER and LB has LOCALBASE.  I don't need two properties, so I
make one property SPFP for both registers.

6 years agoMake osx386 and osxppc use _hol0.s like the other platforms.
George Koehler [Tue, 23 Jan 2018 18:55:39 +0000 (13:55 -0500)]
Make osx386 and osxppc use _hol0.s like the other platforms.

Because I'm lazy, I didn't make another copy of _hol0.s; I am building
plat/linux/libsys/_hol0.s for OS X.

6 years agoAdd fef 4, fif 4. Improve fef 8, fif 8. Other float changes.
George Koehler [Mon, 22 Jan 2018 19:04:15 +0000 (14:04 -0500)]
Add fef 4, fif 4.  Improve fef 8, fif 8.  Other float changes.

When I wrote fef 8, I forgot to test denormalized numbers.  Oops.  Now
fix two of my mistakes:

 - When checking for zero, `extrwi r6, r3, 22, 12` needs to be
   `extrwi r6, r3, 20, 12`.  There are only 20 bits to extract.

 - After the multiplication by 2**64, I forgot to put the fraction in
   [0.5, 1) or (-1, 0.5] by setting IEEE exponent = 1022.

Teach fif 8 about signed zero and NaN.

In ncg/table, change cmf so NaN is not equal to any value, and comment
why ordered comparisons don't work with NaN.  Also add cost for
fctwiz, remove extra `uses REG`.

Edit comment in cfu8.s because the conditional branch might be before
or after fctwiz.

6 years agoUse extended mnemonics and ha16/lo16.
George Koehler [Fri, 12 Jan 2018 01:04:27 +0000 (20:04 -0500)]
Use extended mnemonics and ha16/lo16.

Remove wrong comment: that's a right shift, not a left shift.

6 years agoRewrite sigaction() to prevent another race.
George Koehler [Thu, 11 Jan 2018 22:59:02 +0000 (17:59 -0500)]
Rewrite sigaction() to prevent another race.

A signal handler might call sigaction().  We must block all signals,
not only our signal, to prevent a race between us and the next signal
handler.

Use /* comments */ because cpp might expand macros in ! comments
though such expansion is probably harmless.

The bridge is now shorter by 2 instructions.

6 years agoThese are EM trap numbers.
George Koehler [Tue, 9 Jan 2018 05:39:03 +0000 (00:39 -0500)]
These are EM trap numbers.

Remove .sect; absolute symbols don't go in a section.

6 years agoHide some i386 stuff from linux68k, linuxppc.
George Koehler [Tue, 9 Jan 2018 03:26:24 +0000 (22:26 -0500)]
Hide some i386 stuff from linux68k, linuxppc.

Rename plat/linux/libsys/errno.s to plat/linux386/libsys/trapno.s and
stop building it for linux68k and linuxppc.  It defines symbols for
mach/i386/libem.

In syscalls.h, the numbers after 165 are only for i386, so hide them
from 68k, ppc.  These numbers are unused, because the system calls now
in libsys use the lower numbers.

Also teach the build system that libsys depends on the internal
headers in plat/linux/libsys/*.h

6 years agoShrink .cfu8
George Koehler [Sun, 7 Jan 2018 21:03:55 +0000 (16:03 -0500)]
Shrink .cfu8

With my PowerBook G4, a program that converts values from 1.0 to
4000000.0 runs in about 0.32s with the old .cfu8 and 0.29s with this
shrunken .cfu8

Leave a comment about other ways to implement .cfu8

6 years agoTeach top to merge or delete "addi sp, sp, X".
George Koehler [Fri, 5 Jan 2018 22:55:50 +0000 (17:55 -0500)]
Teach top to merge or delete "addi sp, sp, X".

This reduces code size, because ncg emits too many "addi sp, sp, X"
instructions when unstacking things.  Now top lowers "addi sp, sp, X"
by lifting other instructions.  This sometimes creates chances to
merge or delete _addi_ instructions.  If no such chance is found, the
_addi_ remains uselessly lowered.

Edit ncg/table to remove something that top now does.

Edit ncg/mach.c to remove some spaces after commas.  This removes a
whitespace difference between *.s and *.so files, because top removes
the space.

6 years agoFix lim. Improve lxl, lxa, lor, str, procs with no locals.
George Koehler [Fri, 5 Jan 2018 01:40:35 +0000 (20:40 -0500)]
Fix lim.  Improve lxl, lxa, lor, str, procs with no locals.

_lim_ must use _loe_ (load word external), not _lde_ (load double-word
external).

The new patterns for _lxl_, _lxa_, _lor_, _str_ emit shorter code in
some cases.  The change from GPR_EXPR to REG_EXPR allows moving
LXFRAME to a register variable.

Add more "reusing" clauses.  We have enough registers that ncg almost
never reuses a register, but sometimes it can reuse r3.

In mach.c, emit one fewer instruction in procedures with no locals.

6 years agoAdd tests for C <setjmp.h> and Modula-2 Semaphores.
George Koehler [Wed, 3 Jan 2018 19:51:14 +0000 (14:51 -0500)]
Add tests for C <setjmp.h> and Modula-2 Semaphores.

Fix PowerPC ncg so setjmp() returns the correct value.  I got unlucky
when ncg picked r3 for "uses REG"; this destroyed the return value in
r3 and caused the new test to fail.

6 years agoAdd test for EM _rck_. Fix traps in PowerPC ncg.
George Koehler [Mon, 25 Dec 2017 03:37:52 +0000 (22:37 -0500)]
Add test for EM _rck_.  Fix traps in PowerPC ncg.

The new test rck_e.e segfaults on PowerPC unless I make some changes.
The inline code for _rck_ was wrong because it didn't allow the trap
handler to return.  _sig_ forgot to push the old trap handler.

Move plat/linuxppc/libsys/trap.s to mach/powerpc/libem/trp.s and
rewrite it with simplified/extended mnemonics.  Remove .trap alias for
.trp procedure.  Add a missing `mtspr lr, r0` so we can return from
the trap handler.  Call write() and _exit() so trp.s works with both
linuxppc and osxppc.  Before, Mac OS X was wrongly using the trap.s
for Linux.

In powerpc/libem, simplify .aar4; teach .csa and .csb to raise the
trap if the default target is zero.

C programs don't need these changes.  You may relink your C programs
with the changed .csa and .csb, but C code doesn't raise the trap.
Modula-2 code can raise traps, so you may want to relink your Modula-2
programs with the changed libem, but you might keep your old .o files
from Modula-2.  You may need to recompile your Pascal programs (delete
old .o files from Pascal) because the Pascal compiler might use _rck_.

6 years agoOptimize `mr. X, X` after some instructions.
George Koehler [Sat, 23 Dec 2017 03:32:16 +0000 (22:32 -0500)]
Optimize `mr. X, X` after some instructions.

For example, when ncg emits
    slw r9,r8,r5
    mr. r9,r9
then top simplifies the code to
    slw. r9,r8,r5

6 years agoRemove INT32 and such. Adjust indentation.
George Koehler [Sat, 23 Dec 2017 02:18:58 +0000 (21:18 -0500)]
Remove INT32 and such.  Adjust indentation.

I understand `loi 4` more easily than `loi INT32`, because `loi 4`
appears in .e files.  So remove INT8, INT16, INT32, INT64.

Add a comment to explain r3 during unconditional jumps.

6 years agoGenerate shorter code for ret 4 and ret 8.
George Koehler [Sat, 23 Dec 2017 01:37:39 +0000 (20:37 -0500)]
Generate shorter code for ret 4 and ret 8.

6 years agoRemove two obsolete patterns.
George Koehler [Sat, 23 Dec 2017 00:57:42 +0000 (19:57 -0500)]
Remove two obsolete patterns.

These patterns seem to have no effect on the generated code.

6 years agoAdd FRAME_V tokens for local variables.
George Koehler [Fri, 22 Dec 2017 22:04:16 +0000 (17:04 -0500)]
Add FRAME_V tokens for local variables.

When storing to a local, stop killing the tokens of other locals,
unless they might overlap with the stored local.  This helps some
procedures that juggle locals when the locals aren't in registers.

Also use FRAME_V tokens for locals in statically enclosing procedures.
Rewrite _lxa_ as _lxl_, to skip the `addi ?,?,8` if we can add 8 to
the next constant.  The PowerPC code from _lxl_ is now sometimes
better, sometimes worse than before.

The i386 table provided the idea to use %size to find overlapping
locals.

6 years agoRevise the comments in the EM tests.
George Koehler [Thu, 21 Dec 2017 23:19:26 +0000 (18:19 -0500)]
Revise the comments in the EM tests.

You can cheat these tests if _cms_ and _cmu_ always push zero.

6 years agoAdd some tests for Modula-2.
George Koehler [Thu, 21 Dec 2017 22:44:03 +0000 (17:44 -0500)]
Add some tests for Modula-2.

6 years agoPass 4 bytes to fail(uint32_t)
George Koehler [Tue, 19 Dec 2017 02:58:57 +0000 (21:58 -0500)]
Pass 4 bytes to fail(uint32_t)

This would become necessary if something failed on a platform with
16-bit int (EM_WSIZE == 2).

Remove unreachable `ret 0`.  If reached, it wouldn't work to return
from _m_a_i_n.

6 years agoSimplify code by using cms EM_WSIZE to compare bytes.
George Koehler [Tue, 19 Dec 2017 02:52:13 +0000 (21:52 -0500)]
Simplify code by using cms EM_WSIZE to compare bytes.

This should work because the C compiler does it.

6 years agoRemove '\0' from output. Fix a compiler warning.
George Koehler [Tue, 19 Dec 2017 02:17:42 +0000 (21:17 -0500)]
Remove '\0' from output.  Fix a compiler warning.

Don't output '\0' in "@@FINISHED\0".

Cast code to unsigned int.  This helps platforms with 16-bit int, by
doing only the low 16 bits of the bitwise-and.  It also removes the
"(warning) conversion of long to pointer loses accuracy".

6 years agoAdd splitting coercions for IND_ALL_D.
George Koehler [Tue, 19 Dec 2017 01:59:04 +0000 (20:59 -0500)]
Add splitting coercions for IND_ALL_D.

Delete my wrong comment (from commits cfbc537a8f62f45432bd0) which
claimed that such coercions are not possible.

6 years agoEnable conditional expressions in splitting coercions.
George Koehler [Tue, 19 Dec 2017 01:39:56 +0000 (20:39 -0500)]
Enable conditional expressions in splitting coercions.

ncgg has parsed the optional conditional expression (optexpr) of each
splitting coercion since commit 72b83cc in 1985; but for almost 33
years, ncg has ignored the expression in c2_expr.

Few tables had conditional coercions (I only found them in arm and
m68020), and no tables had conditional splitting coercions, so this
only becomes a problem now as I try to add a conditional splitting
coercion to powerpc.

6 years agoRename two tokens. CONST_HZ was not hertz (Hz).
George Koehler [Mon, 18 Dec 2017 17:36:10 +0000 (12:36 -0500)]
Rename two tokens.  CONST_HZ was not hertz (Hz).

6 years agoIn coercions, try to reuse a register with the same token.
George Koehler [Sun, 17 Dec 2017 17:45:27 +0000 (12:45 -0500)]
In coercions, try to reuse a register with the same token.

This reduces code size.

6 years agoRename ANY_BHW to INT_W; add FLOAT_W, FLOAT_D.
George Koehler [Thu, 14 Dec 2017 21:26:19 +0000 (16:26 -0500)]
Rename ANY_BHW to INT_W; add FLOAT_W, FLOAT_D.

INT_W, the integer set, continues to exclude FSREG, because we can't
easily move FSREG to GPR.

ANY4 becomes ISET+FLOAT_W and ANY8 becomes FLOAT_D.

6 years agoDelete rules for sti 8 with REG IND_RC_D, with REG IND_RR_D.
George Koehler [Tue, 12 Dec 2017 18:36:43 +0000 (13:36 -0500)]
Delete rules for sti 8 with REG IND_RC_D, with REG IND_RR_D.

Prefer the rule with REG FREG, by coercing IND_RC_D or IND_RR_D to
FREG.  This rule looks better to ncg.  When ncg chose between coercion
to REG IND_RC_D or coercion to REG FREG, it chose REG FREG.  It only
chose REG IND_RC_D if the stack had exact REG IND_RC_D.

6 years agoThese instructions write to the CR.
George Koehler [Sun, 10 Dec 2017 19:01:14 +0000 (14:01 -0500)]
These instructions write to the CR.

6 years agoRevise stack shuffles and integer conversions in PowerPC ncg.
George Koehler [Sat, 9 Dec 2017 22:21:06 +0000 (17:21 -0500)]
Revise stack shuffles and integer conversions in PowerPC ncg.

Allow asp 4, exg 4 to shuffle tokens without coercing them into
registers; but comment why dup 4, dup 8 coerce tokens into registers.

Allow dup, dus, exg with larger sizes; and add tests dup_e.e and
exg_e.e to check that dup 20, dus, exg 20 work as well in powerpc as
in i80 and i86.

Then powerpc failed to compile loc 2 loc 4 cuu in dup_e.e.  Revise the
integer conversions, so powerpc can compile and pass the test.

6 years agoAdd more chances to put results in register variables.
George Koehler [Fri, 8 Dec 2017 22:19:26 +0000 (17:19 -0500)]
Add more chances to put results in register variables.

When a rule `uses REG ... yields %a`, the result %a is always a
temporary, never a regvar.  If the EM code uses _stl_ to put the
result in a regvar, then ncg emits _mr_ to move %a to the regvar.

There are two ways to put the result in the regvar without %a:

  1. Yield a token, as in `yields {MUL_RR, %2, %1}`, so that _stl_
     can move the token to the regvar without using %a.

  2. Provide a pattern, like `sli stl`, that just puts the result
     in `{LOCAL, $2}` and not %a.

Allow some tokens, like SUM_RIS and XEQ, onto the stack; and add
tokens like MUL_RR, and patterns like `sli stl`.

Delete patterns for `stl lol` and `sdl ldl` to avoid an extra
temporary %a when the local is a regvar.  Delete `lal sti lal loi`
because it would emit wrong code.

6 years agoSplit C from CONST.
George Koehler [Fri, 8 Dec 2017 00:24:09 +0000 (19:24 -0500)]
Split C from CONST.

Rename token CONST to C.  Define set CONST = C + CONST_STACK.  The
instructions with CONST operands can now accept CONST_STACK tokens;
some cases of {CONST, %1.val} become %1.

Also simplify two of _rlwinm_ into _slwi_ and _srwi_.

6 years agoAdd test for EM rol, ror. Fix i80, i86, powerpc.
George Koehler [Thu, 7 Dec 2017 22:16:21 +0000 (17:16 -0500)]
Add test for EM rol, ror.  Fix i80, i86, powerpc.

EM instructions _rol_ and _ror_ do rotate an integer left or right.
Our compilers and optimizers never emit _rol_ nor _ror_, but I might
want to use them in the future.

Add _rol_ and _ror_ to powerpc.  Fix `rol 4` and `ror 4` in both i80
and i86, where the rules for `rol 4` and `ror 4` seem to have never
been tested until now.

6 years agoCorrect the stack pointer when i80 shrinks an integer.
George Koehler [Thu, 7 Dec 2017 20:39:41 +0000 (15:39 -0500)]
Correct the stack pointer when i80 shrinks an integer.

The code used `sphl` to set the stack pointer, but the correct value
was in de, not hl.  Fix by swapping the values of de and hl, so `sphl`
is now correct.  When we shrink an integer from 4 to 2 bytes, both
registers de and hl point to copies of the result, but only one
register preserves the stack below the result.

This fixes writehex() in tests/plat/lib/test.c, when I compile it with
ack -mcpm, so it preserves the pointer to "0123456789abcdef", so it
writes hexadecimal digits and not garbage.

This bug goes back to commit 157b243 of Mar 18, 1985, so the bug is
32 years old, and probably the oldest bug that I ever fixed.

6 years agoKill registers a, de, when i80 ncg does Call libem.
George Koehler [Thu, 7 Dec 2017 03:14:00 +0000 (22:14 -0500)]
Kill registers a, de, when i80 ncg does Call libem.

I compiled tests/plat/lib/test.c with ack -mcpm, but i80 ncg did emit
wrong code in writehex(uint32_t) for

    "0123456789abcdef"[code & 0xf]

The code called '.and' to evaluate `code & 0xf`, then tried to call
'.cii' to narrow the result from 4 to 2 bytes, but it passed garbage
instead of 4 to '.cii'.  The rule for '.and' was

    pat and defined($1)
    kills ALL
    uses dereg={const2,$1}
    gen Call {label,".and"}

This failed to kill register de={const2,4}, so ncg pushed de,
expecting to push 4, but actually pushing garbage.

Fix such rules using `mvi a,...` or `lxi de,...` so ncg doesn't track
the token in the register.  This is like the i86 table.  A different
fix would use a dummy instruction `killreg a` or `killreg de` like the
m68020 table.

Also correct 1 to $1 when calling '.exg'.

6 years agoUse <stdarg.h> in util/misc/convert.c
George Koehler [Wed, 6 Dec 2017 22:09:12 +0000 (17:09 -0500)]
Use <stdarg.h> in util/misc/convert.c

I made a syntax error in some .e file, and em_encode dumped core
because a 64-bit pointer didn't fit in a 32-bit int.  Now use stdarg
to pass pointers to error() and fatal().

Stop using the number of errors as the exit status.  Many systems use
only the low 8 bits of the exit status, so 256 errors would become 0.

Also change modules/src/print to accept const char *buf

6 years agoMerge pull request #69 from kernigh/kernigh-stdc
David Given [Sun, 19 Nov 2017 11:00:40 +0000 (12:00 +0100)]
Merge pull request #69 from kernigh/kernigh-stdc

use libc assert, strcmp; declare more functions; fewer clang warnings

6 years agoMerge pull request #66 from davidgiven/dtrg-warnings
David Given [Sun, 19 Nov 2017 10:39:45 +0000 (11:39 +0100)]
Merge pull request #66 from davidgiven/dtrg-warnings

lang/basic/lib: fewer warnings

6 years agoFix build with gcc. kernigh-stdc
George Koehler [Fri, 17 Nov 2017 22:52:37 +0000 (17:52 -0500)]
Fix build with gcc.

gcc gave an error because the `char *` parameter doesn't match the
`const char *` in the prototype of regsave().  clang didn't give an
error.  I added the prototype in commit 5301cce.

6 years agoFix my typo from commit 5bbbaf4.
George Koehler [Fri, 17 Nov 2017 20:46:24 +0000 (15:46 -0500)]
Fix my typo from commit 5bbbaf4.

6 years agoSwitch ego to libc <assert.h>
George Koehler [Thu, 16 Nov 2017 00:48:53 +0000 (19:48 -0500)]
Switch ego to libc <assert.h>

I also tried, in types.h, to switch ego to libc <stdbool.h>, but that
causes an infinite loop in the IL phase.

6 years agoAdd prototypes, void in util/ego/share
George Koehler [Wed, 15 Nov 2017 21:29:27 +0000 (16:29 -0500)]
Add prototypes, void in util/ego/share

This uncovers a problem in il/il_aux.c: it passes 3 arguments to
getlines(), but the function expects 4 arguments.  I add FALSE as the
4th argument.  TRUE would fill in the list of mesregs.  IL uses
mesregs during phase 1, but this call to getlines() is in phase 2.
TRUE would leak memory unless I added a call to Ldeleteset(mesregs).
So I pass FALSE.

Functions passed to go() now have a `void *` parameter because
no_action() now takes a `void *`.

6 years agoLLgen won't update the output file timestamp if the file contents doesn't
David Given [Wed, 15 Nov 2017 18:41:39 +0000 (19:41 +0100)]
LLgen won't update the output file timestamp if the file contents doesn't
change, which confuses ninja no end. Fix this.

Fixes: #68

6 years agoUse size_t and void with memory allocation in ego.
George Koehler [Wed, 15 Nov 2017 01:35:18 +0000 (20:35 -0500)]
Use size_t and void with memory allocation in ego.

alloc.h now needs to #include <stdlib.h> to find type size_t and
function free().

6 years agostrcmp, strncmp are in <string.h>
George Koehler [Tue, 14 Nov 2017 22:04:01 +0000 (17:04 -0500)]
strcmp, strncmp are in <string.h>

*Important:*  Do `make clean` to work around a problem and prevent
infinite rebuilds, https://github.com/davidgiven/ack/issues/68

I edit tokens.g in util/LLgen/src, so I regenerate tokens.c.  The
regeneration script bootstrap.sh can't find LLgen, but I can run the
same command by typing the path to llgen.

6 years agoFree buf in GetFile().
George Koehler [Tue, 14 Nov 2017 02:34:31 +0000 (21:34 -0500)]
Free buf in GetFile().

aprintf() returns a const char *; the assignment to char * caused both
clang and gcc to warn of the dropped const.

Commit 893471a introduced a tiny memory leak, because GetFile()
stopped freeing buf.  The const return type of aprintf() suggests that
the buffer must not be freed.

Now use Malloc() to allocate the buffer and free() to free it.  This
also checks if we are out of memory, because Malloc() does the check
and aprintf() currently doesn't.

6 years agoCheck each format string in tabgen.c
George Koehler [Tue, 14 Nov 2017 01:40:43 +0000 (20:40 -0500)]
Check each format string in tabgen.c

Silence warning from clang at `if (ch2 = ...)`

Delete `|| rm %{outs}` in build.lua, because it hid the exit status of
tabgen, so if tabgen failed, the build continued and failed later.

6 years agoSilence warning about pointer cast to int.
George Koehler [Mon, 13 Nov 2017 23:21:26 +0000 (18:21 -0500)]
Silence warning about pointer cast to int.

This cast was safe because the pointer is a small constant integer,
but it causes warning from gcc.

6 years agostrcpy() is in <string.h>
George Koehler [Mon, 13 Nov 2017 22:57:02 +0000 (17:57 -0500)]
strcpy() is in <string.h>

6 years agoDeclare machine-dependent functions in mach/proto/ncg
George Koehler [Mon, 13 Nov 2017 19:23:44 +0000 (14:23 -0500)]
Declare machine-dependent functions in mach/proto/ncg

This breaks all machines because the declared return type void
disagrees with the implicit return type int (when I compile mach.c
with clang).  Unbreak i386, i80, i86, m68020, powerpc, vc4 by adding
the return types to mach.c.  We don't build any other machines; they
are broken since commit a46ee91 (May 19, 2013) declared void prolog()
and commit fd91851 (Nov 10, 2016) declared void mes(), with both
declarations in mach/proto/ncg/fillem.c.

Also fix mach/vc4/ncg/mach.c where type full is long, so fprintf()
must use "%ld" not "%d" to print full nlocals.

6 years agoMore prototypes, less register in mach/proto/ncg
George Koehler [Mon, 13 Nov 2017 17:44:17 +0000 (12:44 -0500)]
More prototypes, less register in mach/proto/ncg

Files that #include "equiv.h" must do so after including "data.h", now
that a function prototype in equiv.h uses type rl_p from data.h.

Adjust style, changing some `for(...)` to `for (...)`.  The style in
mach/proto/ncg is less than consistent; the big annoyance now is that
some files want tabs at 4 spaces, others want tabs at 8 spaces.

6 years agoAdd prototypes to functions in subr.c
George Koehler [Sun, 12 Nov 2017 21:11:05 +0000 (16:11 -0500)]
Add prototypes to functions in subr.c

Put the declarations in "data.h", because that header declares the
types cost_t and token_p.  Also #include <cgg_cg.h> from "data.h" to
get types c3_p and set_p, and guard <cgg_cg.h> against multiple
inclusion.

6 years agoPrototypes for string functions. More static.
George Koehler [Sun, 12 Nov 2017 16:25:18 +0000 (11:25 -0500)]
Prototypes for string functions.  More static.

6 years agoRemove old "assert.h" in mach/proto/ncg
George Koehler [Sun, 12 Nov 2017 00:35:48 +0000 (19:35 -0500)]
Remove old "assert.h" in mach/proto/ncg

*Important:*  You must "make clean" after checking out this commit,
because the build had copied the old "assert.h" to several places in
obj/.  If you don't "make clean", then the compiler finds the old
"assert.h" before libc <assert.h>, and the build fails because this
commit removes badassertion() in subr.c.  After "make clean", the
compiler finds libc <assert.h> and the build succeeds.

6 years agoUse libc assert(); fix dependencies; unbreak isduo().
George Koehler [Sat, 11 Nov 2017 21:09:05 +0000 (16:09 -0500)]
Use libc assert(); fix dependencies; unbreak isduo().

Switch from custom assert() to libc assert() in mach/proto/as.
Continue to disable asserts if DEBUG == 0.

This change found a problem in the build system; comm2.y was missing
depedencies on comm0.h and comm1.h.  Add the missing dependencies to
the cppfile rule.  Allow the dependencies by modifying cppfile in
first/build.lua to act like cfile if t.dir is false.

Now that comm2.y gets rebuilt, I must fix the wrong prototype of
yyparse() in comm1.h.

I got unlucky as induo() in comm5.c was reading beyond the end of the
array.  It found an operator "= " ('=' then space) in the garbage, so
it returned a garbage token number, and "VAR = 123" became a syntax
error.  Unbreak induo() by terminating the array.

6 years agoMerge pull request #65 from kernigh/kernigh-qemu
David Given [Sat, 11 Nov 2017 20:00:16 +0000 (21:00 +0100)]
Merge pull request #65 from kernigh/kernigh-qemu

unbreak qemuppc

6 years agoAdd more const in <object.h>.
George Koehler [Sat, 11 Nov 2017 18:08:13 +0000 (13:08 -0500)]
Add more const in <object.h>.

6 years agoAdd more prototypes in mach/proto/as
George Koehler [Sat, 11 Nov 2017 04:30:46 +0000 (23:30 -0500)]
Add more prototypes in mach/proto/as

Change "register i;" to "int i;" to so clang stops warning about
implicit int.  Use function prototypes so clang stops warning about
implicitly declared functions.

6 years agobts2str(), long2str() are in <ack_string.h>
George Koehler [Fri, 10 Nov 2017 22:31:11 +0000 (17:31 -0500)]
bts2str(), long2str() are in <ack_string.h>

6 years agoAdjust dependencies in modules/src{print,string,system}
George Koehler [Fri, 10 Nov 2017 21:26:27 +0000 (16:26 -0500)]
Adjust dependencies in modules/src{print,string,system}

Drop dependency on <ansi.h> in modules+headers; assume that compiler
knows ANSI C89.

Add missing dependency from print to string; #include <ack_string.h>.

Because <print.h> had commented out the declarations of sys_lock() and
sys_unlock(), I now stop building lock.c and unlock.c.

6 years agoRemove functions that also exist in libc.
George Koehler [Fri, 10 Nov 2017 04:25:17 +0000 (23:25 -0500)]
Remove functions that also exist in libc.

Some of these functions were slightly different from libc:

 - This strncpy() didn't pad the buffer with '\0' bytes beyond the end
   of the string; libc does the padding.  This string.3 manual said
   that this strncpy() does "null-padding", but it didn't.

 - This strcmp() and strncmp() compared using char (which might be
   signed); libc compares using unsigned char.

6 years agoDelete old "assert.h" files; use libc <assert.h>.
George Koehler [Fri, 10 Nov 2017 03:22:13 +0000 (22:22 -0500)]
Delete old "assert.h" files; use libc <assert.h>.

Edit build.lua for programs losing their private assert.h, so they
depend on a list of .h files excluding assert.h.

Remove modules/src/assert; it would be a dependency of cpp.ansi but we
didn't build it, so cpp.ansi uses the libc assert.

I hope that libc <assert.h> can better report failed assertions.  Some
old "assert.h" files didn't report the expression.  Some reported a
literal "x", because traditional C expanded the macro parameter x in
"x", but ANSI C89 doesn't expand macro parameters in string literals.

6 years agoIncrease time-out from 5 to 15 seconds.
George Koehler [Wed, 8 Nov 2017 20:02:56 +0000 (15:02 -0500)]
Increase time-out from 5 to 15 seconds.

My computer is too slow, so qemuppc tests randomly timed out.  With
this commit, my machine passes the qemuppc tests (if I also edit the
top build.lua to enable qemuppc).

6 years agoShow tests that @@TIMEDOUT.
George Koehler [Wed, 8 Nov 2017 19:08:43 +0000 (14:08 -0500)]
Show tests that @@TIMEDOUT.

A `set -e` in testdriver.sh caused it to exit early and hide the
output of a @@TIMEDOUT test, so I never saw the @@TIMEDOUT marker.
Then build.lua added a @@FAIL marker.

6 years agoRestore an assignment deleted in commit 789f79b.
George Koehler [Wed, 8 Nov 2017 04:52:52 +0000 (23:52 -0500)]
Restore an assignment deleted in commit 789f79b.

Because of the accidental deletion, mcgg on my machine followed a
garbage pointer, and never wrote calls to emit_fragment.

A wrong call to `data->emit_reg(0, 0)` instead of the correct
`data->emit_fragment(0)` caused PowerPC mcg to emit an empty string
instead of `8(fp)`, causing a syntax error in PowerPC as.

The wrong `data->emit_reg(0, 0)` called the function emit_reg() in
mach/proto/mcg/pass_instructionselection.c, but that function
unfortunately has `if (vreg) { ... }`.  The call had vreg == NULL
because the fragment wasn't a vreg, but emit_reg() ignored the problem
and emit nothing.

6 years agoMerge pull request #63 from kernigh/kernigh-rm-fix
David Given [Tue, 31 Oct 2017 10:33:52 +0000 (11:33 +0100)]
Merge pull request #63 from kernigh/kernigh-rm-fix

small changes to C, Pascal, Modula-2, em_opt, getopt(), Makefile

6 years agoUpdate comment after commit 9a965ef.
George Koehler [Tue, 31 Oct 2017 01:24:18 +0000 (21:24 -0400)]
Update comment after commit 9a965ef.

6 years agoImprove how Makefile handles multiple goals.
George Koehler [Mon, 30 Oct 2017 21:09:19 +0000 (17:09 -0400)]
Improve how Makefile handles multiple goals.

 - Don't run BUILDSYSTEM more than once if there is more than one goal
   with '+'.
 - Don't pass goals without '+' to BUILDSYSTEM.
 - Use $(MAKE) because "make" might not be GNU make.  For me, "make"
   is BSD make.
 - Add a comment so readers know MAKECMDGOALS is special.

Over in README, remove Lua from requirements; we always ignore any
installed Lua and build our own.  Increase guesses for free space
because we build more platforms.  Don't need to type MAKEFLAGS=.

6 years agoDon't use '-' in option string to getopt().
George Koehler [Mon, 30 Oct 2017 02:00:43 +0000 (22:00 -0400)]
Don't use '-' in option string to getopt().

@dram reported a build failure in FreeBSD at
https://github.com/davidgiven/ack/issues/1#issuecomment-273668299

Linux manual for getopt(3) says:
> If the first character of optstring is '-', then each nonoption
> argv-element is handled as if it were the argument of an option with
> character code 1....
>
> The use of '+' and '-' in optstring is a GNU extension.

GNU/Linux and OpenBSD handle '-' in this special way, but FreeBSD
seems not to.  If '-' is not special, then em_ego can't find its input
file, so the build must fail.  This commit stops using '-' in both
em_b and em_ego, but doesn't change mcg.

Also fix em_ego -O3 to not act like -O4.

6 years agoUse (arith) 1 << ... when getting the sign bit.
George Koehler [Sun, 29 Oct 2017 21:45:10 +0000 (17:45 -0400)]
Use (arith) 1 << ... when getting the sign bit.

This prevents an overflow reported by @hexcoder- in
https://github.com/davidgiven/ack/issues/56

lang/cem/cpp.ansi/LLlex.c used a plain 1 << ... and caused an overflow
on machines where sizeof(int) < sizeof(long).  Using 1L << ... would
work for now but might fail later if arith became long long.

C doesn't specify whether negative integers use 2's complement or some
other format.  Therefore, (arith) 1 << ... has an undefined value.  It
should still work because the value is some integer where the sign bit
is set and all other bits are clear.

(unsigned arith) 1 << ... would also get the sign bit, but casting it
from unsigned back to signed would make the same undefined value.

(arith) -1 << ... would assume 2's complement.

6 years agoRemove UNSIGNED_ARITH from a few more files.
George Koehler [Sun, 29 Oct 2017 21:03:51 +0000 (17:03 -0400)]
Remove UNSIGNED_ARITH from a few more files.

I missed these in commits 649410b and 1ab1306.

6 years agoAlways use unsigned long in lang/cem
George Koehler [Sun, 29 Oct 2017 21:01:29 +0000 (17:01 -0400)]
Always use unsigned long in lang/cem

Same reason as commit 649410b.

6 years agoFix pattern that was rewriting func(! var, var) as func(1).
George Koehler [Sun, 29 Oct 2017 18:53:33 +0000 (14:53 -0400)]
Fix pattern that was rewriting func(! var, var) as func(1).

Bug reported by Rune, see
 - https://sourceforge.net/p/tack/mailman/message/35809953/
 - https://github.com/davidgiven/ack/issues/62

In EM code, beq and bne pop 2 values and compare them, but teq and tne
pop only 1 value and compare it with zero.  We need cms to compare 2
values; other patterns may convert cmi or cmu to cms.

6 years agoFor DIAGOPT, change outshort(patno) to outshort(lino - 1).
George Koehler [Sun, 29 Oct 2017 18:18:47 +0000 (14:18 -0400)]
For DIAGOPT, change outshort(patno) to outshort(lino - 1).

This is more useful when looking for patterns; lino - 1 is probably
the line number in the patterns file.  DIAGOPT is off by default but
one can edit optim.h to enable it.

The other changes just clean up whitespace.

6 years agomktab depends on some of the *.h files.
George Koehler [Sun, 29 Oct 2017 01:41:59 +0000 (21:41 -0400)]
mktab depends on some of the *.h files.

If I edit optim.h to #define DIAGOPT then mktab must get rebuilt.

6 years agoGet correct sign of a MOD b when (a > 0) and (b < 0).
George Koehler [Sat, 28 Oct 2017 23:55:06 +0000 (19:55 -0400)]
Get correct sign of a MOD b when (a > 0) and (b < 0).

Reported by me in https://github.com/davidgiven/ack/issues/60

This doesn't change DIV.  Right now a DIV b does floor division and
a MOD b has the sign of b.  This is the same as Lua, Python, Ruby,
Tcl; but is different from other Modula-2 implementations.

6 years agoAlways use unsigned long.
George Koehler [Sat, 28 Oct 2017 21:56:20 +0000 (17:56 -0400)]
Always use unsigned long.

Traditional C compilers had long but not unsigned long.  I now assume
that everyone can compile unsigned long.  Remove macro UNSIGNED_ARITH
and act like it is always defined.  The type `unsigned arith` works
because arith is a macro for long.

6 years agoTerminal now writes to fd 1, not fd 0.
George Koehler [Sat, 28 Oct 2017 21:20:39 +0000 (17:20 -0400)]
Terminal now writes to fd 1, not fd 0.

Fixes problem where `./program </dev/null` didn't show output.

6 years agoDon't check ferror(fp) when reading fp.
George Koehler [Sat, 28 Oct 2017 20:20:48 +0000 (16:20 -0400)]
Don't check ferror(fp) when reading fp.

If feof(fp) or ferror(fp) was set, then our libc returned EOF for all
later reads without trying to read.  Our libc now behaves like BSD
(and probably Illumos and musl) by checking only feof(fp).  For
difference, glibc doesn't check feof(fp).

I described the difference between our libc and BSD libc in
https://sourceforge.net/p/tack/mailman/message/35430300/

6 years agoDelete unused misc/getpw.c from libc.
George Koehler [Sat, 28 Oct 2017 18:25:39 +0000 (14:25 -0400)]
Delete unused misc/getpw.c from libc.

@hexcoder- reported in https://github.com/davidgiven/ack/issues/57
that our getpw() has bugs.

I don't fix these bugs, because Illumos and Linux manual pages say
that getpw() is obsolete.  The function can overflow its buffer, so it
is never safe to use.  Our libc did not build getpw().

6 years agoDelete malloc.h and tgmath.h from libc.
George Koehler [Sat, 28 Oct 2017 17:57:10 +0000 (13:57 -0400)]
Delete malloc.h and tgmath.h from libc.

This malloc.h might get confused with the private malloc.h in our
libc.  C programs should #include <stdlib.h> for malloc().

This tgmath.h has no useful content, and never worked because
complex.h is missing.

Touch build.lua (by deleting some whitespace) so the *.h globs see
the deletions.

6 years agoBuild fdopen(), hypot(), putenv() in libc.
George Koehler [Sat, 28 Oct 2017 17:06:38 +0000 (13:06 -0400)]
Build fdopen(), hypot(), putenv() in libc.

These functions are in POSIX; hypot() is in C99.  Also build cabs()
because it rides with hypot(), but don't declare cabs() in any header
file, because our compiler can't parse C99 "double complex" type.

Touch build.lua so it sees that .c files moved.

6 years agoAdd .pas as a Pascal suffix.
George Koehler [Sat, 28 Oct 2017 15:59:35 +0000 (11:59 -0400)]
Add .pas as a Pascal suffix.

Requested by @dram in https://github.com/davidgiven/ack/issues/41