007a63d529
Add long long type, but without literals; you can't say '123LL' yet. You can try constant operations, like `(long long)123 + 1`, but the compiler's `arith` type might not be wide enough. Conversions, shifts, and some other operations don't work in i386 ncg; I am using a union instead of conversions: union q { long long ll; unsigned long long ull; int i[2]; }; Hack plat/linux386/descr to enable long long (size 8, alignment 4) only for this platform. The default for other platforms is to disable long long (size -1). In lang/cem/cemcom.ansi, - BigPars, SmallPars: Add default size, alignment of long long. - align.h: Add lnglng_align. - arith.c: Convert arithmetic operands to long long or unsigned long long when necessary; avoid conversion from long long to long. Allow long long as an arithmetic, integral, or logical operand. - ch3.c: Handle long long like int and long when erroneously applying a selector, like `long long ll; ll.member` or `ll->member`. Add long long to integral and arithmetic types. - code.c: Add long long to type stabs for debugging. - conversion.c: Add long long to integral conversions. - cstoper.c: Write masks up to full_mask[8]. Add FIXME comment. - declar.g: Parse `long long` in code. - decspecs.c: Understand long long in type declarations. - eval.c: Add long long to operations, to generate code like `adi 8`. Don't use `ldc` with constant over 4 bytes. - ival.g: Allow long long in initializations. - main.c: Set lnglng_type and related values. - options.c: Add option like `-Vq8.4` to set long long to size 8, alignment 4. I chose 'q', because Perl's pack and Ruby's Array#pack use 'q' for 64-bit or long long values; it might be a reference to BSD's old quad_t alias for long long. - sizes.h: Add lnglng_size. - stab.c: Allow long long when writing the type stab for debugging. Switch from calculating the ranges to hardcoding them in strings; add 8-byte ranges as a special case. This also hardcodes the unsigned 4-byte range as "0;-1". Before it was either "0;-1" or "0;4294967295", depending on sizeof(long) in the compiler. - struct.c: Try long long bitfield, but it will probably give the error, "bit field type long long does not fit in a word". - switch.c: Update comment. - tokenname.c: Define LNGLNG (long long) like LNGDBL (long double). - type.c, type.str: Add lnglng_type and ulnglng_type. Add function no_long_long() to check if long long is disabled. |
||
---|---|---|
.. | ||
include | ||
libsys | ||
tests | ||
boot.s | ||
build-pkg.lua | ||
build-tools.lua | ||
descr | ||
README |
# $Source$ # $State$ # $Revision$ The linux386 platform ===================== linux386 is an i386-based BSP that produces Linux ELF executables. This port only implements a very limited number of system calls; basically, just enough to make the demo apps run. Adding more is easy, but there are some subtleties that require more thought. The port should be considered only in proof-of-concept stage right now. Important note: you *can't* link access ELF shared libraries from these executables. In other words, you have to all your work from inside ACK. IEEE floating point is available, but requires an FPU. The executables are generated with aelfslod and are extremely simple; there's one rwx ELF section which contains all the application's code and data. This is not optimal, but it does work. Bugs ==== isatty() is a stub and always returns 0. Example command line ==================== ack -mlinux386 -O -o linux386.exe examples/paranoia.c The file linux386.exe can then be run on a i386 Linux machine (or on an emulation thereof). David Given dg@cowlark.com