From 38bff3ec609e996c217e7852a48b6c6f471ef600 Mon Sep 17 00:00:00 2001 From: Virgile Prevosto <virgile.prevosto@m4x.org> Date: Mon, 11 Mar 2019 14:36:56 +0100 Subject: [PATCH] [parser] accept adjacent string literal tokens in extended GNU asm clauses Apparently things like that exist in untamed code bases. Fixes #615 --- src/kernel_internals/parsing/cparser.mly | 13 +++++-------- tests/syntax/assembly_gmp.c | 3 +++ tests/syntax/oracle/assembly_gmp.0.res.oracle | 5 +++++ tests/syntax/oracle/assembly_gmp.1.res.oracle | 5 +++++ tests/syntax/oracle/assembly_gmp.2.res.oracle | 5 +++++ 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/kernel_internals/parsing/cparser.mly b/src/kernel_internals/parsing/cparser.mly index 965974d98d9..7da75c2c4a1 100644 --- a/src/kernel_internals/parsing/cparser.mly +++ b/src/kernel_internals/parsing/cparser.mly @@ -736,10 +736,7 @@ string_constant: back to a string for easy viewing. */ string_list { intlist_to_string (fst $1), snd $1 } ; -one_string_constant: -/* Don't concat multiple strings. For asm templates. */ - CST_STRING { intlist_to_string (fst $1) } -; + string_list: one_string { fst $1, snd $1 } | string_list one_string { merge_string $1 $2 } @@ -1674,8 +1671,8 @@ asmattr: | CONST asmattr { ("const", []) :: $2 } ; asmtemplate: - one_string_constant { [$1] } -| one_string_constant asmtemplate { $1 :: $2 } + one_string { [intlist_to_string (fst $1)] } +| one_string asmtemplate { intlist_to_string (fst $1) :: $2 } ; asmoutputs: /* empty */ { None } @@ -1711,8 +1708,8 @@ asmclobber: | COLON asmcloberlst_ne asmlabels { $2,$3 } ; asmcloberlst_ne: - one_string_constant { [$1] } -| one_string_constant COMMA asmcloberlst_ne { $1 :: $3 } + string_constant { [fst $1] } +| string_constant COMMA asmcloberlst_ne { fst $1 :: $3 } ; asmlabels: | /* empty */ { [] } diff --git a/tests/syntax/assembly_gmp.c b/tests/syntax/assembly_gmp.c index 91147a15876..0d39854c42e 100644 --- a/tests/syntax/assembly_gmp.c +++ b/tests/syntax/assembly_gmp.c @@ -191,4 +191,7 @@ asm("sidt %0\n" : :"m"(loc)); asm ("movq $36, (%0)": : "r"(pulValue)); +int a = 2, b = 3; + __asm__("mov %1, %0" : "=r"(a) :"r"(b): "%""eax"); + } diff --git a/tests/syntax/oracle/assembly_gmp.0.res.oracle b/tests/syntax/oracle/assembly_gmp.0.res.oracle index 64d451b45f1..eb6853729c5 100644 --- a/tests/syntax/oracle/assembly_gmp.0.res.oracle +++ b/tests/syntax/oracle/assembly_gmp.0.res.oracle @@ -140,6 +140,11 @@ void f(void) \from (indirect: pulValue), *(pulValue + (..)); */ __asm__ ("movq $36, (%0)" : : "r" (pulValue)); + int a = 2; + int b = 3; + /*@ assigns a; + assigns a \from b; */ + __asm__ ("mov %1, %0" : "=r" (a) : "r" (b) : "%eax"); return; } diff --git a/tests/syntax/oracle/assembly_gmp.1.res.oracle b/tests/syntax/oracle/assembly_gmp.1.res.oracle index 34e7312b07b..63a12b1b07b 100644 --- a/tests/syntax/oracle/assembly_gmp.1.res.oracle +++ b/tests/syntax/oracle/assembly_gmp.1.res.oracle @@ -123,6 +123,11 @@ void f(void) \from (indirect: pulValue), *(pulValue + (..)); */ __asm__ ("movq $36, (%0)" : : "r" (pulValue)); + int a = 2; + int b = 3; + /*@ assigns a; + assigns a \from b; */ + __asm__ ("mov %1, %0" : "=r" (a) : "r" (b) : "%eax"); return; } diff --git a/tests/syntax/oracle/assembly_gmp.2.res.oracle b/tests/syntax/oracle/assembly_gmp.2.res.oracle index 914bb19ed14..2684a9a6655 100644 --- a/tests/syntax/oracle/assembly_gmp.2.res.oracle +++ b/tests/syntax/oracle/assembly_gmp.2.res.oracle @@ -122,6 +122,11 @@ void f(void) \from (indirect: pulValue), *(pulValue + (..)); */ __asm__ ("movq $36, (%0)" : : "r" (pulValue)); + int a = 2; + int b = 3; + /*@ assigns a; + assigns a \from b; */ + __asm__ ("mov %1, %0" : "=r" (a) : "r" (b) : "%eax"); return; } -- GitLab