[Bug target/85203] cmse_nonsecure_caller intrinsic returns incorrect results
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85203 Ramana Radhakrishnan changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED CC||ramana at gcc dot gnu.org Resolution|--- |FIXED Target Milestone|--- |7.4 --- Comment #4 from Ramana Radhakrishnan --- Fixed I'm assuming ?
[Bug target/85203] cmse_nonsecure_caller intrinsic returns incorrect results
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85203 --- Comment #3 from Thomas Preud'homme --- Author: thopre01 Date: Wed Apr 11 09:47:21 2018 New Revision: 259309 URL: https://gcc.gnu.org/viewcvs?rev=259309=gcc=rev Log: [ARM] Fix PR85203: cmse_nonsecure_caller returns wrong result __builtin_cmse_nonsecure_caller implementation returns true in almost all cases due to 2 separate bugs: * gen_addsi is used instead of gen_andsi to retrieve the lsb * the lsb boolean value is not negated but the specification [1] says the intrinsic should return true for a nonsecure caller and a nonsecure caller is characterized with LR's lsb being 0 This was not caught due to (1) lack of runtime test and (2) the existing RTL scan not taking into account that '.' matches newline in Tcl regular expressions. This commit fixes the implementation issues and improves testing of cmse_nonsecure_caller by (1) adding a runtime test for the secure caller case and (2) looking for an SET insn of an AND expression in the right function. This leaves the nonsecure caller case only partly tested since the exact value being AND and the negation are not covered by the scan and the existing test infrastructure does not allow 2 separate compilation and link to be performed. It is enough though to catch the current incorrect behavior. The commit also reorganize the scan directives in cmse-1.c to more easily identify what function they are intended to test in the file. 2018-04-11 Thomas Preud'hommeBackport from mainline 2018-04-04 Thomas Preud'homme gcc/ PR target/85203 * config/arm/arm-builtins.c (arm_expand_builtin): Change expansion to perform a bitwise AND of the argument followed by a boolean negation of the result. gcc/testsuite/ PR target/85203 * gcc.target/arm/cmse/cmse-1.c: Tighten cmse_nonsecure_caller RTL scan to match a single insn of the baz function. Move scan directives at the end of the file below the functions they are trying to test for better readability. * gcc.target/arm/cmse/cmse-16.c: New testcase. Added: branches/gcc-7-branch/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c Modified: branches/gcc-7-branch/gcc/ChangeLog branches/gcc-7-branch/gcc/config/arm/arm-builtins.c branches/gcc-7-branch/gcc/testsuite/ChangeLog branches/gcc-7-branch/gcc/testsuite/gcc.target/arm/cmse/cmse-1.c
[Bug target/85203] cmse_nonsecure_caller intrinsic returns incorrect results
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85203 Thomas Preud'homme changed: What|Removed |Added Known to work||8.0 Known to fail|8.0 | --- Comment #2 from Thomas Preud'homme --- Fixed in trunk
[Bug target/85203] cmse_nonsecure_caller intrinsic returns incorrect results
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85203 --- Comment #1 from Thomas Preud'homme --- Author: thopre01 Date: Wed Apr 4 17:31:46 2018 New Revision: 259097 URL: https://gcc.gnu.org/viewcvs?rev=259097=gcc=rev Log: [ARM] Fix PR85203: cmse_nonsecure_caller returns wrong result __builtin_cmse_nonsecure_caller implementation returns true in almost all cases due to 2 separate bugs: * gen_addsi is used instead of gen_andsi to retrieve the lsb * the lsb boolean value is not negated but the specification says the intrinsic should return true for a nonsecure caller and a nonsecure caller is characterized with LR's lsb being 0 This was not caught due to (1) lack of runtime test and (2) the existing RTL scan not taking into account that '.' matches newline in Tcl regular expressions. This commit fixes the implementation issues and improves testing of cmse_nonsecure_caller by (1) adding a runtime test for the secure caller case and (2) looking for an SET insn of an AND expression in the right function. This leaves the nonsecure caller case only partly tested since the exact value being AND and the negation are not covered by the scan and the existing test infrastructure does not allow 2 separate compilation and link to be performed. It is enough though to catch the current incorrect behavior. The commit also reorganize the scan directives in cmse-1.c to more easily identify what function they are intended to test in the file. 2018-04-04 Thomas Preud'hommegcc/ PR target/85203 * config/arm/arm-builtins.c (arm_expand_builtin): Change expansion to perform a bitwise AND of the argument followed by a boolean negation of the result. gcc/testsuite/ PR target/85203 * gcc.target/arm/cmse/cmse-1.c: Tighten cmse_nonsecure_caller RTL scan to match a single insn of the baz function. Move scan directives at the end of the file below the functions they are trying to test for better readability. * gcc.target/arm/cmse/cmse-16.c: New testcase. Added: trunk/gcc/testsuite/gcc.target/arm/cmse/cmse-16.c Modified: trunk/gcc/ChangeLog trunk/gcc/config/arm/arm-builtins.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gcc.target/arm/cmse/cmse-1.c