Commit graph

8130 commits

Author SHA1 Message Date
David Given decf0f5e9c Merge pull request #29 from kernigh/pr-elf-symbol
ELF symbol table from aelflod
2016-12-14 22:30:44 +01:00
George Koehler 7e39a821f4 Update aelflod.1 to describe options, mention symbol table. 2016-12-13 17:22:45 -05:00
George Koehler 5cf2a68438 Teach aelflod to write the ELF symbol table.
Convert each ack.out symbol to ELF, preserving its name and value, and
some but not all other symbol info.  The ELF symbol table comes with
ELF section headers.  If the input file has no symbols (ack -Rled-s),
then the output file has no ELF section headers.

Append the symbol table and section headers to the ELF file.  Linux
ignores this appended info when it execs the file.  The info might
pollute the last page of the ELF segment, but Linux clears this
pollution.  Tools like nm and gdb can read the ELF symbol table.

I include code to translate debugger symbols to an ELF .stab section.
I did not test this code, because I did not find a platform that can
put S_STB symbols in the ack.out file.
2016-12-13 16:41:22 -05:00
George Koehler 8280ca8745 In aslod, remove some unused m68k2 stuff. 2016-12-13 16:02:38 -05:00
George Koehler 2874806048 Tweak man syntax in aelflod.1 and aslod.1
Put end of sentence at end of line.  This is roff(7) syntax so the
formatter can make spacing between sentences.

Use the macro .PP to break paragraphs.  Use bold for the command name
in SYNOPSIS, to match other ack manuals.
2016-12-13 15:54:38 -05:00
David Given 0e020132f8 Fix a warning. 2016-12-12 21:17:01 +01:00
David Given 04e54d6cb1 Run lang/basic/lib through clang-format. 2016-12-12 21:16:32 +01:00
David Given a53b51001b Ansify function definitions. 2016-12-12 21:15:25 +01:00
David Given bf2e0be69a Merge pull request #27 from kernigh/pr-qemu-doze
Teach qemuppc to halt the cpu on _exit().
2016-12-11 23:17:12 +01:00
David Given 62edb90641 Convert the inn test to work with the test library and not import InOut; it now
runs on qemuppc again. Reenable qemuppc tests.
2016-12-11 23:06:37 +01:00
David Given 65fdb03231 Merge pull request #28 from kernigh/pr-set-ppc
add Modula-2 set operations to PowerPC ncg
2016-12-11 22:25:04 +01:00
George Koehler 8605a2fcfc Add Modula-2 set operations to PowerPC ncg.
This provides and, ior, xor, com, zer, set, cms when defined($1) and
ior, set when !defined($1).  I don't provide the other operations
!defined($1) because our Modula-2 compiler hasn't used them.

I wrote a Modula-2 example in
https://gist.github.com/kernigh/add79662bb3c63ffb7c46d01dc8ae788

Put a dummy comment in mach/powerpc/libem/build.lua so git checkout
will touch that file.  Without the touch, the build system doesn't see
the new *.s files.
2016-12-10 12:23:07 -05:00
George Koehler fcda786fe9 Add some missing clauses to los, sts, aar, inn, cmi, cmu.
We only implement 'los 4', 'sts 4', 'cmi 4', 'cmu 4', not for sizes
other than 4.  Add clause $1==4.

We only implement inn when defined($1).

The rule for aar needs 'kills ALL' because it kills many registers,
like other rules that call libem.
2016-12-09 19:49:50 -05:00
George Koehler 436114fce4 Add a move from CONST smalls(%val) to GPR.
This allows 'move {CONST, $1}, R3' with a small enough $1 to emit one
instruction (addi) instead of two instructions (addis, ori).  The
CONST token confusingly isn't in the CONST_ALL set.
2016-12-09 18:40:14 -05:00
George Koehler 17211eef47 Fix ass to match the EM spec.
The spec says, "ASS w: Adjust the stack pointer by w-byte integer".
The w argument "can either be given as argument or on top of the
stack."  Therefore, 'ass 4' would pop the 4-byte integer from the
stack, but 'ass' would pop the size w from the stack, then pop the
w-byte integer.

PowerPC ncg wrongly implemented 'ass' as if it was 'ass 4'.  Fix it to
accept only 'ass 4'.
2016-12-09 17:32:42 -05:00
George Koehler 5bd0ad4269 Remove the bogus rules for 'lor 2' and 'str 2'.
These instructions would load or store the EM heap pointer.  They
don't work.  Programs must use brk() or sbrk() in libsys.

