Commit Graph

260 Commits

Author SHA1 Message Date
Rui Ueyama
31087f8d4b Handle inline functions as static functions 2020-12-07 12:00:06 +09:00
Rui Ueyama
a2535163e2 Add basic "asm" statement 2020-12-07 12:00:06 +09:00
Rui Ueyama
e28a612e9c [GNU] Add ?: operator with omitted operand 2020-12-07 12:00:06 +09:00
Rui Ueyama
aee7891acb [GNU] Allow sizeof(<function type>) 2020-12-07 12:00:06 +09:00
Rui Ueyama
1faab48ecf Add _Generic 2020-12-07 12:00:06 +09:00
Rui Ueyama
1433b404d6 [GNU] Add __builtin_types_compatible_p 2020-12-07 12:00:06 +09:00
Rui Ueyama
7d80a5136d Add typeof 2020-12-07 12:00:06 +09:00
Rui Ueyama
007e526ec5 [GNU] Support GCC-style variadic macro 2020-12-07 12:00:06 +09:00
Rui Ueyama
74ec9f6f39 Ignore #pragma 2020-12-07 12:00:06 +09:00
Rui Ueyama
083c27559e [GNU] Handle ,##__VA_ARG__ 2020-12-07 12:00:06 +09:00
Rui Ueyama
338144869f Add __VA_OPT__ 2020-12-07 12:00:06 +09:00
Rui Ueyama
3a10c8aa44 [GNU] Add __BASE_FILE__ macro 2020-12-07 12:00:06 +09:00
Rui Ueyama
922604ae1e [GNU] Add __TIMESTAMP__ macro 2020-12-07 12:00:06 +09:00
Rui Ueyama
aaf20fb96e [GNU] Add line marker directive 2020-12-07 12:00:06 +09:00
Rui Ueyama
c61c0d0025 Add #line 2020-12-07 12:00:06 +09:00
Rui Ueyama
37998be0c1 Improve error message for multibyte characters 2020-12-07 12:00:06 +09:00
Rui Ueyama
95eb5b01b3 Handle struct designator for anonymous struct member 2020-12-07 12:00:06 +09:00
Rui Ueyama
31dc1dfa21 Add union designated initializer 2020-12-07 12:00:06 +09:00
Rui Ueyama
67f5834378 Add struct designated initializer 2020-12-07 12:00:06 +09:00
Rui Ueyama
691c4fac15 [GNU] Allow to omit "=" in designated initializers 2020-12-07 12:00:06 +09:00
Rui Ueyama
835cd24b2c Allow array designators to initialize incomplete arrays 2020-12-07 12:00:06 +09:00
Rui Ueyama
c618c3b582 Add array designated initializer 2020-12-07 12:00:06 +09:00
Rui Ueyama
2b2fa25507 Skip UTF-8 BOM markers 2020-12-07 12:00:06 +09:00
Rui Ueyama
238277714d Allow to concatenate regular string literals with L/u/U string literals 2020-12-07 12:00:06 +09:00
Rui Ueyama
adb8b98889 [GNU] Accept $ as an identifier character 2020-12-07 12:00:06 +09:00
Rui Ueyama
0e5d250ebf Allow multibyte UTF-8 character in identifier 2020-12-07 12:00:06 +09:00
Rui Ueyama
e4491b8115 Define __STDC_UTF_{16,32}__ macros
These predefined macros indicates that our u and U chars/strings
are UTF-16 and UTF-32-encoded, respectively.
2020-12-07 12:00:06 +09:00
Rui Ueyama
6adba75af8 Add UTF-32 string literal initializer 2020-12-07 12:00:06 +09:00
Rui Ueyama
36230e0827 Add UTF-16 string literal initializer 2020-12-07 12:00:06 +09:00
Rui Ueyama
cae061af2b Add wide string literal 2020-12-07 12:00:06 +09:00
Rui Ueyama
c467ee665d Add UTF-32 string literal 2020-12-07 12:00:06 +09:00
Rui Ueyama
9cabe1f204 Add UTF-16 string literal 2020-12-07 12:00:06 +09:00
Rui Ueyama
57b21fe902 Add UTF-8 string literal 2020-12-07 12:00:06 +09:00
Rui Ueyama
2dac3afece Add UTF-32 character literal 2020-12-07 12:00:06 +09:00
Rui Ueyama
454618cd15 Add UTF-16 character literal 2020-12-07 12:00:06 +09:00
Rui Ueyama
a57c661d46 Accept multibyte character as wide character literal
On most Unix-like systems, wide character literal is 32-bit long
and encodes a Unicode code point. On Windows, that is 16-bit
long and encodes a UTF-16 code unit. Clearly, there's a portability
issue here. Personally I've never used wide characters in my code
as I didn't find it useful.

Being said that, some header files contain wide character literal,
so we need to support that so that chibicc can include such files.

We assume that source files are always encoded in UTF-8.
2020-12-07 12:00:06 +09:00
Rui Ueyama
c31886aa7a Add \u and \U escape sequences 2020-12-07 12:00:06 +09:00
Rui Ueyama
74bcec5b22 Canonicalize newline character 2020-12-07 12:00:06 +09:00
Rui Ueyama
0e77f3dff8 [GNU] Add __COUNTER__ macro 2020-12-07 12:00:06 +09:00
Rui Ueyama
e27417fcde Add __DATE__ and __TIME__ macros 2020-12-07 12:00:06 +09:00
Rui Ueyama
c3075b3030 Add anonymous struct and union 2020-12-07 12:00:06 +09:00
Rui Ueyama
9c36dd727c Make "main" to implicitly return 0 2020-12-07 12:00:06 +09:00
Rui Ueyama
5257ee0f20 Make an array of at least 16 bytes long to have alignment of at least 16 bytes
Quote from AMD64 System V ABI: "An array uses the same alignment as
its elements, except that a local or global array variable of length
at least 16 bytes or a C99 variable-length array variable always has
alignment of at least 16 bytes."
2020-12-07 12:00:06 +09:00
Rui Ueyama
2c91da54df Turn on -Wall compiler flag and fix compiler warnings 2020-12-07 12:00:06 +09:00
Rui Ueyama
b1fdddff15 Ignore -O, -W and -g and other flags 2020-12-07 12:00:06 +09:00
Rui Ueyama
2bdc6b800c Write to an in-memory buffer before writing to an actual output file
We don't want to leave a partial assembly output if the compiler
fails during compilation.

Technically speaking, there's still a risk of leaving a partially-
written output file if the compiler dies during file copy. To fix
that, we have to write to a temporary file in the same filesystem as
the final output file and rename the temporary file to atomically
replace the output file. We don't do that in this patch for the sake
of succinctness, though.
2020-12-07 12:00:06 +09:00
Rui Ueyama
c302a969d8 Do not allow to obtain an address of a bitfield 2020-12-07 12:00:06 +09:00
Rui Ueyama
17ea802cea Handle zero-width bitfield member 2020-12-07 12:00:06 +09:00
Rui Ueyama
54c2b3b18f Handle op=-style assignments to bitfields 2020-12-07 12:00:06 +09:00
Rui Ueyama
441a89b80b Support global struct bitfield initializer 2020-12-07 12:00:06 +09:00