Commit Graph

228 Commits

Author SHA1 Message Date
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
Rui Ueyama cc852fe99d Add bitfield 2020-12-07 12:00:06 +09:00
Rui Ueyama be8b6f6d31 Add -U option 2020-12-07 12:00:06 +09:00
Rui Ueyama fc69f5c6f9 Add -D option 2020-12-07 12:00:06 +09:00
Rui Ueyama 3f2c2d5bca Tokenize numeric tokens as pp-numbers 2020-12-07 12:00:06 +09:00
Rui Ueyama e0b5da3b39 Dereferencing a function shouldn't do anything
This is an oddity in the C spec, but you can apply the unary `*`
operator to a function as many times as you want. `*x` and `x`
means exactly the same, given that `x` is a function.
2020-12-07 12:00:06 +09:00
Rui Ueyama 603de502fd Add va_copy() 2020-12-07 12:00:06 +09:00
Rui Ueyama b6d3cd00df Allow variadic function to take more than 6 parameters 2020-12-07 12:00:06 +09:00
Rui Ueyama d7bad96114 Allow to define a function returning a struct 2020-12-07 12:00:06 +09:00
Rui Ueyama c72df1c9be Allow to call a fucntion returning a struct 2020-12-07 12:00:06 +09:00
Rui Ueyama d63b1f410a Allow struct argument 2020-12-07 12:00:06 +09:00
Rui Ueyama 5e0f8c47e3 Allow struct parameter 2020-12-07 12:00:06 +09:00
Rui Ueyama 9021f7f5de Support passed-on-stack parameters 2020-12-07 12:00:06 +09:00
Rui Ueyama b29f052102 Support passed-on-stack arguments 2020-12-07 12:00:06 +09:00
Rui Ueyama 12a9e7506c Self-host: including preprocessor, chibicc can compile itself 2020-12-07 12:00:06 +09:00
Rui Ueyama 5322ea8495 Add va_arg() 2020-12-07 12:00:06 +09:00
Rui Ueyama 7cbfd111d3 Add stdarg.h, stdbool.h, stddef.h, stdalign.h and float.h 2020-12-07 12:00:06 +09:00
Rui Ueyama 7746e4ee0b Recognize wide character literal
For now, L'' is equivalent to ''.
2020-12-07 12:00:06 +09:00
Rui Ueyama ab4f1e1e19 Concatenate adjacent string literals 2020-12-07 12:00:06 +09:00
Rui Ueyama 82ba010c76 [GNU] Add __FUNCTION__ 2020-12-07 12:00:06 +09:00
Rui Ueyama ba6b4b6375 Add __func__ 2020-12-07 12:00:06 +09:00
Rui Ueyama dc01f94900 Add __VA_ARGS__ 2020-12-07 12:00:06 +09:00
Rui Ueyama 6f17071885 Add __FILE__ and __LINE__ 2020-12-07 12:00:06 +09:00
Rui Ueyama 5f5a8507ff Add predefine macros such as __STDC__ 2020-12-07 12:00:06 +09:00
Rui Ueyama e7fdc2e3f1 Add #error 2020-12-07 12:00:06 +09:00
Rui Ueyama a939a7a906 Add default include paths 2020-12-07 12:00:06 +09:00
Rui Ueyama a1dd6213c8 Add -I<dir> option 2020-12-07 12:00:06 +09:00
Rui Ueyama d85fc4ffcf Add #include <...> 2020-12-07 12:00:06 +09:00
Rui Ueyama b33fe0ea82 Support line continuation 2020-12-07 12:00:06 +09:00
Rui Ueyama 8075582c21 Preserve newline and space during macro expansion 2020-12-07 12:00:06 +09:00
Rui Ueyama a8d76ad435 Replace remaining identifiers with 0 in macro constexpr 2020-12-07 12:00:06 +09:00
Rui Ueyama 5cb2f89e6a Add defined() macro operator 2020-12-07 12:00:06 +09:00
Rui Ueyama 769b5a0941 Use chibicc's preprocessor for all tests 2020-12-07 12:00:06 +09:00