diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | lib.h | 2 | ||||
-rw-r--r-- | machine.h | 1 | ||||
-rw-r--r-- | pre-process.c | 26 | ||||
-rw-r--r-- | predefine.c | 2 | ||||
-rw-r--r-- | target-arm64.c | 2 | ||||
-rw-r--r-- | target-microblaze.c | 25 | ||||
-rw-r--r-- | target-riscv.c | 2 | ||||
-rw-r--r-- | target.c | 2 | ||||
-rw-r--r-- | target.h | 1 | ||||
-rw-r--r-- | validation/preprocessor/predef-token.c | 5 |
11 files changed, 66 insertions, 3 deletions
@@ -74,6 +74,7 @@ LIB_OBJS += target-arm64.o LIB_OBJS += target-bfin.o LIB_OBJS += target-default.o LIB_OBJS += target-m68k.o +LIB_OBJS += target-microblaze.o LIB_OBJS += target-mips.o LIB_OBJS += target-nios2.o LIB_OBJS += target-ppc.o @@ -123,6 +123,8 @@ enum phase { extern void add_pre_buffer(const char *fmt, ...) FORMAT_ATTR(1); extern void predefine(const char *name, int weak, const char *fmt, ...) FORMAT_ATTR(3); +extern void predefine_strong(const char *name, ...) FORMAT_ATTR(1); +extern void predefine_weak(const char *name, ...) FORMAT_ATTR(1); extern void predefine_nostd(const char *name); extern void predefined_macros(void); @@ -35,6 +35,7 @@ enum machine { MACH_ALPHA, MACH_BFIN, MACH_M68K, + MACH_MICROBLAZE, MACH_NIOS2, MACH_UNKNOWN }; diff --git a/pre-process.c b/pre-process.c index 38167802..403e3507 100644 --- a/pre-process.c +++ b/pre-process.c @@ -1439,6 +1439,32 @@ void predefine_nostd(const char *name) predefine(name, 1, "1"); } +static void predefine_fmt(const char *fmt, int weak, va_list ap) +{ + static char buf[256]; + + vsnprintf(buf, sizeof(buf), fmt, ap); + predefine(buf, weak, "1"); +} + +void predefine_strong(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + predefine_fmt(fmt, 0, ap); + va_end(ap); +} + +void predefine_weak(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + predefine_fmt(fmt, 1, ap); + va_end(ap); +} + static int do_handle_define(struct stream *stream, struct token **line, struct token *token, int attr) { struct token *arglist, *expansion; diff --git a/predefine.c b/predefine.c index ff457b38..d05b1018 100644 --- a/predefine.c +++ b/predefine.c @@ -52,7 +52,7 @@ static void predefined_min(const char *name, struct symbol *type) snprintf(buf, sizeof(buf), "__%s_MIN__", name); if (is_signed_type(type)) - predefine(buf, 1, "(-__%s_MAX__ - 1)", name); + add_pre_buffer("#weak_define %s (-__%s_MAX__ - 1)\n", buf, name); else predefine(buf, 1, "0%s", suffix); } diff --git a/target-arm64.c b/target-arm64.c index d491b65e..8619bd84 100644 --- a/target-arm64.c +++ b/target-arm64.c @@ -21,7 +21,7 @@ static void predefine_arm64(const struct target *self) predefine("__aarch64__", 1, "1"); if (cmodel) - add_pre_buffer("#define __AARCH64_CMODEL_%s__ 1\n", cmodel); + predefine_strong("__AARCH64_CMODEL_%s__", cmodel); } const struct target target_arm64 = { diff --git a/target-microblaze.c b/target-microblaze.c new file mode 100644 index 00000000..1fbeef3c --- /dev/null +++ b/target-microblaze.c @@ -0,0 +1,25 @@ +#include "symbol.h" +#include "target.h" +#include "machine.h" + + +static void predefine_microblaze(const struct target *self) +{ + predefine("__MICROBLAZE__", 1, "1"); + predefine("__microblaze__", 1, "1"); + + if (arch_big_endian) + predefine("__MICROBLAZEEB__", 1, "1"); + else + predefine("__MICROBLAZEEL__", 1, "1"); +} + +const struct target target_microblaze = { + .mach = MACH_MICROBLAZE, + .bitness = ARCH_LP32, + .big_endian = true, + + .bits_in_longdouble = 64, + + .predefine = predefine_microblaze, +}; diff --git a/target-riscv.c b/target-riscv.c index 08d036ca..d68fb585 100644 --- a/target-riscv.c +++ b/target-riscv.c @@ -24,7 +24,7 @@ static void predefine_riscv(const struct target *self) predefine("__riscv_xlen", 1, "%d", ptr_ctype.bit_size); if (cmodel) - add_pre_buffer("#define __riscv_cmodel_%s 1\n", cmodel); + predefine_strong("__riscv_cmodel_%s", cmodel); } const struct target target_riscv32 = { @@ -63,6 +63,7 @@ static const struct target *targets[] = { [MACH_I386] = &target_i386, [MACH_BFIN] = &target_bfin, [MACH_X86_64] = &target_x86_64, + [MACH_MICROBLAZE] = &target_microblaze, [MACH_MIPS32] = &target_mips32, [MACH_MIPS64] = &target_mips64, [MACH_NIOS2] = &target_nios2, @@ -93,6 +94,7 @@ enum machine target_parse(const char *name) { "i386", MACH_I386, 32, }, { "bfin", MACH_BFIN, 32, }, { "m68k", MACH_M68K, 32, }, + { "microblaze", MACH_MICROBLAZE,32, }, { "mips", MACH_MIPS32, 0, }, { "nios2", MACH_NIOS2, 32, }, { "powerpc", MACH_PPC32, 0, }, @@ -86,6 +86,7 @@ extern const struct target target_arm; extern const struct target target_arm64; extern const struct target target_bfin; extern const struct target target_m68k; +extern const struct target target_microblaze; extern const struct target target_mips32; extern const struct target target_mips64; extern const struct target target_nios2; diff --git a/validation/preprocessor/predef-token.c b/validation/preprocessor/predef-token.c new file mode 100644 index 00000000..6df8ea40 --- /dev/null +++ b/validation/preprocessor/predef-token.c @@ -0,0 +1,5 @@ +static __UINT8_TYPE__ u8; + +/* + * check-name: predef-token + */ |