The last file to use 'lor 2' and 'str 2' was lang/pc/libpc/sav.e in
the Pascal library.  Commit c084f9f deleted the file, so we no longer
need rules 'lor 2' or 'str 2' to build the ACK.
2016-12-09 17:00:56 -05:00
George Koehler 805883e377 Fill in a hint for enabling the COMMENT macro.
If you want to enable comments in the .s file, change

    #define COMMENT(n) /* comment {LABEL, n} */

to

    #define COMMENT(n) comment {LABEL, n}
2016-12-09 16:58:47 -05:00
George Koehler 244e554f2f Remove trailing whitespace in mach/powerpc/ncg/table 2016-12-09 16:36:42 -05:00
George Koehler df86e3b84f Fix typo: msr0 should be msr. 2016-12-09 16:04:21 -05:00
George Koehler d94ea4c508 Teach qemuppc to halt the cpu on _exit().
Without this, qemu-system-ppc spins the host cpu until I close its
window.  I assume the default G3 emulation.  The emulator yields the
host cpu if I set certain flags in hid0 then msr.  The hid0 flag can
be any of DOZE, NAP, SLEEP, so I just set all 3.  I encode mfmsr and
mtmsr with .data4, because our assembler doesn't know instructions for
supervisor mode.

Also move some common symbols from .rom to .bss.  Our assembler puts
common symbols in any section.

Also clean up the file.  Delete a comment about linuxppc that is wrong
here.  Delete redundant .extern because .define is the same.
2016-12-07 18:11:12 -05:00
George Koehler b8c921ca70 Allow mfspr, mtspr with a register number.
PowerPC has a few hundred special-purpose registers.  The assembler
had only accepted the names "xer", "lr", "ctr".  Most programs use
only those three SPRs.  If I add more names, they would almost never
get used, and they might conflict with labels.

I want to use "mfspr r3, 0x3f0" and "mtspr 0x3f0, r3" in
plat/qemu/boot.s to access register hid0 from supervisor mode.
2016-12-07 17:28:00 -05:00
David Given 97acc7bcad Merge pull request #25 from davidgiven/dtrg-inn
Fix endianess issue with inn.
2016-12-06 22:24:31 +01:00
David Given 1039c0a747 Add a test for #22. 2016-12-06 22:07:22 +01:00
David Given 67e7d226ad Disable qemuppc tests; turns out qemu-system-ppc won't load more than the first
4kB of a kernel...
2016-12-06 22:06:17 +01:00
David Given cc3d72e884 Fix redirection so stray stderr output from qemu doesn't cause mysterious test
failures.
2016-12-06 22:05:14 +01:00
David Given 55e24e1f24 inn was assuming that bitfields were arrays of bytes, when actually they're
arrays of words (which makes the LSB move on big-endian systems).
2016-12-06 21:45:20 +01:00
David Given 6a77309e96 Merge pull request #23 from kernigh/pr-osx
new platforms osx386 and osxppc
2016-12-06 16:28:24 +01:00
George Koehler 6cbea83f7f Don't share as, ncg, top between Linux and Mac OS X.
Telling osx386 and osxppc to build and run their own tools, not to
reuse the tools from linux386 and linuxppc.  This wastes time to build
identical tools, but it removes some bogus dependencies.  OS X tools
had wrongly depended on Linux descr files and aelflod; now they don't.

Discussion in https://github.com/davidgiven/ack/pull/23
2016-12-05 20:13:29 -05:00
David Given 3fe285f8f8 Fix some shell issues that would occasionally cause hangs if no tests failed. 2016-12-05 21:06:38 +01:00
David Given c569ca15d8 Clean up how the language libraries refer to plat headers; they should be using
the +pkg forms of the rules and getting the headers via the paths in descr,
rather than depending on the +headers version.
2016-12-05 21:05:24 +01:00
David Given c5aff6fc2e Change dependency from simplerule{} with a dependency but no outputs to an
installable; otherwise, the dependency would be built, but the result wouldn't
get added to the header path and so wouldn't be seen.
2016-12-05 20:33:26 +01:00
David Given 3cce93586f Merge branch 'pr-osx' of https://github.com/kernigh/ack into kernigh-pr-osx 2016-12-05 20:14:54 +01:00
George Koehler 969e98b82d Create Mach-o files with mode 0777 to allow executing them.
Until now, I was always doing chmod +x before running my files on the
Mac.  Now files get created +x.  There's no change when overwriting
an existing file.  I needed to gmake clean my build to remove the
example programs without +x, so cvmach can create them with +x.
2016-12-03 17:52:24 -05:00
George Koehler 355cc06fff Write README files for osx386 and osxppc. 2016-12-03 17:17:44 -05:00
George Koehler 25e159c930 Remove bad overflow check from plat/osx/libsys/brk.c
If I want to check for overflow, then I should check it before I do
base + incr, not after.

