diff options
| author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-09-16 23:19:19 +0200 |
|---|---|---|
| committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-09-16 23:19:19 +0200 |
| commit | 517177692e00fd36d89f1aac389348c9598bc426 (patch) | |
| tree | 1b0825895125bac64012c7f1ee28a37712c7184b /validation | |
| parent | 24bdaac6682c36f5f7878321e8f9eb02c0993572 (diff) | |
| download | sparse-dev-517177692e00fd36d89f1aac389348c9598bc426.tar.gz | |
teach sparse about -funsigned-bitfields
Currently, Sparse treats 'plain' bitfields as unsigned.
However, this is this is inconsistent with how non-bitfield integers
are handled and with how GCC & clang handle bitfields.
So, teach sparse about '-funsigned-bitfields' and by default treat
these bitfields are signed, like done by GCC & clang and like done
for non-bitfield integers.
Also, avoid plain bitfields in IR related testcases.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
Diffstat (limited to 'validation')
| -rw-r--r-- | validation/linear/bitfield-sign-default.c | 13 | ||||
| -rw-r--r-- | validation/linear/bitfield-sign-signed.c | 13 | ||||
| -rw-r--r-- | validation/linear/bitfield-sign-unsigned.c | 13 | ||||
| -rw-r--r-- | validation/linear/bitfield-size.c | 10 | ||||
| -rw-r--r-- | validation/optim/bitfield-size.c | 15 | ||||
| -rw-r--r-- | validation/optim/bitfield-store-loads.c | 4 |
6 files changed, 48 insertions, 20 deletions
diff --git a/validation/linear/bitfield-sign-default.c b/validation/linear/bitfield-sign-default.c new file mode 100644 index 00000000..9a2854e6 --- /dev/null +++ b/validation/linear/bitfield-sign-default.c @@ -0,0 +1,13 @@ +struct s { + int f:2; +}; + +static int getf(struct s s) { return s.f; } + +/* + * check-name: bitfield-sign-default + * check-command: test-linearize -fdump-ir=linearize $file + * + * check-output-ignore + * check-output-contains: sext\\. + */ diff --git a/validation/linear/bitfield-sign-signed.c b/validation/linear/bitfield-sign-signed.c new file mode 100644 index 00000000..59a07ceb --- /dev/null +++ b/validation/linear/bitfield-sign-signed.c @@ -0,0 +1,13 @@ +struct s { + int f:2; +}; + +static int getf(struct s s) { return s.f; } + +/* + * check-name: bitfield-sign-signed + * check-command: test-linearize -fdump-ir=linearize -fsigned-bitfields $file + * + * check-output-ignore + * check-output-contains: sext\\. + */ diff --git a/validation/linear/bitfield-sign-unsigned.c b/validation/linear/bitfield-sign-unsigned.c new file mode 100644 index 00000000..099edaad --- /dev/null +++ b/validation/linear/bitfield-sign-unsigned.c @@ -0,0 +1,13 @@ +struct s { + int f:2; +}; + +static int getf(struct s s) { return s.f; } + +/* + * check-name: bitfield-sign-unsigned + * check-command: test-linearize -fdump-ir=linearize -funsigned-bitfields $file + * + * check-output-ignore + * check-output-contains: zext\\. + */ diff --git a/validation/linear/bitfield-size.c b/validation/linear/bitfield-size.c index dcda930d..719b0ab8 100644 --- a/validation/linear/bitfield-size.c +++ b/validation/linear/bitfield-size.c @@ -19,7 +19,7 @@ void ucpy(struct u *d, const struct u *s) struct s { - int f:3; + signed int f:3; }; int spostinc(struct s *x) @@ -118,7 +118,7 @@ spostinc: load.64 %r33 <- 0[x] load.32 %r34 <- 0[%r33] trunc.3 %r35 <- (32) %r34 - zext.32 %r36 <- (3) %r35 + sext.32 %r36 <- (3) %r35 add.32 %r37 <- %r36, $1 trunc.3 %r38 <- (32) %r37 load.32 %r39 <- 0[%r33] @@ -126,7 +126,7 @@ spostinc: and.32 %r41 <- %r39, $0xfffffff8 or.32 %r42 <- %r41, %r40 store.32 %r42 -> 0[%r33] - zext.32 %r43 <- (3) %r36 + sext.32 %r43 <- (3) %r36 phisrc.32 %phi3(return) <- %r43 br .L7 @@ -142,7 +142,7 @@ spreinc: load.64 %r45 <- 0[x] load.32 %r46 <- 0[%r45] trunc.3 %r47 <- (32) %r46 - zext.32 %r48 <- (3) %r47 + sext.32 %r48 <- (3) %r47 add.32 %r49 <- %r48, $1 trunc.3 %r50 <- (32) %r49 load.32 %r51 <- 0[%r45] @@ -150,7 +150,7 @@ spreinc: and.32 %r53 <- %r51, $0xfffffff8 or.32 %r54 <- %r53, %r52 store.32 %r54 -> 0[%r45] - zext.32 %r55 <- (3) %r50 + sext.32 %r55 <- (3) %r50 phisrc.32 %phi4(return) <- %r55 br .L9 diff --git a/validation/optim/bitfield-size.c b/validation/optim/bitfield-size.c index 0d2deeea..ea1ed57f 100644 --- a/validation/optim/bitfield-size.c +++ b/validation/optim/bitfield-size.c @@ -19,17 +19,6 @@ signed int get__bfs_b(struct bfs bf) { return bf.b; } signed int get_pbfs_a(struct bfs *bf) { return bf->a; } signed int get_pbfs_b(struct bfs *bf) { return bf->b; } - -struct bfi { - int a:4; - int :2; - int b:4; -}; -unsigned int get__bfi_a(struct bfi bf) { return bf.a; } -unsigned int get__bfi_b(struct bfi bf) { return bf.b; } -unsigned int get_pbfi_a(struct bfi *bf) { return bf->a; } -unsigned int get_pbfi_b(struct bfi *bf) { return bf->b; } - /* * check-name: bitfield size * check-command: test-linearize -Wno-decl $file @@ -37,8 +26,8 @@ unsigned int get_pbfi_b(struct bfi *bf) { return bf->b; } * * check-output-excludes: and\\..*\\$960 * check-output-excludes: zext\\. - * check-output-pattern(8): and\\..*\\$15 + * check-output-pattern(4): and\\..*\\$15 * check-output-pattern(4): sext\\. * check-output-pattern(4): trunc\\.4 - * check-output-pattern(6): lsr\\..*\\$6 + * check-output-pattern(4): lsr\\..*\\$6 */ diff --git a/validation/optim/bitfield-store-loads.c b/validation/optim/bitfield-store-loads.c index dc625131..f946715b 100644 --- a/validation/optim/bitfield-store-loads.c +++ b/validation/optim/bitfield-store-loads.c @@ -1,6 +1,6 @@ struct s { - char :2; - char f:3; + unsigned char :2; + unsigned char f:3; }; int foo(struct s s, int a) |
