diff options
Diffstat (limited to 'target-riscv.c')
-rw-r--r-- | target-riscv.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/target-riscv.c b/target-riscv.c new file mode 100644 index 00000000..08d036ca --- /dev/null +++ b/target-riscv.c @@ -0,0 +1,53 @@ +#include "symbol.h" +#include "target.h" +#include "machine.h" + + +static void init_riscv(const struct target *self) +{ + if (arch_cmodel == CMODEL_UNKNOWN) + arch_cmodel = CMODEL_MEDLOW; + if (fpic) + arch_cmodel = CMODEL_PIC; +} + +static void predefine_riscv(const struct target *self) +{ + static const char *cmodels[CMODEL_LAST] = { + [CMODEL_MEDANY] = "medany", + [CMODEL_MEDLOW] = "medlow", + [CMODEL_PIC] = "pic", + }; + const char *cmodel = cmodels[arch_cmodel]; + + predefine("__riscv", 1, "1"); + predefine("__riscv_xlen", 1, "%d", ptr_ctype.bit_size); + + if (cmodel) + add_pre_buffer("#define __riscv_cmodel_%s 1\n", cmodel); +} + +const struct target target_riscv32 = { + .mach = MACH_RISCV32, + .bitness = ARCH_LP32, + .big_endian = 0, + .unsigned_char = 1, + + .target_64bit = &target_riscv64, + + .init = init_riscv, + .predefine = predefine_riscv, +}; + +const struct target target_riscv64 = { + .mach = MACH_RISCV64, + .bitness = ARCH_LP64, + .big_endian = 0, + .unsigned_char = 1, + .has_int128 = 1, + + .target_32bit = &target_riscv32, + + .init = init_riscv, + .predefine = predefine_riscv, +}; |