diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-07-05 12:34:11 +0200 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-07-05 12:34:11 +0200 |
commit | d5305a788ebe5c04993bbe158e48a9555c1d8fef (patch) | |
tree | 5678f5c52d3e4b23fd492bf5cb162db3710e1fda | |
parent | 1a913ebefbc0b8eb18c5637db81616cf7a41f0ce (diff) | |
parent | b84b4b4b63aa13dd3257827ec0b0b777a1fbe159 (diff) | |
download | sparse-d5305a788ebe5c04993bbe158e48a9555c1d8fef.tar.gz |
Merge branch 'arch-asm-mem'
* teach sparse about arch specific asm constraints
* teach sparse about memory operand constraints for ppc & s390
-rw-r--r-- | evaluate.c | 5 | ||||
-rw-r--r-- | target-ppc.c | 13 | ||||
-rw-r--r-- | target-s390.c | 13 | ||||
-rw-r--r-- | target.h | 3 |
4 files changed, 32 insertions, 2 deletions
@@ -3642,7 +3642,10 @@ static void parse_asm_constraint(struct asm_operand *op) return; default: - // FIXME: arch-specific (and multi-letter) constraints + if (arch_target->asm_constraint) + str = arch_target->asm_constraint(op, c, str); + + // FIXME: multi-letter constraints break; } } diff --git a/target-ppc.c b/target-ppc.c index b138635b..c0d6068f 100644 --- a/target-ppc.c +++ b/target-ppc.c @@ -1,6 +1,7 @@ #include "symbol.h" #include "target.h" #include "machine.h" +#include "expression.h" static void predefine_ppc(const struct target *self) @@ -15,6 +16,16 @@ static void predefine_ppc(const struct target *self) predefine("_BIG_ENDIAN", 1, "1"); } +static const char *asm_constraint_ppc(struct asm_operand *op, int c, const char *str) +{ + switch (c) { + case 'Z': + op->is_memory = true; + break; + } + return str; +} + static void predefine_ppc32(const struct target *self) { @@ -32,6 +43,7 @@ const struct target target_ppc32 = { .target_64bit = &target_ppc64, .predefine = predefine_ppc32, + .asm_constraint = asm_constraint_ppc, }; @@ -55,4 +67,5 @@ const struct target target_ppc64 = { .target_32bit = &target_ppc32, .predefine = predefine_ppc64, + .asm_constraint = asm_constraint_ppc, }; diff --git a/target-s390.c b/target-s390.c index 8fe7d936..9dbc810e 100644 --- a/target-s390.c +++ b/target-s390.c @@ -1,6 +1,7 @@ #include "symbol.h" #include "target.h" #include "machine.h" +#include "expression.h" static void predefine_s390(const struct target *self) @@ -8,6 +9,16 @@ static void predefine_s390(const struct target *self) predefine("__s390__", 1, "1"); } +static const char *asm_constraint_s390(struct asm_operand *op, int c, const char *str) +{ + switch (c) { + case 'R': case 'S': case 'T': + op->is_memory = true; + break; + } + return str; +} + const struct target target_s390 = { .mach = MACH_S390, .bitness = ARCH_LP32, @@ -21,6 +32,7 @@ const struct target target_s390 = { .target_64bit = &target_s390x, .predefine = predefine_s390, + .asm_constraint = asm_constraint_s390, }; @@ -45,4 +57,5 @@ const struct target target_s390x = { .target_32bit = &target_s390, .predefine = predefine_s390x, + .asm_constraint = asm_constraint_s390, }; @@ -53,7 +53,7 @@ extern int pointer_alignment; extern int bits_in_enum; extern int enum_alignment; - +struct asm_operand; struct builtin_fn; struct target { @@ -77,6 +77,7 @@ struct target { void (*init)(const struct target *self); void (*predefine)(const struct target *self); + const char *(*asm_constraint)(struct asm_operand *op, int c, const char *str); }; extern const struct target target_default; |