Now that I have no check, I am passing the overflowed base + incr to
brk1(), where it will probably fail the nbreak < segment check.
2016-12-03 17:07:51 -05:00
George Koehler e06b1fa05e Write a manual page for cvmach(6).
This manual is in the new mdoc(7) format.  All existing ack manuals
use the old man(7) format.  This might be a problem if someone can't
display mdoc(7) files.

The build system doesn't install the cvmach(6) manual; that might
happen later.  The current build system installs manuals in two
different places, and doesn't install some manuals, so I don't know
what to do.
2016-12-02 18:04:06 -05:00
David Given 07e654d6e3 Merge from default. 2016-12-02 00:25:50 +01:00
David Given f1c357b9ea Merge pull request #21 from davidgiven/dtrg-tests
Run all tests, even if some fail, and produce a test summary at the end of the build.
2016-12-02 00:24:44 +01:00
David Given 353e2d2842 Typo fix. 2016-12-02 00:18:44 +01:00
David Given 213def9666 Don't fail to build if all tests are skipped. 2016-12-02 00:14:40 +01:00
David Given 3aa0487289 UI tweaks to the test summary. 2016-12-02 00:10:33 +01:00
David Given 467709ff38 Report skipped, failed and timed out tests. 2016-12-02 00:00:31 +01:00
David Given 9e6581b0ff Mark skipped tests in the logs (so we can get stats on them later). 2016-12-01 23:14:29 +01:00
David Given 8c99e2b7ad Run all tests, even the ones which fail, and emit a test summary right at the
end of the build (and fail then).
2016-12-01 23:03:30 +01:00
David Given ee22fc5fae Merge pull request #20 from davidgiven/dtrg-tests
Replace the hacky pipeline in testdriver.sh with a bespoke tool.
2016-12-01 22:23:09 +01:00
David Given b7de58e34e Fix signal unsafety in testdriver.c. 2016-12-01 22:05:22 +01:00
David Given 90547157b4 Merge from default. 2016-11-30 22:07:29 +01:00
David Given 8ce3382996 Merge from default. 2016-11-30 22:04:11 +01:00
David Given d94c326465 Merge pull request #18 from kernigh/pr-util-ack
util/ack: use DEFAULT_PLATFORM, allow non-ASCII filenames, other changes
2016-11-30 22:00:55 +01:00
George Koehler 8ef7c31089 Write a powerpc.descr for ego and use it with osxppc.
No change to linuxppc and qemuppc.  They continue to run ego without
any descr file.

I copied m68020.descr to powerpc.descr and changed some numbers.  My
numbers are guesses; I know little about PowerPC cycle counts, and
almost nothing about ego.  This powerpc.descr causes most of the
example programs to shrink in size (without descr -> with descr):

  65429 -> 57237  hilo_b.osxppc        -8192
  36516 -> 32420  hilo_c.osxppc        -4096
  55782 -> 51686  hilo_mod.osxppc      -4096
  20096 -> 20096  hilo_p.osxppc            0
   8813 ->  8813  mandelbrot_c.osxppc      0
  93355 -> 89259  paranoia_c.osxppc    -4096
  92751 -> 84559  startrek_c.osxppc    -8192

(Each file has 2 Mach segments, then a symbol table.  Each segment
takes a multiple of 4096 bytes.  When the code shrinks, we lose a
multiple of 4096 bytes.)

I used "ack -mosxppc -O6 -c.so" to examine the assembly code for
hilo.mod and mandelbrot.c, both without and with descr.  This reveals
optimizations made only with descr, from 2 ego phases: SP (stack
pollution) and RA (register allocation).  In hilo.mod, SP deletes some
instructions that remove items from the stack.  These items get
removed when the function returns.  In both hilo.mod and mandelbrot.c,
RA moves some values into local variables, so ncg can make them into
register variables.  This shrinks code size, probably because register
variables get preserved across function calls.  More values stay in
registers, and ncg emits shorter code.

I believe that the ego descr file uses (time,space) tuples but the ncg
table uses (space,time) tuples.  This is confusing.  Perhaps I am
wrong, and some or all tuples are backwards.  My time values are the
cycle counts in latency from the MPC7450 Reference Manual (but not
including complications like "store serialization").

In powerpc.descr, I give the cost for saving and restoring registers
as if I was using chains of stw and lwz instructions.  Actually ncg
uses single stmw and lmw instructions with at least 2 instructions.
The (time,space) for stmw and lmw would be much less than the
(time,space) for chains of stw and lwz.  But this ignores the pipeline
of the MPC7450.  The chains of stw and lwz may run faster than stmw
and lmw in the pipeline, because the throughput may be better than the
latency.  By using the wrong values for (time,space), I'm trying to
tell ego that stmw and lmw are not better than chains of stw and lwz.
2016-11-30 15:29:19 -05:00